makelmdz_fcm Mars 源码路径约定

输入范围

LMDZ.COMMON-6.3\LMDZ.COMMON\makelmdz_fcm
LMDZ.COMMON-6.3\LMDZ.COMMON\bld.cfg
LMDZ.MARS\doc\run.tex
LMDZ.MARS\doc\compilation.tex

Mars 运行参与度:构建期必经。Mars 可执行文件运行时不执行 makelmdz_fcmbld.cfg,但 makelmdz_fcm -p mars gcm 决定哪些 COMMON 动力目录、Mars physics 目录、dyn-phys 接口目录和并行目录被 FCM 编译进 gcm_..._phymars_...e

从命令到物理包名

LMDZ.MARS 文档给出的 3D Mars 构建示例是:

makelmdz_fcm -arch linux-ifort -d 64x48x49 -p mars gcm

makelmdz_fcm 默认 physique=lmd,遇到 -p mars 后把 physique 设为 mars,最后一个非选项参数 gcm 写入 code。随后:

脚本变量 -p mars gcm 下的值 来源
physique mars -p 选项。
phys_root mars ${physique:0:4} == "mars" 分支。
code gcm 参数解析 fallback 分支。
CPP_KEY 至少包含 CPP_PHYS physique!="nophys"
SUFF_NAME _64x48x49_phymars_seq.e_64x48x49_phymars_para.e 维度、物理包和并行模式拼接。

phys_root 的作用是选择 dyn-phys 子接口名:phy${phys_root}。因此 -p mars 对应 phymars,而不是 phymar

路径变量展开

脚本启动时:

LMDGCM = 当前工作目录
LIBFGCM = $LMDGCM/libf
LIBOGCM = $LMDGCM/libo
DYN_COMMON_PATH = $LIBFGCM/dyn3d_common
FILTRE_PATH/DYN_PHYS_PATH/DYN_PHYS_SUB_PATH/PHY_COMMON_PATH = $LMDGCM/.void_dir

只要 physique!="nophys",Mars 构建会把 physics 和接口路径打开:

PHY_COMMON_PATH   = $LIBFGCM/phy_common
DYN_PHYS_PATH     = $LIBFGCM/dynphy_lonlat
DYN_PHYS_SUB_PATH = $LIBFGCM/dynphy_lonlat/phymars
FILTRE_PATH       = $LIBFGCM/filtrez

维度和并行模式决定 %DYN

构建模式 DYN 说明
-parallel none, -d 64x48x49 dyn3d 串行 3D 动力入口。
-parallel mpi/omp/mpi_omp, -d 64x48x49 dyn3dpar 并行动力入口,另加 CPP_PARA 和 MPI/OMP key。
-d <single-number> 1D phymars/dyn1d 1D 主程序在 physics 树;脚本同时关闭 filtre、dyn3d_common 和 dyn-phys 全目录编译。

对普通 3D Mars 串行 gcm,写入 config.fcm 的核心路径等价于:

%LIBF          <LMDGCM>/libf
%DYN           dyn3d
%DYN_COMMON    <LMDGCM>/libf/dyn3d_common
%PHY_COMMON    <LMDGCM>/libf/phy_common
%FILTRE        <LMDGCM>/libf/filtrez
%PHYS          phymars
%DYN_PHYS      <LMDGCM>/libf/dynphy_lonlat
%DYN_PHYS_SUB  <LMDGCM>/libf/dynphy_lonlat/phymars
%EXEC          gcm
%SUFF_NAME     _64x48x49_phymars_seq.e

bld.cfg 如何使用这些路径

bld.cfg 先 include arch.fcmconfig.fcm,再设:

%SRC_PATH %LIBF

核心 source groups 是:

source group 展开方式 Mars 3D 串行含义
src::dyn %SRC_PATH/%DYN <LMDGCM>/libf/dyn3d
src::phys %SRC_PATH/%PHYS <LMDGCM>/libf/phymars
src::dyn_phys %DYN_PHYS <LMDGCM>/libf/dynphy_lonlat
src::dyn_phys_sub %DYN_PHYS_SUB <LMDGCM>/libf/dynphy_lonlat/phymars
src::grid %SRC_PATH/grid COMMON grid/dimensions。
src::filtrez %FILTRE COMMON longitudinal filter。
src::misc %SRC_PATH/misc COMMON NetCDF/getin/interpolation helpers。
src::dyn3d_common %DYN_COMMON COMMON serial/parallel shared dynamics。
src::phy_common %PHY_COMMON COMMON physics-side parallel/grid/output utilities。

目标输出:

bld::target liblmdz.a %EXEC%SUFF_NAME
dir::bin    %ROOT_PATH/bin

所以 gcm 会生成 bin/gcm_64x48x49_phymars_seq.ebin/gcm_64x48x49_phymars_para.e,与 LMDZ.MARS 文档中的命名一致。

COMMON/MARS 分离树的边界

源码文档说明模型分成两棵树:COMMON 保存共用动力,MARS 保存 Mars physics;同时文档描述的集成布局中,COMMON libf 下的 phymars/aeronomarsdynphy_lonlat/phymars 可以作为指向 LMDZ.MARS/libf 的链接。

当前源码依据:

路径 当前存在性 含义
LMDZ.COMMON\libf\dynphy_lonlat\phymars 不存在 仅 COMMON 源码树不能独立满足 %DYN_PHYS_SUB
LMDZ.MARS\libf\dynphy_lonlat\phymars 存在 Mars dyn-phys 接口实体在 MARS 树。
LMDZ.COMMON\libf\phymars 不存在 仅 COMMON 源码树不能独立满足 %SRC_PATH/%PHYS
LMDZ.MARS\libf\phymars 存在 Mars physics 实体在 MARS 树。

复现 Mars 构建时必须让 FCM 看到 %SRC_PATH/%PHYS%DYN_PHYS_SUB。做法可能是使用发布包/检出流程创建的链接,或在构建前建立等价集成布局。若只在当前拆分 checkout 的 LMDZ.COMMON 目录直接运行 makelmdz_fcm -p mars gcm,这些 Mars physics 路径在源码层面无法由 COMMON 自身提供。

并行和工具目标边界

复现检查点

  1. 在构建目录运行 makelmdz_fcm 前,确认 LMDZ.COMMON/libf/phymarsLMDZ.COMMON/libf/dynphy_lonlat/phymars 是否可由链接或集成布局访问。
  2. 确认 -p marsphys_root=mars,而非 mar。脚本中先有 ${physique:0:3}=="mar",随后 ${physique:0:4}=="mars" 会覆盖为 mars
  3. 对 3D Mars GCM,确认 -d 是三维格式,如 64x48x49;单数字维度会进入 1D 特殊路径。
  4. 对并行 Mars GCM,确认使用 dyn3dpar 页面和 MPI/OMP arch flags,而不是串行 dyn3d 页面。
  5. 编译失败若表现为缺 phymarsiniphysiq_mod,优先检查目录链接/集成布局,而不是 COMMON 动力源码。

待确认

相关页面