作为一名从事气候模拟研究多年的科研工作者,我深知CESM(Community Earth System Model)这个"巨无霸"给初学者带来的挑战。记得我第一次接触CESM时,光是搭建环境就折腾了两周时间。本文将分享我多年来总结的11步系统学习方案,帮助大家避开我当年踩过的坑。
CESM是目前全球最先进的地球系统模式之一,由美国国家大气研究中心(NCAR)主导开发。它能够模拟大气、海洋、陆地、海冰、陆冰等地球系统各圈层的相互作用,是研究气候变化的重要工具。最新版本的CESM2.2在物理过程参数化和计算效率方面都有显著提升,但同时也增加了学习曲线。
CESM对运行环境有较高要求,合理的环境配置能节省大量调试时间。根据我的经验,建议准备:
硬件配置:
软件依赖:
提示:使用Intel编译器通常能获得更好的性能,但在某些新型CPU架构上可能需要额外配置。
以CentOS 7系统为例,以下是详细的环境配置流程:
bash复制# 安装基础开发工具
sudo yum groupinstall "Development Tools"
sudo yum install -y wget git cmake
# 安装Intel编译器(需提前获取安装包)
tar zxvf l_BaseKit_p_2023.2.0.49397.sh
./l_BaseKit_p_2023.2.0.49397.sh
# 按照提示完成安装并配置环境变量
# 安装NetCDF库
wget https://downloads.unidata.ucar.edu/netcdf-c/4.9.2/netcdf-c-4.9.2.tar.gz
tar zxvf netcdf-c-4.9.2.tar.gz
cd netcdf-c-4.9.2
./configure --prefix=/usr/local/netcdf
make && sudo make install
# 安装Parallel-NetCDF
wget https://parallel-netcdf.github.io/Release/pnetcdf-1.12.3.tar.gz
tar zxvf pnetcdf-1.12.3.tar.gz
cd pnetcdf-1.12.3
./configure --prefix=/usr/local/pnetcdf
make && sudo make install
环境变量配置示例(添加到~/.bashrc):
bash复制export NETCDF=/usr/local/netcdf
export PNETCDF=/usr/local/pnetcdf
export PATH=$NETCDF/bin:$PNETCDF/bin:$PATH
export LD_LIBRARY_PATH=$NETCDF/lib:$PNETCDF/lib:$LD_LIBRARY_PATH
CESM代码托管在GitHub上,推荐使用以下方法获取:
bash复制git clone https://github.com/ESCOMP/CESM.git
cd CESM
git checkout release-cesm2.2.0 # 切换到稳定版本
./manage_externals/checkout_externals
注意:checkout_externals会下载所有子模块,耗时较长,建议在网络状况良好时进行。
了解目录结构是掌握CESM的基础,主要目录及其功能如下:
| 目录路径 | 功能描述 |
|---|---|
| cime/ | 耦合基础设施(CIME),负责案例配置和运行管理 |
| components/ | 各物理模块源代码 |
| cam/ | 大气模块(CAM6) |
| clm/ | 陆面过程模块(CLM5) |
| pop/ | 海洋模块(POP2) |
| cice/ | 海冰模块(CICE) |
| scripts/ | 工具脚本和辅助程序 |
| cases/ | 案例配置目录(运行后生成) |
在运行CESM前,需要为你的服务器创建Machine File。以名为"mycluster"的服务器为例:
bash复制cd cime/config/cesm/machines
cp config_machines.xml.template config_machines.xml
xml复制<machine MACH="mycluster">
<DESC>My computing cluster</DESC>
<OS>LINUX</OS>
<COMPILERS>intel</COMPILERS>
<MPILIBS>openmpi</MPILIBS>
<RUNDIR>/scratch/$USER/cesm/run</RUNDIR>
<EXEROOT>/scratch/$USER/cesm/bld</EXEROOT>
<DIN_LOC_ROOT>/data/cesm/inputdata</DIN_LOC_ROOT>
<DIN_LOC_ROOT_CLMFORC>/data/cesm/inputdata/atm/datm7</DIN_LOC_ROOT_CLMFORC>
</machine>
创建一个简单的F1850气候模拟案例:
bash复制./create_newcase --case ~/cesm_cases/test_F1850 \
--compset F1850 \
--res f19_g17 \
--machine mycluster \
--compiler intel \
--mpilib openmpi \
--project myproject
cd ~/cesm_cases/test_F1850
./case.setup
./case.build
./case.submit
常见问题排查:
CaseStatus文件中的错误信息check_input_data脚本下载所需数据CLM单点模式是研究陆面过程的理想选择。创建案例时使用I单点网格:
bash复制./create_newcase --case ~/cesm_cases/clm_point \
--compset I2000Clm50BgcCrop \
--res f09_g17 \
--machine mycluster \
--compiler intel \
--mpilib openmpi
cd ~/cesm_cases/clm_point
./xmlchange CLM_FORCE_COLDSTART=on
./xmlchange STOP_OPTION=nyears,STOP_N=1
./case.setup
CLM运行时需要三个关键文件:
drv_flds_in - 驱动场文件列表lnd_in - 陆面模型参数datm.streams.txt - 数据流配置典型的lnd_in配置示例:
code复制&clm_inparm
finidat = ''
fpftcon = '$DIN_LOC_ROOT/lnd/clm2/paramdata/clm5_params.c210317.nc'
fatmlndfrc = '$DIN_LOC_ROOT/share/domains/domain.lnd.fv0.9x1.25_gx1v6.151020.nc'
urban_hac = 'OFF'
use_snicar_frc = .true.
/
创建CAM-chem与CLM耦合案例:
bash复制./create_newcase --case ~/cesm_cases/camchem_clm \
--compset FC5CAMchemCLM50 \
--res f09_g17 \
--machine mycluster \
--compiler intel \
--mpilib openmpi
关键配置调整:
bash复制./xmlchange CAM_CONFIG_OPTS="-chem trop_mozart"
./xmlchange CLM_CONFIG_OPTS="-bgc cn -crop"
全耦合运行时需要特别注意:
建议首次全耦合运行时:
bash复制./xmlchange REST_OPTION=nyears,REST_N=1
./xmlchange STOP_OPTION=nyears,STOP_N=5
CLM典型输出文件结构:
code复制CLM输出/
├── *.h0.*.nc # 月平均输出
├── *.h1.*.nc # 日平均输出
├── *.h2.*.nc # 小时输出
└── *.h3.*.nc # 瞬时场输出
关键变量说明:
示例代码:计算年平均土壤温度
python复制import xarray as xr
ds = xr.open_dataset('clm_output.h0.0001-01.nc')
tsoil = ds['TSOI'].mean(dim='time') # 时间平均
tsoil_global = tsoil.mean(dim=['lat','lon']) # 空间平均
# 绘制垂直剖面
tsoil.isel(lat=50,lon=60).plot(y='levgrnd')
主要模块代码位置:
components/cam/src/physics/cam/components/clm/src/main/cime/src/drivers/mct/cime/修改土壤热传导率参数(clm5中):
components/clm/src/main/SoilBiogeophysMod.F90fortran复制real(r8), parameter :: tk_soil = 0.25_r8 ! 原值0.2
重新编译:
bash复制./case.build --clean-all
./case.build
典型全耦合运行的并行布局:
bash复制./xmlchange NTASKS_ATM=64,NTASKS_LND=32,NTASKS_OCN=128
./xmlchange NTHRDS_ATM=2,NTHRDS_LND=1,NTHRDS_OCN=2
减少输出频率和变量:
bash复制./xmlchange HIST_OPTION=nyears,HIST_N=1
./xmlchange ATM_NCPL=48 # 增加耦合步长
使用NetCDF4压缩:
bash复制./xmlchange PIO_TYPENAME=netcdf4c
| 错误类型 | 可能原因 | 解决方案 |
|---|---|---|
| MPI链接错误 | MPI库路径不正确 | 检查config_compilers.xml中的MPI设置 |
| NetCDF缺失 | 未安装Fortran接口 | 确认安装了netcdf-fortran库 |
| 内存不足 | 任务数设置过多 | 减少NTASKS或增加内存 |
遇到运行失败时:
CaseStatus文件logs/下的最新日志./preview_run检查任务配置掌握CESM需要长期实践,建议:
我在实际使用中发现,建立一个自己的案例库非常有用,将成功运行的案例配置保存下来,方便后续参考和复用。对于复杂的研究问题,建议采用增量开发的方式,先验证单个模块的行为,再逐步扩展到耦合模拟。