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_*.bashmakelmdz_fcm;但 Mars GCM 是否带 IOIPSL history、是否带 XIOS、include/lib 从哪里来、CPP_IOIPSL/CPP_XIOS 是否定义,都由这些构建文件决定。

当前上游入口:用户提供的 IOIPSL 当前项目页为 https://gitlab.in2p3.fr/ipsl/icmc/plateforme/IOIPSL。本页仍以当前 COMMON 源码中的 ioipsl/READMEinstall_*.basharch.pathmakelmdz_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_modCPP_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>

共同流程:

  1. 可选参数 rev 指定 IOIPSL SVN revision;无参数默认 HEAD
  2. 删除旧的 ../../IOIPSL 和当前目录下 modipsl
  3. 回到 LMDZ.COMMON 同级目录,执行 IOIPSL SVN checkout 到 IOIPSL
  4. 写入或复制 IOIPSL arch 配置。
  5. 运行 ./makeioipsl_fcm -arch <arch> -job 8 > makeioipsl.out 2>&1
  6. 检查 lib/libioipsl.a 是否存在;不存在则提示查看 makeioipsl.out 并退出。
  7. 回到 LMDZ.COMMON/ioipsl,创建 modipsl/libmodipsl/bin,把 ../../../../IOIPSL/lib/libioipsl.a../../../../IOIPSL/inc/*../../../../IOIPSL/bin/* 链接进来。

机器差异:

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.patharch-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 ioipsluse xios 当作 COMMON 内部源码依赖来解析;它们必须由 makelmdz_fcm 注入的 include/lib 路径和链接 flags 解决。这也解释了为什么 IOIPSL 安装和 arch.path 对 Mars 构建是硬前提,而不是运行时可选补丁。

Mars 构建复现顺序

  1. 选择目标平台 arch,例如 gfortranX64_JEANZAY 或本机自定义 arch。
  2. ioipsl/install_*.bash 或等价手工流程安装 IOIPSL,确保 LMDZ.COMMON/ioipsl/modipsl/lib/libioipsl.a 和 include/module 链接存在。
  3. 检查 LMDZ.COMMON/arch/arch-<name>.pathIOIPSL_* 指向 ioipsl/modipsl/lib,并检查 XIOS_* 是否只在需要 mix/xios 时有效。
  4. 运行 Mars 目标构建时指定 makelmdz_fcm -p mars -arch <name> -io ioipsl,或按输出需求使用 -io mix/-io xios
  5. 若使用 -io xios,注意 COMMON 会同时定义 CPP_IOIPSLCPP_XIOS,并加 CPP_IOIPSL_NO_OUTPUT,即保留 IOIPSL 依赖但关闭 IOIPSL 输出路径。
  6. 构建失败时优先查 IOIPSL_INCDIR/IOIPSL_LIBDIR/IOIPSL_LIBlibioipsl.a、NetCDF flags、XIOS flags,而不是 Mars physics 源码。

与 Mars 范围的边界

待确认

相关页面