前言 随着分析的深入,需要在wrfout中增加新的变量。
如果是/WRF/Registry目录下的注册表内存在的变量,那很方便。
参考:[原创]WRF输出控制 (Registry + namelist)-专业气象研究-气象家园_气象人自己的家园
思路 但是如果只是WRF或者某个参数化方案内部的计算过程中的变量,不在注册表,不被输出,就需要修改为输出变量,并在注册表中添加信息。
核心思路是找到这个变量所在的子程序subroutine ,将其从局地变量改为该程序会输出的变量,并在一层层的引用call 中添加这个变量。
实例 以WRF4.4.2版本为例,增加输出noahmp模块中的rsurf(ground surface resistance)变量,具体过程如下:
首先了解在noahmp中该变量在哪 。noahmp的主要计算过程在module_sf_noahmplsm.F 文件中(注意: /WRF/phys/ 下直接的是链接,真实的文件存储在 /WRF/phys/noahmp/ 下)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 module_sf_noahmplsm.F 关于RSURF变量是计算主要在SUBROUTINE ENERGY 中。 但是原本这个变量使用的不输出的局地定义,在1945 行左右: REAL :: RSURF 需要对这个定义删除/注释掉,并给出新的定义,跟在RSSHA变量后面1898 行,跟随关系是固定的: REAL , INTENT (OUT ) :: RSSUN REAL , INTENT (OUT ) :: RSSHA REAL , INTENT (OUT ) :: RSURF 在修改的过程中,也可对标RSSHA,这是和rsurf格式和物理含义类似,但原本就输出的变量。 在SUBROUTINE ENERGY (括号内的变量申明中,将RSURF写在RSSHA后面,即 FSRG ,RSSUN ,RSSHA ,RSURF, ALBSND ,ALBSNI,BGAP ,WGAP,TGV,TGB,&) 在另外两个子程序中,也有关于RSURF的计算,但是不必修改。 SUBROUTINE VEGE_FLUX(本来就有RSURF,不必修改)SUBROUTINE BARE_FLUX(本来就有RSURF,不必修改)
1 2 3 4 5 6 7 8 9 搜索寻找Call ENERGY 命令,在 SUBROUTINE NOAHMP_SFLX(主程序)中找到。 在CALL ENERGY (变量中添加RSURF,在RSSHA后面,与之前的修改一致) 并且由于在NOAHMP_SFLX子程序中原来没有申明定义RSURF,现在追随RSSHA加上(638 行): REAL , INTENT (OUT ) :: RSSUN REAL , INTENT (OUT ) :: RSSHA REAL , INTENT (OUT ) :: RSURF 在SUBROUTINE NOAHMO_SFLX (括号中,追随RSSHA,添加RSURF)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 继续外推,搜索寻找CALL NOAHMP_SFLX, 在module_sf_noahmpdrv.F文件中找到。 1191 在CALL NOAHMP_SFLX (括号里RSSHA后面添加RSURF)这个CALL NOAHMP_SFLX的命令出现在SUBROUTINE noahmplsm中, 需要在noahmplsm的程序中添加rsurf变量,参照rssha。 注意noahmplsm中RSSHA被传递给RSSHAXY,所以参考RSSHAXY,RSSHA, 需要定义RSURFXY,RSURF,赋予初值和传递数据。 这一部分搜索RSSHA,在下面照葫芦画瓢。 45 SUBROUTINE noahmplsm(---RSSUNXY, RSSHAXY, RSURFXY, & 302 REAL , DIMENSION ( ims:ime, jms:jme ), INTENT (OUT ) :: RSSHAXY 303 REAL , DIMENSION ( ims:ime, jms:jme ), INTENT (OUT ) :: RSURFXY 525 REAL :: RSSHA 526 REAL :: RSURF 1102 RSSHA = undefined_value 1103 RSURF = undefined_value1306 RSSHAXY (I,J) = RSSHA1307 RSURFXY (I,J) = RSURF
1 2 3 4 5 6 7 8 9 10 搜索call noahmplsm,在/WRF/phys/module_surface_driver.F中找到。 3115 CALL noahmplsm(ITIMESTEP, --- 在RSSHAXY后添加RSURFXY3148 RSSUNXY, RSSHAXY, RSURFXY, & ---)CALL noahmplsm在SUBROUTINE surface_driver 之下。需要在surface_driver的括号中添加,并定义申明RSURFXY 有RSSHAXY一席之地,就有RSURFXY一席之地。 61 ,rssunxy ,rsshaxy ,rsurfxy &894 SAVXY, SAGXY, RSSUNXY, RSSHAXY, RSURFXY, BGAPXY,---
1 2 3 搜索CALL surface_driver,在module_first_rk_step_part1.F的594 行左右 修改参照rsshaxy 954 ---,rsshaxy=grid%rsshaxy,rsurfxy=grid%rsurfxy & ---
1 2 3 4 5 在/WRF/Registry/Registry.noahmp中添加RSURF,参照RSSHA state real rsshaxy ij - 1 - i02rhd=(interp_mask_field:lu_index,iswater)u=(copy_fcnm) "rssha" "shaded stomatal resistance" "s/m" state real rsurfxy ij - 1 - i02rhd=(interp_mask_field:lu_index,iswater)u=(copy_fcnm) "rsurf" "ground surface resistance" "s/m"
然后重新编译WRF即可。