growthrate.F
快速理解
它做什么: 水冰晶增长/升华阻力的解析辅助例程(F. Montmessin)。被 improvedclouds 调用。
基本过程: 输入温度/压强/饱和压/冰晶半径 → 计算水汽扩散系数 Dv 和总阻力 res。
关键结果: res 放入隐式 dMice 公式,决定微物理子步内水汽和水冰间的质量交换。
路径
LMDZ.MARS\libf\phymars\growthrate.F
所属目录 / 模块
libf\phymars
文件定位
growthrate.F 定义 growthrate_mod,提供水冰晶增长/升华阻力的局部解析辅助例程。它不直接推进水冰质量,而是根据温度、层中压强、饱和水汽分压和当前冰晶半径,计算水汽扩散系数 Dv 以及总阻力 res = Rk + Rd*(1+lambda*knudsen)。
当前源码搜索中,唯一外部调用点在 improvedclouds_mod.F90 的水冰增长段:improvedclouds 先用 sig_h2o 算 Kelvin 平衡饱和修正 seq,再调用 growthrate 得到 res,最后把 res 放入隐式 dMice 公式,决定本微物理子步内水汽和水冰之间交换多少质量。因此本文件是完整水云微物理中“单颗冰晶增长阻力/扩散系数”的计算部件,而不是云方案主调度器。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
growthrate_mod |
module | 1 | 封装水冰晶增长阻力辅助例程。 |
growthrate |
subroutine | 7 | 计算热阻 Rk、扩散阻 Rd、Knudsen 修正和水汽扩散系数,输出总阻力 res 与 Dv。 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
tracer_mod |
rho_ice |
水冰密度,用于热阻、扩散阻和冰晶质量-半径关系。 | 否 |
comcstfi_h |
pi |
圆周率,进入平均自由程常数和扩散系数公式。 | 否 |
microphys_h |
kbz, mh2o, mco2, molco2, molh2o |
Boltzmann 常数、H2O/CO2 摩尔质量和有效分子半径。 | 否 |
microphys_h |
nav, rgp, To |
Avogadro 常数、理想气体常数和参考温度。 | 否 |
调用的关键例程
| 被调用例程 | 所在模块 / 文件 | 调用位置 | 作用 |
|---|---|---|---|
无显式 CALL |
- | - | 本例程只使用 Fortran 内建 sqrt 和算术表达式。 |
上游调用点
| 调用方 | 所在文件 | 调用位置 | 用途 |
|---|---|---|---|
improvedclouds |
improvedclouds_mod.F90 |
第 327 行 | 在 ccn_number*tauscaling >= 1 的冰增长分支中,计算 res 和 Dv,随后用于隐式 dMice 冰增长/升华公式。 |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
temp |
调用方;improvedclouds 中为 zt(ig,l) |
REAL |
K | 当前格点/层的温度。 |
pmid |
调用方;improvedclouds 中为 pplay(ig,l) |
REAL |
Pa | 层中压强。源码注释误写为 temperature (K),实际公式把它作为压力使用。 |
psat |
调用方;improvedclouds 中为 real(ph2o/satu) |
REAL |
Pa | 水汽饱和分压。 |
rcrystal |
调用方;improvedclouds 中为 rice(ig,l) |
REAL |
m | 冰晶增长前半径。 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
res |
调用方局部变量;improvedclouds 还写入 res_out(ig,l) |
REAL |
resistance factor | 总增长阻力;improvedclouds 把它放入 res*zqsat/(cste*No*rice)+1 的隐式分母。 |
Dv |
调用方局部变量 | REAL |
推断:m2/s(按 SI 公式量纲) | H2O 在 CO2 背景气体中的水汽扩散系数;当前 improvedclouds 调用后没有直接再用 Dv。 |
共享状态与副作用
growthrate_mod 不定义保存型 module 变量,不读写文件,不打印日志,也不读取运行时配置。它只读取三个共享常数来源:tracer_mod::rho_ice、comcstfi_h::pi、microphys_h 的分子物理常数。副作用限于写入实参 res 和 Dv。
需要注意的是,rho_ice 是 tracer_mod 中的 save 变量,并声明为 OpenMP THREADPRIVATE;本文件不初始化它。复现 growthrate 时必须保证上游 tracer 初始化已经给 rho_ice 赋值,否则阻力量级会错误。
核心逻辑
- 由温度计算 CO2 热导率
k = (0.17913*temp - 13.9789) * 4.184e-4。 - 由温度和参考温度
To计算水冰升华潜热Lv = (2834.3 - 0.28*(temp-To) - 0.004*(temp-To)^2) * 1.e3。 - 构造平均自由程常数
afactor = 0.707*rgp/(4*pi*molco2^2*nav)。 - 用 H2O 热速度、H2O/CO2 碰撞截面和压强计算水汽扩散系数
Dv。 - 用
temp/pmid*afactor/rcrystal得到 Knudsen 数knudsen。 - 用
(1.333+0.71/knudsen)/(1+1/knudsen)得到非连续修正系数lambda。 - 计算潜热释放热阻
Rk = Lv^2*rho_ice*mh2o/(k*rgp*temp^2)。 - 计算水汽扩散阻力
Rd = rgp*temp*rho_ice/(Dv*psat*mh2o)。 - 输出
res = Rk + Rd*(1+lambda*knudsen);源码注释明确没有直接修正Dv,而是把修正放入阻力项。
伪代码
growthrate(temp, pmid, psat, rcrystal):
k = thermal_conductivity_CO2(temp)
Lv = latent_heat_H2O(temp)
afactor = 0.707 * R / (4*pi*molco2^2*Avogadro)
Dv = one_third * thermal_speed_H2O(temp)
* k_B * temp
/ (pi * pmid * (molco2+molh2o)^2 * sqrt(1+mh2o/mco2))
knudsen = temp / pmid * afactor / rcrystal
lambda = (1.333 + 0.71/knudsen) / (1 + 1/knudsen)
Rk = Lv^2 * rho_ice * mh2o / (k * R * temp^2)
Rd = R * temp * rho_ice / (Dv * psat * mh2o)
res = Rk + Rd * (1 + lambda * knudsen)
return res, Dv
in improvedclouds:
seq = Kelvin_equilibrium_saturation(...)
growthrate(T, pplay, ph2o/satu, rice, -> res, -> Dv)
dMice = (h2o_vap - seq*zqsat) / (res*zqsat/(4*pi*rho_ice*dt*No*rice) + 1)
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 水循环 | 在 microphys=.true. 的完整水冰云微物理中提供冰晶增长/升华阻力,影响 dMice 和潜热反馈。 |
| improvedclouds_mod | 唯一调用方;在冰增长分支中把 growthrate 输出接入隐式质量交换公式。 |
写法特点
- 文件扩展名为
.F,但内部使用 module/subroutine 结构;源码采用固定格式续行&。 - Kelvin 平衡饱和项
seq不在本文件计算,只在注释中保留公式;当前调用方improvedclouds已在调用前计算seq。 - 源码注释保留了旧方案的显式增长率公式
growth = ...和半径更新公式,但当前实际运行路径只输出阻力res。 Dv的非连续修正行被注释掉;实际修正体现在res = Rk + Rd*(1+lambda*knudsen)。
复现要点
pmid必须按压力传入。虽然参数注释写了(K),Dv和knudsen公式都把它作为 Pa 量级的压强。psat在当前主调用中来自ph2o/satu,不是 Kelvin 修正后的seq*zqsat;Kelvin 修正由improvedclouds单独处理。- 不要把
Dv再除以(1+lambda*knudsen);源码明确把这一行注释掉,并把修正放在Rd的阻力乘子里。 rcrystal不在本文件内部做下限保护;调用方在计算seq时对rice用了max(rice,1.e-7),但传给growthrate的仍是原始rice(ig,l)。rho_ice由tracer_mod运行时状态提供,不是本文件常数;复现实验需先确认 tracer 物性初始化路径。
待确认
res的严格物理量纲没有在源码注释中给出;本页只记录它在improvedclouds隐式分母中的实际用法。rcrystal若极小或为零时本文件没有保护,是否完全依赖updaterice_micro的输出保证正半径,需要在updaterad.F90专页或后续源码核验中确认。
相关页面
- improvedclouds_mod
- watercloud_mod
- water-cycle
- water-cycle-config
- tracer_mod
- comcstfi_h
- microphys_h:提供本例程读取的分子常数、参考温度和气体常数。