gencol.F90

路径

LMDZ.MARS\util\gencol.F90

所属目录/模块

util

文件定位

gencol.F90 是 LMD Mars GCM 输出的离线柱含量计算工具。它读取 diagfi.ncconcat.ncstats.nc 一类 NetCDF 文件中的四维 tracer 变量,根据变量单位判断输入是质量混合比、体积混合比还是数浓度,再沿 hybrid 垂直层积分出二维水平场随时间变化的柱质量,输出文件名为 input_col.nc

程序只选择维度数为 4 且单位属于 kg/kgkg.kg-1mol/molmol.mol-1cm-3m-3 的变量。输出变量名为原变量名追加 _col,单位固定写为 kg/m2

定义的符号

符号 类型 行号 作用
genCol program 1 主程序:读取输入文件、筛选 tracer、读取 hybrid 坐标和辅助场,计算并写出柱含量。
initiate internal subroutine 800 创建输出 NetCDF 文件,定义并写入 latitude/longitude/altitude/Time 坐标。
def_var internal subroutine 923 在输出文件中定义变量并写入 titleunits 属性。
getmm internal subroutine 977 从变量名中解析物种名,并映射到分子量表;供 VMR 和数浓度转换使用。

依赖

依赖 用途
include "netcdf.inc" 使用旧式 NetCDF Fortran NF_* 接口读写文件、变量、维度和属性。

调用的关键例程

被调用例程 所在位置 作用
NF_OPEN / NF_CLOSE NetCDF 库 打开输入文件、必要时打开 diagfi.ncdiagfi1.nc 读取 hybrid 坐标,最后关闭文件。
NF_INQ_NVARS / NF_INQ_VARNAME / NF_INQ_VARNDIMS / NF_GET_ATT_TEXT NetCDF 库 列出候选变量并按维度和单位筛选 tracer。
NF_INQ_DIMID / NF_INQ_DIMLEN / NF_INQ_VARID / NF_GET_VAR_REAL NetCDF 库 读取坐标、ap/bp/aps/bpspsrhommeantemppressure 和 tracer 数据。
NF_CREATE / NF_DEF_DIM / NF_DEF_VAR / NF_PUT_ATT_TEXT / NF_PUT_VAR_REAL NetCDF 库 创建 *_col.nc,定义坐标和 *_col 输出变量并写入结果。
initiate 本文件 创建输出文件与坐标变量。
def_var 本文件 封装变量定义和 title/units 属性写入。
getmm 本文件 vmr_*num_* 等变量查分子量。

输入

输入 来源 类型/维度 单位 含义
输入文件名 stdin / gencol.def NetCDF 文件名 - diagfi.ncconcat.ncstats.nc 等。
变量列表 stdin / gencol.def all 或逐行变量名,空行结束 - 要积分的 4D tracer;all 会自动选择全部合格 tracer。
latitude / longitude / altitude / Time 输入 NetCDF 1D 随文件 输出坐标的来源。
ap / bp 输入 NetCDF,或 diagfi.nc / diagfi1.nc altlength+1 Pa / 无量纲 hybrid 层界面坐标,用于每层空气质量。
aps / bps 输入 NetCDF,或 diagfi.nc / diagfi1.nc altlength Pa / 无量纲 hybrid 层中心坐标,用于必要时计算压力。
ps 输入 NetCDF (longitude,latitude,Time) Pa 地表压力;所有积分分支必需。
rho 输入 NetCDF (longitude,latitude,altitude,Time) kg m-3 数浓度转质量必需,也可用于反推局地平均分子量。
mmean 输入 NetCDF (longitude,latitude,altitude,Time) 源码注释按 g mol-1 处理 VMR 转质量时的局地平均分子量;读不到时尝试计算。
temp / pressure 输入 NetCDF (longitude,latitude,altitude,Time) K / Pa mmean 不可读且 rho 存在时,用理想气体关系反推 locmm
tracer 变量 输入 NetCDF 4D kg/kgmol/molcm-3 被积分的 tracer。

输出

输出 去向 类型/维度 单位 含义
input_col.nc 磁盘 NetCDF 文件 - infile(1:len_trim(infile)-3)//"_col.nc" 生成,会覆盖同名文件。
latitude / longitude / altitude / Time 输出 NetCDF 1D degrees / km / days since... 从输入坐标复制或按 initiate 的固定属性写出。
<var>_col 输出 NetCDF (longitude,latitude,Time) kg/m2 每个选择 tracer 的柱质量。

副作用

核心逻辑

  1. 打开输入文件,遍历所有变量,打印维度为 4 且单位为 MMR、VMR 或数浓度的变量。
  2. 用户输入 all 或逐行列出变量;程序再次检查变量存在、维度为 4、单位可识别。
  3. 读取 latitudelongitudeTimealtitude
  4. 优先从输入文件读取 ap/bpaps/bps;若没有,则依次尝试当前目录的 diagfi.ncdiagfi1.nc
  5. 读取必需的 ps,可选读取 rho
  6. 优先读取 mmean。若读取失败且已有 rho,尝试用 temppressure 计算 locmm = rgp*rho*temp/pressure;若 pressure 不存在,则用 aps+bps*ps 回推;若仍不可行,则使用 cstmm=rgp/Rmean
  7. 创建 *_col.nc 并写入坐标。
  8. 对每个选择 tracer 读取完整四维数组,按单位进入 MMR、VMR 或数浓度分支。

每层空气质量增量为:

incMass = ((ap(k)-ap(k+1)) + (bp(k)-bp(k+1))*ps(i,j,t)) / g

其中 g=3.72。MMR 分支累加 incMass*tracer。VMR 分支先用 getmm 得到物种分子量 tmpmm,常数平均分子量时累加 incMass*tracer*tmpmm/cstmm,局地平均分子量时累加 incMass*tracer*tmpmm/locmm*1.e3。数浓度分支要求 rhogetmm 成功,累加 incMass/rho*tracer*tmpmm/navnav=6.023d23;输入为 cm-3 时最终再乘 1.d6

伪代码

read infile
open input NetCDF
scan candidate 4D tracer variables by units
read selected variable list
read lon, lat, alt, Time
read ap/bp and aps/bps from input or diagfi fallback
read ps and optional rho
prepare local or constant mean molecular mass
create infile_col.nc
for each tracer:
  read tracer(lon,lat,alt,time)
  for each lon, lat, time:
    sum layer contributions using hybrid pressure thickness
  define and write tracer_col(lon,lat,time)

getmm 物种表

getmm 假设变量名格式为 *_name_**_name,用第一个和第二个下划线之间的字符串作为物种名。它覆盖 CO2/CO/O/O2/O3/H/H2/OH/HO2/H2O2/N2/CH4/Ar/N/NO/NO2、热层离子、水汽和冰、HDO 同位素等名称,最后把 g mol-1 转成 kg mol-1。

复现时要注意变量名必须让解析出的 varname 与表中字符串完全相等;否则 VMR 和数浓度分支会停止。

参与的主题流程

主题 参与方式
util 后处理链 可接在 concatnczrecast 或原始 diagfi/stats 输出之后,把 tracer 场转换为柱质量诊断。
气溶胶与化学诊断 对质量混合比、体积混合比或数浓度 tracer 统一输出 kg/m2 柱量,便于与光学厚度、柱含量或观测产品比较。

复现要点

待确认

复现风险

相关页面