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。关键步骤:
- 第 314-316 行设置默认地表压力和参考压力:
psurf=610 Pa、pa=20、preff=610。 - 若不是 1D restart,第 319 行通过
getin("psurf", psurf)覆盖地表压力;若是 restart,第 321-322 行从start1Dname的首行读取psurf, pa, preff。 - 第 332-334 行默认
hybrid=.true.,并通过getin("hybrid", hybrid)允许切换 hybrid/sigma 坐标。 - 第 337 行调用
disvert_noterre,该公共例程写入ap/bp/aps/bps/presnivs/pseudoalt/scaleheight。 - 第 339 行把这些固定维度状态复制到物理侧
vertical_layers_mod:init_vertical_layers(nlayer, preff, scaleheight, ap, bp, aps, bps, presnivs, pseudoalt)。 - 第 341-342 行构造 1D 物理调用使用的
plev = ap + psurf*bp和play = 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)=0、bp(l)=sig(l),顶界 ap(llm+1)=0、bp(llm+1)=0。 |
| 层中系数 | aps/bps 先取相邻界面平均;最顶层按 hybrid 或 sigma 分支分别用相邻层平方比外推。 |
| 参考压力/高度 | presnivs(l)=aps(l)+bps(l)*preff,pseudoalt(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。 |
复现要点
- 复现 dyn1d 压力坐标时,先确定
psurf、pa、preff、hybrid和z2sig.def/esasig.def等垂直坐标输入。 - 必须先执行
disvert_noterre,再用ap/bp/aps/bps构造plev/play;否则physiq会收到未初始化压力层。 - 地表压力每个时间步由
dpsurf更新后,plev/play必须同步重算。 - restart 链路只写
psurf/pa/preff,垂直坐标数组本身在下一次运行时重新由disvert_noterre生成。
待确认
- 当前 Windows 工作树把链接文件呈现为一行路径文本;在原始类 Unix 工作树中它可能是符号链接。
disvert_noterre读取z2sig.def或esasig.def的具体选择规则见 disvert_noterre.F。pressure_exner在 dyn1d 运行路径中是否被配置使用,需结合公共动力调用页继续确认。
相关页面
- dyn1d/index.md - dyn1d 子目录索引。
- comconst_mod - dyn1d 同目录公共动力常数 stub。
- disvert_noterre.F - 写入
ap/bp/aps/bps/presnivs/pseudoalt。 - init_testphys1d_mod.F90 - 初始化后使用垂直坐标构造压力层。
- testphys1d.F90 - 主循环随表压更新
plev/play。 - writerestart1D_mod - 1D 文本 restart 写出。