这篇文章对 CESM 2.x 以及 CLM 5.x 版本的配置做了详细的解释,如果对你有帮助的话欢迎点赞评论支持一下,谢谢~ 文章首发在 CSDN ,除了本站与 CSDN 之外都属于抄袭盗版,敬请举报!
配置文件路径 CESM 2.2 版本配置文件路径在 $CESM_ROOT/cime/config/cesm/machines CLM 5.0 的配置文件也在上述路径下 $CLM_ROOT/cime/config/cesm/machines
配置文件详解 config_machines.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <machine MACH ="custom" > <DESC > User Defined </DESC > <NODENAME_REGEX > User Defined </NODENAME_REGEX > <OS > Linux</OS > <COMPILERS > intel</COMPILERS > <MPILIBS > impi</MPILIBS > <CIME_OUTPUT_ROOT > $ENV{WORKDIR}/cesm213_case_dir</CIME_OUTPUT_ROOT > <DIN_LOC_ROOT > /public/cesm/inputdata</DIN_LOC_ROOT > <DIN_LOC_ROOT_CLMFORC > /public/cesm/ptclm-data</DIN_LOC_ROOT_CLMFORC > <DOUT_S_ROOT > $ENV{WORKDIR}/cesm213_case_dir/$CASE</DOUT_S_ROOT > <BASELINE_ROOT > $ENV{WORKDIR}/cesm_baselines</BASELINE_ROOT > <CCSM_CPRNC > $CIMEROOT/tools/cprnc/build/cprnc</CCSM_CPRNC > <GMAKE > make</GMAKE > <GMAKE_J > 16</GMAKE_J > <BATCH_SYSTEM > pbs</BATCH_SYSTEM > <SUPPORTED_BY > mrxun_</SUPPORTED_BY > <MAX_TASKS_PER_NODE > 64</MAX_TASKS_PER_NODE > <MAX_MPITASKS_PER_NODE > 64</MAX_MPITASKS_PER_NODE > <PROJECT_REQUIRED > FALSE</PROJECT_REQUIRED > <mpirun mpilib ="default" > <executable > mpirun</executable > <arguments > <arg name ="anum_tasks" > -np {{ total_tasks }}</arg > </arguments > </mpirun > <module_system type ="none" /> <environment_variables > <env name ="NETCDF_PATH" > /public/lib/netcdf/intel/4.7.4</env > </environment_variables > </machine >
这里重点有下面几个方面:
COMPILERS:一般大型服务器上都会部署 mpi 编译器,根据你的需求选择有 pgi,intel,gnu 等等
MPILIBS:Intel 编译器一般选择 impi,gnu 可以搭配 openmpi,mpich,如果你不需要 mpi 这里就填 mpi-serial 即可
DIN_LOC_ROOT:这个文件夹的位置可以选择一个固定的目录,这样所有的 inputdata 都会放在同一个文件夹中,方便后续使用
DIN_LOC_ROOT_CLMFORC:同上
BATCH_SYSTEM:如果你是普通的服务器没有部署作业调度系统这一项填写 none 即可。一般大型服务器或超算上都会部署类似 slurm,pbs 或者 lsf 等等作业调度系统,还有部分作业调度系统是定制版本,这就需要联系系统管理员或者自己熟读用户手册之后再修改这两项
GMAKE_J:编译时候可以并行的最大核数,这个数字填你使用的机器的 CPU 核数即可
PES_PER_NODE 和 MAX_TASKS_PER_NODE:这两个数字需要视情况而定,如果你使用的机器是一般的服务器,没有计算节点这些东西的话直接填写机器的 CPU 核数即可;如果你使用的是大型服务器或超算则需要填写计算节点的 CPU 核数。如果这里填的数字超过你的 CPU 核数一般都是会再运行时报错
RUNDIR、EXEROOT、DOUT_S_ROOT、BASELINE_ROOT:这些都是可以使用环境变量的形式填写,这样的好处是多人使用的时候每个人只需要设置 WORKDIR 变量就可以了,方便每个人管理自己的 case
上面的几点如果熟悉 CESM 1.x 的朋友们应该已经很熟悉了,下面几点是 2.x 版本新添加的功能,这里需要大家根据自己的配置来设置
mpirun 标签:如果你只使用一种 mpi 模式,后面 mpilib 的值填 default 即可,如果你有多种模式的 mpi ,例如 openmpi、mpich 等。这里就需要对每种 mpi 模式选择对应的提交方式,我这里就只有 intelmpi ,所以选择 default
executable 标签:指 mpi 提交作业的方式,没有作业调度系统的情况下填写 mpirun 或 mpiexec 即可。如果有作业调度系统,这里一般不能直接填写 mpirun,应选择对应的作业提交方式,类似 srun、qsub等
arguments 标签:指 mpi 提交作业的其他参数,每个参数都可以单独写一个 arg 标签,例如指定 -n 核数1 <arg name ="num_tasks" > -n {{ total_tasks }}</arg >
module_system 标签:指定在软件运行前需要使用 module 命令加载的软件或者库,如果没有 module 或不需要软件提醒,自己手动加载的,这里的 type 选择 none 就可以了
init_path 标签:指加载 module 命令的初始命令,一般情况下系统中都会自动加载,后面的 lang 参数是指初始化 module 时使用的语言
cmd_path 标签:指使用 module 时的命令,一般情况下都是 module
modules 标签:指在运行 CESM 之前需要使用的命令,如果是指定 compiler 则是指在使用某个编译器时需要加载的命令
modules 下 command 标签:执行 module 命令的参数,name = load 就相当于执行了 module load 命令
environment_variables 标签:指定在运行前需要手动设置的环境变量,例如:1 <env name ="NETCDF_PATH" > /public/lib/netcdf/intel/4.7.4</env >
这就是指你在编译运行前需要设置 NETCDF_PATH 参数:export NETCDF_PATH=/public/lib/netcdf/intel/4.7.4,如果你使用 openmpi ,可以在这里写1 <env name ="OMP_NUM_THREADS" > 24</env >
config_compilers.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <compiler COMPILER ="intel" > <CFLAGS > <base > -qno-opt-dynamic-align -fp-model precise -std=gnu99 </base > <append compile_threaded ="true" > -qopenmp </append > <append DEBUG ="FALSE" > -O2 -debug minimal </append > <append DEBUG ="TRUE" > -O0 -g </append > </CFLAGS > <CPPDEFS > <append > -DFORTRANUNDERSCORE -DCPRINTEL</append > </CPPDEFS > <CXX_LDFLAGS > <base > -cxxlib </base > </CXX_LDFLAGS > <CXX_LINKER > FORTRAN</CXX_LINKER > <FC_AUTO_R8 > <base > -r8 </base > </FC_AUTO_R8 > <FFLAGS > <base > -qno-opt-dynamic-align -convert big_endian -assume byterecl -ftz -traceback -assume realloc_lhs -fp-model source </base > <append compile_threaded ="true" > -qopenmp </append > <append DEBUG ="TRUE" > -O0 -g -check uninit -check bounds -check pointers -fpe0 -check noarg_temp_created </append > <append DEBUG ="FALSE" > -O2 -debug minimal </append > </FFLAGS > <FFLAGS_NOOPT > <base > -O0 </base > <append compile_threaded ="true" > -qopenmp </append > </FFLAGS_NOOPT > <FIXEDFLAGS > <base > -fixed -132 </base > </FIXEDFLAGS > <FREEFLAGS > <base > -free </base > </FREEFLAGS > <LDFLAGS > <append compile_threaded ="true" > -qopenmp </append > </LDFLAGS > <MPICC > mpiicc </MPICC > <MPICXX > mpiicpc </MPICXX > <MPIFC > mpiifort </MPIFC > <SCC > icc </SCC > <SCXX > icpc </SCXX > <SFC > ifort </SFC > <SLIBS > <base > -L$ENV{NETCDF_PATH}/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -ldl -lm -lz -lcurl</base > <append MPILIB ="mpich" > -mkl=cluster </append > <append MPILIB ="mpich2" > -mkl=cluster </append > <append MPILIB ="mvapich" > -mkl=cluster </append > <append MPILIB ="mvapich2" > -mkl=cluster </append > <append MPILIB ="mpt" > -mkl=cluster </append > <append MPILIB ="openmpi" > -mkl=cluster </append > <append MPILIB ="impi" > -mkl=cluster </append > <append MPILIB ="mpi-serial" > -mkl </append > </SLIBS > <SUPPORTS_CXX > TRUE</SUPPORTS_CXX > </compiler >
这里重点有下面几个方面(依旧以 Intel 编译器为例):
首先需要修改的还是 MPICC 等几个 mpi 编译器的名称
SLIBS 标签下原先缺少了 netcdf 库的各种链接,需要手动添加,base 的意思是无论你的 MPILIB 是什么都会自动加载
关于 NetCDF 库还有一点需要注意 在 $CESM_ROOT/cime/scripts/Tools/Makefile 文件中查找 lnetcdff,可以看到有两行是
1 2 3 4 5 ifeq ($(NETCDF_SEPARATE), false ) SLIBS := -L$(LIB_NETCDF) -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -ldl -lm -lz -lcurl else ifeq ($(NETCDF_SEPARATE), true ) SLIBS := -L$(LIB_NETCDF_FORTRAN) -L$(LIB_NETCDF_C) -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -ldl -lm -lz -lcurl endif
原来是没有 -lhdf5_hl -lhdf5 这些选项的需要手动添加一下
CESM 2.x 中关于 compiler 的配置不需要修改太多,算是对开发人员更加友好了
config_batch.xml 在 config_batch.xml 文件中我们可以看到很多已经配置好的作业调度系统,如果刚好有你需要的,例如:slurm、lsf、pbs 等等,可以直接在原有的基础上修改一些选项,例如在 pbs 中添加 -l 选项,找到 directives 标签,在下方添加:
1 <directive > -l nodes=2:ppn=10 </directive >
因为每个调度系统使用的队列是不同的,如果你没有在这里指定队列信息,在后面运行的时候会提示你没有可用队列,我们只需要添加一条自己的队列信息即可
1 2 3 4 5 <batch_system MACH ="custom" type ="pbs" > <queues > <queue nodemin ="1" nodemax ="4" default ="true" > compute_queue_1</queue > </queues > </batch_system >
如果你在 config_machines.xml 中的 BATCH_SYSTEM 配置是 none 的话这个文件就可以不用修改了
FAQs(持续收集中 … ) Q1:编译过程中出现 pnetcdf 的问题 A1:找到 $CESM_ROOT/cime/scripts/Tools/Makefile 中关于 pnetcdf 的位置将 -lpnetcdf 等等都删了 A2:重新安装 pnetcdf 库以及 netcdf 库
如果你在运行过程中有任何问题欢迎留言或私信讨论! ps:笔者也提供代安装服务,有需求的朋友可以添加微信 mrxun_ ,添加时请备注来意,谢谢!