- 概述
- 环境配置
- cesm1_2_1配置
- 部分环境软件压缩包
- 改变CLM陆面模式结果文件的输出变量、特征值及频率
- 小结
记录用户如何在Linux系统上移植CESM1.2.1模型,并且使用CLM4.5模式创建并单点模拟算例I_2000_CLM45。
1.更新系统软件源
2.更新系统安装软件
安装git、make、python等。
3.安装MPI (openmpi4.1.5)
// 下载并解压进入文件夹 wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.5.tar.gz tar -zxvf openmpi-4.1.5.tar.gz cd openmpi-4.1.5 // 执行configure (/path/to是自定义安装目录,下文同) ./configure -prefix=/path/to/openmpi // 编译安装 make && make install // 添加环境变量 vim ~/.bashrc export PATH=/path/to/openmpi/bin:$PATH export LD_LIBRARY_PATH=/path/tp/openmpi/lib:$LD_LIBRARY_PATH // 保存退出后 source ~/.bashrc
4.安装zlib (zlib-1.2.11)
// 下载并解压进入文件夹 wget http://www.zlib.net/zlib-1.2.11.tar.xz tar -xvf zlib-1.2.11.tar.xz cd zlib-1.2.11 // 创建zlib.sh vim zlib.sh // 输入: FCFLAGS=“-fPIC” CPPFLAGS=“-fPIC” CFLAGS=“-O3 -fPIC” CC=mpicc CXX=mpic++ F77=mpif70 F90=mpif90 ./configure -prefix=/path/to/zlib // 执行脚本 chmod a+x zlib.sh ./zlib.sh // 编译安装 make && make install // 安装zlib1g-dev sudo apt-get install zlib1g-dev
5.安装HDF5 (hdf5-1.10.5)
// 下载并解压进入文件夹 wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.5/src/hdf5-1.10.5.tar.gz // 创建hdf5.sh vim hdf5.sh // 输入: CC=mpicc CXX=mpicxx F90=mpif90 F77=mpif77 CFLAGS=“-fPIC -g “ FCFLAGS=“ -fPIC -lm -g “ ./configure --with-zlib=/path/to/zlib --enable-parallel --enable-fortran --prefix=/path/to/hdf5 --enable-hl // 执行脚本 chmod a+x hdf5.sh ./hdf5.sh // 编译安装 make && make install // 添加环境变量 export PATH=/path/to/hdf5/bin:$PATH export LD_LIBRARY_PATH=/path/tp/hdf5/lib:$LD_LIBRARY_PATH // 保存退出 source ~/.bashrc
6.安装netcdf-c和fortran(须安装在同一个目录下)
// 进入netcdf解压目录,创建netcdfc.sh 输入: H5DIR=/path/to/hdf5 MPIDIR=/path/to/openmpi CURLDIR=/path/tp/curl CC=mpicc CXX=mpic++ FC=mpif90 CFLAGS=“ -fPIC -lm “ FFLAGS=“ -fPIC -lm “ CPPFLAGS=“ -fPIC -I${PNDIR}/include -I ${MPIDIR}/include -I${H5DIR}/include -I${CURLDIR}/include “ LDFLAGS=“-L${MPIDIR}/lib -L${PNDIR}/lib -lmpi -L${H5DIR}/lib -L${CURLDIR}/lib “ ./configure --prefix=/path/to/netcdf --enable-netcdf-4 --enable-largefile -disable-dap --enable-shared --enable-parallel-tests // 执行脚本后编译安装(类比上文) // 进入fortran解压目录,创建netcdff.sh 输入: NFDIR=/path/to/netcdf NCDIR=/path/to/netcdf H5DIR=/path/to/hdf5 MPIDIR=/path/to/openmpi export LD_LIBRARY_PATH=${NCDIR}/lib:${LD_LIBRARY_PATH} CC=mpicc F77=mpif77 F90=mpif90 F77=mpif77 FCFLAGS=“ -fPIC -lm “ FFLAGS=“-fPIC -lm “ CFLAGS=“ -fPIC -lm” CPPFLAGS=“-fPIC -lm -I ${MPIDIR}/include -I${H5DIR}/include -I${PNDIR}/include -I${NCDIR}/include” LDFLAGS=“-L${MPIDIR}/lib -L${PNDIR}/lib -lmpi -L${H5DIR}/lib -L${NCDIR}/lib” ./configure --prefix=${NFDIR} --enable-netcdf-4 --enable-largefile --disable-dap --enable-parallel-tests --enable-shared // 执行脚本后编译安装(类比上文) // 添加环境变量 export PATH=/path/to/netcdf/bin:$PATH export LD_LIBRARY_PATH=/path/tp/netcdf/lib:$LD_LIBRARY_PATH // 保存退出后 source ~/.bashrc
7.安装blas和lapack,注意先后顺序(可百度)
// 下载并解压 // 编译安装 cp INSTALL/make.inc.gfortran make.inc vim make.inc // 在make.inc文件中,设置BLASLIB和CBLASLIB为你的BLAS和CBLAS库的路径。 // 如果已经有了BLAS和CBLAS库文件,确保它们被正确引用。 make blaslib make cblaslib make lapacklib make lapackelib // 确保以下静态库文件已正确生成: // librefblas.a、libcblas.a、liblapack.a、liblapacke.a // 添加环境变量 export LIBRARY_PATH=“$LIBRARY_PATH:/xxx/lapack-3.9.1” export C_INCLUDE_PATH=“$C_INCLUDE_PATH:/xxx/lapack-3.10.1/LAPACKE/include:/xxx/lapack-3.9.1/CBLAS/include” // 保存退出后 source ~/.bashrc
8.安装 Subversion 客户端
1.下载cesm1.2.1
2.创建输入数据目录
mkdir -p /path/to/inputdata mkdir -p /path/to/inputdata/CLMFORC
3.修改配置文件
// 进入配置文件目录 cd /.../cesm1_2_1/scripts/ccsm_utils/Machines // 修改 config_machines.xml,添加配置,参考:
//机器名称自定义 // 修改 config_compilers.xml,添加配置,参考:any gnu openmpi /path/to/CESM/$CASE/run //输出文件位置/path/to/CESM/$CASE/bld //编译出来的可执行文件位置/path/to/inputdata //输入数据位置/path/to/inputdata/CLMFORC //CLMFORC输入数据(CLM扩展)FALSE /path/to/CESM/$CASE/archive/$CASE //输出结果/path/to/CESM/$CASE //输出运行日志UNSET UNSET LINUX 8 当前集群每个节点的最大核数 // 其他依据情况可以使用默认配置 cp mkbathch.userdefined mkbatch.User-Define cp env_mach_specific.userdefined env_mach_specific.User-Define -DFORTRANUNDERSCORE -DNO_R16 -DNO_MPIMOD -L/home/jlucesm_env/netcdf-arm/lib -lnetcdff -lnetcdf //netcdf库位置-fopenmp -fopenmp -fopenmp -D CISM_GNU=ON -ffixed-form -ffree-form -g -Wall -O -g -lgomp -O -g -lgomp -fconvert=big-endian -lgomp -ffree-line-length-none -ffixed-line-length-none -O0 -fdefault-real-8 gfortran gcc g++ mpif90 mpicc mpicxx FORTRAN TRUE
4.创建算例
cd /.../cesm1_2_1/scripts ./create_newcase --case 算例名 --res f19_g16 --compset I_2000_CLM45 --mach User-Define
5.算例编译
// 进入算例目录 cd /.../cesm1_2_1/scripts/算例名
注:临时更改算例的资源配置需编辑env_mach_pes.xml文件,文件内修改的具体注释,注意任意模块分配核数为超过37的质数时算例无法创建,避免分配质数资源(2,3,5,7除外),使用”./xmlquery 变量名”的方式查看变量配置信息及使用 “./xmlchange 变量名 = 值”的方式进行修改。
// setup ./cesm_setup
检查算例状态 获取环境变量设置(执行):
./Tools/ccsm_getenv
检查case是否准备好运行:
./check_case
验证输入数据(第一次会进行下载,或在编译时自动下载):
./check_input_data -inputdata /path/to/inputdata -check
检查名称列表配置:编辑user_nl_clm文件,设置user_nl_datm文件,修改流文件,确保变量设置正确,最后:
./preview_namelists
检查环境变量 BUILD_COMPLETE是否为 “TRUE”,如果不是,则用户构建未完成。如果构建已完成,表示这个 “case” 准备好运行
// build ./算例名.build
注:如果想要更改运行的资源分配或者配置变量,需要删除先前的编译,并且删除setup内容,重新从setup开始:
./算例名.clean_build ./cesm_setup -clean
// 修改 算例名.run 文件 vim 算例名.run mpirun -np (需要的核数) --allow-run-as-root -hostfile ssh节点文件 ...(此处为省略路径)/cesm1_2_1/算例名/bld/cesm.exe
注:其中(–allow-run-as-root)是在root用户下要加的,普通用户可去掉;“-hostfile ssh节点文件”是用于多机运行的,ssh节点文件中写入需要参与计算的节点的ip或者ssh名称。单点模拟只需要选择一个运行方式取消注释。
6.算例运行
// 判断名为templar的文件是否存在,存在则执行 .submit,不存在则执行 .run ./算例名.submit // 或者: ./算例名.run
检查模型运行状态 检查日志文件:
tail -f /home/forest/CLM/CESM/I_2000_CLM45/run/cesm.log.*
检查资源占用:
top
检查模型输出:
ls -l /home/forest/CLM/CESM/I_2000_CLM45/run/
检查模型状态:
cat CaseStatus
检查进程运行状态:
ps aux | grep cesm.exe
- openmpi-4.0.1:https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.1.tar.gz
- zlib-1.2.11:
- https://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.xz
- hdf5-1.10.5:https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.5/src/hdf5-1.10.5.tar.gz
- pnetcdf-1.11.2:http://cucis.ece.northwestern.edu/projects/PnetCDF/Release/pnetcdf-1.12.1.tar.gz
- curl-7.62.0:GitHub - curl/curl: A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features
- Netcdf-c-4.7.0:https://github.com/Unidata/netcdf-c/archive/v4.7.0.tar.gz
- netcdf-fortran-4.4.4:https://github.com/Unidata/netcdf-fortran/archive/v4.4.4.tar.gz
CLM陆面模式的结果输出频率,通常是指输出文件的频率,如输出不同时间尺度的特征值,这里有两个注意事项:
一是时间尺度(可以是年、月、日、小时、甚至是模拟步长);
二是模拟结果(可以是平均值、瞬时值、最大值或最小值)。
关于user_nl_clm文件:
当创建case进行到./case.setup之后,模型会在算例所在的文件夹创建一系列namelist文件,其中控制CLM结果输出的就是user_nl_clm文件。
通过编辑user_nl_clm文件中的内容(直接在文件末尾添加语句),就可以对CLM的模拟结果进行输出。
控制输出时间频率的参数:
控制参数主要有两个,hist_mfilt 和 hist_nhtfrq。
hist_mfilt是控制一个输出的一个nc文件包含记录的数目,如想要每个月输出一条记录,但每年输出一个nc文件,这样每个nc文件中就相对于包含12个月的结果,即12条记录。默认情况下:hist_mfilt=1
hist_nhtfrq则是控制输出记录的频率,需要注意:0表示每月输出一条记录,正整数表示按照模拟步长(通常是0.5h或1h)的正整数倍进行输出记录,如若步长为0.5h, 则48就代表每天输出一个结果,负整数表示按照小时的整数倍输出记录,如-24也表示每天输出一个结果。默认情况下:hist_nhtfrq=0。
如果输出每年一个nc文件,并且每个文件包含该年每一天的数据,则设置hist_nhtfrq = -24,hist_mfilt = 365。
控制输出变量及特征的参数:
在不另行设置任何参数的情况下,CLM模式会按照逐月平均的频率输出结果,其中包含了各种各样的地表通量变量和状态变量,如潜热通量、感热通量、径流、地表温度、蒸散发、土壤含水等等。
除了默认的输出之外,也可以根据需求自定义输出变量列表。默认的输出变量列表是通过hist_fincl1变量来控制的。默认情况下,它包含了上述很多的变量。可以通过以下方式往默认列表中添加和减少变量:
hist_fincl1 = 'COSZEN', 'DECL' hist_fexcl1 = 'TG', 'TV', 'TSOI', 'H2OSOI'
此外,如果不想改动模式默认的变量列表,则可以通过额外增加列表的方式进行添加,模式中最多提供了6个额外增加的列表清单控制参数。
例如,如果想额外输出指定频率的地表温度和植被温度,则可以通过下面方式进行控制:
hist_fincl2 = 'TG', 'TV' hist_fincl3 = 'TG', 'TV' hist_fincl4 = 'TG', 'TV' hist_fincl5 = 'TG', 'TV' hist_nhtfrq = 0, -24, -6, -1, 1 hist_mfilt = 12, 30, 28, 24, 48
其中,TG和TV分别表示地表温度和植被温度。而hist_nhtfrq和hist_mfilt则负责控制包含默认列表在内的5个变量列表的时间频率。
控制输出变量特征值的参数:
默认的输出是以平均值作为该时段的特征值,如果我们想要输出模拟时段的最大值、最小值或是时段末的瞬时值,方案有两种:
一是直接在输出变量的后面加冒号和特征值标识字母,例如TSOI:X表示将输出TSOI变量的最大值;
二是通过hist_avgflag_pertape进行控制。
其中,标识字母有4个,分别为A平均值、I 瞬时值、X最大值和M最小值:
A Average, over the output interval. I Instantaneous, output the value at the output interval. X Maximum, over the output interval. M Minimum, over the output interval.
// 举个例子: hist_empty_htapes = .true. hist_fincl1 = 'TSOI:X', 'TG', 'TV', 'FIRE', 'FSR', 'FSH', 'EFLX_LH_TOT', 'WT' hist_fincl2 = 'TSOI:X', 'TG', 'TV', 'FIRE', 'FSR', 'FSH', 'EFLX_LH_TOT', 'WT' hist_fincl3 = 'TSOI', 'TG:I', 'TV', 'FIRE', 'FSR', 'FSH', 'EFLX_LH_TOT', 'WT' hist_fincl4 = 'TSOI', 'TG', 'TV:I', 'FIRE', 'FSR', 'FSH', 'EFLX_LH_TOT', 'WT' hist_fincl5 = 'TSOI', 'TG', 'TV', 'FIRE:I', 'FSR', 'FSH', 'EFLX_LH_TOT', 'WT' hist_avgflag_pertape = 'A', 'I', 'X', 'M', 'A' hist_nhtfrq = 0, -6, -24, -24, -24
hist_empty_htapes表示将默认变量清单清空;然后重新定义默认输出变量列表的变量内容,并新增4个列表。在列表变量中通过上述两种方式进行了输出变量特征值的设置,输出的内容包括平均值,瞬时值,最大值,最小值。
本文作者同样是使用CLM模型的新手小白,仅仅是为了实验室部分需求而使用该模型。希望本文能够对正在移植CESM模型并使用CLM模式的同道一些参考或者启发。更多的信息推荐阅读1.2版本使用手册:CESM User's Guide (CESM1.2 Release Series User's Guide) (PDF)