CESM 2.1.3 配置文件详解

这篇文章对 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>

这里重点有下面几个方面:

  1. COMPILERS:一般大型服务器上都会部署 mpi 编译器,根据你的需求选择有 pgi,intel,gnu 等等
  2. MPILIBS:Intel 编译器一般选择 impi,gnu 可以搭配 openmpi,mpich,如果你不需要 mpi 这里就填 mpi-serial 即可
  3. DIN_LOC_ROOT:这个文件夹的位置可以选择一个固定的目录,这样所有的 inputdata 都会放在同一个文件夹中,方便后续使用
  4. DIN_LOC_ROOT_CLMFORC:同上
  5. BATCH_SYSTEM:如果你是普通的服务器没有部署作业调度系统这一项填写 none 即可。一般大型服务器或超算上都会部署类似 slurm,pbs 或者 lsf 等等作业调度系统,还有部分作业调度系统是定制版本,这就需要联系系统管理员或者自己熟读用户手册之后再修改这两项
  6. GMAKE_J:编译时候可以并行的最大核数,这个数字填你使用的机器的 CPU 核数即可
  7. PES_PER_NODE 和 MAX_TASKS_PER_NODE:这两个数字需要视情况而定,如果你使用的机器是一般的服务器,没有计算节点这些东西的话直接填写机器的 CPU 核数即可;如果你使用的是大型服务器或超算则需要填写计算节点的 CPU 核数。如果这里填的数字超过你的 CPU 核数一般都是会再运行时报错
  8. RUNDIR、EXEROOT、DOUT_S_ROOT、BASELINE_ROOT:这些都是可以使用环境变量的形式填写,这样的好处是多人使用的时候每个人只需要设置 WORKDIR 变量就可以了,方便每个人管理自己的 case

上面的几点如果熟悉 CESM 1.x 的朋友们应该已经很熟悉了,下面几点是 2.x 版本新添加的功能,这里需要大家根据自己的配置来设置

  1. 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>
  1. 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 命令
  1. 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>
<!-- http://software.intel.com/en-us/articles/intel-composer-xe/ -->
<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 编译器为例):

  1. 首先需要修改的还是 MPICC 等几个 mpi 编译器的名称
  2. 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_ ,添加时请备注来意,谢谢!