---
title: 运行和验证
description: "1. 使用PuTTY工具，以root用户登录服务器。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpcindapp/prtg-osc/openmind_kunpengcesm_02_0017.html
sourcePath: /source/zh/kunpenghpcs/hpcindapp/prtg-osc/openmind_kunpengcesm_02_0017.html
indexId: 4423196e1217e2e15c004a1d1b293b2f993298b155e4e76b034ddc8695bdaf8675
---
# 运行和验证

#### 单节点

1. 使用PuTTY工具，以root用户登录服务器。
2. 执行以下命令修改“config_machines.xml”文件。

  a. 打开“config_machines.xml”文件。

```
vi
/path/to/CESM
/CESM-cesm2.1.1/cime/config/cesm/machines/config_machines.xml
```


  b. 按“i”进入编辑模式，修改如下粗体内容。

```
<machine MACH="centos7-linux">
<DESC>
Example port to centos7 linux system with gcc, netcdf, pnetcdf and mpich
using modules from http://www.admin-magazine.com/HPC/Articles/Environment-Modules
</DESC>
<NODENAME_REGEX>n2</NODENAME_REGEX>
<OS>LINUX</OS>
<PROXY> https://howto.get.out </PROXY>
<COMPILERS>gnu</COMPILERS>
<MPILIBS>openmpi</MPILIBS>
<PROJECT>none</PROJECT>
<SAVE_TIMING_DIR> </SAVE_TIMING_DIR>
<CIME_OUTPUT_ROOT>$ENV{HOME}/cesm/scratch</CIME_OUTPUT_ROOT>
<DIN_LOC_ROOT>$ENV{HOME}/cesm/inputdata</DIN_LOC_ROOT>
<DIN_LOC_ROOT_CLMFORC>$ENV{HOME}/cesm/inputdata/lmwg</DIN_LOC_ROOT_CLMFORC>
<DOUT_S_ROOT>$ENV{HOME}/cesm/archive/$CASE</DOUT_S_ROOT>
<BASELINE_ROOT>$ENV{HOME}/cesm/cesm_baselines</BASELINE_ROOT>
<CCSM_CPRNC>$ENV{HOME}/cesm/tools/cime/tools/cprnc/cprnc</CCSM_CPRNC>
<GMAKE>make</GMAKE>
<GMAKE_J>8</GMAKE_J>
<BATCH_SYSTEM>none</BATCH_SYSTEM>
<SUPPORTED_BY>me@my.address</SUPPORTED_BY>
<MAX_TASKS_PER_NODE>96</MAX_TASKS_PER_NODE>
<MAX_MPITASKS_PER_NODE>96</MAX_MPITASKS_PER_NODE>
<PROJECT_REQUIRED>FALSE</PROJECT_REQUIRED>
<mpirun mpilib="default">
<executable>mpirun</executable>
<arguments>
<arg name="ntasks">--allow-run-as-root --mca btl ^openib -np {{ total_tasks }} </arg>
</arguments>
</mpirun>
<module_system type="module" allow_error="true">
<init_path lang="perl">/usr/share/Modules/init/perl.pm</init_path>
<init_path lang="python">/usr/share/Modules/init/python.py</init_path>
<init_path lang="csh">/usr/share/Modules/init/csh</init_path>
<init_path lang="sh">/usr/share/Modules/init/sh</init_path>
<cmd_path lang="perl">/usr/bin/modulecmd perl</cmd_path>
<cmd_path lang="python">/usr/bin/modulecmd python</cmd_path>
<cmd_path lang="sh">module</cmd_path>
<cmd_path lang="csh">module</cmd_path>
<modules>
<command name="purge"/>
</modules>
</module_system>
<environment_variables>
<env name="NETCDF_PATH">
/path/to/NETCDF
</env>
<env name="NETCDF_FORTRAN_PATH">
/path/to/NETCDF
</env>
<env name="PNETCDF_PATH">
/path/to/PNETCDF
</env>
<env name="NETCDF_C_PATH">
/path/to/NETCDF
</env>
<env name="MPI_PATH">
/path/to/HMPI
</env>
<env name="OMP_STACKSIZE">256M</env>
</environment_variables>
<resource_limits>
<resource name="RLIMIT_STACK">-1</resource>
</resource_limits>
</machine>
```


**表1 config_machines.xml文件修改参数说明**

| 参数 | 修改说明 |
| --- | --- |
| <NODENAME\_REGEX> | 选项根据用户具体节点名称配置。 |
| <COMPILERS> | 编译器写成GNU。 |
| <MPILIBS> | 改为OpenMPI。 |
| <MAX\_TASKS\_PER\_NODE> | 根据用户环境，最大值为节点CPU核心总数。 |
| <MAX\_MPITASKS\_PER\_NODE> | 根据用户环境，最大值为节点CPU核心总数。 |
| <executable> | 默认是mpiexec，需修改为mpirun。 |
| <arguments> | 修改为\-\-allow\-run\-as\-root \-\-mca btl ^openib \-np {{ total\_tasks }}，系统会自动生成线程总数。 |
| <environment\_variables> | 根据用户安装位置配置依赖函数路径。 |


    请用户根据表1实际配置修改为自己指定的路径。

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
3. 执行以下命令修改“config_compilers.xml”文件。

  a. 打开“config_compilers.xml”文件。

```
vi
/path/to/CESM
/CESM-cesm2.1.1/cime/config/cesm/machines/config_compilers.xml
```


  b. 按“i”进入编辑模式，修改如下粗体内容。

```
<compiler COMPILER="gnu">
<CFLAGS>
<base>  -O3 -mcpu=tsv110 -Hx,54,0x08 </base>
<append compile_threaded="true"> -fopenmp </append>
<append DEBUG="TRUE"> -g -Wall -Og -fbacktrace -ffpe-trap=invalid,zero,overflow -fcheck=bounds </append>
<append DEBUG="FALSE"> -O </append>
</CFLAGS>
<CPPDEFS>
<!-- http://gcc.gnu.org/onlinedocs/gfortran/ -->
<append> -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU</append>
</CPPDEFS>
<CXX_LINKER>FORTRAN</CXX_LINKER>
<FC_AUTO_R8>
<base> -fdefault-real-8 </base>
</FC_AUTO_R8>
<FFLAGS>
<!-- -ffree-line-length-none and -ffixed-line-length-none need to be in FFLAGS rather than in FIXEDFLAGS/FREEFLAGS
so that these are passed to cmake builds (cmake builds don't use FIXEDFLAGS and FREEFLAGS). -->
<base>  -fconvert=big-endian -O3 -mcpu=tsv110 -Hx,54,0x08 -I
/path/to/NETCDF
/include -I
/path/to/PNETCDF
/include -I
/path/to/HDF5
/include -I
/path/to/CURL
/include -I
/path/to/OPENBLAS
/include -I
/path/to/ZLIB
/include </base>
<append compile_threaded="true"> -fopenmp </append>
<!-- Ideally, we would also have 'invalid' in the ffpe-trap list. But at
least with some versions of gfortran (confirmed with 5.4.0, 6.3.0 and
7.1.0), gfortran's isnan (which is called in cime via the
CPRGNU-specific shr_infnan_isnan) causes a floating point exception
when called on a signaling NaN. -->
<append DEBUG="TRUE"> -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds </append>
<append DEBUG="FALSE"> -O </append>
</FFLAGS>
<FFLAGS_NOOPT>
<base> -O0 </base>
</FFLAGS_NOOPT>
<FIXEDFLAGS>
<base>  -ffixed-form </base>
</FIXEDFLAGS>
<FREEFLAGS>
<base> -ffree-form </base>
</FREEFLAGS>
<HAS_F2008_CONTIGUOUS>FALSE</HAS_F2008_CONTIGUOUS>
<LDFLAGS>
<append compile_threaded="true"> -fopenmp -L
/path/to/NETCDF
/lib -L
/path/to/PNETCDF
/lib -L
/path/to/HDF5
/lib -L
/path/to/OPENBLAS
/lib -L
/path/to/CURL
/lib -L
/path/to/ZLIB
/lib -lopenblas -lnetcdff -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl</append>
</LDFLAGS>
<MPICC> /path/to/HMPI/bin/mpicc  </MPICC>
<MPICXX> /path/to/HMPI/bin/mpicxx </MPICXX>
<MPIFC> /path/to/HMPI/bin/mpifort </MPIFC>
<SCC> /path/to/bisheng/bin/clang </SCC>
<SCXX> /path/to/bisheng/bin/clang++ </SCXX>
<SFC> /path/to/bisheng/bin/flang </SFC>
<SUPPORTS_CXX>TRUE</SUPPORTS_CXX>
<SLIBS>
<append> -L
/path/to/NETCDF
/lib -L
/path/to/PNETCDF
/lib -L
/path/to/HDF5
/lib -L
/path/to/OPENBLAS
/lib -L
/path/to/CURL
/lib -L
/path/to/ZLIB
/lib -lopenblas -lnetcdff -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl </append>
</SLIBS>
```


**表2 config_compilers.xml文件修改参数说明**

| 参数 | 说明 |
| --- | --- |
| <CFLAGS> | 添加参数\-mcpu=tsv110。 |
| <FFLAGS> | 添加参数\-mcpu=tsv110，并且链接所有依赖库的include路径。 |
| <MPICC> | 指定为Hyper MPI的mpicc路径。 |
| <MPICXX> | 指定为Hyper MPI的mpicxx所在位置。 |
| <MPIFC> | 指定为Hyper MPI的mpifort所在位置。 |
| <SCC> | 指定为毕昇编译器的clang所在路径。 |
| <SCXX> | 指定为毕昇编译器的clang++所在路径。 |
| <SFC> | 指定为毕昇编译器的flang所在路径。 |
| <LDFLAGS> | 链接所有依赖环境的lib库，使用参数\-L。 |
| <SLIBS> | 链接所有依赖环境的lib库，使用参数\-L。 |


    请用户根据表2实际配置修改为自己指定的路径。

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
4. 执行以下命令进入工作目录。

```
cd
/path/to/CESM
/CESM-cesm2.1.1/cime/scripts
```


5. 执行以下命令创建算例。

```
./create_newcase --case mycase --compset X --res f19_g16 --mach=centos7-linux
```


  成功后回显信息如下图所示：

6. 执行以下命令下载输入数据，此处没有离线算例包，所有的组件根据命令行自动下载。

```
cd mycase
./check_case
./check_input_data --download
```


  每个模块下载成功后都成功会显示SUCCESS字样，用户可等其自动结束。

7. 执行以下命令运行CESM程序。

```
./case.setup
```


  成功回显信息如下图：

8. 检查Macro.make文件中的编译选项，Macro.make文件需要与config_compilers.xml文件中一致。选项包括<CFLAGS>、<FFLAGS>、<MPICC>、<MPICXX>、<MPIFC>、<SCC>、<SCXX>、<SFC>、<LDFLAGS>、<SLIBS>。

```
SUPPORTS_CXX := FALSE
ifeq ($(COMPILER),gnu)
FC_AUTO_R8 :=  -fdefault-real-8
HAS_F2008_CONTIGUOUS := FALSE
FFLAGS_NOOPT :=  -O0
SUPPORTS_CXX := TRUE
FFLAGS :=   -fconvert=big-endian -O3 -mcpu=tsv110 -Hx,54,0x08 -I
/path/to/NETCDF
/include -I
/path/to/PNETCDF
/include -I
/path/to/HDF5
/include -I
/path/to/CURL
/include -I
/path/to/OPENBLAS
/include -I
/path/to/ZLIB
/include
FIXEDFLAGS :=   -ffixed-form
SCC :=  /path/to/bisheng/bin/clang
SFC :=  /path/to/bisheng/bin/flang
MPICC :=  /path/to
/HMPI
/bin/mpicc
CFLAGS :=   -O3 -mcpu=tsv110 -Hx,54,0x08
MPIFC :=  /path/to/
HMPI
/bin/mpifort
MPICXX :=  /path/to/
HMPI
/bin/mpicxx
FREEFLAGS :=  -ffree-form
CXX_LINKER := FORTRAN
SCXX :=  /path/to/bisheng/bin/clang++
endif
ifeq ($(MODEL),pop)
CPPDEFS := $(CPPDEFS)  -D_USE_FLOW_CONTROL
endif
ifeq ($(COMPILER),gnu)
CPPDEFS := $(CPPDEFS)  -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU
SLIBS := $(SLIBS)  -L
/path/to/NETCDF
/lib -L
/path/to/PNETCDF
/lib -L
/path/to/HDF5
/lib -L
/path/to/OPENBLAS
/lib -L
/path/to/CURL
/lib -L
/path/to/ZLIB
/lib -lopenblas -lnetcdff -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl
ifeq ($(compile_threaded),true)
FFLAGS := $(FFLAGS)  -fopenmp
CFLAGS := $(CFLAGS)  -fopenmp
endif
ifeq ($(DEBUG),TRUE)
FFLAGS := $(FFLAGS)  -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds
CFLAGS := $(CFLAGS)  -g -Wall -Og -fbacktrace -ffpe-trap=invalid,zero,overflow -fcheck=bounds
endif
ifeq ($(DEBUG),FALSE)
FFLAGS := $(FFLAGS)  -O
CFLAGS := $(CFLAGS)  -O
endif
ifeq ($(compile_threaded),true)
LDFLAGS := $(LDFLAGS)  -L
/path/to/NETCDF
/lib -L
/path/to/PNETCDF
/lib -L
/path/to/HDF5
/lib -L
/path/to/OPENBLAS
/lib -L
/path/to/CURL
/lib -L
/path/to/ZLIB
/lib -lopenblas -lnetcdff -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl
endif
endif
```


9. 执行以下命令修改“CESM-cesm2.1.1/cime/src/share/util/shr_infnan_mod.F90.in”文件。

  a. 打开“CESM-cesm2.1.1/cime/src/share/util/shr_infnan_mod.F90.in”文件。

```
vi
/path/to/CESM
/CESM-cesm2.1.1/cime/src/share/util/shr_infnan_mod.F90.in
```


  b. 按“i”进入编辑模式，修改文件中第227行的内容，如图光标所在处。
    执行9.a之后，按“Esc”键，输入“:set nu”，按“Enter”即可显示出行号。

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
10. 执行以下命令修改“CESM-release-cesm2.1.1/cime/src/share/util/shr_sys_mod.F90”文件。

  a. 打开“CESM-release-cesm2.1.1/cime/src/share/util/shr_sys_mod.F90”文件。

```
vi
/path/to/CESM
/CESM-cesm2.1.1/cime/src/share/util/shr_sys_mod.F90
```


  b. 按“i”进入编辑模式，修改如下内容。
    删除第70行defined CPRGNU之前的感叹号“！”。

    删掉第115行defined CPRGNU之前的感叹号“！”。

    执行10.a之后，按“Esc”键，输入“:set nu”，按“Enter”即可显示出行号。

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
11. 执行以下命令构建“cesm.exe”运行文件。

```
./case.build --skip-provenance-check
```


  成功回显信息如下图：

  用户需将所在系统中“cmake3”软连接到“cmake”，同时指定“cmake”路径。如在root用户下，如果用户CMake已经是3.0版本以上，请忽略ln -sf /usr/bin/cmake3 /usr/bin/cmake。

```
ln -sf /usr/bin/cmake3 /usr/bin/cmake
```


12. 执行以下命令运行“cesm.exe”。

```
./case.submit
```


  当CESM运行的结尾处出现如图所示内容时，表示CESM程序运行正常结束。

  需要查看输出到屏幕中的日志，手动计算出时间差，数值越少性能越优。如图，算例开始时间为“2021-10-20 16:19:28”，结束时间为“2021-10-20 16:20:02”，那么此算例运行时间为34s。


#### 多节点

1. 使用PuTTY工具，以root用户登录服务器。
2. 执行以下命令修改“config_machines.xml”文件。

  a. 打开“config_machines.xml”文件。

```
vi
/path/to/CESM
/CESM-cesm2.1.1/cime/config/cesm/machines/config_machines.xml
```


  b. 按“i”进入编辑模式，修改如下粗体内容。

```
<machine MACH="centos7-linux">
<DESC>
Example port to centos7 linux system with gcc, netcdf, pnetcdf and mpich
using modules from http://www.admin-magazine.com/HPC/Articles/Environment-Modules
</DESC>
<NODENAME_REGEX>n2</NODENAME_REGEX>
<OS>LINUX</OS>
<PROXY> https://howto.get.out </PROXY>
<COMPILERS>gnu</COMPILERS>
<MPILIBS>openmpi</MPILIBS>
<PROJECT>none</PROJECT>
<SAVE_TIMING_DIR> </SAVE_TIMING_DIR>
<CIME_OUTPUT_ROOT>$ENV{HOME}/cesm/scratch</CIME_OUTPUT_ROOT>
<DIN_LOC_ROOT>$ENV{HOME}/cesm/inputdata</DIN_LOC_ROOT>
<DIN_LOC_ROOT_CLMFORC>$ENV{HOME}/cesm/inputdata/lmwg</DIN_LOC_ROOT_CLMFORC>
<DOUT_S_ROOT>$ENV{HOME}/cesm/archive/$CASE</DOUT_S_ROOT>
<BASELINE_ROOT>$ENV{HOME}/cesm/cesm_baselines</BASELINE_ROOT>
<CCSM_CPRNC>$ENV{HOME}/cesm/tools/cime/tools/cprnc/cprnc</CCSM_CPRNC>
<GMAKE>make</GMAKE>
<GMAKE_J>8</GMAKE_J>
<BATCH_SYSTEM>none</BATCH_SYSTEM>
<SUPPORTED_BY>me@my.address</SUPPORTED_BY>
<MAX_TASKS_PER_NODE>96</MAX_TASKS_PER_NODE>
<MAX_MPITASKS_PER_NODE>96</MAX_MPITASKS_PER_NODE>
<PROJECT_REQUIRED>FALSE</PROJECT_REQUIRED>
<mpirun mpilib="default">
<executable>mpirun</executable>
<arguments>
<arg name="ntasks">--allow-run-as-root --mca btl ^openib --machinefile path/to/machinefile -np 192 -N 96 -x PATH=
/path/to/bisheng/
bin:
/path/to/HMPI
/bin:
/path/to/NETCDF
/bin:$PATH -x
LD_LIBRARY_PATH=
/path/to/bisheng
/lib:
/path/to/HMPI
/lib:
/path/to/NETCDF/lib:
$LD_LIBRARY_PATH
</arg>
</arguments>
</mpirun>
<module_system type="module" allow_error="true">
<init_path lang="perl">/usr/share/Modules/init/perl.pm</init_path>
<init_path lang="python">/usr/share/Modules/init/python.py</init_path>
<init_path lang="csh">/usr/share/Modules/init/csh</init_path>
<init_path lang="sh">/usr/share/Modules/init/sh</init_path>
<cmd_path lang="perl">/usr/bin/modulecmd perl</cmd_path>
<cmd_path lang="python">/usr/bin/modulecmd python</cmd_path>
<cmd_path lang="sh">module</cmd_path>
<cmd_path lang="csh">module</cmd_path>
<modules>
<command name="purge"/>
</modules>
</module_system>
<environment_variables>
<env name="NETCDF_PATH">
/path/to/NETCDF
</env>
<env name="NETCDF_FORTRAN_PATH">
/path/to/NETCDF
</env>
<env name="PNETCDF_PATH">
/path/to/NETCDF
</env>
<env name="NETCDF_C_PATH">
/path/to/PNETCDF
</env>
<env name="MPI_PATH">
/path/to/HMPI
/env>
<env name="OMP_STACKSIZE">256M</env>
</environment_variables>
<resource_limits>
<resource name="RLIMIT_STACK">-1</resource>
</resource_limits>
</machine>
```


**表3 config_machines.xml文件修改参数说明**

| 参数 | 说明 |
| --- | --- |
| <NODENAME\_REGEX> | 选项根据用户具体节点名称配置。 |
| <COMPILERS> | 编译器写成GNU。 |
| <MPILIBS> | 改为OpenMPI。 |
| <MAX\_TASKS\_PER\_NODE> | 根据用户环境，最大值为节点CPU核心总数。 |
| <MAX\_MPITASKS\_PER\_NODE> | 根据用户环境，最大值为节点CPU核心总数。 |
| <executable> | 默认是mpiexec，需修改mpirun。 |
| <arguments> | 对于多节点来说，需要修改的是的ntasks值，例如，若用户使用两个96核心数的节点满核运行，那么总进程数ntasks设为96\*2=192，\-np 192，每个节点上进程数 \-N 96。同时多节点运行需要加入编译器的路径和依赖库的路径，路径之间用\-x参数隔开。 |
| <environment\_variables> | 根据用户安装位置配置依赖函数路径。 |


    请用户根据表3实际配置修改为自己指定的路径。

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
3. 执行以下命令修改“config_compilers.xml”文件。

  a. 打开“config_compilers.xml”文件。

```
vi
/path/to/CESM
/CESM-cesm2.1.1/cime/config/cesm/machines/config_compiler.xml
```


  b. 按“i”进入编辑模式，修改如下粗体内容。

```
<compiler COMPILER="gnu">
<CFLAGS>
<base>  -O3 -mcpu=tsv110 -Hx,54,0x08 </base>
<append compile_threaded="true"> -fopenmp </append>
<append DEBUG="TRUE"> -g -Wall -Og -fbacktrace -ffpe-trap=invalid,zero,overflow -fcheck=bounds </append>
<append DEBUG="FALSE"> -O </append>
</CFLAGS>
<CPPDEFS>
<!-- http://gcc.gnu.org/onlinedocs/gfortran/ -->
<append> -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU</append>
</CPPDEFS>
<CXX_LINKER>FORTRAN</CXX_LINKER>
<FC_AUTO_R8>
<base> -fdefault-real-8 </base>
</FC_AUTO_R8>
<FFLAGS>
<!-- -ffree-line-length-none and -ffixed-line-length-none need to be in FFLAGS rather than in FIXEDFLAGS/FREEFLAGS
so that these are passed to cmake builds (cmake builds don't use FIXEDFLAGS and FREEFLAGS). -->
<base>  -fconvert=big-endian -O3 -mcpu=tsv110 -Hx,54,0x08 -I
/path/to/NETCDF
/include -I
/path/to/PNETCDF
/include -I
/path/to/HDF5
/include -I
/path/to/CURL
/include -I
/path/to/OPENBLAS
/include -I
/path/to/ZLIB
/include </base>
<append compile_threaded="true"> -fopenmp </append>
<!-- Ideally, we would also have 'invalid' in the ffpe-trap list. But at
least with some versions of gfortran (confirmed with 5.4.0, 6.3.0 and
7.1.0), gfortran's isnan (which is called in cime via the
CPRGNU-specific shr_infnan_isnan) causes a floating point exception
when called on a signaling NaN. -->
<append DEBUG="TRUE"> -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds </append>
<append DEBUG="FALSE"> -O </append>
</FFLAGS>
<FFLAGS_NOOPT>
<base> -O0 </base>
</FFLAGS_NOOPT>
<FIXEDFLAGS>
<base>  -ffixed-form </base>
</FIXEDFLAGS>
<FREEFLAGS>
<base> -ffree-form </base>
</FREEFLAGS>
<HAS_F2008_CONTIGUOUS>FALSE</HAS_F2008_CONTIGUOUS>
<LDFLAGS>
<append compile_threaded="true"> -fopenmp -L
/path/to/NETCDF
/lib -L
/path/to/PNETCDF
/lib -L
/path/to/HDF5
/lib -L
/path/to/OPENBLAS
/lib -L
/path/to/CURL
/lib -L
/path/to/ZLIB
/lib -lopenblas -lnetcdff -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl</append>
</LDFLAGS>
<MPICC> /path/to/
HMPI
/bin/mpicc  </MPICC>
<MPICXX> /path/to/
HMPI
/bin/mpicxx </MPICXX>
<MPIFC> /path/to/
HMPI
/bin/mpifort </MPIFC>
<SCC> /path/to/bisheng/bin/clang </SCC>
<SCXX> /path/to/bisheng/bin/clang++ </SCXX>
<SFC> /path/to/bisheng/bin/flang </SFC>
<SUPPORTS_CXX>TRUE</SUPPORTS_CXX>
<SLIBS>
<append> -L
/path/to/NETCDF
/lib -L
/path/to/PNETCDF
/lib -L
/path/to/HDF5
/lib -L
/path/to/OPENBLAS
/lib -L
/path/to/CURL
/lib -L
/path/to/ZLIB
/lib -lopenblas -lnetcdff -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl </append>
</SLIBS>
```


**表4 config_compilers.xml文件修改参数说明**

| 参数 | 说明 |
| --- | --- |
| <CFLAGS> | 添加参数\-mcpu=tsv110。 |
| <FFLAGS> | 添加参数\-mcpu=tsv110，并且链接所有依赖库的include路径。 |
| <MPICC> | 指定为Hyper MPI的mpicc路径。 |
| <MPICXX> | 指定为Hyper MPI的mpicxx所在位置。 |
| <MPIFC> | 指定为Hyper MPI的mpifort所在位置。 |
| <SCC> | 指定为毕昇编译器的clang所在路径。 |
| <SCXX> | 指定为毕昇编译器的clang++所在路径。 |
| <SFC> | 指定为毕昇编译器的flang所在路径。 |
| <LDFLAGS> | 链接所有依赖环境的lib库，使用参数\-L。 |
| <SLIBS> | 链接所有依赖环境的lib库，使用参数\-L。 |


    请用户根据表4实际配置修改为自己指定的路径。

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
4. 执行以下命令进入工作目录。

```
cd
/path/to/CESM
/CESM-cesm2.1.1/cime/scripts
```


5. 执行以下命令创建算例。

```
./create_newcase --case mycase --compset X --res f19_g16 --mach=centos7-linux
```


  回显信息如下图：

6. 执行以下命令下载输入数据。

```
cd mycase
./check_case
./check_input_data --download
```


  每个模块下载成功后都成功会显示SUCCESS字样，用户可等其自动结束。

7. 执行以下命令运行CESM程序。

```
./case.setup
```


8. 检查Macro.make文件中的编译选项，Macro.make文件编译选项内容需要与config_compilers.xml文件中一致。选项包括<CFLAGS>、<FFLAGS>、<MPICC>、<MPICXX>、<MPIFC>、<SCC>、<SCXX>、<SFC>、<LDFLAGS>、<SLIBS>。

```
SUPPORTS_CXX := FALSE
ifeq ($(COMPILER),gnu)
FC_AUTO_R8 :=  -fdefault-real-8
HAS_F2008_CONTIGUOUS := FALSE
FFLAGS_NOOPT :=  -O0
SUPPORTS_CXX := TRUE
FFLAGS :=   -fconvert=big-endian -O3 -mcpu=tsv110 -Hx,54,0x08 -I
/path/to/NETCDF
/include -I
/path/to/PNETCDF
/include -I
/path/to/HDF5
/include -I
/path/to/CURL
/include -I
/path/to/OPENBLAS
/include -I
/path/to/ZLIB
/include
FIXEDFLAGS :=   -ffixed-form
SCC :=  /path/to/bisheng/bin/clang
SFC :=  /path/to/bisheng/bin/flang
MPICC :=  /path/to/HMPI/bin/mpicc
CFLAGS :=   -O3 -mcpu=tsv110 -Hx,54,0x08
MPIFC :=  /path/to/HMPI/bin/mpifort
MPICXX :=  /path/to/HMPI/bin/mpicxx
FREEFLAGS :=  -ffree-form
CXX_LINKER := FORTRAN
SCXX :=  /path/to/bisheng/bin/clang++
endif
ifeq ($(MODEL),pop)
CPPDEFS := $(CPPDEFS)  -D_USE_FLOW_CONTROL
endif
ifeq ($(COMPILER),gnu)
CPPDEFS := $(CPPDEFS)  -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU
SLIBS := $(SLIBS)  -L
/path/to/NETCDF
/lib -L
/path/to/PNETCDF
/lib -L
/path/to/HDF5
/lib -L
/path/to/OPENBLAS
/lib -L
/path/to/CURL
/lib -L
/path/to/ZLIB
/lib -lopenblas -lnetcdff -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl
ifeq ($(compile_threaded),true)
FFLAGS := $(FFLAGS)  -fopenmp
CFLAGS := $(CFLAGS)  -fopenmp
endif
ifeq ($(DEBUG),TRUE)
FFLAGS := $(FFLAGS)  -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds
CFLAGS := $(CFLAGS)  -g -Wall -Og -fbacktrace -ffpe-trap=invalid,zero,overflow -fcheck=bounds
endif
ifeq ($(DEBUG),FALSE)
FFLAGS := $(FFLAGS)  -O
CFLAGS := $(CFLAGS)  -O
endif
ifeq ($(compile_threaded),true)
LDFLAGS := $(LDFLAGS)  -L
/path/to/NETCDF
/lib -L
/path/to/PNETCDF
/lib -L
/path/to/HDF5
/lib -L
/path/to/OPENBLAS
/lib -L
/path/to/CURL
/lib -L
/path/to/ZLIB
/lib -lopenblas -lnetcdff -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl
endif
endif
```


9. 执行以下命令修改“CESM-cesm2.1.1/cime/src/share/util/shr_infnan_mod.F90.in”文件。

  a. 打开“CESM-cesm2.1.1/cime/src/share/util/shr_infnan_mod.F90.in”文件。

```
vi
/path/to/CESM
/CESM-cesm2.1.1/cime/src/share/util/shr_infnan_mod.F90.in
```


  b. 按“i”进入编辑模式，修改文件中第227行的内容，如图光标所在处。
    执行9.a之后，按“Esc”键，输入“:set nu”，按“Enter”即可显示出行号。

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
10. 执行以下命令修改“CESM-release-cesm2.1.1/cime/src/share/util/shr_sys_mod.F90”文件。

  a. 打开“CESM-release-cesm2.1.1/cime/src/share/util/shr_sys_mod.F90”文件。

```
vi
/path/to/CESM
/CESM-cesm2.1.1/cime/src/share/util/shr_sys_mod.F90
```


  b. 按“i”进入编辑模式，修改如下内容。
    删掉第70行defined CPRGNU之前的感叹号“！”。

    删掉第115行defined CPRGNU之前的感叹号“！”。

    执行10.a之后，按“Esc”键，输入“:set nu”，按“Enter”即可显示出行号。

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
11. 执行以下命令构建cesm.exe运行文件。

```
./case.build --skip-provenance-check
```


  成功后回显信息如下图：

  用户需将所在系统中“cmake3”软连接到“cmake”，同时指定“cmake”路径。如在root用户下，如果用户CMake已经是3.0版本以上，请忽略ln -sf /usr/bin/cmake3 /usr/bin/cmake。

```
ln -sf /usr/bin/cmake3 /usr/bin/cmake
```


12. 执行以下命令运行cesm.exe。

```
./case.submit
```


  当CESM运行的结尾处出现如图所示内容时，表示CESM程序运行正常结束。

  需要查看输出到屏幕中的日志，手动计算出时间差，数值越少性能越优。如图，双节点时，算例开始时间为“2021-10-22 20:27:51”，结束时间为“2021-10-22 20:28:29”，那么此算例运行时间为38s。
