Astro's 踩坑记录

Ubuntu 20.04 下cesm1.1 的移植与测试

字数统计: 1.6k阅读时长: 7 min
2022/05/23

前言

开始之前先要安装库以及相应软件,过程省略,具体在官网:
CESM1.1.z User’s Guide
CESM Software/Operating System Prerequisites.
CESM各个版本:CESM Models
也可在github中下载:
GitHub-ESCOMP/CESM: The Community Earth System ModelThe Community Earth System Model.


正文

本文重点在于source code移植后的修改配置部分
假设模式位于 cesm1_1/
需要修改的文件均位于 cesm1_1/scripts/ccsm_utils/Machines 路径下

config_machines.xml

主要是修改关于机器的配置
添加以下部分 (根据自己服务器的配置/环境来配置。具体各项意义可见官网CESM Models | CESM1.1 Public Release

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<machine MACH="ubuntu">
<DESC>my ubuntu 20.04</DESC>
<OS>LINUX</OS>
<COMPILERS>intel,pgi,gnu,pathscale</COMPILERS>
<MPILIBS>mpich,mpi,pempi,mpi-serial</MPILIBS>
<RUNDIR>/xxxxxxxxx/cesm1_1/$CASE/run</RUNDIR>
<EXEROOT>/xxxxxxxx/cesm1_1/$CASE/bld</EXEROOT>
<DIN_LOC_ROOT>/xxxxxx/Cesm_data/inputdata</DIN_LOC_ROOT><DIN_LOC_ROOT_CLMFORC>xxxxxxx/Cesm_data/tss</DIN_LOC_ROOT_CLMFORC>
<DOUT_S_ROOT>xxxxxx/cesm1_1/$CASE/output</DOUT_S_ROOT>
<DOUT_L_MSROOT>csm/$CASE</DOUT_L_MSROOT><CCSM_BASELINE>$ENV{CESMDATAROOT}/ccsm_baselines</CCSM_BASELINE><CCSM_CPRNC>$ENV{CESMDATAROOT}/tools/cprnc/cprnc</CCSM_CPRNC>
<BATCHQUERY>USERDEFINED_optional_run</BATCHQUERY>
<BATCHSUBMIT>USERDEFINED_optional_run</BATCHSUBMIT><SUPPORTED_BY>USERDEFINED_optional_run</SUPPORTED_BY>
<GMAKE_J>1</GMAKE_J>
<MAX_TASKS_PER_NODE>2</MAX_TASKS_PER_NODE>
<PES_PER_NODE>1</PES_PER_NODE>
</machine>

config_compilers.xml

关于编译器的配置
添加以下部分

1
2
3
4
5
6
7
8
9
10
11
12
13
<compiler COMPILER="intel" MACH="ubuntu">
<NETCDF_PATH>$(NETCDF)</NETCDF_PATH>
<MPICC>mpiicc</MPICC>
<MPIFC>mpiifort</MPIFC>
<MPICXX>mpicpc</MPICXX>
<SFC>ifort</SFC>
<SCC>icc</SCC>
<SCXX>icpc</SCXX>
<MPI_PATH MPILIB="mpich"> /opt/intel/oneapi/mpi/2021.2.0</MPI_PATH>
<MPI_PATH MPILIB="openmpi"> /opt/intel/oneapi/mpi/2021.2.0</MPI_PATH>
<HDF5_PATH>$(NETCDF)</HDF5_PATH>
<ADD_SLIBS> -L$(NETCDF_PATH)/lib -lnetcdff -lnetcdf -L$(HDF5_PATH)/lib -lhdf5 -lhdf5_hl </ADD_SLIBS>
</compiler>

env_mach_specific.userdefined

env_mach_specific.userdefined 复制为 env_mach_specific.ubuntu
点后面(ubuntu)为之前设置的MACH名称
添加以下部分,注意 set 后面有=,且=前后有空格。setenv没有等号,只有空格

1
2
3
4
5
6
set NETCDF_PATH = /usr/local/netcdf-ifort
set MPI_PATH = /opt/intel/oneapi/mpi/2021.2.0
setenv INC_NETCDF ${NETCDF_PATH}/include
setenv LIB_NETCDF ${NETCDF_PATH}/lib
setenv INC_MPI ${MPI_PATH}/include
setenv LIB_MPI ${MPI_PATH}/lib

mkbatch.userdefined

mkbatch.userdefined 复制为 mkbatch.ubuntu
点后面依旧是之前设置的MACH名称
根据服务器提交作业的方式把qname=batch 为自己服务器的脚本提交方式,如 qname=qnormal,并把下方##的代码根据提交任务的脚本 去掉注释即可 (包括mpirun等等命令所在的行)

完成移植,进行测试。

测试1

此测试来自官方网站:Use Cases and FAQs

1
2
3
4
5
6
7
cd cesm1_1/scripts
./create_newcase -case case_official \
-compset B_1850_CN \
-res 0.9x1.25_gx1v6 \
-mach ubuntu

cd case_official/

此时可根据需要修改运行配置如大气模式用到的核数 NTASKS_ATM ….. (当前该变量值可通过以下命令查询到。)

1
./xmlquery NTASKS_ATM  

对于修改诸如模式要用的核数NTASKS_xxxxx、线程数NTHRDS_xxx等等env_mach_pes.xml中的变量,必须在./cesm_setup之前修改,如果setup之后修改,必须先./cesm_setup -clean,修改,然后重新./cesm_setup。
对于诸如任务重新提交时间STOP_OPTION等等其他变量,可在./cesm_setup之后修改
两种修改方式:

1
1  ./xmlchange NTASKS_ATM=64   (等价于 ./xmlchange -file env_mach_pes.xml -id NTASKS_ATM -val 64)

2 直接vim修改env_mach_pes.xml 或是其余xml文件
同上,所有与运行相关的配置变量可在CESM Models | CESM1.1 Public Release通过对应xml文件查找到。


1
2
./cesm_setup
./case_official.build

生成测试脚本(测试本例子能否跑通)

1
2
3
4
5
./create_production_test
cd ../case_official_ERT
./case_official_ERT.test_build
./case_official_ERT.test
cat CaseStatus (官网为 cat TestStatus ,以实际为准)

如果没有问题(PASS)即可进行下一步

1
2
3
4
cd ../case_official
./xmlchange STOP_OPTION=nmonths 注意修改方式与官网给出的不一致
./xmlchange STOP_N=12
bsub < case_official.run 提交作业方法因服务器而异

之后可在out文件中查看是否成功

测试2

创建一个分辨率为10&deg;x15&deg;,只运行大气模块的试验
1
2
3
4
./create_newcase -case coarse_amip -compset  FAMIPC5 -res 10x15_10x15  -mach ubuntu
cd coarse_amip
./cesm_setup
./coarse_amip.build
生成测试的试运行脚本
1
2
3
4
5
./create_production_test
cd ../coarse_amip._ERT
./coarse_amip_ERT.build
./coarse_amip_ERT.run
cat TestStatus
修改运行设置
1
cd ../coarse_amip

设置例如积分时长,运行月份,变量输出频率的配置
对于自定义输出,可见: CAM: How do I customize CAM output fields?
user_nl_xxx 中修改xxx(如CAM,CLM…)模块的namelist设置,如cam模块变量输出频率见: CAM Component Model Namelist Variables
以user_nl_cam为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
;history文件中所有变量的平均输出标志,两个值表示同时两种设置
avgflag_pertpe = 'A','A'

;数组,各history文件序列的输出频率,第一个为0表示月平均,往后i大于0表示n个时步,小于0表示n小时
nhtfrq = 0,-24

;数组,样本写入历史文件h0的最大次数,第一个数表示主历史文件,2-6表示辅助历史文件
mfilt = 1,1

;第一个历史文件 h0 包括的变量场
fincl1= 'T','TMQ','TS','U','V','Z3'

;第二个历史文件 h1 包括的变量场
fincl2 = 'FLDS','FLNS','FLNT','OMEGA','PSL','PS','RELHUM','Q','SHFLX','T','TMQ','TS','U','V','Z3'

修改后查询结果:

1
./preview_namelist 

然后在 CaseDocs/atm_in 查看设置的上述变量是否出现

运行并查看当前运行状态
1
./coarse_amip.run

当前运行状态位于

1
$CESMROOT/$CASENAME/run/xxx.log.yymmdd-hhmmss

如 cesm1_1/coarse_amip/run/atm.log.220520-145438 模式积分完成后会被删除

运行结束

CCSM4/CESM1 OUTPUT FILENAME REQUIREMENTS
文件储存分为 short-term archivinglong-term archiving ,分别通过 env_run.xml$DOUT_S$DOUT_L_MS 来控制,输出路径分别为 $DOUT_S_ROOT$DOUT_L_MSROOT
模式输出文件位于

1
$CESMROOT/$CASENAME/output/xxx/

其中XXX表示如atm,ocn,ice等的分量模式输出
再下一级目录的

1
hist/ init/ logs/ rest/

表示history,initial,logs,restart文件
CaseStatus 中最后一行看到 run SUCCESSFUL 并在相应路径有nc文件输出即为成功

踩坑记录

如果出现 Can’t locate Switch.pm in @INC 则是因为Perl5.1以上的版本问题,只需将已有的Switch.pm 文件复制到INC中一个路径即可

1
sudo cp /opt/intel/oneapi/compiler/2021.2.0/linux/lib/oclfpga/host/linux64/bin/perl/lib/site_perl/5.30.3/Switch.pm /usr/share/perl/5.30/

无gmake的情况:ubuntu上取消了gmake(GNUmake),用make代替即可

1
sudo ln -s /usr/bin/make /usr/bin/gmake
CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. config_machines.xml
    2. 2.2. config_compilers.xml
    3. 2.3. env_mach_specific.userdefined
    4. 2.4. mkbatch.userdefined
  3. 3. 完成移植,进行测试。
    1. 3.1. 测试1
    2. 3.2. 测试2
      1. 3.2.1. 创建一个分辨率为10&deg;x15&deg;,只运行大气模块的试验
      2. 3.2.2. 生成测试的试运行脚本
      3. 3.2.3. 修改运行设置
      4. 3.2.4. 运行并查看当前运行状态
      5. 3.2.5. 运行结束
  4. 4. 踩坑记录
    1. 4.1. 如果出现 Can’t locate Switch.pm in @INC 则是因为Perl5.1以上的版本问题,只需将已有的Switch.pm 文件复制到INC中一个路径即可
    2. 4.2. 无gmake的情况:ubuntu上取消了gmake(GNUmake),用make代替即可