zrecast.F90
路径
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 在最低层以下有外推逻辑,而最高层以上可能填缺测或做指数外推,边界层外结果需要谨慎解释。
相关页面