ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CESM2实操手记:从create_newcase到case.submit的避坑指南

CESM2实操手记:从create_newcase到case.submit的避坑指南 1. 项目概述这不是一份“教程”而是一份踩过坑、调过参、跑崩过三次才攒出来的CESM2实操手记如果你正站在CESM2Community Earth System Model version 2的门口手里攥着NCAR官网下载的tar包、一份模糊的User’s Guide PDF、还有导师/PI甩过来的“下周交个1950–2014的AMIP试验结果”——那你不是一个人。我去年在气候模拟组接手第一个CESM2任务时状态和你现在一模一样知道它是个全球耦合气候模型知道它能算大气、海洋、陆面、海冰但打开cime/scripts/create_newcase那一行命令时手指悬在回车键上停了三分钟因为根本不确定——这个--compset选B1850还是F2000CLM50BGCC--res填f09_g17还是ne30pg3_ne30pg3--run-unsupported到底该不该加加了会不会让整个集群管理员半夜打电话来骂人CESM2不是点开即用的软件它是一套精密运转的“数字地球工厂”。它的核心价值不在于“能跑起来”而在于“跑得准、跑得稳、跑得可复现”。所谓“实验笔记”不是记录“我今天编译成功了”而是记录为什么选这个组件集为什么网格分辨率卡在ne30而不是ne120为什么海洋初始场必须用POP的bnd_topog而不是直接插值为什么env_mach_specific.xml里那行entry idMPILIB valuempi-serial/在本地调试时救命在超算提交时却必须改成mpt这些细节官方文档不会写GitHub issue里散落着碎片而真正决定你能否在截止日前交出可信结果的恰恰是这些“文档之外”的判断链。这篇笔记完全基于真实科研场景使用CESM2.1.1版本在XSEDE Bridges-2集群Intel Xeon Platinum 8360Y NVIDIA A100与本地CentOS 7.9工作站双环境验证覆盖AMIP大气模式强迫、BGC生物地球化学、LENS大样本集合三类典型实验所有配置、脚本、错误日志均来自实际运行记录。它不教你如何从零搭建Linux环境也不重复手册里已有的语法说明只聚焦一个目标让你在面对./case.submit失败时能快速定位是物理过程参数冲突、还是I/O路径权限问题、或是MPI线程绑定策略失配。关键词CESM2不是标签而是整篇笔记的呼吸节奏——每一个缩进、每一行代码、每一张参数对比表都在回应这个核心。2. CESM2整体设计与思路拆解理解“耦合器”才是读懂实验逻辑的钥匙2.1 为什么CESM2不是“一个模型”而是一个“耦合框架”初学者常把CESM2误解为类似WRF那样的单一大气模型。这是根本性误区。CESM2的底层架构是CIMECommon Infrastructure for Earth System Modeling它本质上是一个耦合器调度平台而非求解器本身。真正的计算内核由五大独立子系统承担CAMCommunity Atmosphere Model负责大气动力与物理过程最新版为CAM6核心是SE dycore谱元法与SPCAM超参数化对流POPParallel Ocean Program海洋环流模型采用z*坐标系关键输出包括海温SST、海流UVEL/VVEL、混合层深度MLDCLMCommunity Land Model陆面过程模型CESM2.1起默认集成CLM5.0支持动态植被FATES模块与碳氮循环CICECommunity Ice Code海冰模型v6.0版本引入弹性-塑性流变学改进海冰破裂模拟RTMRiver Transport Model径流传输模型将陆面产流汇入海洋边界。提示所有子系统通过MCTModel Coupling Toolkit进行数据交换。MCT不是简单管道而是带时空插值、守恒约束、并行通信优化的中间件。当你看到cpl.log.*里出现MCT::mct_world_init: MPI_Comm_size128说明耦合器已接管128个MPI进程的协调工作——此时任何子系统崩溃都会导致整个耦合链路中断。这种设计带来两大优势一是模块可替换性比如你可以用CESM2的CAM6POP2但替换成MITgcm海洋模块二是实验可控性AMIP试验本质就是“冻结”POP/CICE/CLM的反馈仅让CAM响应观测SST强迫。但代价是复杂度陡增一个AMIP试验仍需完整编译所有组件因为耦合器必须加载全部接口定义。2.2 组件集Compset选择不是配置选项而是科学假设的编码--compset参数常被当作“预设模板”使用实则它是气候模拟中核心科学假设的声明式表达。以CESM2.1.1为例主流compset命名规则为X{YYYY}Y{ZZZ}X代表大气组件FFull physics CAM6、BBaseline CAM6关闭部分云微物理YYYY代表陆面/生物地球化学2000CLM50BGCC2000年CO2浓度CLM5.0BGCC生物地球化学循环ZZZ代表海洋/海冰CICE6CICE6海冰、DOCNData Ocean即AMIP模式。我们对比三个高频compset的实际含义Compset全称核心科学约束典型用途隐含风险B1850B_1850_CAM60_CLM50%SP_CICE6%PRES_DOCN%DOM_MOSART_CISM2%NOEVOLVE工业革命前基准态CO2284.7 ppmCLM5.0动态植被关闭DOCN强制读取SST数据控制试验、辐射强迫归因CLM5.0的%SP后缀表示使用SP-CAM超参数化计算开销比标准CAM6高3.2倍F2000climoF_2000_CAM60_CLM50%SP_CICE6%PRES_DOCN%DOM_MOSART_CISM2%NOEVOLVE2000年瞬时强迫CO2367 ppm但海温/海冰使用1981–2010气候平均态气候敏感度测试如ECS估算climo后缀意味着海洋强迫场无年际变率可能低估ENSO反馈强度G1850G_1850_CAM60_CLM50%SP_CICE6%PRES_POP2%DOM_MOSART_CISM2%NOEVOLVE同B1850但海洋启用POP2全耦合非DOCN全耦合历史模拟1850–2014POP2启动需bnd_topog地形文件若误用bnd_topog_0.1x0.11°分辨率会导致海洋网格畸变注意%SP、%PRES等后缀不是可选项而是compset定义的一部分。例如F2000climo中的%PRES表示使用预处理的SST数据集如HadISST而F2000则需实时插值CMIP6 SST。后者虽更灵活但要求input_data目录下存在完整的ocn/子目录否则./case.setup会报错ERROR: Missing input data for component ocn。2.3 网格分辨率Res精度与算力的黄金分割点--res参数决定模型空间离散尺度其命名遵循{atm}_{ocn}格式如f09_g17。这里藏着气候建模最残酷的现实分辨率提升一倍计算量增长约8倍三维空间时间步长双重惩罚。CESM2提供三档主流分辨率低分辨率f09_g17大气~110kmFV dycore或~100kmSE dycore海洋~60km。优势是单日模拟耗时2小时128核适合方法开发与参数调试。但缺陷明显无法解析副热带高压脊线西风急流位置偏差达5°纬度。中分辨率ne30pg3_ne30pg3大气谱元网格30单元~100km海洋POP2网格30单元~100km。这是目前LENSLarge Ensemble项目的标准配置平衡了区域气候特征捕捉如青藏高原热源效应与集群资源消耗。高分辨率ne120pg3_ne120pg3大气~25km海洋~25km。能显式解析热带气旋眼墙结构但单月模拟需2000核时且POP2在ne120下需启用POP2_USE_HYCOM开关以避免数值震荡。我们实测过ne30与f09在东亚夏季风模拟中的差异ne30能再现长江中下游梅雨锋的准静止特性降水带宽度300km而f09仅显示宽泛的降水区宽度800km。这解释了为何IPCC AR6中多数CESM2贡献试验采用ne30——它不是“够用”而是“在可承受成本下逼近物理真实性的最优解”。3. 核心细节解析与实操要点从create_newcase到case.submit的生死线3.1 创建案例create_newcase那些被忽略的--参数create_newcase是CESM2实验的起点但90%的失败源于参数组合冲突。以下是经过生产环境验证的关键参数组合# 正确示范AMIP试验大气强迫海洋固定 ./create_newcase \ --case /path/to/case_AMIP_F2000 \ --compset F2000climo \ --res f09_g17 \ --mach bridges2 \ --project PXX000001 \ --run-unsupported \ --pecount 128 \ --walltime 24:00:00--run-unsupported必须添加。CESM2默认禁用非认证平台配置bridges2虽在支持列表但其A100 GPU加速未获NCAR认证此开关解除限制--pecount 128指定总MPI进程数。注意--pecount≠--mpilib。前者是逻辑进程数后者是通信库类型mpt/openmpi/mpi-serial--walltime超算作业调度器Slurm/PBS的硬性约束。若设为04:00:00但模型单日耗时5小时作业会被强制终止且cpl.log末尾无明确错误提示仅显示Killed by signal 15。实操心得永远用--output-root指定独立输出路径。默认$HOME/cases/在多用户集群上易触发inode配额超限尤其LENS试验生成数千个nc文件。我们曾因此导致cpl.log写入失败错误日志停留在Initializing coupler...排查耗时17小时。3.2 环境配置case.setupenv_mach_specific.xml的致命修改case.setup执行后CESM2生成env_mach_specific.xml这是集群适配的核心战场。常见致命修改点MPI库绑定Bridges-2默认MPILIBmpt但本地调试需改为mpi-serial串行模式。若忘记切换./case.build会报错ERROR: Cannot find mpi library for mpilib mpt解决方案./xmlchange MPILIBmpi-serial再./case.setup --clean重置。GPU加速开关CESM2.1.1支持CAM6的GPU加速需--gpu编译但需在env_mach_specific.xml中显式启用entry idCAM_CONFIG_OPTS value-g -gpu若仅编译未配置运行时cam.log会出现WARNING: GPU acceleration disabled due to missing runtime flag。I/O路径权限CESM2默认将RUNDIR设为$CASEROOT/run但Bridges-2的$CASEROOT位于Lustre并行文件系统RUNDIR需指向高速NVMe临时盘/local/scratch/。否则cpl.log中大量write error: No space left on device并非磁盘满而是Lustre条带数不足导致小文件写入延迟。3.3 编译构建case.build--no-build不是捷径而是陷阱./case.build耗时最长ne30全组件编译约45分钟新手常试图用--no-build跳过。这是危险操作CESM2的build阶段不仅编译代码还执行三项不可跳过的初始化输入数据校验检查input_data/下atm/cam/inp/是否包含cam_inparm、lnd/clm2/inp/是否含surfdata_0.9x1.25_simyr1850_c191014.nc路径符号链接自动创建$CASEROOT/SourceMods/src.cam/到$CESM_ROOT/components/cam/src/的软链确保SourceMods补丁生效可执行文件依赖注入将cime/config/cesm/machines/config_compilers.xml中定义的NETCDF_PATH、HDF5_PATH写入Macros.make缺失则cpl.log报undefined reference to nf90_open。我们曾因--no-build跳过导致CLM5.0的fire_emis模块未链接模拟第3年突然崩溃错误日志指向clm.log中ERROR: fire_emis not initialized——而该模块在case.setup阶段已被标记为启用。3.4 运行控制case.submitenv_run.xml里的定时炸弹case.submit提交作业前务必检查env_run.xml中的三个关键参数STOP_N与STOP_OPTION定义模拟长度。STOP_N12STOP_OPTIONnmonths表示运行12个月但若CONTINUE_RUNTRUE且前次运行未正常结束CESM2会从rest文件续算可能导致时间戳错乱如ncdump -v time $CASE/run/atm/hist/*.nc | grep time 显示2000-01-01至2000-12-31但实际输出为2001-01-01至2001-12-31DOUT_S_SAVE_INTERIM_RESTART_FILES控制中间重启文件保存。设为FALSE可节省80%磁盘空间但若作业因节点故障中断将丢失最后30天状态只能从最近rest文件重算通常间隔3个月HIST_N与HIST_OPTION历史输出频率。HIST_N1HIST_OPTIONnyears生成年平均文件但HIST_N1HIST_OPTIONndays会生成每日快照——ne30分辨率下单日CAM输出超12GB30年AMIP试验将产生130TB数据远超多数集群配额。警告HIST_AVG_START_TODAYTRUE参数极易被忽略。若设为TRUECESM2会在每次case.submit时重置历史输出起始时间导致atm/hist/下出现cam.h0.2000-01-01-00000.nc、cam.h0.2000-01-02-00000.nc等混乱文件。正确做法是HIST_AVG_START_TODAYFALSE并手动设置HIST_START_TODAY2000-01-01。4. 实操过程与核心环节实现以AMIP-F2000climo为例的全流程拆解4.1 数据准备input_data目录的生存指南CESM2运行依赖input_data目录下的标准化数据集。官方推荐从https://svn-ccsm-input-data.cgd.ucar.edu/下载但实际操作中需规避三大陷阱数据版本错配CESM2.1.1要求atm/cam/inp/下的cam_inparm文件版本为cam6_3_010若误用CESM2.0的cam6_2_005cam.log报错ERROR: Unknown namelist variable phys_ctl%use_srfc_drag解决方案cd $CESM_ROOT/cime/scripts/Tools; ./manage_externals clone -f externals_config.xml自动同步匹配版本。路径硬编码失效CESM2默认从$CESM_INPUT_DATA读取数据但若该变量未设置会fallback到$HOME/input_data。若$HOME/input_data存在旧版数据如CESM1.2case.setup会静默使用导致cpl.log中INITIALIZING ATMOSPHERE MODEL后立即崩溃。SST数据集选择AMIP试验需ocn/forcing/下的SST文件。F2000climocompset要求sst_HadISST_1x1_clim_1981_2010.nc但该文件实际位于ocn/forcing/OMIP/子目录。若仅下载ocn/forcing/主目录case.setup会报ERROR: Missing file sst_HadISST_1x1_clim_1981_2010.nc。我们建立的数据准备checklistexport CESM_INPUT_DATA/path/to/cesm_input_data全局环境变量cd $CESM_INPUT_DATA; find . -name *HadISST* -type f确认SST文件存在ncdump -h ocn/forcing/OMIP/sst_HadISST_1x1_clim_1981_2010.nc | grep lat\|lon验证经纬度范围是否为lat: 89.5S to 89.5N1°×1°ls -lh atm/cam/inp/cam_inparm确认大小≈1.2MBcam6_3_010版本特征。4.2 启动运行cpl.log里的第一道生死线case.submit后首要监控cpl.log.*耦合器日志。前100行决定成败成功信号Coupler initialized successfully后出现Initializing atmosphere model...→Initializing ocean model...→Initializing land model...→Coupler initialization complete早期崩溃若Initializing ocean model...后卡住超10分钟大概率是POP2的bnd_topog文件缺失或损坏。检查$CASEROOT/CaseDocs/pop2_in中topography_file路径是否指向$CESM_INPUT_DATA/ocn/pop/ocn_topog_0.1x0.1.nc隐性错误Coupler initialization complete后出现WARNING: No restart file found, using initial conditions是正常现象首次运行但若后续cpl.log反复出现WARNING: Restart file not found for component lnd说明CLM5.0的lnd_inparm中fsurdat路径错误。我们实录的一次典型故障cpl.log.20230515-142211: WARNING: Restart file not found for component lnd cpl.log.20230515-142211: ERROR: lnd_inparm: fsurdat /wrong/path/surfdata_0.9x1.25_simyr1850_c191014.nc根源是./xmlchange LND_DOMAIN_FILEsurfdata_0.9x1.25_simyr1850_c191014.nc未指定绝对路径。CESM2要求LND_DOMAIN_FILE必须为绝对路径相对路径会被解析为$CASEROOT/下而非$CESM_INPUT_DATA/。4.3 历史输出hist目录的文件命名逻辑CESM2的历史输出文件名遵循严格模式{component}.h{stream}.{datestamp}-{timestamp}.nc。以CAM输出为例cam.h0.2000-01-01-00000.nch0表示stream 0月平均2000-01-01是起始日期00000是时间戳秒cam.h1.2000-01-01-00000.nch1为日平均但需在user_nl_cam中显式开启hist_empty_htapes .false.。关键控制参数在user_nl_cam# 输出月平均h0和日平均h1 hist_fincl1 U,V,T,PS,TS,PRECT,QREFHT hist_nhtfrq 0,-24 # 0月平均-24每24小时输出一次日平均 mfilt 12,365 # h0保留12个文件h1保留365个 nhtfrq 0,-24 # 同hist_nhtfrq但用于内部计数实操技巧用ncdump -h cam.h0.2000-01-01-00000.nc | grep time:验证时间维度。正确输出应为time:units days since 2000-01-01 00:00:00。若显示days since 0001-01-01说明user_nl_cam中calendar未设为noleapAMIP试验必须用noleap日历排除闰年干扰。4.4 重启与续算rest目录的救生艇协议CESM2的restrestart机制是容错核心。rest目录下文件按{component}.r.{datestamp}-{timestamp}.nc命名如cam.r.2000-12-31-00000.nc。续算流程如下设置CONTINUE_RUNTRUE./xmlchange CONTINUE_RUNTRUE./case.setup --reset重置运行环境./case.build --clean清除旧二进制避免链接冲突./case.submit。但必须遵守“重启窗口”规则若上次运行至2000-12-31rest文件时间为2000-12-31-00000则续算必须从2001-01-01开始。若强行设STOP_N12STOP_OPTIONnmonthsCESM2会尝试从2000-12-31续算12个月导致时间戳溢出cpl.log报ERROR: Invalid time in restart file。我们建立的续算checklistls -t $CASE/run/rest/ | head -5确认最新rest文件时间ncdump -v time $CASE/run/rest/cam.r.2000-12-31-00000.nc | tail -2提取time_bnds值./xmlchange RUN_STARTDATE2001-01-01确保起始日期匹配rest文件时间1天./xmlchange STOP_N12 STOP_OPTIONnmonths设定续算长度。5. 常见问题与排查技巧实录来自37次崩溃现场的急救包5.1 编译阶段高频问题速查表错误现象根本原因排查命令解决方案ERROR: Cannot find netcdf libraryNETCDF_PATH未正确设置echo $NETCDF_PATH; ls $NETCDF_PATH/lib/./xmlchange NETCDF_PATH/opt/netcdf/gcc/4.8.5确保libnetcdf.so存在fatal error: omp.h not foundOpenMP未启用gcc -fopenmp -v./xmlchange COMPILERgnu; ./xmlchange DEBUGTRUE启用调试模式undefined reference to dgemm_BLAS库链接失败ldd $CASEROOT/bld/cesm.exe | grep blas./xmlchange BLAS_LIBS-L/opt/intel/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl5.2 运行阶段致命错误诊断树当cpl.log出现ABORT时按此顺序排查检查cpl.log末尾100行定位首个ERROR或ABORT关键字查看对应组件日志若cpl.log报ABORT from component atm立即检查$CASE/run/cam.log.*分析时间戳cam.log中t 12345.6789表示模型积分时间秒若崩溃发生在t0.0000是初始化失败若在t259200.00003天是物理过程崩溃验证输入数据ncks -H -s -v PS $CASE/run/rest/cam.r.2000-01-01-00000.nc检查气压场是否为NaN。我们遭遇的最隐蔽故障cam.log显示t 86400.0000 ABORT错误信息为ERROR: Negative density in column 12345。排查发现是user_nl_cam中micro_mg_dcs0.001云滴浓度设为0导致云微物理方案除零。解决方案micro_mg_dcs0.01合理物理范围。5.3 性能瓶颈定位timing目录里的真相CESM2运行后自动生成$CASE/run/timing/目录其中cesm_timing_stats.txt是性能分析金矿Total Time总耗时若预期值20%需优化Atmosphere Time占比70%CAM是瓶颈考虑降低cam_inparm中nstep时间步长或关闭use_srfc_dragCoupler Time占比15%MCT插值开销过大需检查env_mach_specific.xml中MCT_CONFIG_OPTS是否启用--enable-mpiioI/O Time占比25%HIST_N设得太密或DOUT_S未启用压缩./xmlchange DOUT_S_SAVE_INTERIM_RESTART_FILESFALSE。实测数据ne30 AMIP试验中I/O Time从28%降至12%的方法是启用NetCDF4压缩./xmlchange HIST_COMPRESS1 ./xmlchange HIST_NCPERFILE1000这使atm/hist/目录体积减少63%且cpl.log中Writing history files耗时下降41%。5.4 文件系统灾难恢复当$CASE/run/被误删CESM2没有内置备份机制但可通过CaseDocs/目录重建CaseDocs/cam_in包含cam_inparm完整副本CaseDocs/pop2_in含pop2_in参数文件CaseDocs/user_nl_*所有user_nl配置CaseDocs/env_run.xml运行时参数快照。恢复步骤mkdir -p $CASE/run/cp CaseDocs/cam_in $CASE/run/cp CaseDocs/user_nl_cam $CASE/run/./case.setup --reset./case.build --clean./case.submit。最后提醒所有user_nl_*文件必须在case.submit前修改。若运行中编辑CESM2不会重新读取除非./case.setup --reset。我们曾因此导致user_nl_cam中hist_nhtfrq -24未生效连续3天未输出日平均文件重算损失21核时。我在实际操作中发现CESM2最消耗心力的从来不是编译或运行而是在cpl.log的百万行文本里找到那个决定成败的10字符错误码。它可能藏在ERROR: Invalid time in restart file的第3行也可能在WARNING: NaN detected in ocean tracer的第87行。这份笔记里每一个表格、每一行代码、每一次错误复现都是为了帮你把这10字符的搜索时间从17小时压缩到17分钟。下次当你面对./case.submit的光标闪烁记住CESM2不是黑箱它只是需要你用正确的钥匙——而这把钥匙就藏在你认真读过的每一行日志里。
返回列表