tracer_mass_fixer_dyn_mod.F90

路径

LMDZ.MARS\libf\phymars\tracer_mass_fixer_dyn_mod.F90

所属目录/模块

libf/phymars

文件定位

tracer_mass_fixer_dyn_mod.F90 修正动力学过程中对大气成分占比显著的 tracer(CO、O₂、H₂、HO₂、H₂O₂、N₂、Ar、He)的质量非守恒问题。它在每个物理时步开始时,比较当前 tracer 全球总质量与上一时步结束时的值,按比例缩放所有层的混合比,确保动力传输不产生虚假的质量源/汇。

作者:Y. Luo(2026 年 3 月)。通过 callphys.defcall_mass_fixer_dyn 开关控制。

定义的符号

符号 类型 行号 作用
tracer_mass_fixer_dyn_mod module 1 包裹所有子程序和共享状态的模块
call_mass_fixer_dyn logical, save 5 配置开关,由 conf_physcallphys.def 读取
found_startfi_co/o2/h2/ho2/h2o2/n2/ar/he logical, save 6–13 标记 startfi.nc 中是否找到对应 mass_predyn_<tracer> 字段
mass_predyn(nq) real, allocatable, save 14 上一时步结束时各 tracer 全球总质量(数组)
mass_predyn_co/o2/h2/ho2/h2o2/n2/ar/he real, save 16–17 上一时步结束时各 tracer 全球总质量(标量,用于 startfi I/O)
tracer_mass_fixer_dyn subroutine 28 主修正例程:计算修正因子并返回 tendency
compute_tracer_mass_global subroutine 102 计算单个 tracer 的全球总质量
set_mass_predyn_from_startfi subroutine 154 从 startfi 标量赋值到 mass_predyn 数组
ini_tracer_mass_fixer_dyn subroutine 195 分配 mass_predyn 数组
end_tracer_mass_fixer_dyn subroutine 209 释放 mass_predyn 数组

依赖的模块

use 模块 only 列表 用途 待确认
tracer_mod noms, igcm_co, igcm_o2, igcm_h2, igcm_ho2, igcm_h2o2, igcm_n2, igcm_ar, igcm_he, mmol tracer 名称、索引和分子量
comcstfi_h g 重力加速度
geometry_mod cell_area 网格面积(全球质量积分)
planetwide_mod planetwide_sumval 全球求和(MPI 归约)

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
compute_tracer_mass_global 本模块 行 54 计算各 tracer 的全球总质量
planetwide_sumval planetwide_mod 行 145–147 全球求和(MPI 归约)
set_mass_predyn_from_startfi 本模块 physiq_modfirstcall 时调用 从 startfi 标量赋值到 mass_predyn 数组
ini_tracer_mass_fixer_dyn 本模块 phys_state_var_init_mod 调用 分配 mass_predyn 数组
end_tracer_mass_fixer_dyn 本模块 phys_state_var_init_mod 调用 释放 mass_predyn 数组

输入

tracer_mass_fixer_dyn

输入 来源 类型/维度 单位 含义
ngrid physiq integer 水平网格点数
nlayer physiq integer 垂直层数
nq physiq integer tracer 数量
ptimestep physiq real s 物理时步
pq(ngrid,nlayer,nq) physiq real kg/kg tracer 质量混合比
zplev(ngrid,nlayer+1) physiq real Pa 层界面气压
firstcall physiq logical 首次调用标志

compute_tracer_mass_global

输入 来源 类型/维度 单位 含义
pq(ngrid,nlayer,nq) 同上 real kg/kg tracer 质量混合比
zplev(ngrid,nlayer+1) 同上 real Pa 层界面气压

输出

tracer_mass_fixer_dyn

输出 去向 类型/维度 单位 含义
pdq_corrdyn(ngrid,nlayer,nq) physiq(加到 pdq real kg/kg/s tracer 质量修正 tendency

compute_tracer_mass_global

输出 去向 类型/维度 单位 含义
mass(nq) 调用方 real kg 各 tracer 的全球总质量

共享状态与副作用

核心逻辑

主修正流程(tracer_mass_fixer_dyn,行 28–100)

  1. 计算当前全球质量(行 54):调用 compute_tracer_mass_global 得到 mass_postdyn
  2. 逐 tracer 修正(行 58–96):对 8 个指定 tracer(CO、O₂、H₂、HO₂、H₂O₂、N₂、Ar、He):
    • 条件:tracer 存在(igcm_xx ≠ 0)且有有效参考质量(firstcall 时需 found_startfi_xx,后续时步直接用 mass_predyn
    • 修正因子:masscorrfac = mass_predyn / mass_postdyn
    • 修正混合比:pq_corrdyn = pq * masscorrfac
  3. 计算 tendency(行 98):pdq_corrdyn = (pq_corrdyn - pq) / ptimestep

全球质量计算(compute_tracer_mass_global,行 102–152)

初始化(ini_tracer_mass_fixer_dyn,行 195–207)

startfi 读写

伪代码

! tracer_mass_fixer_dyn
mass_postdyn = compute_tracer_mass_global(pq, zplev)

for each tracer in {co, o2, h2, ho2, h2o2, n2, ar, he}:
  if tracer exists and (not firstcall or found_startfi):
    masscorrfac = mass_predyn / mass_postdyn
    pq_corrdyn = pq * masscorrfac

pdq_corrdyn = (pq_corrdyn - pq) / dt

! compute_tracer_mass_global
for each target tracer:
  for each column:
    colden = Σ_layers pq * Δp * 6.022e22 / (mmol * g)
  mass = planetwide_sumval(colden / 6.022e23 * mmol * 1e4 * cell_area)

参与的主题流程

主题 参与方式
动力学-物理耦合 修正动力学传输产生的 tracer 质量非守恒
大气成分 保护 CO、O₂、N₂ 等主要大气成分的质量守恒

写法特点

复现要点

待确认

相关页面