CESM 1.x 版本现在使用者还是很多,最近对配置方面的理解有了进一步的了解,故写了一篇文章为大家解惑,如果有不正确的地方欢迎指正!
配置文件路径
CESM 1.2 版本配置文件路径在 $CESM_ROOT/script/ccsm_utils/Machines
配置文件详解
config_machines.xml
<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>64</MAX_TASKS_PER_NODE>
<PES_PER_NODE>64</PES_PER_NODE>
<SUPPORTED_BY>me</SUPPORTED_BY>
</machine>
这里重点有下面几个方面:
- COMPILERS:一般大型服务器上都会部署 mpi 编译器,根据你的需求选择有 pgi,intel,gnu 等等
- MPILIBS:Intel 编译器一般选择 impi,gnu 可以搭配 openmpi,mpich,如果你不需要 mpi 这里就填 mpi-serial 即可
- DIN_LOC_ROOT:这个文件夹的位置可以选择一个固定的目录,这样所有的 inputdata 都会放在同一个文件夹中,方便后续使用
- DIN_LOC_ROOT_CLMFORC:同上
- BATCHQUERY和BATCHSUBMIT:如果你是普通的服务器没有部署作业调度系统这两项可以不填,直接把中间的内容删除,元素保留即可,一般大型服务器或超算上都会部署类似 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
config_compilers.xml
<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 编译器为例):
- ADD_CFLAGS:这里原来是 -openmp,如果你使用的 Intel 编译器比较新(version > 17),这里就需要修改为 -qopenmp
- 下面的 MPIFC 等等:mpi 编译器需要修改为你需要使用的编译器,原来这里是 mpiicxx 等等,如果你使用的 Intel 编译器比较新(version > 17),这里就需要修改为 mpiicpc
- 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 即可