LMDZ.COMMON dependency boundary
页面定位
本页记录 LMDZ.MARS Wiki 中需要理解的 LMDZ.COMMON 依赖边界。Mars Wiki 的源码覆盖范围仍以 LMDZ.MARS 为主;这里仅把 Mars 源码直接 USE、CALL 或通过同名 stub 路径依赖的公共层梳理成一张边界表,方便复现编译、初始化和重网格流程。
本页不引用其他 wiki 项目内容;事实依据来自 LMDZ.MARS 与 LMDZ.COMMON 源码路径。
COMMON wiki 入口
本页只保留 MARS 侧直接依赖边界;需要继续阅读 COMMON 实现时,可从以下同工作区 HTML 入口跳转:
| COMMON wiki 入口 | 适用场景 |
|---|---|
| COMMON wiki 首页 | 浏览联合发布站点中的 COMMON 架构、模块、主题和索引。 |
| MARS-COMMON 映射表 | 从 MARS 文件、路径转发文件或功能反查 COMMON 提供者。 |
| COMMON→MARS 使用位置映射 | 从 COMMON 模块反查 MARS 使用位置和优先级。 |
| 动力-物理接口主题 | 追 inigeomphy、calfis/calfis_p、物理列分布和 transfer 边界。 |
| Mars dyn1d COMMON 转发约定 | 追 phymars/dyn1d 一行路径转发到 COMMON 的接口兼容关系。 |
关键依赖
| COMMON 符号 | COMMON 源码位置 | Mars 使用位置 | 作用 |
|---|---|---|---|
geometry_mod |
LMDZ.COMMON/libf/phy_common/geometry_mod.F90 |
libf/dynphy_lonlat/phymars/subslope_mola.F90、libf/phymars/compute_dtau_mod.F90、libf/phymars/iostart.F90 等 |
保存物理列经纬度、格点面积、角点边界和全局列索引。 |
inigeomphy_mod::inigeomphy |
LMDZ.COMMON/libf/dynphy_lonlat/inigeomphy_mod.F90 |
libf/dynphy_lonlat/phymars/iniphysiq_mod.F90 |
从动力经纬网格生成物理网格数组,并调用 geometry_mod::init_geometry。 |
interp_horiz |
LMDZ.COMMON/libf/dyn3d/interp_horiz.F |
libf/dynphy_lonlat/phymars/datareadnc.F、lect_start_archive.F、newstart.F |
规则经纬网格之间的水平插值,用于外部数据、start archive 或 MONS 数据重投影。 |
temps_mod |
LMDZ.COMMON/libf/dyn3d/temps_mod.F90 或 LMDZ.COMMON/libf/dyn3dpar/temps_mod.F90 |
iniphysiq_mod.F90、leapfrog_nogcm.F、newstart.F、nogcm.F90、readhead_NC.F、start2archive.F |
保存动力步数、起止日期、参考日、开始时间和当前时间步等运行时间状态。 |
几何初始化链
Mars 侧入口是 iniphysiq_mod。其 iniphysiq 先调用 inigeomphy,再进入 OpenMP 并行区初始化 phymars 状态、填充 comgeomfi_h 三角缓存并读取物理配置。
COMMON 侧 inigeomphy 负责:
- 根据
rlonu/rlatv/airedyn/cudyn/cvdyn构造物理列的经纬度、面积和角点边界。 - 处理常规经纬格点的南北极和周期经度边界。
- 按并行分块抽取当前 OpenMP/MPI 子域。
- 调用
geometry_mod::init_geometry,把longitude/latitude/cell_area/boundslon/boundslat/ind_cell_glo写入公共几何模块。
Mars 侧后续读取这些状态的典型位置:
| Mars 页面 | 依赖的几何量 | 用途 |
|---|---|---|
| subslope_mola | boundslon,boundslat |
从 GCM 网格角点提取每格 MOLA 统计区域。 |
| compute_dtau_mod | longitude_deg |
尘埃光学深度经度依赖调整。 |
| iostart | ind_cell_glo |
读写物理列 restart 时映射全局列索引。 |
| physiq_mod 与 comgeomfi_h | longitude,latitude,cell_area 经 ini_fillgeom 缓存 |
物理参数化、辐射和诊断常用的三角函数与面积权重。 |
复现约束:凡是读取 geometry_mod 的 Mars 例程,都隐含要求 inigeomphy 已先运行;否则 geometry_mod 内的可分配数组不会有合法内容。
水平插值边界
interp_horiz 是 COMMON 动力层的通用水平插值例程。Mars 侧没有在 libf/dynphy_lonlat/phymars 内定义同名例程,但多个初始化和数据读取文件直接调用它:
| Mars 页面 | 调用场景 |
|---|---|
| datareadnc | 把外部 NetCDF 数据转到当前 GCM 网格。 |
| lect_start_archive | 把旧网格 start archive 的地表、土壤、tracer 和风场插值到新网格。 |
| newstart | MONS 冰深/冰热惯量相关数据的水平重投影。 |
注意边界:LMDZ.MARS/util/hrecast.F90 内部也有一个本地 interp_horiz 子程序,用于离线 NetCDF 重网格。它是工具内局部实现,不是这里的 COMMON 依赖。
时间状态边界
temps_mod 在 COMMON 的串行 dyn3d 与并行 dyn3dpar 目录中都有同名模块。两者保存的核心变量一致,包括 itaufin、itau_dyn、itau_phy、day_ini、day_end、annee_ref、day_ref、start_time、dt 等;并行版本额外带 OpenMP THREADPRIVATE 声明。
Mars 侧典型使用:
| Mars 页面 | 读取/写入含义 |
|---|---|
| leapfrog_nogcm | 计算 itaufin,更新 dt,控制独立物理模式时间积分。 |
| iniphysiq_mod | 在 OpenMP 并行区入口 COPYIN(day_ini,day_end,hour_ini)。 |
| nogcm | 设置日历、起始时间和参考日状态。 |
| newstart / start2archive / readhead_NC | 读取或传播初始日期、小时和归档时间。 |
待确认:实际编译时选择串行 dyn3d/temps_mod.F90 还是并行 dyn3dpar/temps_mod.F90 取决于构建目标和预处理选项;Mars Wiki 当前不把两者合并成单一事实。
与 Mars 本地公共状态的关系
geometry_mod 和 comgeomfi_h 不是重复层。当前代码中:
geometry_mod保存经纬度、面积、角点边界和全局列索引。comgeomfi_h保存sinlon/coslon/sinlat/coslat等物理包常用三角缓存。iniphysiq_mod.F90行内 TODO 注释指出comgeomfi_h的内容可能应迁移到geometry_mod;源码尚未完成该迁移。
因此,复现初始化链时不能只初始化 geometry_mod。Mars 物理包仍需要 ini_fillgeom 填好 comgeomfi_h。
复现要点
- 构建 Mars 可执行文件时,COMMON 源码必须作为同一构建图的一部分参与编译或链接。
- 几何相关 Mars 例程的前置条件是
inigeomphy已运行并初始化geometry_mod。 interp_horiz的调用方通常假设输入网格经纬度、极点和周期边界已经按该例程预期准备好;具体边界处理应结合调用页逐项复现。- 并行版本
temps_mod的THREADPRIVATE语义会影响 OpenMP 区内时间变量复制;改动初始化顺序时必须保留COPYIN语义。
待确认
temps_mod的串行/并行实现选择应通过实际 build log 或 makefile 目标确认。interp_horiz在 Mars 初始化路径中的所有数组边界约定尚未集中逐行复核,本页只记录依赖边界。comgeomfi_h迁移到geometry_mod的 TODO 是源码内设计意图提示,是否仍计划实施需维护者确认。