IOIPSL build 和 Mars I/O 构建约定
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\ioipsl\README
LMDZ.COMMON-6.3\LMDZ.COMMON\ioipsl\install_*.bash
LMDZ.COMMON-6.3\LMDZ.COMMON\makelmdz_fcm
LMDZ.COMMON-6.3\LMDZ.COMMON\bld.cfg
LMDZ.COMMON-6.3\LMDZ.COMMON\arch\arch-*.path
Mars 运行参与度:构建期条件经过。Mars 可执行文件运行时不执行 ioipsl/install_*.bash 或 makelmdz_fcm;但 Mars GCM 是否带 IOIPSL history、是否带 XIOS、include/lib 从哪里来、CPP_IOIPSL/CPP_XIOS 是否定义,都由这些构建文件决定。
当前上游入口:用户提供的 IOIPSL 当前项目页为 https://gitlab.in2p3.fr/ipsl/icmc/plateforme/IOIPSL。本页仍以当前 COMMON 源码中的 ioipsl/README、install_*.bash、arch.path 和 makelmdz_fcm 行为为准;该 GitLab URL 作为查找上游 IOIPSL 项目、许可和历史的外部入口。
IOIPSL 在 Mars 构建中的角色
IOIPSL 对 Mars 运行链路主要提供三类能力:
| 能力 | COMMON 使用位置 | 构建条件 |
|---|---|---|
| history/dynav/flux storage 输出 | inithist*, writehist*, initdynav*, writedynav*, initfluxsto*, fluxstokenc* 等在 CPP_IOIPSL 下调用 IOIPSL |
makelmdz_fcm -io ioipsl/mix/xios 都会加入 CPP_IOIPSL。 |
配置读取 getin |
ioipsl_getin_p_mod 在 CPP_IOIPSL 下转到外部 IOIPSL getin,否则转到 COMMON fallback ioipsl_getincom |
当前 FCM 构建入口默认 io=ioipsl。 |
| XIOS 共存 | xios_writefield, wxios, 并行/物理侧输出封装 |
-io mix 或 -io xios 加入 CPP_XIOS,且当前脚本注释明确 XIOS 仍 implied IOIPSL。 |
因此 Mars 实跑时“经过”的不是安装脚本本身,而是安装脚本生成的 ioipsl/modipsl/lib 链接、arch.path 的 IOIPSL 变量、以及编译后启用的 CPP_IOIPSL/CPP_XIOS 分支。
install 脚本族
ioipsl/README 说明这些脚本是安装 IOIPSL 的示例入口,建议把 IOIPSL 安装在 LMDZ 同级目录以便跟踪版本。脚本族分为两类:
| 脚本类型 | 示例 | 行为 |
|---|---|---|
| 通用编译器示例 | install_ioipsl_gfortran.bash, install_ioipsl_ifort.bash, install_ioipsl_pgf90.bash, install_ioipsl_MesoPSL.bash |
从 nf-config --prefix 或脚本变量取得 NetCDF 根目录,现场写 IOIPSL 的 arch-<name>.env/.fcm/.path,再构建。 |
| 机器脚本 | install_ioipsl_occigen.bash, install_ioipsl_jeanzay.bash, install_ioipsl_irene-amd.bash, install_ioipsl_mesu.bash, install_ioipsl_ciclad-ifort.bash, install_ioipsl_centos-ifort.bash |
复用或复制 LMDZ.COMMON/arch/arch-<machine>.*,按机器名调用 makeioipsl_fcm -arch <machine>。 |
共同流程:
- 可选参数
rev指定 IOIPSL SVN revision;无参数默认HEAD。 - 删除旧的
../../IOIPSL和当前目录下modipsl。 - 回到
LMDZ.COMMON同级目录,执行 IOIPSL SVN checkout 到IOIPSL。 - 写入或复制 IOIPSL
arch配置。 - 运行
./makeioipsl_fcm -arch <arch> -job 8 > makeioipsl.out 2>&1。 - 检查
lib/libioipsl.a是否存在;不存在则提示查看makeioipsl.out并退出。 - 回到
LMDZ.COMMON/ioipsl,创建modipsl/lib和modipsl/bin,把../../../../IOIPSL/lib/libioipsl.a、../../../../IOIPSL/inc/*、../../../../IOIPSL/bin/*链接进来。
机器差异:
occigen脚本先复制arch-X64_OCCIGEN.env/.path/.fcm,再用sed从 IOIPSLmakeioipsl_fcm移除一次$HDF5_LIBDIR $HDF5_LIB。mesu脚本采用modipsl/model IOIPSL_PLUS路径,成功产物检查位置是modipsl/lib/libioipsl.a,和多数脚本的IOIPSL/lib/libioipsl.a不同。- 通用
gfortran/ifort/pgf90脚本现场生成 IOIPSL arch 文件,注释要求用户按本机 NetCDF 和 GCM arch 文件调整。
makelmdz_fcm -io 约定
当前源码中 makelmdz_fcm 默认:
io=ioipsl
帮助文本只列出:
-io ioipsl/mix/xios
对应分支:
-io 值 |
CPP key | include/lib |
|---|---|---|
ioipsl |
CPP_IOIPSL |
${IOIPSL_INCDIR}, ${IOIPSL_LIBDIR}, ${IOIPSL_LIB} |
mix |
CPP_IOIPSL CPP_XIOS |
IOIPSL + XIOS include/lib |
xios |
CPP_IOIPSL CPP_XIOS CPP_IOIPSL_NO_OUTPUT |
IOIPSL + XIOS include/lib |
源码确认结果:当前 makelmdz_fcm 没有发现 -io noioipsl 的帮助文本或分支。COMMON 中确实有无外部 IOIPSL 时可用的 fallback ioipsl_getincom,但这不等于当前 FCM 脚本提供了 noioipsl 模式。复现 Mars 构建时应以源码可见的 ioipsl/mix/xios 为准。
arch.path 链接约定
Mars 构建时,makelmdz_fcm -arch <name> 会 source 目标 arch 的 .path 文件。典型 arch-gfortran.path 和 arch-X64_JEANZAY.path 都使用同一类 IOIPSL 变量:
IOIPSL_INCDIR="-I$ROOT/ioipsl/modipsl/lib"
IOIPSL_LIBDIR="-L$ROOT/ioipsl/modipsl/lib"
IOIPSL_LIB="-lioipsl"
这说明 install 脚本最后创建的 LMDZ.COMMON/ioipsl/modipsl/lib 是 COMMON 构建入口实际读取的位置。若该目录缺少 libioipsl.a 或 IOIPSL .mod/include 文件,-io ioipsl/mix/xios 的编译或链接会失败。
bld.cfg 外部依赖边界
bld.cfg 在依赖扫描阶段排除外部模块:
bld::excl_dep use::ioipsl
bld::excl_dep use::xios
含义是 FCM 不把 use ioipsl 或 use xios 当作 COMMON 内部源码依赖来解析;它们必须由 makelmdz_fcm 注入的 include/lib 路径和链接 flags 解决。这也解释了为什么 IOIPSL 安装和 arch.path 对 Mars 构建是硬前提,而不是运行时可选补丁。
Mars 构建复现顺序
- 选择目标平台 arch,例如
gfortran、X64_JEANZAY或本机自定义 arch。 - 用
ioipsl/install_*.bash或等价手工流程安装 IOIPSL,确保LMDZ.COMMON/ioipsl/modipsl/lib/libioipsl.a和 include/module 链接存在。 - 检查
LMDZ.COMMON/arch/arch-<name>.path的IOIPSL_*指向ioipsl/modipsl/lib,并检查XIOS_*是否只在需要mix/xios时有效。 - 运行 Mars 目标构建时指定
makelmdz_fcm -p mars -arch <name> -io ioipsl,或按输出需求使用-io mix/-io xios。 - 若使用
-io xios,注意 COMMON 会同时定义CPP_IOIPSL和CPP_XIOS,并加CPP_IOIPSL_NO_OUTPUT,即保留 IOIPSL 依赖但关闭 IOIPSL 输出路径。 - 构建失败时优先查
IOIPSL_INCDIR/IOIPSL_LIBDIR/IOIPSL_LIB、libioipsl.a、NetCDF flags、XIOS flags,而不是 Mars physics 源码。
与 Mars 范围的边界
- Earth-only 选项如 ORCHIDEE、INCA、COSP、SISVAT、RRTM、stratospheric aerosol 不属于 Mars 正常运行路径,本页只记录它们在
makelmdz_fcm帮助文本中的存在,不展开。 - Venus/Titan
startvar中的 IOIPSL 直接使用不纳入 Mars wiki 专页。 ioipsl_getincomfallback 属于 COMMON 配置读取兼容层,已由 misc getin 页面覆盖;本页只记录它和构建选项之间的边界。
待确认
- 当前 Mars 生产工作流默认使用
-io ioipsl、-io mix还是-io xios,需要结合具体 run/deftank 脚本确认。 makelmdz_fcm -p mars的最终可执行文件命名、外层包装脚本传参和 deftank 编译循环见对应构建页面。