<center>
06-TUTORIALS-MULTI-多网格运行</center>
参考资料
waves-workshop-exercise-multi.pdf
;(**<font color='red'>
代码没有完全实现,卡 在了PBS,qsub命令</font>
**)
- 是
COURS/WAVES_SHORT_COURSE/TUTORIALS/TUTORIAL-MULTI
里面的内容;TUTORIALS
目录的链接: https://pan.baidu.com/s/1S4qGSGGyJizdSAeFIerewA 密码: jpi1- TUTORIAL 是会更新的,关于 2019 版本的;
- 链接:https://pan.baidu.com/s/1I6IoWwtyA9PNNQ8B2ORwvA
提取码:j0mt
–来自百度网盘
内容
在本教程练习中,我们将完成在多网格配置上运行模型的步骤。 我们将使用 WW3 的并行实现来运行代码。
MULTI 工作目录创建
创建一个 MULTI 工作目录,假如为 work-multi
,在目录下打开终端,输入以下命令
## 将TUTORIAL-MULTI文件夹放进word-multi
# TUTORIAL-MULTI具体的绝对路径需要更改;
cp -r /home/jincanliu/BaiduNetdiskWorkspace/WaveModel2/COURS/WAVES-SHORT-COURSE/TUTORIALS/TUTORIAL_MULTI .
现在可以进 ./TUTORIAL_MULTI
,其中的 data
文件夹可以发现如下文件:
ww3编译生成exe文件夹
在 ftp网站
中的 DATARMOR
有 已编译的exe文件夹
,即 $WAVE_DATA/EXE/exe_Ifremer2_datarmor_mpt
,将其中所有 ww3_
文件复制进 work-multi/TUTORIAL_MULTI
的 work
目录:
##
cd /home/jincanliu/BaiduNetdiskWorkspace/WaveModel2/work-multi/TUTORIAL_MULTI
mkdir work && cd work
cp ../data/* .
##
cp /home/jincanliu/BaiduNetdiskWorkspace/WaveModel2/COURS/WATH_DATA/EXE/exe_Ifremer2_datarmor_mpt/ww3_* .
如果想自己编译生成exe文件夹,需运行以下代码:
## $WW3 说明是在ftp网站中的文件夹;
cd $WW3/bin
./w3_clean
## <comp> 需要自己选择一个;
./w3_setup .. -c <comp> -s Ifremer2 -q
./w3_automake
定义网格(mod_def)
1-模型网格(”model“ grids)
本教程的模型网格有三个,分别是 GLOB-30M
、ZA-7M
、BENG-3M
,这些网格是在 GRIDGEN
教程中生成的。每个模型网格对应一个名称列表 ww3_grid.nml
。对于每个模型网格,必须使用程序 ww3_grid
为每个模型网格创建一个模型定义文件(即 mod_def.ww3
)。
## 目录
# 在 $work 目录下执行
## 赋予权限
chmod 777 ww3_grid
##
ln -sf ww3_grid.nml.GLOB-30M ww3_grid.nml
./ww3_grid | tee ww3_grid.GLOB-30M.out
mv mod_def.ww3 mod_def.GLOB-30M
##
ln -sf ww3_grid.nml.ZA-7M ww3_grid.nml
./ww3_grid | tee ww3_grid.ZA-7M.out
mv mod_def.ww3 mod_def.ZA-7M
##
ln -sf ww3_grid.nml.BENG-3M ww3_grid.nml
./ww3_grid | tee ww3_grid.BENG-3M.out
mv mod_def.ww3 mod_def.BENG-3M
现在您应该已经为模型网格生成了所有模型定义文件:
2-输出点网格(“output points” grids)
由于您的 3 个网格模型可能具有不同的谱设置和分辨率(在 ww3_grid.nml
中:请参阅名称列表中的 SPECTRUM_NML
),因此最好定义另一个网格,专门用于计算 同一谱网格上
的谱输出点。
ln -sf ww3_grid.nml.POINTS ww3_grid.nml
./ww3_grid | tee ww3_grid.POINTS.out
mv mod_def.ww3 mod_def.POINTS
现在已经为输出点网格生成了模型定义文件:
3-强迫场网格(”forcing” grids)
要 计算强迫场
,有两种方法可以在多网格实现中进行。
第一个是
native网格(本地网格)
,强迫场是在与模型网格
相同的网格上计算的。这与单网格实现的行为类似,但由于这里有多个网格,你需要在每个模型网格上预处理强迫场(预处理:将强迫场netCDF文件转换成网格上的二进制文件)。这种方式多用于多网格配置包含不同类型的网格(直线型、曲线型、非结构型)时。第二种方式是
common网格(公用网格)
,强迫场被定义在它自己的网格覆盖和分辨率上。然后,在运行过程中,它将在所有模型网格上进行插值。这是最简单的方法,但它不允许不同类型的网格在同一配置下运行。由于你在这里只有直线型网格,你将使用这种方法只对强迫场网格
进行一次预处理:## ln -sf ww3_grid.nml.wind ww3_grid.nml ./ww3_grid | tee ww3_grid.wind.out mv mod_def.ww3 mod_def.wind ## ln -sf ww3_grid.nml.ice ww3_grid.nml ./ww3_grid | tee ww3_grid.ice.out mv mod_def.ww3 mod_def.ice ## ln -sf ww3_grid.nml.current ww3_grid.nml ./ww3_grid | tee ww3_grid.current.out mv mod_def.ww3 mod_def.current ## ln -sf ww3_grid.nml.level ww3_grid.nml ./ww3_grid | tee ww3_grid.level.out mv mod_def.ww3 mod_def.level
现在你应该已经为
强迫场common网格
生成了所有的模型定义文件:解除通用文件的链接以防止任何错误 :
unlink ww3_grid.nml
定义强迫场–未实现
这里给出的强迫场是netCDF格式,不能直接被模型读取。<font color='red'>
(核心内容)</font><font color='red'>
【</font>
必须使用强迫场网格 mod_def.ww3
将其转换为ww3二进制格式,在其强迫场网格( common 网格
或 native 网格
)上插值<font color='red'>
】</font>
。这里你考虑的是 common 网格
上的强迫场,所以你只需要对强迫场进行一次预处理,否则如果使用 native 网格
,你就必须对每个模型网格进行预处理。
我们将使用预处理程序 ww3_prnc
从 wind.nc
中创建一个 wind.ww3
,以此类推,创建冰、海流和水位的强迫场。每个在其 common 网格
上插值并以二进制格式书写的强迫场,将使用与之前定义的模型定义文件 mod_def
相同的 文件名扩展
。在 native 网格
的情况下,扩展名将是模型网格的名称。
## 权限
chmod 777 ww3_prnc
## wind
ln -sf mod_def.wind mod_def.ww3
ln -sf ww3_prnc.nml.wind ww3_prnc.nml
./ww3_prnc | tee ww3_prnc.wind.out
mv wind.ww3 wind.wind
## ice
ln -sf mod_def.ice mod_def.ww3
ln -sf ww3_prnc.nml.ice ww3_prnc.nml
./ww3_prnc | tee ww3_prnc.ice.out
mv ice.ww3 ice.ice
## current
ln -sf mod_def.current mod_def.ww3
ln -sf ww3_prnc.nml.current ww3_prnc.nml
./ww3_prnc | tee ww3_prnc.current.out
mv current.ww3 current.current
## level
ln -sf mod_def.level mod_def.ww3
ln -sf ww3_prnc.nml.level ww3_prnc.nml
./ww3_prnc | tee ww3_prnc.level.out
mv level.ww3 level.level
./ww3_prnc 出现问题
现在你应该已经用 common网格
生成了所有的 二进制强迫场
:
native网格
得到的二进制强迫场
:
- wind.GLOB-30M ice.GLOB-30M current.GLOB-30M level.GLOB-30M
- wind.ZA-7M ice.ZA-7M current.ZA-7M level.ZA-7M
- wind.BENG-3M ice.BENG-3M current.BENG-3M level.BENG-3M
明显得,
native网格
比common网格
更复杂;
解除通用文件的链接以防止任何错误 :
unlink mod_def.ww3
unlink ww3_prnc.nml
运行多网格模型–未实现(out)
在运行模型之前,需要知道你有什么样的配置,这在 ww3_multi.nml
的5个 namelists(名单列表)
中有详细说明:
&DOMAIN_NML
: 运行中应用的全局信息。&INPUT_GRID_NML
: 每个强迫场输入网格的名称和类型。&MODEL_GRID_NML
: the name and the list of forcings for each model grid,负载平衡
(load balancing).&OUTPUT_TYPE_NML
:每个输出类型的专用信息。&OUTPUT_DATE_NML
:开始和停止日期,输出类型的跨度(设置为0则禁用)。
关于负载平衡的几句话,其原理是根据模型网格的类型(RECT、CURV、UNST)和空间分辨率,将其划分为不同的等级。
考虑3个网格,一个30分钟的全球网格,一个7分钟的区域网格和3分钟的沿海网格。多网格实现的默认行为,对于每个时间步长,是在所有MPI任务上运行全局网格,然后是区域网格,然后是沿海网格。以此类推,直到最后一个时间步长。设置每个等级的网格将定义网格之间的顺序,如下所示:
MODEL(1)%NAME = 'GLOBAL'
MODEL(1)%RESOURCE%RANK_ID = 1
MODEL(2)%NAME = 'REGIONAL'
MODEL(2)%RESOURCE%RANK_ID = 2
MODEL(3)%NAME = 'COASTAL’
MODEL(3)%RESOURCE%RANK_ID = 3
现在,如果你有2个区域网格,可以将MPI任务的总量分成2个网格同时运行。你必须给它们设置相同的等级ID,并通过分割MPI资源来共享(使用0和1之间的比率),这取决于每个网格的海点数量,例如,40 000和60 000海点将得到以下设置:
MODEL(1)%NAME = 'REGIONAL1'
MODEL(1)%RESOURCE%RANK_ID = 2
MODEL(1)%RESOURCE%COMM_FRAC = 0.00,0.40
MODEL(2)%NAME = 'REGIONAL2'
MODEL(2)%RESOURCE%RANK_ID = 2
MODEL(2)%RESOURCE%COMM_FRAC = 0.40,1.00
为了定义更精确的 负载平衡
,可以使用 gprof
、allinea map
或 MPInside
等分析工具。
由于这是你第一次运行多网格配置,模型网格掩码
可能包含一些不一致的地方,这是因为 活动边界点
如何被 更高等级的网格
视为湿或干。在它被认为是干的情况下,你必须手动将掩码值从2(活动边界)修改为3(排除点)。下面是一个 error message
的例子,显示2号网格(ZA-2M)有一个活动边界点,在位置(26;93)被认为是干的,对应于 mask.ZA-7M
中的第26行,位置279(93*3)。
*** WAVEWATCH III ERROR IN WMGLOW : ***
CANNOT FIND SOURCE FOR BOUNDARY DATA
GRID, IX, IY, X, Y: 2 26 93 0.1512E+02 -0.2740E+02
你可以在28个mpi任务的2个节点上运行 ww3_multi
程序:
qsub job_multi.pbs
qstat -u $USER (to check if your job is still running)
gedit log.GLOB-30M log.ZA-7M log.BENG-3M
创建的二进制文件 out_grd.*
对应于不同 模型网格
上的网格化场(列在 ww3_multi.nml
中)的模型积分。二进制文件 out_pnt.POINTS
包含 输出点网格
上的二维谱输出点(列在 point.list
中)的模型积分。在 ww3_multi.nml
中定义的日期,为每个网格创建一个重启文件 restart001.*
。一个映射netcdf文件 rmp_src_to_dst_*.nc
被写入,以允许在不同等级的网格之间进行嵌套。
你可以打开日志文件 log.*
查看每个网格的摘要,这些文件在运行过程中被更新。文件 ww3_multi.out
包含运行结束后的日志。
所有关于运行的全局信息都写在 log.mww3
中。这是对强迫场输入网格、输出点网格和模型网格的总结,包括它们各自的输入强迫、它们的等级和负载平衡、MPI进程的分配和不同等级之间的依赖关系。
gedit log.mww3
结果的后处理–未实现
最后一步是处理不同网格的输出,30min分辨率的全球网格:
cd ~/TUTORIAL_MULTI/work
mkdir GLOB-30M
cd GLOB-30M
ln -sf ../out_grd.GLOB-30M out_grd.ww3
ln -sf ../mod_def.GLOB-30M mod_def.ww3
ln -sf ../ww3_ounf.nml.GLOB-30M ww3_ounf.nml
../ww3_ounf | tee ww3_ounf.out
你可以直观地看到结果:
ncview WW3-GLOB-30M_200910.nc
然后是7分钟分辨率的南部非洲地区:
cd ~/TUTORIAL_MULTI/work
mkdir ZA-7M
cd ZA-7M
ln -sf ../out_grd.ZA-7M out_grd.ww3
ln -sf ../mod_def.ZA-7M mod_def.ww3
ln -sf ../ww3_ounf.nml.ZA-7M ww3_ounf.nml
../ww3_ounf | tee ww3_ounf.out
你可以直观地看到结果:
ncview WW3-ZA-7M_200910.nc
为了填补masked点,可以运行FORTRAN程序 mww3_fill_grids_nc.f90
,使用 GLOB-30M
输出的结果来填补空白。
cp ../mww3_fill_grids_nc.f90 .
cp ../comp_nc4 .
./comp_nc4 mww3_fill_grids_nc
cp ../mww3_fill_grids_nc.inp .
./mww3_fill_grids_nc WW3-GLOB-30M_200910.nc WW3-ZA-7M_200910.nc
你可以直观地看到这些结果:
ncview WW3-ZA-7M_200910.nc
然后,3分钟分辨率的本格拉地区:
cd ~/TUTORIAL_MULTI/work
mkdir BENG-3M
cd BENG-3M
ln -sf ../out_grd.BENG-3M out_grd.ww3
ln -sf ../mod_def.BENG-3M mod_def.ww3
ln -sf ../ww3_ounf.nml.BENG-3M ww3_ounf.nml
../ww3_ounf | tee ww3_ounf.out
你可以直观地看到结果:
ncview WW3-BENG-3M_200910.nc
最后,是谱输出点:
cd ~/TUTORIAL_MULTI/work
mkdir POINTS
cd POINTS
ln -sf ../out_pnt.POINTS out_pnt.ww3
ln -sf ../mod_def.POINTS mod_def.ww3
ln -sf ../ww3_ounp.nml.POINTS ww3_ounp.nml
../ww3_ounp | tee ww3_ounp.out
你可以直观地看到结果:
idlww3
open WW3_200910_spec.nc
as done in TUTORIAL_VISU_SPEC
( modelled time series → modelled → f-theta spec → POLAR_POLY )
你可以用 idl工具
查看所有的谱输出点。你也可以从一个站换到另一个站,在频率的滚动条上面,点击 BOUND001
并选择另一个点。
另外,这些谱点现在可以作为 区域网格
的边界。
额外的练习:定义初始条件(restart)
因为在全球范围内需要一些时间才能有一个 稳定的海况
,所以从初始时间每个网格点上的谱条件的 快照(snapshot)
开始是很有意思的。这个快照是在运行结束时使用这个多网格配置生成的,在最后一个时间步长时,每个网格建立一个 restart file (重启文件)
。这些文件是没有格式化的二进制文件,所以要知道它们在哪个日期相关,可以使用fortran工具 get_restart_date.f90
。
编译fortran代码 :
cd ~/TUTORIAL_MULTI/work
cp ../data/get_restart_date.f90 .
cp ../data/comp_nc4 .
./comp_nc4 get_restart_date
重新命名 restart file (重启文件)
并验证日期,所有 重启文件
的日期必须是相同的:
##
mv restart001.GLOB-30M restart.GLOB-30M
./get_restart_date GLOB-30M
> 20091001 54500
##
mv restart001.ZA-7M restart.ZA-7M
./get_restart_date ZA-7M
> 20091001 54500
##
mv restart001.BENG-3M restart.BENG-3M
./get_restart_date BENG-3M
> 20091001 54500
现在你可以在 ww3_multi.nml
中设置这个日期 20091001 054500
作为初始日期,并以 重启文件
作为初始条件开始运行。在 $WAVE_DATA/MULTI
上有一些额外的风、冰、海流和水位强迫场,以延长运行的时间,不要忘记为每个强迫场重新运行 ww3_prnc
。