水饱和与凝结温度辅助函数页
文件组
| 文件 |
路径 |
watersat_mod.F90 |
LMDZ.MARS\libf\phymars\watersat_mod.F90 |
tcondwater.F90 |
LMDZ.MARS\libf\phymars\tcondwater.F90 |
所属目录/模块
libf/phymars
文件组定位
这两个文件提供水冰凝结的热力学基础计算:
watersat_mod.F90:给定温度和气压计算水饱和质量混合比 (kg/kg)
tcondwater.F90:给定气压和水质量混合比反推凝结温度 (K)
二者基于同一参数化公式(Laurent Li / Murphy & Koop 2005),形式上互为逆运算,是水循环、水云微物理和边界层的核心热力学入口。
定义的符号
| 符号 |
文件 |
类型 |
行号 |
作用 |
watersat_mod |
watersat_mod.F90 |
module |
1 |
封装 watersat 的模块 |
watersat |
watersat_mod.F90 |
subroutine |
19 |
给定 T、P 计算水饱和混合比 |
tcondwater_mod |
tcondwater.F90 |
module |
1 |
封装 tcondwater 的模块 |
tcondwater |
tcondwater.F90 |
subroutine |
7 |
给定 P、q 反推凝结温度 |
依赖的模块
| use 模块 |
来源文件 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
- |
- |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
| 无外部调用 |
- |
- |
纯函数式计算,无子例程调用 |
输入
watersat
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
gridsize |
调用点 |
INTEGER, scalar |
- |
数组维度 |
T |
调用点 |
REAL (gridsize) |
K |
温度数组 |
p |
调用点 |
REAL (gridsize) |
Pa |
总气压数组 |
tcondwater
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
调用点 |
INTEGER, scalar |
- |
水平网格数 |
nlay |
调用点 |
INTEGER, scalar |
- |
垂直层数 |
p |
调用点 |
REAL (ngrid,nlay) |
Pa |
总气压 |
q |
调用点 |
REAL (ngrid,nlay) |
kg/kg |
水质量混合比(watercloud_mod 传入 h2o_vap + h2o_ice) |
输出
watersat
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
qsat |
调用点 |
REAL (gridsize) |
kg/kg |
水饱和质量混合比 |
tcondwater
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
tcond |
调用点 |
REAL (ngrid,nlay) |
K |
水凝结温度 |
共享状态与副作用
- 无 module 变量读写
- 无文件 I/O
- 纯函数式计算,无副作用
核心逻辑
watersat
- 计算分子量比
epsi = 18.0/44.0(≈0.4091,H2O/CO2 分子量比)。
- 按参数化公式计算冰面饱和蒸汽压(Pa):
psat = 100.0 × 10^(2.07023 − 0.00320991×T − 2484.896/T + 3.56654×log₁₀(T))
- 公式来源:Laurent Li 参数化,基于 Murphy & Koop (2005)(QJRMS)
100.0 因子将 mbar 转换为 Pa
- 若
psat > P(总气压),设 qsat = 1(完全饱和保护)。
- 否则
qsat = epsi × psat / (P − (1−epsi) × psat),并取 max(qsat, 1e-30) 防止极小值。
tcondwater
- 计算
x = log₁₀(max(q, 1e-16) × p / (100 × 0.41))。
100 将 mbar 因子归一化,0.41 ≈ epsi = 18/44
max(q, 1e-16) 防止非正数取对数
- 用 5 阶多项式反解温度:
tcond = 252.8466 + 23.9230×x + 2.21334×x² + 0.179978×x³ + 0.0100068×x⁴ + 0.000255145×x⁵
- 多项式系数通过数值拟合得到(源码注释记录了 5~12 阶的多组系数和最大误差)
- 5 阶拟合最大绝对误差:0.0604 K
伪代码
watersat
watersat(gridsize, T, p, qsat):
epsi = 18.0 / 44.0
对 i = 1 到 gridsize:
psat = 100.0 * 10^(2.07023 - 0.00320991*T(i) - 2484.896/T(i) + 3.56654*log10(T(i)))
if psat > p(i):
qsat(i) = 1.0
else:
qsat(i) = epsi * psat / (p(i) - (1 - epsi) * psat)
qsat(i) = max(qsat(i), 1e-30)
tcondwater
tcondwater(ngrid, nlay, p, q, tcond):
对 i = 1 到 ngrid:
对 j = 1 到 nlay:
x = log10(max(q(i,j), 1e-16) * p(i,j) / (100.0 * 0.41))
tcond(i,j) = 252.8466 + 23.9230*x + 2.21334*x² + 0.179978*x³
+ 0.0100068*x⁴ + 0.000255145*x⁵
参与的主题流程
| 主题 |
参与方式 |
| 水循环 (water-cycle) |
为水云微物理和边界层提供饱和判据和凝结温度 |
| 水冰云形成 |
watercloud_mod 调用 tcondwater(行 248)计算 CLFvarying 凝结温度,调用 watersat(行 564)检查过饱和 |
| 边界层 |
vdifc、vdif_cd、pbl_parameters 调用 watersat 计算地表饱和混合比 |
写法特点
watersat_mod.F90 为自由格式 Fortran 90,tcondwater.F90 为自由格式 Fortran 90。
- 无
use、SAVE、THREADPRIVATE 或编译宏。
epsi = 18./44. 为硬编码分子量比,注释提到"Perhaps should be recomputed properly if mu_dry changes"。
tcondwater 中 0.41 硬编码等同于 epsi,源码注释提到 2014 年 6 月 10 日调整了运算优先级。
tcondwater 源码注释保留了 5~12 阶多组多项式系数和误差对比,最终选用 5 阶(最大误差 0.06 K)。
watersat 的 psat > P 保护直接返回 qsat=1,而非限制为某个最大值。
复现要点
watersat 的饱和蒸汽压公式基于 Murphy & Koop (2005),是冰面饱和(非液面)。
epsi = 18./44. 硬编码假设干大气为纯 CO2;若干大气成分变化需同步修改。
tcondwater 的 5 阶多项式拟合最大误差 0.06 K,源码注释记录了更高阶系数(12 阶误差 2.7e-5 K)。
tcondwater 输入 q 在 watercloud_mod 中传入 h2o_vap + h2o_ice(气+冰相总水),而非仅水汽。
tcondwater 中 max(q, 1e-16) 保护防止非正数取对数。
待确认
epsi = 18./44. 假设干大气为纯 CO2——实际火星大气含 Ar、N2 等,mmean 不严格等于 44,但 watersat 不使用 conc_mod::mmean(与 tcondco2 不同)。
tcondwater 的多项式拟合适用温度/压力范围——源码注释未明确标注。
watersat 的 psat > P 保护返回 qsat=1 是否为有意设计(物理上意味着总气压低于饱和蒸汽压,即真空升华场景)。
复现风险
epsi 硬编码假设纯 CO2 大气,非真实火星大气成分。
tcondwater 多项式拟合精度 0.06 K——对大多数应用足够,但极端过饱和检测可能受影响。
相关页面