<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
,
comp
,link
,switch
是exe
文件夹(即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.comp
,link.comp
,switch_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
)
ifort
即intel fortran
;我暂时也没办法从根源解决这个问题,应该需要安装
ifort
命令;(尝试过把comp
和link
文件中的ifort
信息,'ifort -lmpi'
转换为mpif90
,'ifort'
转换为gfortran
,编译还是失败)治标方法,选择
$ww3/model/bin
下自带的comp_Gnu
和link_Gnu
为编译文件。cp comp.Gnu comp.comp.Gnu cp link.Gnu link.comp.Gnu ./w3_setup ../ -c comp.Gnu -s switch -q
将生成的文件放在
exe2
文件夹下,百度网盘链接:
将 exe2
文件夹中所有 ww3_
文件复制进 work-inout/TUTORIAL_INOUT
的 work
目录:
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.bot
和 iro1k.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
文件:能否不用
qsub
命令,仅仅只用MPI
相关命令,运行ww3_shel
?<font color='red'>
一个很重要的想法,十分希望成功</font>
;
直接运行
./ww3_shel
:undefined symbol: mpi_init_
;
mpirun
命令?…
关于
WW3模型
的并行版本(OpenMP
和MPI
版本),需要做两点补充说明。第一,准备在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
更新)。
可以做 后处理(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
中的附录 。
在第一个时间步,所有域都初始化为 从西边 2.5m 的涌浪
,然后在接下来的时间步中,就只是没有任何源项的波浪耗散。 注意未及时更新的边界点。 由于它们在地图状态中设置为 2,因此这些点必须在每个时间步由波谱更新,这里仅在第一个时间步由 restart.ww3
文件更新。
运行模型(均匀输入场)
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 更新。
您可以对结果进行后处理和可视化:
./ww3_ounf | tee ww3_ounf.out
ncview ww3.201109.nc
在第一个时间步,所有域都初始化为 从西边 2.5m 的涌浪
,然后 来自西北的恒定 20 m/s 风
在每个时间步长吹向所有网格,产生来自风向的波浪增长。
运行模型(真实强迫场)
风场数据来源
主要的全球风力再分析是由 NCEP
和 ECMWF
机构完成的。
NCEP
,历史的CFSR
从 1979 年到 2010 年:http://rda.ucar.edu/datasets/ds093.1/最新的一个是从 2011 年到现在的 CFSRR:http://rda.ucar.edu/datasets/ds094.1/
ECMWF
,最新的是 ERA-5:https://climate.copernicus.eu/climate-reanalysis
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
)
您可以对结果进行后处理和可视化:
./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-earth
的kmz
文件)。
要可视化所有可用的谱文件,请在 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
文件即可。
要自动查找特定网格所需的谱列表,请参阅教程 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 .
ww3_bounc:谱边界文件插入
网格的活动边界在掩码文件中由值 2
定义,如图 1 所示。您不需要在每个活动边界点处提供谱点。 预处理程序 ww3_bounc
将读取所有提供的 谱边界 netcdf 文件(即SPECTRA_NC文件夹中的内容)
,并将它们插入到域的边界以创建唯一的二进制文件 nest.ww3
。 所有设置都在 ww3_bounc.nml
中定义,要读取的 netcdf 文件在 spec.list
中列出。
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分钟
?
Restart file read
从cold start (idealized)
变成calm
;
您可以对结果进行后处理和可视化:
./ww3_ounf | tee ww3_ounf.out
ncview ww3.201109.nc
与以前相同的结果,但现在波能从活动边界向域中传播 1m 涌浪。
运行模型(全输出)
7种输出类型
ww3 还可以输出不同类型的输出数据。它在 ww3_shel.nml
中名称列表 OUTPUT_TYPE_NML
和 OUTPUT_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
”符号。
完成后,在您的文件夹中列出最后创建的文件(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
。
- 这里有6个
现在您可以对二进制结果进行后处理……
… 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