microphys_h.F90
路径
LMDZ.MARS\libf\phymars\microphys_h.F90
所属目录 / 模块
libf\phymars
文件定位
microphys_h.F90 定义 microphys_h 模块,是水冰和 CO2 云微物理共享的常数与线程私有状态头文件。它本身不含例程、不读配置、不执行计算;下游云方案、成核、增长阻力、质量传输和地表 HDO 通量例程通过 use microphys_h, only: ... 读取这些常数,或读写其中少量 SAVE 状态。
源码可分为两段:
- H2O/HDO/CO2/N2 的通用分子常数、水冰成核常数,以及水云微物理 bin 数和共享半径数组。
- CO2 云微物理常数、CO2 成核 bin 数、CO2 半径数组和接触参数。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
microphys_h |
module |
1 |
微物理共享常数和状态模块。 |
nbin_cld |
integer parameter |
10 |
水云微物理半径 bin 数,固定为 5。 |
To |
real parameter |
13 |
参考温度 273.15 K。 |
nav |
double precision parameter |
15 |
阿伏伽德罗常数。 |
rgp |
double precision parameter |
17 |
理想气体常数。 |
kbz |
double precision parameter |
19 |
Boltzmann 常数。 |
mh2o, mhdo, mco2, mn2 |
double precision parameter |
21, 23, 25, 27 |
H2O、HDO、CO2、N2 摩尔质量。 |
molco2, molh2o, molhdo |
double precision parameter |
30, 32, 34 |
气体分子有效半径。 |
sigh2o |
double precision parameter |
36 |
水冰/汽表面张力。 |
desorp, nus, surfdif, m0 |
double precision parameter |
40, 42, 46, 48 |
水分子在尘埃基底上的脱附、跳跃、表面扩散和单分子质量常数。 |
mteta |
real save, threadprivate |
52 |
水冰接触参数 m=cos(theta);由 conf_phys 初始化。 |
vo1 |
double precision save, threadprivate |
56 |
水分子体积;由 improvedclouds firstcall 写入。 |
rad_cld |
double precision save, threadprivate array |
59 |
水云微物理半径 bin;由 improvedclouds firstcall 写入。 |
nbinco2_cld |
integer parameter |
67 |
CO2 成核/云微物理 bin 数,固定为 100。 |
sigco2, desorpco2, nusco2, surfdifco2, m0co2 |
double precision parameter |
69, 73, 77, 81, 83 |
CO2 冰成核和质量传输常数。 |
mtetaco2 |
real parameter |
87 |
CO2 在尘埃/流星尘 CCN 上使用的固定接触参数。 |
vo1co2 |
double precision save, threadprivate |
90 |
CO2 分子体积;源码中声明为共享状态,本文件不初始化。 |
rad_cldco2 |
double precision save, threadprivate array |
94 |
CO2 云微物理半径 bin;由 co2cloud firstcall 写入。 |
threshJA |
real parameter |
97 |
微物理阈值参数,当前值为 1。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
无 |
本文件只声明常数和保存型变量,不 use 其他模块。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| 无 |
无 |
无 |
本文件不含可执行例程。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
mteta |
conf_phys.F 的 getin_p("mteta", mteta),仅 temp_dependent_m=.false. 时读配置 |
real scalar |
- |
水冰接触参数,默认 0.95。 |
rad_cld |
improvedclouds_mod.F90 firstcall |
double precision nbin_cld |
m |
水云微物理半径 bin。 |
vo1 |
improvedclouds_mod.F90 firstcall |
double precision scalar |
m3 |
水分子体积。 |
rad_cldco2 |
co2cloud_mod.F90 firstcall |
double precision nbinco2_cld |
m |
CO2 云微物理半径 bin。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
| H2O/HDO/CO2/N2 常数 |
growthrate, hdo_surfex, massflowrateco2, nuclea, nucleaco2, dust_coagulation_main 等 |
parameter |
见源码注释 |
分子质量、半径、气体常数、表面张力和成核常数。 |
mteta |
improvedclouds, improvedco2clouds, nuclea |
threadprivate saved scalar |
- |
水冰接触参数;CO2 水冰 CCN 分支也用它。 |
rad_cld / rad_cldco2 |
nuclea / nucleaco2、CO2 云分布展开 |
threadprivate arrays |
m |
成核和 CCN 尺度分布使用的半径网格。 |
m0 / m0co2 |
nuclea / nucleaco2 / dust_coagulation_mod |
parameter |
kg |
单分子质量。 |
共享状态与副作用
mteta、vo1、rad_cld、vo1co2、rad_cldco2 都是 SAVE 变量,并声明为 OpenMP THREADPRIVATE。
microphys_h 自身没有副作用;副作用来自下游初始化例程写这些共享变量。
conf_phys.F 行 863-872 默认 mteta=0.95,若 temp_dependent_m=.false. 则从 callphys.def 读 mteta。
improvedclouds_mod.F90 行 143-160 构造水云半径网格,行 182 写 vo1。
co2cloud_mod.F90 行 323-336 构造 CO2 半径网格,行 403-404 把 CO2 bin 边界取对数后保存到本地 rb_cldco2。
- 复现风险:直接调用
nuclea 或 nucleaco2 前,必须确保对应云方案 firstcall 已经给 rad_cld 或 rad_cldco2 赋值,否则成核率会依赖未初始化的线程私有数组。
核心逻辑
- 声明水云微物理 bin 数、参考温度、分子常数和水冰成核参数。
- 暴露水冰接触参数、单分子体积和半径数组,供
conf_phys / improvedclouds 初始化,供 nuclea 等例程读取。
- 声明 CO2 云微物理 bin 数、CO2 成核/扩散常数和固定接触参数
mtetaco2。
- 暴露 CO2 单分子体积和半径数组,供 CO2 云路径初始化并供
nucleaco2、improvedco2clouds、co2cloud 使用。
伪代码
module microphys_h:
define water/cloud constants:
nbin_cld = 5
To, nav, rgp, kbz
molecular masses and effective radii
water nucleation constants
m0 = mh2o / nav
declare threadprivate mutable water state:
mteta
vo1
rad_cld(nbin_cld)
define CO2 microphysics constants:
nbinco2_cld = 100
sigco2, desorpco2, nusco2, surfdifco2
m0co2 = mco2 / nav
mtetaco2 = 0.95
declare threadprivate mutable CO2 state:
vo1co2
rad_cldco2(nbinco2_cld)
threshJA = 1
参与的主题流程
| 主题 |
参与方式 |
| 水循环 |
为 improvedclouds、nuclea、growthrate、hdo_surfex 提供分子常数、水冰半径 bin 和接触参数。 |
| CO2 循环 |
为 co2cloud、improvedco2clouds、nucleaco2、massflowrateco2 提供 CO2 成核/增长常数和半径 bin。 |
| 尘埃循环 |
dust_coagulation_mod 读取 kbz 和 m0co2,CO2 / 水云 CCN 也通过尘埃 tracer 与微物理常数耦合。 |
写法特点
- 这是头文件式 Fortran module:没有
contains、没有例程、没有本地初始化过程。
- 参数常数和可写共享状态混在同一个模块内;读者需要区分
PARAMETER 常数和 SAVE THREADPRIVATE 状态。
mh2o、mhdo、mco2、mn2 注释为 kg.mol-1,但 m0=mh2o/nav 和 m0co2=mco2/nav 才是单分子质量。
mtetaco2 注释保留了 Bachnar 2016 值 0.78 和旧值 0.95,源码当前实际采用 0.95。
复现要点
- 水云成核路径需要先经过
conf_phys 初始化 mteta,再由 improvedclouds firstcall 初始化 rad_cld 和 vo1。
- CO2 成核路径需要先经过
co2cloud firstcall 初始化 rad_cldco2;improvedco2clouds 在尘埃、流星尘和水冰 CCN 分支中读取该数组。
THREADPRIVATE 表示并行线程各有一份变量;复现 OpenMP 运行时要保证每个线程都经历了相同初始化路径。
microphys_h 不读取 callphys.def;配置只通过 conf_phys 间接写入 mteta。
待确认
vo1co2 在本文件中声明,但本次只在 microphys_h.F90 和直接 use microphys_h 搜索中未定位到写入点;若后续页面依赖它,应继续全仓库核验。
improvedclouds_mod.md 已记录 mh2o 在 seq 公式和 vo1=mh2o/rho_ice 用法中的量纲疑点;本页按 microphys_h.F90 注释和源码定义记录,不把该疑点改写为结论。
相关页面