好文档 - 专业文书写作范文服务资料分享网站

WRF模式简易操作 - 中文指南 - 图文

天下 分享 时间: 加入收藏 我要投稿 点赞

FCBASEOPTS = -qarch=auto -qfree=f90

-bmaxdata:0x80000000 -bmaxstack:0x10000000 -qzerosize -qnosave -qmaxmem=-1 -qspill=20000 $(FCDEBUG) $(OMP)

. . . . . .

LDFLAGS = -bmaxdata:0x80000000 -bmaxstack:0x10000000 -qmaxmem=-1

. . . . . .

wrfio_nf :

( cd ../external/io_netcdf ; make NETCDFPATH=/u/denglt/netcdf

FC=\ $(FCDEBUG) -qarch=auto -qfree=f90 -bmaxdata:0x80000000 -bmaxstack:0x10000000 -qmaxmem=-1 -qzerosize -qnosave\; /bin/cp wrf_io_flags.h wrf_status_codes.h ../../inc )

wrfio_int :

( cd ../external/io_int ; \\

make CC=$(CC) FC=\$(FCDEBUG) -qarch=auto

-qfree=f90 -bmaxdata:0x80000000 -bmaxstack:0x10000000 -qmaxmem=-1 -qzerosize -qnosave\

solve_interface.o : solve_interface.F $(RM) $@

$(CPP) -I../inc $(CPPFLAGS) $*.F > $*.f

$(FC) -c -qfree=f90 -bmaxdata:0x80000000 -bmaxstack:0x80000000 -qmaxmem=-1 -qspillsize=32767 -I. $(MODULE_DIRS) $*.f

由于以上的修改,在运行清除程序clean后会被自动删除掉,造成修改信息丢失。有鉴于此,用户除了修改configure.wrf外,还可以直接修改arch子目录中的configure.defaults文件。找到configure.defaults文件中与AIX相关的十一个配置模块,按在configure.wrf中的修改方法一样修改。这样做好修改后,以后的每次清除编译环境重新配置编译环境时,都不会丢失修改好的信息。

在编译1.3版时,发现有些程序在选用“优化”编译时,往往会编译很慢,甚至会由于优化消耗内存,造成内存不足后而导致编译失败。因此,一种解决方法是可以在编译选项中去掉优化选项“-O2”;另一种解决方法就是将优化编译时耗时很长或者耗内存很大的程序加入到优化的编译规则中。这一修改,也可以在arch子目录中的configure.defaults中进行。在IBM SP2机器上,要添加的的目标文件有:

module_io_mm5.o module_si_io.o module_io_wrf.o module_domain.o\\ module_start.o module_initialize.o module_initialize_b_wave.o \\ module_initialize_hill2d_x.o module_initialize_quarter_ss.o \\

14

module_initialize_squall2d_x.o module_initialize_squall2d_y.o \\ module_initialize_real.o module_dm.o start_domain.o \\ mediation_force_domain.o mediation_interp_domain.o \\ mediation_feedback_domain.o solve_interface.o

当configure.wrf文件中的ARCHFLAG标志参数包含-DDM_PARALLEL参数值,并且连接好相应的消息传递库函数时,可用分布式内存并行机制进行编译。目前连接库只有一种可供选择:external/RSL/RSL/librsl.a。此时,其他一些必须设置生效的参数值包括:-DWRF_RSL_IO和_DRSL。CFLAGS参数必须取有-DWRF_RSL_IO,-DMAXDOM_MAKE = $(MAX_DOMAINS),DMAXPROC_MAKE= $(MAX_PROC ),DMAXPROC_MAKE = $(MAX_PROC),-I../external/RSL/RSL。在设置文件arch/configure.defaults的用于设置分布式内存并行编译的模板中包含了上面这些参数值。而在configure.wrf文件中设置相应的编译标志参数时,就可以用共享式内存并行机制来进行编译。内存共享式并行机制采用OpenMP线程形式。

2.5.4 编译代码

在配置完编译环境变量之后,就可以输入编译命令“compile”进行程序代码编译了。首先,输入“compile”,则会出现以下帮助选项:

Usage:

compile wrf compile wrf in run dir test cases (see README_test_cases): compile em_b_wave (欧拉质量坐标斜压波方案) compile em_grav2d_x (欧拉质量坐标重力波方案) compile em_hill2d_x (欧拉质量坐标二维钟形山体方案) compile em_quarter_ss (欧拉质量坐标三维超级单体云体方案) compile em_real (欧拉质量坐标真实大气方案) compile em_squall2d_x (欧拉质量坐标x-z平面二维飚线方案 ) compile em_squall2d_y (欧拉质量坐标y-z平面二维飚线方案 ) compile exp_real (真实大气试验方案 )

compile nmm_real (欧拉高度坐标真实大气方案 ) compile -h (帮助信息)

上面的帮助信息里,列出了目前WRF模式中可以编译运行的方案选择。其中em表示“欧拉质量坐标”模式动力框架。当模式从一个方案转到其他方案时,必须重新编译。重新编译后,wrf.exe不变,但初始化程序(比如real.exe和ideal.exe)会有所不同。除了“nmm_real”和“em_real”两个编译方案是真实大气方案外,其他方案都是用理想数据进行大气模拟试验的方案。 编译时,输入带参数的编译命令“compile”,命令格式为: $compile case_name

比如说要编译质量动力框架下的二维飚线方案时,则可键入命令: $compile em_squall2d_x

然后,编译程序启用注册机制:在“tools/directory”目录中的c程序会根据文件Registry/Registry中的列表内容创建文件,放在inc目录中。然后,编译程

15

序会编译一些源程序目录中的源代码,产生目标文件“.o”以及一些中间文件(如“.f”)。注意,其中目录“frame/”中的一个源代码文件(“frame/module_state_description.F”)不是随模型源程序一起发布的,而是在编译时由注册机制自动创建的。如果想要在下一次编译时强制重新运行注册机制,则将文件“frame/module_state_description.F”移除掉即可。

成功编译后,会产生两个可执行文件“ideal.exe”和“wrf.exe”,放置目录为“main/”,并且在目录“test/em_squall2d_x”中有他们的连接文件。对于每一个不同理想大气试验方案,ideal.exe都会不同,这是因为它们建立方案时是编译了不同的模块“module_initialize”。如果用户想修改试验方案,则需对目录“dyn_em/”或者“dyn_eh/”中的“module_initialize”进行修改。可以改变它们的初始状态,比如边界环境、热力湍流(thermal bubble)、模式层数以及地形等。如果模式动力框架不同,那么“ideal.exe”也会不同。

当编译失败或者要重新编译时,可用模式提供的清除命令clean来进行。当未指定任何参数时,清除程序“clean”将删除源程序目录中的目标文件(*.o)以及编译时产生的一些中间文件,文件“configure.wrf”会保留。当指定“-a”为“clean”的参数时,则会连同文件“configure”以及一些在“external”目录中的库函数一起删除。所以,用带参数“-a”的清除命令,则会将模式恢复到模式的安装最原始的状态,而文件“configure.wrf”中的一些修改信息都会丢失。(注意,清除程序并不会将run或test子目录中的数据文件或可执行文件删除掉)。

对发布的原始代码或运行了清除程序“clean -a”后的代码进行第一次编译时,编译程序会在“external”目录中创建一些库函数。

另外,编译错误时显示的行号是中间文件“.f”的对应行号,但不一定都是源程序目录中的“.F”文件的对应行号。这可能会给查找错误所在地位置带来一些麻烦。

F90编译器允许在向外部子程序传递实参时,产生f90型伪形(assumed-shape)数组的副本。一些F90编译器即使整个数组(无需分割成子集)被作为实参传递时也会产生这种副本。这样的话,产生副本是非常浪费内存的。-DDEREF_KLUDGE指示注册机制在构建调用子程序的实参列表时创建一个额外标志信息,从而使编译器认为仅仅是传递数组的第一个元素,避免了创建副本。

16

3. WRF模式与T213模式嵌套

3.1 嵌套方案

T213模式是一个全球谱模式,而WRF模式是一个区域格点模式。目前,要实现WRF模式与T213模式的完全嵌套,在理论上和实践上都还有许多困难。因此,根据WRF模式当前只处于调试阶段的实际情况,我们仅将WRF模式与T213模式作简单地嵌套。

简单嵌套的基本思路就是以T213模式的预报场或者客观分析场为WRF模式的背景场,并为WRF模式提供边界条件。

具体实现的方法有两种,一种是从T213场库获取要素场,然后修改WRFSI源程序,读取T213要素场,处理后生成WRF模式的输入场;另一种是利用从T213场库获取要素场,然后利用MM5的前处理程序TERRAIN、REGRID以及INTERPF等程序,生成MM5的初始场及边界条件,再利用MM52WRF程序,将其转换成WRF模式的输入要素场。第一种方法简捷方便,易于操作;第二种方法相对繁杂些,但由于MM5模式有比较完善的资料同化方案,可以解决目前WRF模式没有资料同化方案的不足。

3.2 嵌套程序设计

3.2.1 T213场库资料的通用接口程序

IBM SP机器中T213场库的水平分辨率为0.5625*0.5625(度)。目前,由于T213场库资料的检索已经模块化,用户根据检索时,可直接调用通用场库(T213)检索接口程序“gdbrck”。调用通用场库接口程序时,用户只必须设置好程序的各个接口参数。具体各接口参数说明如下:

call gdbrck(ftype,idate,iftime,ielemcd,level,ii,jj,kk,record,data,index_dic,iret)

ftype : character*4,场类型,例:暴雨系统为 'BJLP',t213系统为 'BJGL’ idate : integer idate(4), 日期数组,年(四位)、月、日、时次 iftime : integer, 时效

ielemcd : integer, 要素代码

level : integer level(n+1), 层次数组,第一元为调用的总层数n, 2到n+1元为

具体的调用层次,如level(3), data level/2,500,700/

ii : integer,纬度格点数 jj : integer, 经度格点数 kk : integer, 调用层数n

record : integer,本场最大ii * jj。T213系统为: 640*321 data : real*8 dimension data(ii,jj,kk) ,符点数组,数据区 index_dic : character*80, 字符串,模式字典文件全名 iret : integer,返回码 0:正常

6:场没生成或记录不存在 9:其他错

值得注意的是,由于场库资料中整数和浮点数都是以64位格式存储的,也就是8个字节。因此,在程序的声明部分注意场库调用参数的存储长度;或者在

17

编译程序的时候,选用64位编译方式编译。当然,也可以在编译的时候,用编译选项 -qintsize=8 和 -qrealsize=8两个选项来进行编译。

index_dic是模式字典文件全名,在调用前必须指定。在IBM SP上,场库在SP:/gpfs/fs2/nwp/gdbt213目录下用index_dic(1:28)='/u/nwp/gdbt213/dic/index_dic';在场库在盘阵库/asm2/nwpgdb/t213gdb目录下用index_dic(1:32)='/u/nwp/gdbt213 /dic/index_nfs_dic?。

3.2.2 读取T213场库资料的程序设计

读取T213场库资料的基本思路是首先设置好相应的气象要素场的具体调用参数;然后利用T213场库提供的通用接口程序读取场库资料,保存在内存变量中;再将内存变量中的相应气象要素场数据按不同的要求输出为不同的数据文件格式。根据这一思想,可以得到读取T213场库资料的程序流程图(见图10)。 实现读取T213场库资料的程序名称为readt213.F。程序开始调用子程序parse_table来变量列表Vtable文件中的变量信息。Vtable的格式如下:

GRIB Code| Level Code| Level 1 | Level 2 | REGRID Name | REGRID Units | REGRID Description |

-----+------+------+------+----------+----------+------------------------------------------+ 80 | 1 | 0 | | SST | K | Sea Surface Temperature | 1 | 1 | 0 | | PSFC | Pa | Surface Pressure | 2 | 102 | 0 | | PMSL | Pa | Sea-level Pressure |

7 | 1 | 0 | | HGT | m | Height | Terrain Height 211 | 1 | 0 | | SKINTEMP | K | Skin temperature (can use for SST also) | 229 | 105 | 2 | | T | K | Temperature | At 2 m 230 | 105 | 2 | | RH | % | Relative Humidity | At 2 m 202 | 105 | 10 | | U | m s{-1}| U | At 10 m 203 | 105 | 10 | | V | m s{-1} | V | At 10 m 7 | 100 | | | HGT | m | Height | 11 | 100 | * | | T | K | Temperature | 33 | 100 | * | | U | m s{-1} | U | 34 | 100 | * | | V | m s{-1} | V | 52 | 100 | * | | RH | % | Relative Humidity | -----+------+------+------+----------+----------+---------------------------------------------+

变量列表Vtable文件中,第一行是说明信息,调用parse_table子程序时,会忽略这些信息。而parse_table子程序识别这些信息与有用的变量信息的重要标志就是第一列包含中画线“-”的第二行。也就是说,程序将忽略第一次出现中画线的那一行以前的所有信息,然后读取第一次出现中画线到第二次出现中画线之间的所有变量信息。如果在第二次出现中画线的那一行后面还有信息,那么将忽略第二次出现中画线的那一行之后的所有信息,直到第三次出现中画线的那一行,同时必须有第四次出现中画线的行。第三和第四次之间有没有变量信息不重要,重要的是第三次和第四次必须同时配套出现。

18

2wj3p33oel1oirv327pb3jk4h7sglc00poj
领取福利

微信扫码领取福利

微信扫码分享