dyn1d/comvert_mod.F90

路径

LMDZ.MARS\libf\phymars\dyn1d\comvert_mod.F90

文件定位

dyn1d/comvert_mod.F90 在当前源码树中不是独立实现,而是一行相对路径:

../../../../LMDZ.COMMON/libf/dyn3d_common/comvert_mod.F90

它把 1D testphys1d 编译路径中的 comvert_mod 模块解析到 LMDZ.COMMON/libf/dyn3d_common/comvert_mod.F90。目标模块保存动力核心混合垂直坐标系的界面系数、层中系数、参考压力和伪高度状态;dyn1d 初始化和主时间循环直接读取这些状态来构造 plev/play 并调用物理主程序。

定义的符号

符号 类型 行号 作用
comvert_mod.F90 path stub dyn1d line 1 指向 LMDZ.COMMON/libf/dyn3d_common/comvert_mod.F90
comvert_mod module common target line 1 声明垂直坐标共享状态。
ap, bp module arrays common target lines 11-12 界面层混合坐标系数;压力界面按 p = ap + bp * ps 构造。
aps, bps module arrays common target lines 22-23 层中混合坐标系数;层中压力按 p = aps + bps * ps 构造。
presnivs, pseudoalt module arrays common target lines 13, 25 参考层中压力和基于 preff/scaleheight 的伪高度。
pa, preff, scaleheight module scalars common target lines 17, 19, 24 hybrid 坐标转变压力、参考地表压力和参考尺度高度。
disvert_type, pressure_exner module flags common target lines 28, 36 垂直离散类型和层内压力计算方式开关。

目标模块使用 INCLUDE "dimensions.h" 得到 llm 等维度;数组为固定维度声明,没有 ALLOCATE、例程或 I/O。

垂直坐标语义

状态 维度 语义
ap(llm+1), bp(llm+1) 界面层 混合坐标的 pressure/sigma 贡献。给定地表压力 ps,界面压力为 ap(l)+bp(l)*ps
aps(llm), bps(llm) 层中 层中 pressure/sigma 贡献。给定 ps,层中压力为 aps(l)+bps(l)*ps
presnivs(llm) 层中 基于 preff 的参考层中压力。
pseudoalt(llm) 层中 -scaleheight*log(presnivs/preff) 得到的参考伪高度,单位注释为 km。
sig, ds, nivsig, nivsigs 垂直网格 sigma 层边界、厚度和输出层坐标辅助状态。

dyn1d 初始化路径

init_testphys1d_mod.F90 第 27 行 use comvert_mod, only: ap, bp, aps, bps, pa, preff, presnivs, pseudoalt, scaleheight。关键步骤:

  1. 第 314-316 行设置默认地表压力和参考压力:psurf=610 Papa=20preff=610
  2. 若不是 1D restart,第 319 行通过 getin("psurf", psurf) 覆盖地表压力;若是 restart,第 321-322 行从 start1Dname 的首行读取 psurf, pa, preff
  3. 第 332-334 行默认 hybrid=.true.,并通过 getin("hybrid", hybrid) 允许切换 hybrid/sigma 坐标。
  4. 第 337 行调用 disvert_noterre,该公共例程写入 ap/bp/aps/bps/presnivs/pseudoalt/scaleheight
  5. 第 339 行把这些固定维度状态复制到物理侧 vertical_layers_modinit_vertical_layers(nlayer, preff, scaleheight, ap, bp, aps, bps, presnivs, pseudoalt)
  6. 第 341-342 行构造 1D 物理调用使用的 plev = ap + psurf*bpplay = aps + psurf*bps

disvert_noterre 写入逻辑

公共目标 LMDZ.COMMON/libf/dyn3d_common/disvert_noterre.F 使用本模块:

分支 写入
hybrid=.true. 对每个界面调用 sig_hybrid(sig(l), pa, preff, newsig);随后 bp(l)=exp(1-1/newsig**2)ap(l)=pa*(newsig-bp(l)),顶界 ap/bp(llm+1)=0
hybrid=.false. 纯 sigma 坐标:ap(l)=0bp(l)=sig(l),顶界 ap(llm+1)=0bp(llm+1)=0
层中系数 aps/bps 先取相邻界面平均;最顶层按 hybrid 或 sigma 分支分别用相邻层平方比外推。
参考压力/高度 presnivs(l)=aps(l)+bps(l)*preffpseudoalt(l)=-scaleheight*log(presnivs(l)/preff)

dyn1d 主循环读取

testphys1d.F90 第 13 行 use comvert_mod, only: ap, bp, aps, bps, pa, preff。主循环中的使用:

行号 表达式 作用
184 s = (aps/psurf + bps)**rcp 用层中 hybrid 坐标计算 Exner/位势高度相关因子。
194 call physiq(..., plev, play, ...) 把界面压力和层中压力传入物理主程序。
254-256 psurf = psurf + dttestphys*dpsurf(1) 后重算 plev/play 每步地表压力变化后刷新压力坐标。
264 writerestart1D(..., psurf, pa, preff, ...) 写出 1D restart 首行压力控制量。

writerestart1D_mod.F90 第 25 行写出 ps psurf pa preff,与 init_testphys1d_mod.F90 第 322 行的 restart 读取格式配对。

副作用和 I/O

项目 说明
文件 I/O comvert_mod 本身无 I/O;disvert_noterre 可能读取垂直坐标配置文件并打印系数;writerestart1D 写出 restart1D.txt 中的 psurf/pa/preff
全局状态 本模块保存固定维度全局数组,供 dyn1d 初始化、主循环和公共动力例程共享。
分配/释放 本模块不分配;dyn1d 之后调用 vertical_layers_mod::init_vertical_layers 分配物理侧可分配数组并复制这些值。
单位 pa/preff/psurf/plev/play/presnivs 为 Pa;scaleheight/pseudoalt 注释为 km。

复现要点

  1. 复现 dyn1d 压力坐标时,先确定 psurfpapreffhybridz2sig.def/esasig.def 等垂直坐标输入。
  2. 必须先执行 disvert_noterre,再用 ap/bp/aps/bps 构造 plev/play;否则 physiq 会收到未初始化压力层。
  3. 地表压力每个时间步由 dpsurf 更新后,plev/play 必须同步重算。
  4. restart 链路只写 psurf/pa/preff,垂直坐标数组本身在下一次运行时重新由 disvert_noterre 生成。

待确认

相关页面