arch 环境和 Mars deftank 运行约定
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\makelmdz_fcm
LMDZ.COMMON-6.3\LMDZ.COMMON\arch\arch-*.env
LMDZ.COMMON-6.3\LMDZ.COMMON\arch\arch-*.fcm
LMDZ.COMMON-6.3\LMDZ.COMMON\arch\arch-*.path
LMDZ.MARS\deftank\run0
LMDZ.MARS\deftank\*\run0
LMDZ.MARS\deftank\*\run_month1
LMDZ.MARS\deftank\*\run_year1
LMDZ.MARS\deftank\launch_1Dchained.sh
LMDZ.MARS\deftank\launch_orb_1Dchained.sh
Mars 运行参与度:构建期必经/运行期条件经过。arch-*.env/.fcm/.path 在编译 Mars GCM 时必经;deftank 脚本在使用示例作业运行 Mars GCM 或 1D PCM 时条件经过。它们不改变物理公式,但决定编译器、库、MPI/OMP 环境、可执行文件名和 restart 链式运行是否匹配。
三类 arch 文件职责
makelmdz_fcm -arch <name> 在 COMMON 根目录创建并使用三个生成名:
arch.env -> arch/arch-<name>.env 或 .void_file
arch.path -> arch/arch-<name>.path
arch.fcm -> arch/arch-<name>.fcm
脚本先 source arch.env 和 source arch.path,再把 arch.fcm 与 config.fcm 交给 bld.cfg。三类文件分工如下:
| 文件 | 使用时机 | 主要内容 | Mars 复现作用 |
|---|---|---|---|
arch-*.env |
shell 执行期,source arch.env |
module purge/load、编译器/MPI/NetCDF/HDF5/XIOS 依赖模块;有些 arch 没有 .env,脚本用空文件代替。 |
让 mpif90, nc-config, nf-config, NetCDF/HDF5 环境变量等可见。 |
arch-*.fcm |
FCM 配置期,inc arch.fcm |
%COMPILER, %LINK, %FPP_FLAGS, %BASE_FFLAGS, %PROD_FFLAGS, %DEBUG_FFLAGS, %MPI_FFLAGS, %OMP_FFLAGS, %BASE_LD, %OMP_LD 等。 |
决定 Fortran/C 编译器、real*8、NetCDF double、MPI/OMP 编译和链接 flags。 |
arch-*.path |
shell 执行期,source arch.path,随后写入 config.fcm |
NETCDF_INCDIR/LIBDIR/LIB, IOIPSL_INCDIR/LIBDIR/LIB, XIOS_INCDIR/LIBDIR/LIB 等。 |
给 makelmdz_fcm -io ioipsl/mix/xios 注入 include/lib 路径。 |
当前工作树中 LMDZ.COMMON\arch.env、arch.path、arch.fcm 不存在;它们是构建命令运行后生成的链接。Mars deftank 脚本里 source ../trunk/LMDZ.COMMON/arch.env 依赖这个生成物或等价手工准备。
代表性 arch 展开
| arch | .env |
.fcm |
.path |
|---|---|---|---|
X64_JEANZAY |
module purge,加载 intel-all/19.0.4, gcc/9.1.0, MPI HDF5, NetCDF, NetCDF-Fortran。 |
%COMPILER mpiifort, %FPP_DEF NC_DOUBLE LAPACK FFT_MKL, real8/int32 flags,OpenMP -qopenmp -qopenmp-threadprivate=compat。 |
NETCDF_* 来自 nc-config,IOIPSL 指向 $ROOT/ioipsl/modipsl/lib,XIOS 指向 $ROOT/../XIOS。 |
X64_OCCIGEN |
加载 Intel 17、IntelMPI、HDF5、NetCDF;保留旧 module 组合注释。 | %COMPILER mpif90, %CPP_DEF LAPACK, %FPP_DEF NC_DOUBLE LAPACK FFT_MKL,OpenMP -qopenmp。 |
NetCDF 使用 ${NETCDFF_LIBDIR} 和 ${NETCDF_INCDIR},IOIPSL/XIOS 路径同 $ROOT 约定。 |
gfortran |
无 .env;makelmdz_fcm 会链接空 .void_file。 |
%COMPILER gfortran, %LINK gfortran, %CPP_DEF LAPACK, %FPP_DEF NC_DOUBLE,gfortran real*8 flags。 |
依赖环境变量 $NETCDF,IOIPSL/XIOS 仍按 $ROOT/ioipsl 和 $ROOT/../XIOS。 |
复现含义:同一个 makelmdz_fcm -p mars gcm 命令换不同 -arch,会改变 module 环境、编译器、NetCDF/IOIPSL/XIOS 解析方式和 OpenMP/MPI flags;运行脚本必须和编译出来的 seq/para 可执行文件匹配。
Mars deftank 脚本分层
deftank 里的运行脚本不是编译器。它们假定可执行文件已经存在,并负责链式运行、作业调度、restart 滚动和日志命名。
| 脚本 | 职责 | 环境处理 |
|---|---|---|
deftank/run0 |
单机/通用链式运行模板:检查 gcm=gcm.e,复制 start<num>.nc/startfi<num>.nc 到 start.nc/startfi.nc,运行 ./$gcm,成功后把 restart*.nc 改名为下一段 start。 |
不 source arch.env;只直接运行当前目录可执行文件。 |
deftank/<machine>/run0 |
机器版本运行模板:设置机器默认 gcm=gcm_..._phymars_para.e,使用 mpirun, srun, ccc_mprun 或 binding wrapper 启动。 |
通常不 source arch.env;由外层 run_month1/run_year1 负责。 |
deftank/<machine>/run_month1 |
月链式作业入口:source arch 环境,设置 OMP_NUM_THREADS/OMP_STACKSIZE,生成当月 run.def,调用 ./run0,提交下个月作业。 |
多数机器 source ../trunk/LMDZ.COMMON/arch.env。 |
deftank/<machine>/run_year1 |
年链式作业入口,与月脚本类似。 | Adastra 版本 source arch.env 并设置 OMP。 |
launch_1Dchained.sh, launch_orb_1Dchained.sh |
1D PCM 链式运行;指定 testphys1d_..._phymars_seq.e,检查 startfi.nc/start1D.txt,逐年运行。 |
顶部 source ../trunk/LMDZ.COMMON/arch.env。 |
机器脚本差异
| 机器目录 | run0 启动方式 |
run_month1 运行环境 |
|---|---|---|
adastra |
srun ... ./adastra_cpu_binding.sh ./$gcm,默认 gcm_64x48x54_phymars_para.e。 |
source ../trunk/LMDZ.COMMON/arch.env,OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK,OMP_STACKSIZE=400M。 |
occigen |
srun --resv-ports --kill-on-bad-exit=1 --mpi=pmi2 --label -n $SLURM_NTASKS $gcm。 |
source arch.env,设置 I_MPI_DOMAIN, I_MPI_PIN_RESPECT_CPUSET, KMP_HW_SUBSET, OMP_NUM_THREADS, OMP_STACKSIZE, KMP_AFFINITY。 |
ciclad |
mpirun $gcm > lrun${numnew}。 |
source arch.env,用 PBS qsub 链接下个月脚本。 |
irene |
ccc_mprun -l $gcm > lrun${numnew} 2>&1。 |
source arch.env,固定 OMP_NUM_THREADS=5 和 OMP_STACKSIZE=400M。 |
mesu |
mpirun -map-by slot:PE=$SLURM_CPUS_PER_TASK --bind-to core $gcm。 |
source arch.env,OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK。 |
spirit |
mpirun $gcm > lrun${numnew} 2>&1。 |
source arch.env,OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK。 |
README 提醒用户需要改 run0 中的 gcm=... 行来匹配自己的可执行文件;Adastra 还要求根据核心数调整 run_month1/run_year1,Occigen README 明确 OMP_NUM_THREADS 要随节点/MPI/OMP 组合选择。
运行时 restart 链
run0 的通用状态机:
read num_run, default 0
numnew = numold + 1
require start<numold>.nc and startfi<numold>.nc
copy them to start.nc and startfi.nc
run executable, write lrun<numnew>
if restart.nc and restartfi.nc exist:
move restart.nc -> start<numnew>.nc
move restartfi.nc -> startfi<numnew>.nc
move diag/stat/profile outputs with numnew suffix
write num_run=numnew
else:
write num_run=99999 and keep crash marker
因此 deftank 运行约定要求:
- 可执行文件名和
run0:gcm=完全一致。 - 初始
start0.nc/startfi0.nc或当前num_run对应的 start pair 必须存在。 - Mars GCM 成功结束必须产生
restart.nc和restartfi.nc;否则脚本判定 crash。 run_month1通过sed s/9999/<nday>/ run.def.ref > run.def改当月运行长度,再调用run0。
和构建页的边界
arch-*.env/.fcm/.path是编译环境约定;run0/run_month1是运行环境和 restart 链约定。arch.path的 IOIPSL/XIOS 路径已由 IOIPSL build 页覆盖;本页只说明这些路径如何通过arch.path -> config.fcm进入编译,以及运行脚本 sourcearch.env的前提。gcm_XXX_phymars_YY.e的精确命名规则见 target 输出命名页;本页只说明 run 脚本必须匹配该名字。
复现检查点
- 编译前:确认
-arch <name>对应.fcm/.path存在;如果没有.env,确认空.void_file环境足够。 - 编译后或运行前:确认 COMMON 根目录存在可 source 的
arch.env,或把 deftank 脚本里的source ../trunk/LMDZ.COMMON/arch.env改到真实位置。 - 若运行并行可执行文件,确认
run0使用的启动器和gcm=..._para.e与编译的 parallel/MPI/OMP 模式一致。 - 若使用 OpenMP,确认
OMP_NUM_THREADS、OMP_STACKSIZE和 scheduler 的cpus-per-task一致。 - 确认运行目录有
run.def.ref,run0,run_month1,以及start<num>.nc/startfi<num>.nc。 - 脚本链式提交前,确认
num_now/num_end、月长度 sed 值和 job scheduler 指令适合当前实验。
待确认
- 当前本地 workspace 没有
LMDZ.COMMON\arch.env/path/fcm生成链接;是否由用户的实际编译流程在运行前生成,需要在真实运行环境确认。 - 不同机器脚本的 scheduler directives 是否仍符合当前集群队列策略,需要由实际平台文档确认。