gencol.F90
路径
LMDZ.MARS\util\gencol.F90
所属目录/模块
util
文件定位
gencol.F90 是 LMD Mars GCM 输出的离线柱含量计算工具。它读取 diagfi.nc、concat.nc、stats.nc 一类 NetCDF 文件中的四维 tracer 变量,根据变量单位判断输入是质量混合比、体积混合比还是数浓度,再沿 hybrid 垂直层积分出二维水平场随时间变化的柱质量,输出文件名为 input_col.nc。
程序只选择维度数为 4 且单位属于 kg/kg、kg.kg-1、mol/mol、mol.mol-1、cm-3 或 m-3 的变量。输出变量名为原变量名追加 _col,单位固定写为 kg/m2。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
genCol |
program | 1 | 主程序:读取输入文件、筛选 tracer、读取 hybrid 坐标和辅助场,计算并写出柱含量。 |
initiate |
internal subroutine | 800 | 创建输出 NetCDF 文件,定义并写入 latitude/longitude/altitude/Time 坐标。 |
def_var |
internal subroutine | 923 | 在输出文件中定义变量并写入 title、units 属性。 |
getmm |
internal subroutine | 977 | 从变量名中解析物种名,并映射到分子量表;供 VMR 和数浓度转换使用。 |
依赖
| 依赖 | 用途 |
|---|---|
include "netcdf.inc" |
使用旧式 NetCDF Fortran NF_* 接口读写文件、变量、维度和属性。 |
调用的关键例程
| 被调用例程 | 所在位置 | 作用 |
|---|---|---|
NF_OPEN / NF_CLOSE |
NetCDF 库 | 打开输入文件、必要时打开 diagfi.nc 或 diagfi1.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/bps、ps、rho、mmean、temp、pressure 和 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.nc、concat.nc、stats.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/kg、mol/mol、cm-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 的柱质量。 |
副作用
- 使用
NF_CLOBBER创建输出,同名_col.nc会被覆盖。 - 输入文件和变量列表完全由标准输入提供,批处理时应保存实际
gencol.def。 - tracer、
rho、temp、press、locmm都按完整(lon,lat,alt,time)分配。 - 缺少
ps、必要 hybrid 坐标、未知分子量、浓度分支缺rho、NetCDF 读写失败时直接stop。
核心逻辑
- 打开输入文件,遍历所有变量,打印维度为 4 且单位为 MMR、VMR 或数浓度的变量。
- 用户输入
all或逐行列出变量;程序再次检查变量存在、维度为 4、单位可识别。 - 读取
latitude、longitude、Time、altitude。 - 优先从输入文件读取
ap/bp和aps/bps;若没有,则依次尝试当前目录的diagfi.nc和diagfi1.nc。 - 读取必需的
ps,可选读取rho。 - 优先读取
mmean。若读取失败且已有rho,尝试用temp与pressure计算locmm = rgp*rho*temp/pressure;若pressure不存在,则用aps+bps*ps回推;若仍不可行,则使用cstmm=rgp/Rmean。 - 创建
*_col.nc并写入坐标。 - 对每个选择 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。数浓度分支要求 rho 和 getmm 成功,累加 incMass/rho*tracer*tmpmm/nav,nav=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 后处理链 | 可接在 concatnc、zrecast 或原始 diagfi/stats 输出之后,把 tracer 场转换为柱质量诊断。 |
| 气溶胶与化学诊断 | 对质量混合比、体积混合比或数浓度 tracer 统一输出 kg/m2 柱量,便于与光学厚度、柱含量或观测产品比较。 |
复现要点
- 输入文件名必须以
.nc结尾;输出名通过去掉最后 3 个字符再拼_col.nc得到。 - 输入文件必须有
latitude、longitude、altitude、Time和ps。 ap/bp长度按altlength+1使用,aps/bps长度按altlength使用;若输入缺失,需要当前目录存在匹配的diagfi.nc或diagfi1.nc。- 只有四维变量会被处理;二维/三维 tracer 即使单位匹配也不会进入候选列表。
- 浓度变量必须同时有
rho,否则程序停止。 - VMR 或浓度变量名要能被
getmm解析出已知物种名。
待确认
- 源码中用
ps(ilon,ialt,it)计算回退压力,第三个索引位置按ps(lon,lat,time)声明看疑似应为ps(ilon,ilat,it);复现时按源码字面行为执行,需开发者确认意图。 - 输出
altitude的单位在initiate中固定写为km,没有读取输入altitude的原始单位。 getmm物种名比较大小写敏感,表中Ar_N2为混合大小写;实际变量名若使用ar_n2将无法匹配。locmm的单位处理依赖源码注释“mmean is stored in g/mol”,不同输入文件若单位不同需人工确认。
复现风险
_col.nc会被NF_CLOBBER覆盖。- 大网格和长时间序列会一次性分配多个四维数组,内存占用较高。
- 输入缺少
rho/temp/pressure/mmean时 VMR 转换会退到常数平均分子量,物理误差取决于大气组成变化。 getmm不识别新 tracer 名称时程序直接停止,需要扩展源码中的分子量表。
相关页面
- util/index.md - util 后处理工具总览。
- concatnc.md - 常见上游时间拼接工具。
- zrecast.md - 常见上游垂直坐标转换工具。
- hrecast.md - 常见水平重网格工具。