06-TUTORIALS-INOUT-考虑初始条件、强迫场、谱边界、全输出


<center>06-TUTORIALS-INOUT-考虑初始条件、强迫场、谱边界、全输出</center>

参考资料

waves-workshop-exercise-inout.pdf;(**<font color='red'>代码基本完全实现,之前卡在了PBS,qsub命令,这里我选择跳过了</font>**)

  • 也就是 COURS/WAVES_SHORT_COURSE/TUTORIALS/TUTORIAL-INOUT 里面的内容;

  • 需要知道的一点是,TUTORIAL 是会更新的,下面是关于 2019 版本的;

  • 链接:https://pan.baidu.com/s/1wjsRgnrbUv9gu-RJB6FZ-g
    提取码:5p2b
    –来自百度网盘


内容

在本教程练习中,我们将

  • 完成使用 不同类型的输入运行模型的步骤,从理想化的强迫场(forcing field)到现实的初始条件;
  • 了解可能的 不同输出,从网格字段到沿轨道的谱数据;

所有输入和输出文件都将使用 NetCDF 格式


INOUT工作目录创建

创建一个 INOUT 工作目录,假如为 work-inout ,在目录下打开终端,输入以下命令

## 将TUTORIAL-INOUT文件夹放进word-inout ,用复制命令,因为TUTORIAL-GRIDGEN文件夹不大。
#  TUTORIAL-INOUT具体的绝对路径需要更改;
cp   -r   /home/jincanliu/BaiduNetdiskWorkspace/WaveModel2/COURS/WAVES-SHORT-COURSE/TUTORIALS/TUTORIAL_INOUT   .

现在可以进 ./TUTORIAL_INOUT,其中的 data文件夹可以发现如下文件:


ww3编译生成exe文件夹

ftp网站中有 已编译的exe文件夹,即 $WAVE_DATA/EXE/exe_Ifremer2_datarmor_mpt

  • complinkswitchexe 文件夹(即 exe_Ifremer2_datarmor_mpt)中编译需要用到的文件。

如果想自己编译生成exe文件夹,可以运行以下代码:

##	进入WW3模型;
cd $WW3/bin

##	清空exe文件夹中的ww3文件;
./w3_clean
./w3_new

##	复制 exe_Ifremer2_datarmor_mpt 中的 comp,link,switch;
cp $exe_Ifremer2_datarmor_mpt/comp .
cp $exe_Ifremer2_datarmor_mpt/link .
cp $exe_Ifremer2_datarmor_mpt/switch .


##	编译
./w3_setup ../ -c comp -s switch -q
./w3_make
  • 遇到缺少 comp.complink.compswitch_switch文件问题(终端显示)

    ##	编译
    cp comp comp.comp
    cp link link.comp
    cp switch switch_switch
    ./w3_setup ../ -c comp -s switch -q
    ./w3_make
  • 遇到 ifort: 未找到命令问题(去 model/tmp编译步骤出现问题的文件,此处是 ww3_grid.err

    • ifortintel fortran

    • 我暂时也没办法从根源解决这个问题,应该需要安装 ifort命令;(尝试过把 complink文件中的 ifort信息,'ifort -lmpi'转换为 mpif90'ifort'转换为 gfortran,编译还是失败)

      comp文件中的ifort信息 link中的ifort信息

      治标方法,选择 $ww3/model/bin下自带的 comp_Gnulink_Gnu为编译文件。

      cp comp.Gnu comp.comp.Gnu 
      cp link.Gnu link.comp.Gnu 
      ./w3_setup ../ -c comp.Gnu -s switch -q

      治标方法生成的exe文件夹,ww3文件数与ftp中的一致,但是大小却不一样...

      将生成的文件放在 exe2文件夹下,百度网盘链接:

      链接:https://pan.baidu.com/s/1Ypg-ikoX8umhs9_tVZAYFg
      提取码:p3lp

exe2文件夹中所有 ww3_文件复制进 work-inout/TUTORIAL_INOUTwork目录:

cd /home/jincanliu/BaiduNetdiskWorkspace/WaveModel2/work-inout/TUTORIAL_INOUT
mkdir work && cd work
cp $exe2/ww3_* .
  • 验证 exe2中的ww3文件运行有没有问题~~无问题~

    exe_Ifremer2_datarmor_mpt中的ww3文件的运行会出现问题,见 INOUT教程运行模型部分~~(<font color='red'>MPI</font>


ww3_grid:定义网格

使用研究区域的水深和掩码文件 iro1k.botiro1k.mask(参见教程 gridgen)和namelists文件 ww3_grid.nml 来定义网格设置和 namelists_IROISE.nml<font color='red'>定义模型参数化</font>(基于激活的switch),在含有编译文件的 work目录下,运行程序 ww3_grid 创建 模型定义文件,即 mod_def.ww3

cp ../data/iro1k.bot .
cp ../data/iro1k.mask .
cp ../data/ww3_grid.nml .
cp ../data/namelists_IROISE.nml .

##	需要给	ww3_* 赋权限
chmod -R 777 . 

##	Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
#	https://www.runoob.com/linux/linux-comm-tee.html
./ww3_grid | tee ww3_grid.out

完成后,在您的文件夹中列出最后创建的文件 (ls -lrt),应该有一个 mod_def.ww3。 该二进制文件包含模型网格的谱和空间定义。 所有 ww3 程序都需要它。

ls -lrt

运行模型(理想谱初始条件)

ww3_strt:定义初始条件

在整个网格中 定义初始条件的最简单方法是使用 ww3_strt 定义理想化的波谱。 该程序将只读取输入文件 ww3_strt.inp 中定义的参数化,它可以是频率和空间中的高斯或 JONSWAP 频谱。 它将创建一个文件 restart.ww3,其中包含整个模型网格的全谱信息。

cp ../data/ww3_strt.inp .
./ww3_strt | tee ww3_strt.out

完成后,在您的文件夹中列出最后创建的文件 (ls -lrt),您应该有一个 restart.ww3

ww3_shel:运行模型(<font color='red'>代码运行之前卡在此处,失败在PBS,qsub</font>

现在您可以运行模型,为此,复制与 ww3_shel 对应的名称列表文件 ww3_shel.nml

#cp ../data/job_shel.pbs .
cp ../data/ww3_shel.nml .
./ww3_shel | tee ww3_shel.out
#qsub job_shel.pbs
#qstat -u $USER (to check if your job is still running : job_shel.pbs $USER 00:03:08 R mpi_1)
  • 不需要复制<font color='red'>MPI 提交作业</font> job_shel.pbs ,也不需要使用 qsub命令了;
  • job_shel.pbs文件:

    job_shel.pbs
  • 能否不用 qsub 命令,仅仅只用 MPI相关命令,运行 ww3_shel<font color='red'>一个很重要的想法,十分希望成功</font>

    • 直接运行 ./ww3_shelundefined symbol: mpi_init_

    • mpirun命令?

    • 关于 WW3模型的并行版本(OpenMPMPI版本),需要做两点补充说明。第一,准备在MPI环境下运行的可执行文件时,可能会出现复杂的情况,这种复杂情况在 附录C中讨论。第二,OpenMP代码应该只使用指令来编译,即不要使用自动运行代码的编译器选项。(2019-ww3v6.07手册5.6

      去看 附录C

    • 实现了,使用自己编译生成exe文件夹,思路是在请教中找到的:

运行结果是一个二进制文件 out_grd.ww3,其中包含在网格上为每个输出时间步长计算的所有 平均波参数。 这个例子中,模型中没有给出 输入风,仅仅只含有 ww3_strt 实现的初始理想化条件。当前路径中有 ww3_strt 实现的 restart.ww3时,模型会自动读取此文件。了解模型是否已考虑 restart, 可以阅读 log.ww3文件,本例子显示的是:“Restart file read; cold start (idealized)”,说明已考虑 restart。 在 输出时间线中,您可以在“gridded field”列“g”中看到由“X”符号显示的 I/O 更新(或“L”表示的 最后一次 Last更新)。

gedit log.ww3

可以做 后处理(Post-Processing):复制 ww3_ounf对应的namelist文件 ww3_ounf.nml,运行,对结果进行可视化。

cp ../data/ww3_ounf.nml .
./ww3_ounf | tee ww3_ounf.out

##
# sudo apt-get install ncview
ncview ww3.201109.nc

查看 MAPSTA 变量,即网格的地图状态,海点设置为 1(图中为绿色),陆地点设置为 0(图中为蓝色),活动边界点设置为 2(图中为红色)。要了解有关地图状态的更多信息,请参阅教程 gridgen 中的附录 。

图1

在第一个时间步,所有域都初始化为 从西边 2.5m 的涌浪,然后在接下来的时间步中,就只是没有任何源项的波浪耗散。 注意未及时更新的边界点。 由于它们在地图状态中设置为 2,因此这些点必须在每个时间步由波谱更新,这里仅在第一个时间步由 restart.ww3 文件更新。

Hs变量随时间步长的变化

运行模型(均匀输入场)

ww3_shel:运行模型

均匀输入场(Homogeneous Input Field )是一个 强迫场(风、水流、水位、冰),它可以在整个网格上的给定日期的给定值上定义。 可以添加许多均匀场使 随时间变化,否则 将在所有时间步长中保持其值(<font color='red'>其和它指代的是什么?强迫场</font>)。 要定义 ,请打开名称列表文件 ww3_shel.nml 以设置 输入风场。 在名称列表 INPUT_NML 中,将风输入的强制标志设置为 H 以表示“homogeneous”。

&INPUT_NML
INPUT%FORCING%WINDS = 'H' 
/
  • 填写 H而不是 'H'会报错,显示 READ_INPUT_NML读取名单列表有问题,神奇!

要定义均匀风场的值,将在 ww3_shel.nml 的最后一节中设置。

  • 首先,在名称列表 HOMOG_COUNT_NML 中设置要使用的均匀风场的数量。

    &HOMOG_COUNT_NML
    HOMOG_COUNT%N_WND = 1
    /
  • 然后在 HOMOG_INPUT_NML中定义日期、风速、方向和海气差:

    &HOMOG_INPUT_NML
    HOMOG_INPUT(1)%NAME = 'WND'
    HOMOG_INPUT(1)%DATE = '20110902 000000'
    HOMOG_INPUT(1)%VALUE1 = 20.
    HOMOG_INPUT(1)%VALUE2 = 315.
    HOMOG_INPUT(1)%VALUE3 = 2.0
    /

    或者写成都在一行中

    &HOMOG_INPUT_NML
    HOMOG_INPUT(1) = 'WND' '20110902 000000' 20. 315. 2.0
    /

现在您可以重新运行模型:

./ww3_shel | tee ww3_shel.out

在这个例子下,风仅在给定时间更新,然后保持恒定。 您可以读取文件 log.ww3 以验证运行是否已成功终止。 在 输入时间轴中,您可以在“w”列中看到关于风的“F”符号,它显示的是第一个 I/O 更新。

log.ww3

您可以对结果进行后处理和可视化:

./ww3_ounf | tee ww3_ounf.out
ncview ww3.201109.nc

在第一个时间步,所有域都初始化为 从西边 2.5m 的涌浪,然后 来自西北的恒定 20 m/s 风在每个时间步长吹向所有网格,产生来自风向的波浪增长。

运行模型(真实强迫场)

风场数据来源

主要的全球风力再分析是由 NCEPECMWF 机构完成的。

ww3_prnc:定义风场

在本教程,您只需从数据文件夹中复制风文件。 要将风力场从 netcdf 文件 wind.nc 转换为在模型网格上插值的二进制文件 wind.ww3,您需要运行预处理程序 ww3_prnc。 相应的名称列表文件 ww3_prnc.nml 包含转换它所需的所有设置。

cp ../data/wind.nc .
cp ../data/ww3_prnc.nml .
./ww3_prnc | tee ww3_prnc.out

完成后,在您的文件夹中列出最后创建的文件 (ls -lrt),您应该有一个 wind.ww3

ww3_shel:运行模型

要定义外部输入场,您必须在 ww3_shel.nml 中进行编辑。 在名称列表 INPUT_NML 中,将风输入的强制标志设置为“外部强制文件(external forcing field)”的 'T'

&INPUT_NML
INPUT%FORCING%WINDS = 'T' 
/

删除或评论 均匀场名单的内容。 类似的下面的代码:

&HOMOG_COUNT_NML
/
&HOMOG_INPUT_NML
/

现在您可以运行模型:

./ww3_shel | tee ww3_shel.out

在这种情况下,使用 wind.ww3,输入风在模型中 每小时更新一次。 您可以阅读 log.ww3 以了解强迫场更新的频率。 在 输入时间线中,您可以在“w”列中看到“F”和“X”符号显示的 I/O 更新。(F指的是 First

log.ww3

您可以对结果进行后处理和可视化:

./ww3_ounf | tee ww3_ounf.out
ncview ww3.201109.nc

在第一个时间步,所有的域都被初始化为 从西边 2.5m 的涌浪,然后一个真实的风吹过所有的网格,并且每小时更新一次。

运行模型(真实谱边界条件)

谱边界文件

现在您已拥有初始条件 (restart.ww3) 和真实的风力场 (wind.ww3)。 所需的最后一个输入是 谱边界(spectral boundary),以迫使你的<font color='red'>网格(边界)向大海开放</font>

  • 一种方法是运行 多网格模型来传达全球和区域网格之间的谱边界(参见 TUTORIAL_MULTI)。
  • 另一种方法是首先运行一个 全球网格模型,然后输出区域网格所需的边界点。为此我们做了近 20 年的全球后报,我们在全球海岸线上每0.5度提供一个 二维谱点。(请参阅我们的 google-earthkmz 文件)。

要可视化所有可用的谱文件,请在 google-earth 上打开我们的 kml 文件。

open the google-earth on your local machine
google-earth $WAVE_DATA/GOOGLE-EARTH-KMZ/IOWAGA_WWATCH_MULTI_output_points.kmz

google-earth 的下载安装:

##	参考网站
#	https://www.codenong.com/f-install-google-earth-ubunu/

##
mkdir google-earth && cd google-wget https://dl.google.com/dl/earth/client/current/google-earth-stable_current_amd64.deb
sudo dpkg -i google-earth-stable*.deb
#	deb包的百度网盘
#	链接: https://pan.baidu.com/s/1eW-OEXOa2PJv1JPionl0fw  密码: 11ku

安装完成后,在软件菜单栏有 google-earth的图标,点击进入软件后,打开所需 kml 文件即可。

未打开IOWAGA的 kml 的 google-earth

打开IOWAGA的 kml 的 google-earth

要自动查找特定网格所需的谱列表,请参阅教程 GRIDGEN 中的 附录 D。 如果没有 netcdf谱数据,别担心今年(2019年)应该全部重做。

GRIDGEN附录D–Define a polyline as domain boundaries with google-earth

运行 create_grid 程序后,您可能需要定义特定的边界区域。 这可以通过 google-earth 应用程序来定义多边形。

google earth
select the polyline tool
draw your polygon around your area, it can be an opened polygon
save as kml file
remove the first line of kml file

然后就可以将 kml文件转换成多边形文件了。
请参阅GRIDGEN附录 C 以安装 gmt 工具。

run kml2gmt to create .poly file
rename output file to fname.poly
put it in data directory
set SELECT_BOUND =2 in namelist file
run create_boundary program

例如,2016 年北半球在 19W 和 19E 之间:

ftp://ftp.ifremer.fr/ifremer/ww3/HINDCAST/GLOBAL/2016_ECMWF/SPEC_NW19toE19/

对于本教程,您只需从数据文件夹中复制谱文件:

cp -r ../data/SPECTRA_NC .

SPECTRA_NC 文件夹内容

ww3_bounc:谱边界文件插入

网格的活动边界在掩码文件中由值 2 定义,如图 1 所示。您不需要在每个活动边界点处提供谱点。 预处理程序 ww3_bounc读取所有提供的 谱边界 netcdf 文件(即SPECTRA_NC文件夹中的内容),并将它们插入到域的边界以创建唯一的二进制文件 nest.ww3。 所有设置都在 ww3_bounc.nml 中定义,要读取的 netcdf 文件在 spec.list 中列出。

spec.list 文件内容,与 SPECTRA_NC 相对应

cp ../data/spec.list .
cp ../data/ww3_bounc.nml .
./ww3_bounc | tee ww3_bounc.out

完成后,在您的文件夹中列出最后创建的文件 (ls -lrt),您应该有一个 nest.ww3

ww3_shel:运行模型

现在您可以运行模型:

##	防止 restart.ww3 和 nest.ww3 冲突?
rm -f restart.ww3 (remove restart created from a theoretical spectrum)

./ww3_shel | tee ww3_shel.out

在这种情况下,来自 全局域的边界条件(在下一个 全局时间步长)每 3 小时更新一次。 当前路径中有 nest.ww3时,模型会自动读取此文件。 可以阅读 log.ww3 查看输入边界在第一次运行时(即 pass=1)已更新,具体更新时间为 00:10:00。 在 输入时间轴中,对于 restart.ww3, I/O 更新显示为“F”,对于 boundary在“b”列I/O 更新显示为“X”。

  • 全局时间步长10分钟

log.ww3

  • Restart file readcold start (idealized)变成 calm

您可以对结果进行后处理和可视化:

./ww3_ounf | tee ww3_ounf.out
ncview ww3.201109.nc

与以前相同的结果,但现在波能从活动边界向域中传播 1m 涌浪。

图6

运行模型(全输出)

7种输出类型

ww3 还可以输出不同类型的输出数据。它在 ww3_shel.nml 中名称列表 OUTPUT_TYPE_NMLOUTPUT_DATE_NML 中定义,一共有 7 种类型的输出:场的平均波参数点输出沿轨迹谱点输出重启文件边界数据、分离波场数据、耦合场。

对于每种输出数据,必须设置开始和停止数据,这些数据可能与运行本身的开始和停止日期不同。 每种输出数据的时间步长必须大于 全局时间步长,理想情况下应该是全局时间步长的倍数。 禁用某种输出类型,必须将其时间步幅设置为 0。

  • 第一种输出数据是 场的平均波参数。 必须在 OUTPUT_TYPE_NML 中指定要请求的输出参数:

    &OUTPUT_TYPE_NML
    TYPE%FIELD%LIST = 'HS FP DIR DP CHA UST DPT CUR WND'
    /

    然后在 OUTPUT_DATE_NML 中定义开始日期、时间跨度和停止日期:

    &OUTPUT_DATE_NML
    DATE%FIELD%START = '20110902 000000'
    DATE%FIELD%STRIDE = '3600'
    DATE%FIELD%STOP = '20110902 060000' 
    /

    或在一行中:

    &OUTPUT_DATE_NML
    DATE%FIELD = '20110902 000000' '3600' '20110902 060000' 
    /
  • 第二种输出数据是 点输出。 要输出的谱点的位置在文本文件 points.list 中列出。该文件包含由经度、纬度和名称定义的点列表。
    复制 谱点输出文件

    cp ../data/points.list .

    points.list 的内容应该是:

    -4.97 48.29 '62069'
    -6.00 48.29 'Boundary'

    然后在 OUTPUT_DATE_NML 中定义开始日期、时间跨度和停止日期:

    &OUTPUT_DATE_NML
    DATE%FIELD = '20110902 000000' '3600' '20110902 060000'
    DATE%POINT = '20110902 000000' '3600' '20110902 060000' 
    /
  • 第三种输出数据是 沿轨道输出。要输出的谱点的位置列在文本文件 track_i.ww3 中(在标题行之后)。 该文件包含由时间、经度、纬度和名称定义的点列表。 该模型将在 最近的输出日期最近网格点处输出 2D 光谱。
    复制 轨道输入文件 :

    cp ../data/track_i.ww3 .

    track_i.ww3 的内容应该是:

    WAVEWATCH III TRACK LOCATIONS DATA
    20110902 020000 -5.0 48.0 S1B
    20110902 040000 -4.2 48.5 S1C

    然后在 OUTPUT_DATE_NML 中定义开始日期、时间跨度和停止日期:

    &OUTPUT_DATE_NML
    DATE%TRACK = '20110902 000000' '3600' '20110902 060000' 
    /
  • 第四种输出数据是 重启文件(restart files)。 要仅生成一个 重启文件(例如在运行结束时),您必须设置开始和停止日期的日期,并设置一个大于 0 的步幅值。然后开始日期、时间步幅和停止日期在 OUTPUT_DATE_NML 种定义。 在本教程中,您将在运行结束时输出一个 重启文件

    &OUTPUT_DATE_NML
    DATE%FIELD = '20110902 000000' '3600' '20110902 060000'
    DATE%POINT = '20110902 000000' '3600' '20110902 060000' 
    DATE%RESTART = '20110902 000000' '3600' '20110902 060000' 
    /
  • 第五种输出数据是 边界数据。 输出边界点必须事先在 ww3_grid.nml中定义,以输出内部网格边界处的谱条件。 它不经常使用,首选的方法是通过运行 ww3_bounc 来输出可用作内部谱边界的谱点,就像您在上一个练习中为此运行所做的那样。 它不会在本教程中使用,默认情况下时间步幅设置为 0,因此它被禁用。

  • 第六种输出数据是 分离波场数据(separated wave field data)。 这个输出是为了获得计算域中所有 分量波系统空间和时间一致的场和时间序列,有一个专门的教程(见 TUTORIAL_WAVETRACK)。 它不会在本教程中使用,默认情况下时间步幅设置为 0,因此它被禁用。

  • 第七种输出数据是 耦合(coupling)。 此输出用于在 波浪模型和其他 被耦合模型之间交换场,也有专门的教程(参见 TUTORIAL_COUPLING)。 它不会在本教程中使用,默认情况下时间步幅设置为 0,因此它被禁用。

ww3_shel:运行模型

现在可以再次运行模型以输出所有模型结果。

./ww3_shel | tee ww3_shel.out
gedit log.ww3

输出时间线中,可以在“g”列中的“gridded field”、“p”列中的“output points”、”t“列中的”track“、”r“列中的“restart file”看到,由“X”符号显示的 I/O 更新,在最后一个时间步中出现一个“L”符号。

log.ww3

完成后,在您的文件夹中列出最后创建的文件(ls -lrt),应该以下文件:

ls -lrt 显示最新生成的文件
  • ww3_ounf 将使用 out_grd.ww3 文件来创建输出网格化的场数据

  • ww3_ounp 将使用 out_pnt.ww3 文件来创建输出谱点

  • ww3_trnc 将使用 track_o.ww3 文件来创建输出轨迹点

  • restart00*.ww3 文件必须重命名为 restart.ww3 才能用作下次运行的 初始条件

    • 这里有6个 restart文件,如果按照原 pdf中设置(DATE%RESTART = '20110902 060000' '3600' '20110902 060000' ),即 RESTART的开始和终止时间都是 '20110902 060000',那么只会生成的一个 restart文件,即 restart001.ww3

现在您可以对二进制结果进行后处理……

  • … netcdf 场输出

    cp ../data/ww3_ounf.nml .
    ./ww3_ounf | tee ww3_ounf.out
    ncview ww3.201109.nc
  • … netcdf 谱点输出

    cp ../data/ww3_ounp.nml .
    ./ww3_ounp | tee ww3_ounp.out
    
    ##
    idlww3
    open ww3.201109_spec.nc as done in TUTORIAL_VISU_SPEC
    ( modelled time series → modelled → f-theta spec → POLAR_POLY → scroll the time steps )
  • … netcdf 轨迹点输出

    cp ../data/ww3_trnc.nml .
    ./ww3_trnc | tee ww3_trnc.out
    • 注意:要可视化结果,必须从给定的位置和时间提取数据,然后使用 idl

Author: Jincan
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Jincan !
  TOC