zrecast.F90

路径

LMDZ.MARS\util\zrecast.F90

所属目录/模块

util

文件定位

zrecast.F90 是 LMD Mars GCM 输出的垂直坐标重投影工具。它读取 diagfi.ncconcat.ncstats.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 初始化 a0g0Rmean
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 (全部) 主程序和高度构建例程共享 a0g0Rmean

主程序主体还包含 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.ncconcat.ncstats.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 静力积分所需温度;源码还尝试 ttetatemperature 等候选名。
sigmaaps/bps 输入 NetCDF REAL(alt) - / Pa GCM 原始垂直层;优先找 sigma,否则找 hybrid 坐标。
phisinit 输入文件或回退文件 REAL(lon,lat) m2 s-2 地表位势;当前文件无此变量时,回退查找 diagfi.ncdiagfi1.ncphisinit.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 修改后加入输出,保留地表位势。
sigmaaps/bps 输出文件 REAL(alt) - / Pa 原始 GCM 垂直层信息。
controle 输出文件 REAL(n) 混合 若输入可得,则复制到输出。

共享状态与副作用

核心逻辑

  1. 读输入文件和维度:打开用户指定的 GCM 输出,读取 longitude、latitude、altitude、Time 维度,收集变量列表、ps、温度、sigmaaps/bpsphisinit、可选 rhocontrole
  2. 初始化行星常数init_planet_constcontrole 读行星半径、参考重力和平均气体常数;若当前输入文件没有 controle,继续查找 diagfi.ncdiagfi1.nc
  3. 选择目标垂直坐标:用户选择压力、areoid 高度、本地地表高度或半径坐标;层数可由 min/max/nlevels 自动生成,也可逐层手动输入。本地地表高度还有 mcd 特殊构建模式。
  4. 构建原始 GCM 层压力:若有 sigma,按 P=sigma*ps;否则按 P=aps+bps*ps
  5. 构建几何高度关系:需要高度坐标时,程序积分静力方程。若有 rho,用 R=P/(rho*T);若没有 rho,使用 Rmean 的近似分支。
  6. 定义输出 NetCDF:复制维度、坐标、phisinit、原始 sigma/hybrid 层和可得的 controle;根据输出模式定义 pressurezareoid 辅助变量。
  7. 逐变量垂直插值:对用户选择的变量读取四维场;rho*num_* 前缀变量设置为 log-space 插值;其他变量按线性或压力对数坐标规则插值。
  8. 写结果并关闭文件:每个变量写入输出文件,最后写辅助坐标变量、关闭输入/输出 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 生成物理垂直坐标,再交给 localtimelslinsolzenangleextract

写法特点

复现要点

待确认

复现风险

相关页面