how to add RSURF in NOAH-MP as output in WRF

前言

随着分析的深入,需要在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 !ground surface resistance (s/m)
需要对这个定义删除/注释掉,并给出新的定义,跟在RSSHA变量后面1898行,跟随关系是固定的:
REAL, INTENT(OUT) :: RSSUN !sunlit leaf stomatal resistance (s/m)
REAL, INTENT(OUT) :: RSSHA !shaded leaf stomatal resistance (s/m)
REAL, INTENT(OUT) :: RSURF ! GROUND SURFACE RESISTANCE
在修改的过程中,也可对标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 !sunlit leaf stomatal resistance (s/m)
REAL, INTENT(OUT) :: RSSHA !shaded leaf stomatal resistance (s/m)
REAL, INTENT(OUT) :: RSURF !GROUND SURFACE RESISTANCE

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文件中找到。
1191CALL 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, & ! OUT Noah MP only---)

302 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RSSHAXY ! shaded leaf stomatal resistance (s/m)
303 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RSURFXY ! GROUND SURFACE RESISTANCE

525 REAL :: RSSHA ! shaded leaf stomatal resistance (s/m)
526 REAL :: RSURF ! GOURND SURFACE RESISTANCE

1102 RSSHA = undefined_value
1103 RSURF = undefined_value

1306 RSSHAXY (I,J) = RSSHA
1307 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后添加RSURFXY
3148 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即可。