CESM 2.1.3 安装配置文件详解

这篇文章对 CESM 2.x 以及 CLM 5.x 版本的配置做了详细的解释,如果对你有帮助的话欢迎点赞评论支持一下,谢谢~

文章首发在 CSDN ,除了个人网站与 CSDN 之外都属于抄袭盗版,敬请举报!

配置文件路径

CESM 2.x 版本配置文件路径在 $CESM_ROOT/cime/config/cesm/machines
CLM 5.0 的配置文件也在上述路径下 $CLM_ROOT/cime/config/cesm/machines

配置文件详解

config_machines.xml
<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 核数
<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 标签:指定在运行前需要手动设置的环境变量,例如:
<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 ,可以在这里写

<env name="OMP_NUM_THREADS">24</env>
config_compilers.xml
<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,可以看到有两行是

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 标签,在下方添加:

 <directive> -l nodes=2:ppn=10 </directive>

因为每个调度系统使用的队列是不同的,如果你没有在这里指定队列信息,在后面运行的时候会提示你没有可用队列,我们只需要添加一条自己的队列信息即可

<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 库

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

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MrXun_

谢谢老板的支持!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值