zrecast.F90
快速理解
它做什么: 独立命令行程序,把 GCM 输出从 sigma/hybrid 垂直坐标重投影到物理垂直坐标(压力/高度/半径)。
基本过程: 静力方程积分建立几何高度 → 按用户给定新垂直层插值 → 写新 NetCDF。
关键结果: 物理垂直坐标下的 NetCDF 场,是制图前的必要步骤。
路径
LMDZ.MARS\util\zrecast.F90
所属目录/模块
util
文件定位
zrecast.F90 是 LMD Mars GCM 输出的垂直坐标重投影工具。它读取 diagfi.nc、concat.nc 或 stats.nc 一类 lon-lat-alt-time 四维 NetCDF 场,把原始 GCM sigma 或 hybrid sigma 垂直坐标转换到物理垂直坐标:压力、areoid 以上高度、本地地表以上高度,或距行星中心半径。
util/README 明确说明 GCM 原始 hybrid 坐标不对应任何物理垂直坐标,zrecast 是制作可发表科学图像前的必要步骤。程序通过静力方程积分建立 GCM 层的几何高度/压力关系,再按用户给定的新垂直层进行插值,并把结果写入一个新的 NetCDF 文件。
本文件是独立命令行 program zrecast,不是运行时物理模块;它通过 stdin 交互或 zrecast.*.def 重定向输入。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
planet_const |
module | 1 | 保存由 controle 读出的行星半径、重力和平均气体常数。 |
zrecast |
program | 9 | 主程序:读输入文件、选择输出垂直坐标、构建压力/高度场、插值变量并写 NetCDF。 |
init_planet_const |
subroutine | 2163 | 从 controle 初始化 a0、g0、Rmean。 |
build_gcm_zs |
subroutine | 2217 | 在有 rho 时积分静力方程,构建 GCM 层的本地地表以上高度。 |
build_gcm_za |
subroutine | 2343 | 在有 rho 时构建 GCM 层的 areoid 以上高度。 |
build_zs |
subroutine | 2467 | 为 mcd 模式构建通用本地地表高度层。 |
crude_gcm_zs |
subroutine | 2528 | 无 rho 时用常数 Rmean 近似构建本地地表以上高度。 |
crude_gcm_za |
subroutine | 2630 | 无 rho 时用常数 Rmean 近似构建 areoid 以上高度。 |
p_coord_interp |
subroutine | 2730 | 将变量插值到压力坐标;压力轴用 -log(P) 插值。 |
z_coord_interp |
subroutine | 2805 | 将变量插值到 areoid 高度或半径坐标。 |
zs_coord_interp |
subroutine | 2921 | 将变量插值到本地地表以上高度坐标,含近地外推分支。 |
interpolf |
subroutine | 3102 | 一维插值辅助例程。 |
build_gcm_ra |
subroutine | 3144 | 基于 areoid 半径和高度构建距行星中心半径坐标。 |
areoid_ini |
subroutine | 3224 | 初始化 areoid 球谐系数。 |
geoid |
subroutine | 9839 | 计算给定经纬度的 areoid 半径(输出参数 rg)。 |
LGNDR |
subroutine | 9905 | Legendre 多项式相关辅助例程。 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
netcdf |
(全部) | init_planet_const 使用 nf90 接口读取 controle。 |
|
planet_const |
(全部) | 主程序和高度构建例程共享 a0、g0、Rmean。 |
主程序主体还包含 include 'netcdf.inc',大量使用旧式 NetCDF Fortran NF_* 接口读写文件。
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
init_planet_const |
本文件 | 主程序读入维度和 controle 后 |
初始化行星常数,供高度和半径计算使用。 |
build_gcm_zs / crude_gcm_zs |
本文件 | 构建本地地表高度输出前 | 根据是否有 rho 选择精细或近似静力积分。 |
build_gcm_za / crude_gcm_za |
本文件 | 构建 areoid 高度输出前 | 根据是否有 rho 选择精细或近似静力积分。 |
build_zs |
本文件 | mcd 本地地表高度层模式 |
用参考压力和高度尺度生成通用 zsurface 层。 |
build_gcm_ra |
本文件 | 半径坐标输出 | 调用 areoid 相关例程,把 areoid 高度转为距行星中心半径。 |
p_coord_interp |
本文件 | 压力坐标输出变量循环 | 在压力维上插值变量,并额外生成 zareoid。 |
z_coord_interp |
本文件 | areoid 高度或半径输出变量循环 | 在几何高度/半径维上插值变量,并额外生成 pressure。 |
zs_coord_interp |
本文件 | 本地地表高度输出变量循环 | 在本地地表高度维上插值变量,并额外生成 pressure。 |
areoid_ini / geoid |
本文件 | build_gcm_ra 内部 |
用内置 Lemoine/MOLA 系数计算 areoid 半径。 |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
| 输入文件名 | stdin / .def |
NetCDF 文件 | - | diagfi.nc、concat.nc、stats.nc 一类 GCM 输出。 |
| 变量列表 | stdin / .def |
字符串列表 | - | 要重投影的变量名;空行结束。 |
| 输出坐标类型 | stdin / .def |
整数选项 | - | 1=压力,2=areoid 以上高度,3=本地地表以上高度,4=距行星中心半径。 |
| 垂直层定义模式 | stdin / .def |
yes / no / mcd |
- | yes 用 min/max/nlevels 自动生成;no 手动逐层输入;mcd 为本地地表高度专用层构建。 |
ps |
输入 NetCDF | REAL(lon,lat,time) | Pa | 地表压力,用于从 sigma/hybrid 层计算压力。 |
temp 或候选温度名 |
输入 NetCDF | REAL(lon,lat,alt,time) | K | 静力积分所需温度;源码还尝试 t、teta、temperature 等候选名。 |
sigma 或 aps/bps |
输入 NetCDF | REAL(alt) | - / Pa | GCM 原始垂直层;优先找 sigma,否则找 hybrid 坐标。 |
phisinit |
输入文件或回退文件 | REAL(lon,lat) | m2 s-2 | 地表位势;当前文件无此变量时,回退查找 diagfi.nc、diagfi1.nc、phisinit.nc。 |
rho |
输入 NetCDF | REAL(lon,lat,alt,time) | kg m-3 | 可选密度;存在时用 R=P/(rho*T) 计算局地气体常数。 |
controle |
输入文件或回退文件 | REAL(n) | 混合 | 可选控制数组;用于读 a0=controle(5)、g0=controle(7)、Rmean=1000*8.314511/controle(8)。 |
示例输入文件:
zrecast.auto.def:
../stats.nc
temp
2
yes
-2000 2000
3
zrecast.manual.def:
../stats.nc
temp
2
no
3
-2000
0
1000
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
name_of_input_file_P.nc |
磁盘 | NetCDF | - | 压力坐标输出。 |
name_of_input_file_A.nc |
磁盘 | NetCDF | - | areoid 以上高度坐标输出。 |
name_of_input_file_S.nc |
磁盘 | NetCDF | - | 本地地表以上高度坐标输出。 |
name_of_input_file_R.nc |
磁盘 | NetCDF | - | 距行星中心半径坐标输出。 |
| 用户选择的变量 | 输出文件 | REAL(lon,lat,newalt,time) | 随变量 | 在新垂直坐标上的插值结果。 |
zareoid |
压力坐标输出 | REAL(lon,lat,newalt,time) | m | 压力层对应的 areoid 以上高度。 |
pressure |
高度/本地高度/半径输出 | REAL(lon,lat,newalt,time) | Pa | 新几何坐标层对应的大气压力。 |
phisinit |
输出文件 | REAL(lon,lat) | m2 s-2 | 2021 修改后加入输出,保留地表位势。 |
sigma 或 aps/bps |
输出文件 | REAL(alt) | - / Pa | 原始 GCM 垂直层信息。 |
controle |
输出文件 | REAL(n) | 混合 | 若输入可得,则复制到输出。 |
共享状态与副作用
- 文件副作用:读取输入 NetCDF 和可能的回退文件
diagfi.nc、diagfi1.nc、phisinit.nc;创建新的*_P.nc、*_A.nc、*_S.nc或*_R.nc。 - stdout 交互提示:程序通过
write(*,*)输出大量选择菜单、查找提示和错误信息。 - 硬停止:多数 NetCDF 错误、缺少必要维度/变量、非法输入值都会直接
stop。 - 全局常数:
planet_const中的a0、g0、Rmean由controle初始化,之后被高度积分和 areoid/半径计算使用。 - 内置 areoid 数据:半径坐标分支依赖文件末尾内嵌的 Lemoine/MOLA 系数,而不是外部数据文件。
核心逻辑
- 读输入文件和维度:打开用户指定的 GCM 输出,读取 longitude、latitude、altitude、Time 维度,收集变量列表、
ps、温度、sigma或aps/bps、phisinit、可选rho和controle。 - 初始化行星常数:
init_planet_const从controle读行星半径、参考重力和平均气体常数;若当前输入文件没有controle,继续查找diagfi.nc和diagfi1.nc。 - 选择目标垂直坐标:用户选择压力、areoid 高度、本地地表高度或半径坐标;层数可由 min/max/nlevels 自动生成,也可逐层手动输入。本地地表高度还有
mcd特殊构建模式。 - 构建原始 GCM 层压力:若有
sigma,按P=sigma*ps;否则按P=aps+bps*ps。 - 构建几何高度关系:需要高度坐标时,程序积分静力方程。若有
rho,用R=P/(rho*T);若没有rho,使用Rmean的近似分支。 - 定义输出 NetCDF:复制维度、坐标、
phisinit、原始 sigma/hybrid 层和可得的controle;根据输出模式定义pressure或zareoid辅助变量。 - 逐变量垂直插值:对用户选择的变量读取四维场;
rho*和num_*前缀变量设置为 log-space 插值;其他变量按线性或压力对数坐标规则插值。 - 写结果并关闭文件:每个变量写入输出文件,最后写辅助坐标变量、关闭输入/输出 NetCDF。
伪代码
program zrecast:
read infile and variable list from stdin
open NetCDF input; read lon/lat/alt/time and ps
read temp from preferred or fallback names
read sigma, else aps/bps
read phisinit from input, else diagfi.nc, diagfi1.nc, phisinit.nc
optionally read rho and controle
init_planet_const(controle)
ask output vertical coordinate:
1 pressure -> build target pressures
2 above areoid -> build target zareoid levels
3 above local surface -> build target zsurface levels
4 radius -> build target radius levels
compute original pressure on GCM levels:
if sigma: press = sigma * ps
else: press = aps + bps * ps
if target needs height:
if rho exists: use hydrostatic integration with R=P/(rho*T)
else: use crude integration with Rmean
if radius target: add areoid radius from geoid()
create output file and metadata
for each requested variable:
read 4D data
flag = log interpolation if variable starts with "rho" or "num_"
if pressure target:
p_coord_interp(...)
else if areoid or radius target:
z_coord_interp(...)
else if local-surface target:
zs_coord_interp(...)
write output variable
write pressure or zareoid auxiliary field; close files
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| GCM 后处理与绘图 | 把原始 hybrid 坐标输出转换到科学图像可解释的压力或几何高度坐标。 |
| 观测比较链 | extract 和部分观测比较流程通常需要先运行 zrecast,使输入文件拥有压力或几何高度垂直坐标。 |
| util 工具链 | 常规链路为 concatnc 拼接输出后,运行 zrecast 生成物理垂直坐标,再交给 localtime、lslin、solzenangle 或 extract。 |
写法特点
- 混合 NetCDF API:主程序使用
netcdf.inc里的NF_*旧接口,init_planet_const使用use netcdf的 nf90 接口。 - 交互式 stdin 驱动:与 util 目录其他工具一致,既可回答屏幕问题,也可用
.def文件重定向。 - 变量名前缀规则:
rho*和num_*变量被强制按对数空间插值,用来处理密度或数密度廓线。 - 多层回退查找:
phisinit和controle不只从当前输入文件读取,还会在常见伴随文件中查找。 - 常数和经验层构建:
build_zs使用P_ref=610、低层/高层尺度高度和 tanh 过渡,为mcd模式生成本地高度层。 - 半径坐标自带 areoid 模型:
build_gcm_ra通过areoid_ini/geoid使用文件内嵌球谐系数计算 areoid 半径。
复现要点
- 输入文件必须包含
ps、温度变量、sigma或aps/bps,并能提供phisinit;否则程序会在回退文件中查找,失败则停止。 - 温度变量名最好显式给出;源码有候选名回退,但不同历史输出的命名差异会影响自动识别。
- 若缺少
rho,高度积分会退化为常数Rmean近似;同一输出坐标下,含rho和不含rho的结果并不完全等价。 - 对密度、数密度一类变量,应确保变量名以
rho或num_开头,否则不会触发 log-space 垂直插值。 - 压力坐标输出会额外写
zareoid;高度/本地高度/半径坐标输出会额外写pressure,后续工具应读取正确的辅助变量。 zrecast.auto.def的自动层模式输入顺序是:输入文件、变量列表空行、坐标类型、yes、min/max、层数;手动层模式则是:坐标类型、no、层数、逐层值。
待确认
- 源码注释说明压力坐标输出时缺少温度可被容忍;本页尚未逐行验证所有缺温分支的行为。
temp的候选变量名回退已按源码搜索记录,具体优先级和所有提示文本未在本文完整展开。- 半径坐标的 areoid 系数来自文件内嵌常数,未与外部 MOLA/Lemoine 数据版本做数值核对。
复现风险
- 程序大量使用
stop,批处理链中任一缺失变量或 NetCDF 错误都会终止而不生成可用的部分结果。 - 回退读取
diagfi.nc、diagfi1.nc、phisinit.nc依赖当前工作目录,移动.def或在其他目录运行时容易找不到伴随文件。 stats.nc、diagfi.nc和concat.nc的时间覆盖、变量维度和命名可能不同;重投影前应先用ncdump或同类工具确认。- 本地地表高度的
zs_coord_interp在最低层以下有外推逻辑,而最高层以上可能填缺测或做指数外推,边界层外结果需要谨慎解释。
相关页面
- util/index.md - util 后处理工具总览。
- simu_MCS.md - 同属 util 的观测模拟和分箱比较工具。
- extract.md:常接在
zrecast后抽取点值或廓线。