1. CESM环境搭建与基础配置
1.1 系统需求与依赖准备
CESM(Community Earth System Model)作为复杂的气候系统模型,对运行环境有特定要求。实测在Ubuntu 20.04 LTS和CentOS 7系统上最为稳定,建议分配至少50GB的磁盘空间用于基础安装。以下是必须预先安装的依赖项:
bash复制# Ubuntu/Debian系
sudo apt-get install -y gfortran m4 make perl subversion csh \
libblas-dev liblapack-dev libnetcdf-dev libnetcdff-dev \
mpich libhdf5-mpich-dev
# CentOS/RHEL系
sudo yum install -y gcc-gfortran m4 make perl subversion tcsh \
lapack-devel blas-devel netcdf-fortran-devel netcdf-devel \
hdf5-devel mpich-devel
关键提示:必须确保MPI与NetCDF库的Fortran接口版本匹配,这是后续编译失败的高频诱因。可通过
nf-config --all和nc-config --all验证兼容性。
1.2 源码获取与目录结构
推荐通过官方Subversion仓库获取最新稳定版(当前为CESM2.1.3):
bash复制svn checkout https://svn-ccsm-models.cgd.ucar.edu/cesm1/tags/cesm2.1.3
典型CESM工作目录应包含以下结构:
code复制cesm_root/
├── cime/ # 通用基础设施
├── components/ # 各气候组件源码
├── scripts/ # 案例管理脚本
└── tools/ # 编译工具链
1.3 环境变量配置
在~/.cshrc或~/.bashrc中添加以下关键配置(以bash为例):
bash复制export CESM_ROOT=/path/to/cesm_root
export CC=mpicc
export FC=mpif90
export NETCDF=/usr/lib/x86_64-linux-gnu # 根据实际路径调整
export MPI_ROOT=/usr/lib/x86_64-linux-gnu/mpich
验证环境有效性:
bash复制source ~/.bashrc
which mpif90 && mpif90 -v # 应返回MPI包装的Fortran编译器信息
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 单模块编译与运行实战
2.1 CAM大气模块独立运行
创建单模块案例(以CAM6为例):
bash复制cd $CESM_ROOT/cime/scripts
./create_newcase --case ~/cesm_cases/cam_test \
--compset F2000climo \
--res f19_g17 \
--machine localhost \
--compiler gnu
关键参数解析:
compset:F2000climo表示使用2000年气候态强迫res:f19_g17对应1.9°×2.5°水平分辨率machine:localhost表示本地运行
2.2 编译配置技巧
进入案例目录后需修改env_build.xml:
xml复制<entry id="BUILD_THREADED" value="TRUE"> <!-- 启用多线程编译 -->
<entry id="DEBUG" value="FALSE"> <!-- 生产环境关闭调试 -->
编译过程常见问题处理:
- NetCDF版本冲突:若报错
nf_def_var_deflate not found,需重新编译NetCDF库启用压缩功能 - 内存不足:在
Macros文件中添加-mcmodel=medium解决大内存需求 - MPI路径错误:通过
mpif90 -show确认实际链接库路径
2.3 运行监控与结果输出
启动运行前建议执行:
bash复制./preview_run # 检查资源配置
./case.submit # 提交任务
实时监控日志:
bash复制tail -f cesm.log.* | grep 'DATE=' # 跟踪模拟进度
输出文件通常位于:
code复制~/cesm_cases/cam_test/run/
├── cam.h0.YYYY-MM.nc # 月度输出
└── cam.h1.YYYY-MM.nc # 高频诊断输出
3. 全耦合系统集成运行
3.1 耦合案例创建
创建包含大气-海洋-海冰-陆面全分量的案例:
bash复制./create_newcase --case ~/cesm_cases/b1850_cpl \
--compset B1850 \
--res f19_g17 \
--machine localhost \
--compiler gnu \
--run-unsupported
耦合系统关键组件:
- CAM:大气环流模型
- POP2:海洋环流模型
- CICE:海冰模型
- CLM:陆面过程模型
3.2 耦合器配置要点
修改env_run.xml关键参数:
xml复制<entry id="STOP_OPTION" value="nyears"> <!-- 运行时长单位 -->
<entry id="STOP_N" value="5"> <!-- 运行5年 -->
<entry id="REST_OPTION" value="nyears"> <!-- 重启文件间隔 -->
<entry id="REST_N" value="1"> <!-- 每年输出重启点 -->
耦合频率设置(在drv_in文件中):
code复制atm_cpl_dt = 1800.0 # 大气-耦合器交换间隔(秒)
ocn_cpl_dt = 86400.0 # 海洋-耦合器交换间隔
3.3 大规模运行优化
对于多节点运行,需配置env_mach_pes.xml:
xml复制<entry id="NTASKS_ATM" value="64"> <!-- 大气分量MPI任务数 -->
<entry id="NTHRDS_ATM" value="2"> <!-- 每任务OpenMP线程数 -->
<entry id="ROOTPE_OCN" value="64"> <!-- 海洋分量起始PE编号 -->
性能调优建议:
- 负载均衡:通过
timing_stats文件分析各分量计算耗时 - I/O优化:启用NetCDF4压缩(
env_run.xml中设置NETCDF_COMPRESSION=TRUE) - 通信优化:调整
CPL_GRID减少耦合交换数据量
4. 结果分析与可视化
4.1 常用诊断工具链
- NCAR Command Language (NCL):
ncl复制; 绘制全球温度场示例
f = addfile("cam.h0.0001-01.nc","r")
T = f->T(0,0,:,:) ; 读取第一时次、第一层的温度
wks = gsn_open_wks("png","global_T")
plot = gsn_csm_contour_map(wks,T,False)
- Python xarray + Cartopy:
python复制import xarray as xr
import matplotlib.pyplot as plt
ds = xr.open_dataset('cam.h0.0001-01.nc')
ds.T[0,0].plot(ax=plt.axes(projection=ccrs.PlateCarree()))
plt.savefig('global_T_python.png')
4.2 关键气候指标计算
全球平均温度计算:
bash复制ncwa -O -a lat,lon -w gw cam.h0.0001-01.nc temp_global.nc
ncks -v T temp_global.nc | ncrcat -H
AMOC强度指数:
bash复制ncra -F -d lat,26.0,35.0 -d lon,280.0,310.0 -v MOC pop.h.0001-01.nc amoc_index.nc
4.3 自动化分析流程示例
使用CESM自带分析工具:
bash复制cd $CESM_ROOT/scripts
./create_climo --indir ~/cesm_cases/b1850_cpl/run \
--outdir ~/analysis/climatology \
--case b1850 \
--first 1 \
--last 5 # 计算1-5年的气候态
5. 常见问题排查手册
5.1 编译阶段错误
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
undefined reference to 'mpi_init_' |
MPI库链接顺序错误 | 在Macros中添加-lmpi -lmpifort -lpthread |
NetCDF: Operation not allowed in define mode |
并行I/O冲突 | 设置env_run.xml中PIO_TYPENAME=netcdf4p |
segmentation fault (core dumped) |
栈空间不足 | 添加编译选项-fstack-arrays -Wl,--stack=100000000 |
5.2 运行阶段异常
数据溢出处理:
bash复制# 在user_nl_cam中添加
fincl2 = 'Q:I','T:I','PS:I' # 输出时进行类型转换
重启文件损坏:
- 检查
rpointer.*文件指向的正确性 - 使用
ncdump -h验证NetCDF文件完整性 - 通过
ncrcat合并分段输出文件
5.3 性能优化记录
-
负载不均衡:在
env_mach_pes.xml中调整各分量PE分配比例,典型经验值:- 大气(CAM):总PE的50%
- 海洋(POP2):30%
- 其他:20%
-
I/O瓶颈:启用时间平均输出替代瞬时快照:
xml复制<entry id="AVGFLAG" value="A"> <!-- A表示时间平均 -->
<entry id="AVGHIST" value="TRUE">
