06-TUTORIALS-MULTI-多网格运行(未实现)


<center>06-TUTORIALS-MULTI-多网格运行</center>

参考资料

waves-workshop-exercise-multi.pdf;(**<font color='red'>代码没有完全实现,卡 在了PBS,qsub命令</font>**)


内容

在本教程练习中,我们将完成在多网格配置上运行模型的步骤。 我们将使用 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_MULTIwork目录:

##
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-30MZA-7MBENG-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_prncwind.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

为了定义更精确的 负载平衡,可以使用 gprofallinea mapMPInside等分析工具。

由于这是你第一次运行多网格配置,模型网格掩码可能包含一些不一致的地方,这是因为 活动边界点如何被 更高等级的网格视为湿或干。在它被认为是干的情况下,你必须手动将掩码值从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


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