comm_wrf.F90
路径
LMDZ.MARS\libf\phymars\comm_wrf.F90
所属目录/模块
libf\phymars
文件定位
comm_wrf.F90 定义 comm_wrf,是 phymars 的 MESOSCALE 编译分支使用的 WRF 风格输出共享缓存模块。源码注释说明它用于输出那些尚未放入其他共享模块的诊断场。模块本身只声明、分配和释放数组;实际写入发生在 physiq_mod.F 的 #ifdef MESOSCALE 分支中。
复现上,这个模块不是物理过程入口,也不改变物理倾向。它把 physiq 已经算出的短波/长波加热率、短波地表向下通量、尘埃/水冰光学与半径、水汽/水冰柱量等复制到 comm_* 数组,供外部 WRF/mesoscale 输出接口读取。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
comm_wrf |
module |
1 |
MESOSCALE 分支的 WRF 风格诊断输出缓存模块 |
comm_HR_SW |
real allocatable save module variable |
8 |
短波加热率缓存,二维 ngrid,nlayer |
comm_HR_LW |
real allocatable save module variable |
9 |
长波加热率缓存,二维 ngrid,nlayer |
comm_SWDOWNZ |
real allocatable save module variable |
10 |
地表向下短波通量缓存,长度 ngrid |
comm_TAU_DUST |
real allocatable save module variable |
11 |
参考可见尘埃光学厚度缓存,长度 ngrid |
comm_RDUST |
real allocatable save module variable |
12 |
尘埃半径缓存,二维 ngrid,nlayer |
comm_QSURFDUST |
real allocatable save module variable |
13 |
地表尘埃质量缓存,长度 ngrid |
comm_MTOT |
real allocatable save module variable |
14 |
水汽柱量转换后的缓存,长度 ngrid |
comm_ICETOT |
real allocatable save module variable |
15 |
水冰柱量转换后的缓存,长度 ngrid |
comm_VMR_ICE |
real allocatable save module variable |
16 |
水冰体积混合比缓存,二维 ngrid,nlayer |
comm_TAU_ICE |
real allocatable save module variable |
17 |
水冰云 TES 光学厚度缓存,长度 ngrid |
comm_RICE |
real allocatable save module variable |
18 |
水冰粒子半径缓存,二维 ngrid,nlayer |
allocate_comm_wrf |
subroutine |
26 |
按 ngrid,nlayer 分配未分配的 comm_* 数组 |
deallocate_comm_wrf |
subroutine |
43 |
无条件释放所有 comm_* 数组 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
本模块没有 use 依赖 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
| 无外部例程 |
- |
- |
本模块只调用 Fortran allocated/allocate/deallocate 内建机制 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
physiq_mod.F 的 MESOSCALE 分支调用 allocate_comm_wrf |
integer scalar |
- |
物理网格列数 |
nlayer |
physiq_mod.F 的 MESOSCALE 分支调用 allocate_comm_wrf |
integer scalar |
- |
垂直层数 |
zdtsw(ngrid,nlayer) |
physiq_mod.F 辐射计算后局部数组 |
real array |
K/s |
短波加热率,写入 comm_HR_SW |
zdtlw(ngrid,nlayer) |
physiq_mod.F 辐射计算后局部数组 |
real array |
K/s |
长波加热率,写入 comm_HR_LW |
fluxsurf_dn_sw_tot(ngrid,*) |
physiq_mod.F 辐射通量数组 |
real array |
W m-2 |
第 1 个坡面/平面索引的地表向下短波通量 |
tau_pref_gcm(ngrid) |
physiq_mod.F 尘埃光学厚度状态 |
real array |
- |
参考可见尘埃光学厚度 |
rdust(ngrid,nlayer) |
physiq_mod.F 尘埃半径数组 |
real array |
m |
尘埃粒子半径 |
qsurf(:,igcm_dust_mass,1) |
physiq_mod.F 地表 tracer 数组 |
real array |
kg m-2 |
地表尘埃质量;尘埃质量 tracer 不存在时输出 0 |
mtot(ngrid) / icetot(ngrid) |
physiq_mod.F 水循环柱积分数组 |
real array |
kg m-2 |
水汽/水冰柱质量,写入前乘 1.e6/rho_ice |
zq(:,:,igcm_h2o_ice)、mmean、mmol |
physiq_mod.F tracer 与平均分子量状态 |
real arrays |
- |
水冰体积混合比换算来源 |
taucloudtes / tauTES |
physiq_mod.F 水冰云光学厚度数组 |
real array |
- |
activice 为真时用 taucloudtes,否则用 tauTES |
rice(ngrid,nlayer) |
physiq_mod.F 水冰粒子半径数组 |
real array |
m |
写入 comm_RICE |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
comm_HR_SW |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid,nlayer) |
K/s |
WRF state 注释名 HR_SW |
comm_HR_LW |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid,nlayer) |
K/s |
WRF state 注释名 HR_LW |
comm_SWDOWNZ |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid) |
W m-2 |
WRF state 注释名 SWDOWNZ |
comm_TAU_DUST |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid) |
- |
WRF state 注释名 TAU_DUST |
comm_RDUST |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid,nlayer) |
m |
WRF state 注释名 RDUST |
comm_QSURFDUST |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid) |
kg m-2 |
WRF state 注释名 QSURFDUST |
comm_MTOT |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid) |
pmic |
水汽柱质量折算为微米冰等效厚度 |
comm_ICETOT |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid) |
pmic,源码注释有不一致 |
水冰柱质量同样乘 1.e6/rho_ice |
comm_VMR_ICE |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid,nlayer) |
ppm |
水冰体积混合比 |
comm_TAU_ICE |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid) |
- |
TES 波数处水冰云光学厚度 |
comm_RICE |
MESOSCALE/WRF 输出接口,推断 |
real allocatable (ngrid,nlayer) |
m |
水冰粒子半径 |
共享状态与副作用
- 所有
comm_* 数组都是 REAL,SAVE,ALLOCATABLE 模块变量。
- 源码行 20-22 用 OpenMP
THREADPRIVATE 声明全部 comm_* 数组。
allocate_comm_wrf 对每个数组使用 .not.allocated(...) 保护,因此重复调用不会重复分配;但若网格维度改变而数组仍已分配,本例程不会自动重分配。
deallocate_comm_wrf 没有 allocated(...) 保护;若数组未分配时调用,Fortran 运行时可能报错。
- 全源码搜索只发现
physiq_mod.F 行 3260 调用 allocate_comm_wrf;未发现 deallocate_comm_wrf 的外部调用。
- 本文件不直接写文件、不调用
write_output,也不执行物理计算。
核心逻辑
physiq_mod.F 行 107-110 在 #ifdef MESOSCALE 分支中 use comm_wrf。
physiq_mod.F 行 3254 进入 MESOSCALE 输出段,行 3260 调用 allocate_comm_wrf(ngrid,nlayer)。
allocate_comm_wrf 逐个检查 11 个 comm_* 数组,未分配时按 ngrid 或 ngrid,nlayer 分配。
physiq_mod.F 行 3263-3297 把已计算的物理诊断量复制到 comm_* 数组。
- 若
igcm_dust_mass 不为 0,comm_QSURFDUST 取 qsurf(:,igcm_dust_mass,1);否则全设为 0。
comm_MTOT 和 comm_ICETOT 分别取 mtot、icetot 并乘 1.e6/rho_ice。
- 若
igcm_h2o_ice 不为 0,comm_VMR_ICE = 1.e6*zq(:,:,igcm_h2o_ice)*mmean/mmol(igcm_h2o_ice);否则全设为 0。
- 若
activice 为真,comm_TAU_ICE 取 taucloudtes;否则取 tauTES。
伪代码
module comm_wrf:
declare WRF-style diagnostic arrays as allocatable SAVE
mark all arrays THREADPRIVATE
allocate_comm_wrf(ngrid, nlayer):
for each 2-D diagnostic:
if not allocated, allocate(ngrid, nlayer)
for each 1-D diagnostic:
if not allocated, allocate(ngrid)
physiq MESOSCALE output block:
call allocate_comm_wrf(ngrid, nlayer)
copy shortwave/longwave heating rates
copy surface downward shortwave flux
copy dust optical depth and dust radius
if dust mass tracer exists:
copy surface dust mass
else:
write zero surface dust mass
convert water vapor and water ice column masses by 1e6/rho_ice
if water ice tracer exists:
compute water ice VMR in ppm
else:
write zero VMR
select active/inactive water ice optical depth source
copy water ice particle radius
参与的主题流程
| 主题 |
参与方式 |
| MESOSCALE / WRF 输出 |
在 #ifdef MESOSCALE 分支中为 WRF 风格 registry/state 输出缓存诊断数组 |
| 辐射诊断 |
缓存 zdtsw/zdtlw 加热率和 fluxsurf_dn_sw_tot 地表短波通量 |
| 尘埃诊断 |
缓存 tau_pref_gcm、rdust 和可选 qsurf(:,igcm_dust_mass,1) |
| 水循环诊断 |
缓存 mtot/icetot 的微米等效厚度、VMR_ICE、TAU_ICE 和 rice |
写法特点
- 模块本体是自由格式
.F90,但使用 LMD 共享状态风格:SAVE,ALLOCATABLE 加 THREADPRIVATE。
physiq_mod.F 中对应输出注释采用 WRF Registry 风格,例如 state real HR_SW ikj misc ... "K/s"。
comm_* 数组名是输出接口名的 Fortran 缓存形式;实际输出变量名由 physiq_mod.F 注释给出。
- 本模块没有
implicit none 放在模块层,只在两个子程序内部声明。
复现要点
- 这些数组只在
MESOSCALE 预处理分支中由 physiq_mod.F 填充;普通 GCM 非 MESOSCALE 编译不会执行该输出缓存段。
allocate_comm_wrf 不会在维度变化时重分配已存在数组;复现变网格或多实例场景时要先确认释放/重新分配策略。
deallocate_comm_wrf 没有分配状态保护,不能在数组未分配时直接调用。
comm_ICETOT 的 WRF 注释写成 kg m-2,但赋值和 comm_MTOT 一样乘了 1.e6/rho_ice;页面按源码赋值标为 pmic,并把注释不一致作为复现风险。
- 因为数组是
THREADPRIVATE,并行输出时需要确认写入线程与读取输出接口的线程一致或有明确同步。
待确认
- 外部 WRF/mesoscale 输出接口如何读取这些
comm_* 数组不在 LMDZ.MARS/libf 搜索结果中体现;本页只记录 phymars 侧写入证据。
deallocate_comm_wrf 未在当前源码树中被调用,是否由外部框架或链接单元调用需结合完整 MESOSCALE 构建确认。
comm_ICETOT 的注释单位与赋值换算不一致,需由 WRF 输出约定确认最终展示单位。
相关页面