告别GSWP3:手把手教你为CESM2.1.3配置自定义气象强迫数据集(CLM1PT模式详解)
当研究团队需要将ERA5、CMIP6等新型再分析数据接入CESM模型时,往往会在数据接口环节遭遇"黑箱"操作困境。本文将以CLM1PT模式为切入点,拆解自定义气象强迫数据集的全流程配置方法,重点解决多stream文件合并与datm.input_data_list更新的技术痛点。
1. 数据准备:从格式校验到时空对齐
1.1 NetCDF文件规范检查
自定义数据集必须满足以下核心属性要求(以降水数据为例):
import netCDF4 as nc ds = nc.Dataset('ECMWF_c2020_Prec.1980-02.nc') print(ds.__dict__) # 查看全局属性 print(ds.variables['time'].__dict__) # 检查时间变量单位关键校验点包括:
- 时间维度:必须使用
hours since YYYY-MM-DD HH:MM:SS格式,建议采用noleap日历 - 空间坐标:确保lon/lat变量包含
degrees_east和degrees_north单位声明 - 数据填充:
_FillValue和missing_value需与GSWP3保持一致(默认9.999999616903163e+35)
1.2 变量映射表
| GSWP3变量名 | 自定义数据集对应名 | 物理单位 | 必要维度 |
|---|---|---|---|
| PRECTmms | precipitation | mm H2O/sec | lon×lat×time |
| FSDS | surface_sw_flux | W/m² | lon×lat×time |
| TBOT | air_temperature | K | lon×lat×time |
提示:使用
ncdump -h命令快速验证文件结构,确保时间维度的连续性无断层
2. 案例构建关键参数配置
2.1 create_newcase进阶设置
./create_newcase --case MyCLM51_ERA5 \ --res hcru_hcru \ --compset I2000Clm51Bgc \ --run-unsupported \ --compiler intel \ --mach cluster必须修改的XML参数:
./xmlchange DATM_MODE='CLM1PT' # 强制启用自定义数据模式 ./xmlchange DIN_LOC_ROOT_CLMFORC='/path/to/your/forcing' # 独立指定强迫数据集路径 ./xmlchange DATM_CLMNCEP_YR_START=1981,DATM_CLMNCEP_YR_END=2020 # 时间范围锁定 ./xmlchange CLM_FORCE_COLDSTART='on' # 避免历史记录干扰2.2 时间对齐陷阱排查
当出现ERROR: No time values in range报错时,检查:
user_nl_datm中streams参数的年份是否与数据文件匹配- 数据文件名是否包含完整的年月信息(如
ERA5.1981-01.nc) - 使用
cdo showdate验证时间轴连续性
3. Stream文件深度定制
3.1 单文件整合方案
修改user_datm.streams.txt.CLM1PT.xxx模板:
<fieldInfo> <variableNames> Solar:FSDS Precip:PRECTmms Tair:TBOT Qair:QBOT Wind:WIND Psurf:PSRF </variableNames> <filePath>/path/to/your/forcing</filePath> <fileNames>ERA5.$YEAR-$MON.nc</fileNames> </fieldInfo>对应user_nl_datm设置:
&shr_strdata_nml streams = "datm.streams.txt.CLM1PT.360x720cru 1981 1981 2020", "datm.streams.txt.presaero.clim_2000 1 2000 2000", "datm.streams.txt.topo.observed 1 1 1" taxmode = "extend", "cycle", "cycle" /3.2 多文件分流方案(实验性)
对于需要分离变量存储的场景:
- 复制生成7个stream文件:
for var in Solar Precip Tair Qair Wind LWdown Psurf; do cp CaseDocs/datm.streams.txt.CLM1PT.360x720cru user_datm.streams.txt.ERA5.$var done- 修改
buildnml规避系统覆盖(风险操作):
# 在$CESM_ROOT/cime/src/components/data_comps/datm/cime_config/buildnml - my $datm_input_data_list = create_input_data_list(); + # my $datm_input_data_list = create_input_data_list(); # 注释掉自动生成逻辑- 手动维护
Buildconf/datm.input_data_list:
domain1 = /path/to/domain.nc file1 = /path/to/forcing/ERA5.Solar.1981-01.nc file2 = /path/to/forcing/ERA5.Solar.1981-02.nc ...4. 调试与验证实战
4.1 预处理检查清单
- 执行
./preview_namelists后验证:grep -r "ERA5" CaseDocs/ # 确认路径已更新 - 使用
ncl脚本检查数据映射:f = addfile("CaseDocs/atm_in","r") print(f->streams) # 验证streams参数
4.2 常见报错解决方案
| 错误类型 | 排查重点 | 修复方案 |
|---|---|---|
| Time axis mismatch | 数据文件与xmlchange时间设置 | 使用ncatted修改time属性 |
| Missing variable | stream文件变量名拼写 | 对照GSWP3命名规范统一变量名 |
| Permission denied | 输入文件读写权限 | 执行chmod -R a+rX /forcing_path |
| NetCDF: HDF error | 文件损坏或版本不兼容 | 用nccopy重新压缩保存 |
4.3 性能优化技巧
- 对于高时空分辨率数据,在
user_nl_datm中添加:&datm_nml decomp = "2d" # 启用二维分解 iradsw = 2 # 优化短波辐射计算 / - 使用
dmget预加载数据(适用于Lustre文件系统):dmget /forcing_path/ERA5.*.nc
在完成整套配置后,建议先用单月数据试运行。我在处理ECMWF数据时发现,当时间跨度过大时,需要特别检查闰年数据的对齐情况。对于长期模拟,不妨分段提交作业以降低风险。