CESM 1.2.1 配置文件详解

CESM 1.x 版本现在使用者还是很多,最近对配置方面的理解有了进一步的了解,故写了一篇文章为大家解惑,如果有不正确的地方欢迎指正!

配置文件路径

CESM 1.2 版本配置文件路径在 $CESM_ROOT/script/ccsm_utils/Machines

配置文件详解

config_machines.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<machine MACH="custom">
<DESC>my defined</DESC>
<OS>LINUX</OS>
<COMPILERS>intel</COMPILERS>
<MPILIBS>impi</MPILIBS>
<RUNDIR>$ENV{WORKDIR}/cesm121_case_dir/$CASE/run</RUNDIR>
<EXEROOT>$ENV{WORKDIR}/cesm121_case_dir/$CASE/bld</EXEROOT>
<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}/cesm121_case_dir/CLMARCHIVE/$CASE</DOUT_S_ROOT>
<BASELINE_ROOT>$ENV{WORKDIR}/cesm_baselines</BASELINE_ROOT>
<CCSM_CPRNC>$ENV{CESMROOT}/tools/cprnc</CCSM_CPRNC>
<BATCHQUERY>qstat -f</BATCHQUERY>
<BATCHSUBMIT>qsub</BATCHSUBMIT>
<GMAKE_J>16</GMAKE_J>
<MAX_TASKS_PER_NODE>80</MAX_TASKS_PER_NODE>
<PES_PER_NODE>80</PES_PER_NODE>
<SUPPORTED_BY>me</SUPPORTED_BY>
</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. BATCHQUERY和BATCHSUBMIT:如果你是普通的服务器没有部署作业调度系统这两项可以不填,直接把中间的内容删除,元素保留即可,一般大型服务器或超算上都会部署类似 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

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
<compiler COMPILER="intel">
<!-- http://software.intel.com/en-us/articles/intel-composer-xe/ -->
<ADD_CPPDEFS> -DFORTRANUNDERSCORE -DNO_R16</ADD_CPPDEFS>
<ADD_CFLAGS compile_threaded="true"> -qopenmp </ADD_CFLAGS>
<ADD_FFLAGS compile_threaded="true"> -qopenmp </ADD_FFLAGS>
<ADD_LDFLAGS compile_threaded="true"> -qopenmp </ADD_LDFLAGS>
<FREEFLAGS> -free </FREEFLAGS>
<FIXEDFLAGS> -fixed -132 </FIXEDFLAGS>
<ADD_FFLAGS DEBUG="TRUE"> -g -CU -check pointers -fpe0 </ADD_FFLAGS>
<FFLAGS> -O2 -fPIC -fp-model source -convert big_endian -assume byterecl -ftz -traceback </FFLAGS>
<CFLAGS> -O2 -fPIC -fp-model precise </CFLAGS>
<FFLAGS_NOOPT> -O0 </FFLAGS_NOOPT>
<FC_AUTO_R8> -r8 </FC_AUTO_R8>
<SFC> ifort </SFC>
<SCC> icc </SCC>
<SCXX> icpc </SCXX>
<MPIFC> mpiifort </MPIFC>
<MPICC> mpiicc </MPICC>
<MPICXX> mpiicpc </MPICXX>
<CXX_LINKER>FORTRAN</CXX_LINKER>
<CXX_LDFLAGS> -cxxlib </CXX_LDFLAGS>
<SUPPORTS_CXX>TRUE</SUPPORTS_CXX>
<ADD_SLIBS>-L$ENV{NETCDF_PATH}/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -ldl -lm -lz -lcurl -mkl=cluster</ADD_SLIBS>
</compiler>

这里重点有下面几个方面(以 Intel 编译器为例):

  1. ADD_CFLAGS:这里原来是 -openmp,如果你使用的 Intel 编译器比较新(version > 17),这里就需要修改为 -qopenmp
  2. 下面的 MPIFC 等等:mpi 编译器需要修改为你需要使用的编译器,原来这里是 mpiicxx 等等,如果你使用的 Intel 编译器比较新(version > 17),这里就需要修改为 mpiicpc
  3. ADD_SLIBS:这里一定要把 NetCDF 库的位置已经链接选项都添加上,否则在编译时一定会出错,这里使用 $ENV {NETCDF_PATH} 是方便不同的人使用不同版本的 NetCDF,只需要在编译前设置一下 NETCDF_PATH 即可。如果只需要使用一个版本的 NetCDF (例如 4.1.3),那么这里的 $ENV{NETCDF_PATH} 可以换成固定的全路径即可
    Tips:这里的 NetCDF 库包含的 zlib、szip、hdf5 等等,需要提前安装在同一个目录下,方便管理

mkbatch.custom

如果你使用的服务器没有作业调度系统,那么这里直接随便复制一个原来的即可

如果有作业调度系统,可以参考已经有的文件(mkbatch.xxxx),挑选一个符合你要求的复制一份再修改即可,这里因为每个机器配置不同不做赘述,如果有问题可以私聊

FAQs (持续收集中 … )

Q1: cesm 1.2.1 demo ./cesm_setup 报错 could not find restart file for branch or hybrid start
A1: 将 env_run.xml 中 RUN_TYPE 改为 startup 即可

如果你在运行过程中有任何问题欢迎留言或私信讨论!

ps:笔者也提供代安装服务,有需求的朋友可以添加微信 mrxun_ ,添加时请备注来意,谢谢!