
搞陆面过程模拟的人十有八九绕不开CLM这个名字。CLM全称Community Land Model也就是社区陆面模型现在代码层面基本和CTSMCommunity Terrestrial Systems Model是同一套体系。它要回答的核心问题很简洁在给定气象条件下陆地表面和土壤、植被、积雪、冻土之间到底怎么交换能量、水分和碳但真上手跑一遍你会发现这个简单问题的背后缠着辐射传输、水文径流、碳氮循环、植被演替、火灾排放一堆模块每个模块都有一堆参数等着你调。这篇博文不打算从头讲理论而是按实际做研究的全流程走一遍怎么选版本、怎么准备驱动数据和地表数据、哪些namelist参数最关键、动态植被和冻土林火模块怎么开、跑挂了之后怎么排错。你会发现CLM虽然庞大但它内部结构其实很有条理只要抓住过程模块输入数据配置开关这条主线就能把这个模型用得很顺手。1. 先搞清楚CLM是怎么把陆面过程装进一个模型的1.1 为什么说陆面是地球系统里最热闹的交界面陆面在大气环流模型里看起来只是一个下边界实际上它是整个地球系统里过程最复杂的交界层。太阳辐射打到地表后一部分被反射一部分被吸收吸收的能量一部分以长波辐射放出一部分变成感热和潜热进入大气同时降水落到地表后一部分入渗到土壤一部分形成径流还有一部分被植被根系吸收后通过蒸腾重新回到大气。这些过程直接决定了地表温度、土壤湿度、边界层发展和区域降水的演变。我一直喜欢用一个比喻大气层是一个高速运转的人体那么陆面就是它的皮肤和汗腺。皮肤怎么散热、怎么出汗、怎么保持水分直接决定人的体温状态。如果陆面模型给的感热通量偏大、潜热通量偏小大气模型整个能量收支都会歪掉。这个比喻也解释了为什么陆面模型不能随便简化——它输出的每个通量都会成为大气模型的强迫源。1.2 CLM的过程模块地图CLM虽然代码量大但过程组织得很清晰。初次接触的人我建议先把模块地图印在脑子里生物地球物理过程Biogeophysics负责辐射传输、能量分配、感热/潜热/地热通量、雪盖演变、土壤温度计算。这部分是CLM的物理发动机所有其他过程都要跟它对表。水文过程Hydrology负责降水截留、入渗、径流地表/地下、土壤水分垂直运移、地下水交换、蒸散发拆分。CLM5.0的水文过程改得很细径流方案也换成了更物理化的参数化。生物地球化学过程Biogeochemistry负责光合作用、呼吸、凋落物分解、碳氮库的积累与周转、氮限制对光合的约束。这部分在CLM4.5之后成为标配也是模拟碳循环和气候变化反馈的核心。动态植被DVM让植被PFT组成随气候和碳竞争自动变化而不是由静态LULCC数据指定。冻土过程Permafrost模拟土壤液态水/冰相变、相变潜热对土壤温度的影响、冻土区域水文和碳过程的特殊响应。林火模块Fire基于燃料载量、可燃性、火源和人类管理参数计算火烧面积、燃烧排放和植被死亡。这六个过程不是彼此独立的。比如冻土消融会改变土壤排水条件进而影响厌氧环境下的甲烷排放林火烧掉了植被碳库又会影响下一年的燃料积累。CLM把这种耦合写在同一个网格单元里所以运行起来计算开销很大但也正因为这个耦合它才能回答多年冻土退化后碳会怎么变化这类问题。1.3 版本选型CLM5.0之后还要不要回头看CLM4.5做CLM模拟第一件事不是下载代码而是想清楚用哪个版本。目前大家用得最多的还是CLM4.5和CLM5.0及其演进版本CTSM5.x。CLM4.5的优点是稳定、资料多很多老文献和在线教程都基于它缺点是一些水文和碳氮过程偏老化比如没有CLM5.0的改进地下水方案和农田管理模块。CLM5.0/CTSM5.x在过程刻画上更完整土壤分层、水文过程、碳氮循环、动态植被和火模块都做了重要更新尤其是土壤湿度和径流的模拟比4.5要可靠得多。选型没有绝对标准主要看科学目标。年际或年代际的水文模拟我建议直接上CLM5.0因为它对土壤水分的垂向分布和地下水交换的分辨能力更强。要研究碳循环、植被-气候反馈、农田管理CLM5.0更是唯一选择。只有在你需要和一批已经发表的CLM4.5基准试验对比或者服务器配置较老、编译新版本有困难时才考虑退回CLM4.5。简单说新研究尽量上新版本对比研究才留旧版。2. 环境搭建与数据准备CLM全流程真正的起点2.1 机器环境与依赖库这一关其实最容易卡人很多人觉得CLM难在模型本身其实第一步的环境配置就能劝退一大半人。CLM现在主要通过CESM的CIME框架构建和运行所以你需要一个Linux环境加上Fortran编译器Intel或GNU都行、MPI实现OpenMPI或MPICH、NetCDF库包含Fortran接口。如果装过WRF这类模型环境基本是现成的如果第一次搭建议直接用 Intel oneAPI OpenMPI NetCDF-C/Fortran 这套组合网上排错资料也多。编译前记得检查环境变量NETCDF_HOME或NETCDFROOT要指向NetCDF安装根目录MPI_HOME指向MPI目录。CIME会通过环境变量自动寻找依赖路径设错会出现各种匪夷所思的编译错误。我自己踩过最深的坑就是系统里同时存在两个NetCDF版本CIME抓到了旧版结果编译出来读不了新版数据运行阶段才报错。解决方法是模块化环境里只加载一套或者把NetCDF路径写死在env_mach_specific.xml里。2.2 气象驱动数据选对再分析数据等于成功一半CLM可以做单点、区域和全球模拟。离线运行时需要大气强迫数据包括气温、降水、风速、比湿、气压、短波辐射、长波辐射一共7个变量。CLM5.0离线模拟默认推荐GSWP3v1数据集这套数据覆盖1901-2014年空间分辨率约0.5度由观测和再分析产品融合降尺度而来时代兼容性好和CLM5的默认初始条件匹配度高。如果你研究时段在2015年之后就得考虑WFDE5或其他后处理数据需要额外做变量重命名和插值。驱动数据的时间分辨率至少要到3小时降水最好小时尺度。很多新手拿日平均数据直接灌进去结果CLM对日尺度的降水强度判断不准径流峰值被严重抹平蒸散发也偏小。插值方法在DATM流的配置里选我习惯用tintalgo linear对温度、风场线性插值降水则用coszen或nearest处理防止负值和过度平滑。2.3 地表数据集与土地利用决定下垫面真实与否CLM运行需要三样核心输入domain文件定义网格和陆地掩膜、surface data文件包含每个网格的植被功能型占比、土壤质地、土壤颜色等、土地利用时间序列文件用于历史时期PFT和作物比例的逐年变化。对全球模拟NCAR输入数据服务器已经提供了现成文件分辨率要和模型网格一致。比如f09_f09_mg17网格0.9°x1.25°对应surfdata_0.9x1.25_hist_16pfts_Irrig_CMIP6这类文件。如果做区域模拟或自定义网格就必须自己生成地表数据集。CLM工具包里提供了mksurfdata模块输入高分辨率植被、土壤、地形数据输出目标网格的聚合文件。这个过程的坑在于不同来源数据的时间基准要对齐比如土地利用数据用LUH2而植被功能型分类却要映射到CLM自己的PFT体系映射表写错会导致某些植被类型全变成裸土跑出来的蒸散发明显异常。做完surface data后我建议先用NCVIEW或Python画一下主要PFT的空间分布确认没有大面积零值或错位。3. 核心过程逐项拆解能量、水分、碳与生态过程怎么配置3.1 生物地球物理过程先从能量收支说起生物地球物理模块的底层逻辑是能量守恒净辐射吸收短波净长波等于感热潜热地热储热变化。CLM在每个时间步对土壤和植被分别解这一组方程。你真正需要关心的参数是那些控制辐射和湍流交换的比如土壤颜色决定反照率、叶面积指数决定植被反照率与冠层辐射衰减、粗糙度长度决定湍流交换效率。在SP卫星物候模式下LAI直接由遥感数据指定所以辐射过程的模拟很稳定在BGC模式下LAI由碳循环动态计算可能出现植被碳库还没蓄起来时LAI偏低、感热偏大的短暂偏差。做长时间模拟时这个过程耦合偏差会在前几年特别明显。我一般会在结果的能量通量里长序列检查FSA吸收太阳辐射、FIRA净长波辐射、FSH感热、EFLX_LH_TOT潜热的闭合情况偏差超过5%就要回头检查辐射参数和初始条件。3.2 水文过程径流、土壤水与蒸散发的耦合CLM的水文过程在土壤分层基础上计算降水落到冠层先截留透过冠层后一部分入渗一部分变成地表径流入渗水沿Richards方程向下运动底部有地下水交换和排水项。CLM5.0的水文改进主要在两点一是引入了基于TOPMODEL思想的径流参数化可以模拟饱和过饱和产流二是地下水模块能模拟地下水位动态对湿地和干旱区的水文响应更合理。配置水文过程时最重要的开关是irrigation模式。如果你做历史时期模拟且关注农田水文效应记得开启灌溉选项否则中纬度农业区夏季会出现明显的水分亏空感热偏高。另外CLM的土壤参数饱和导水率、孔隙度来自soil texture数据对站点模拟我强烈建议把站点实测土壤粒径插进surface data否则壤土、砂土的错配会直接把表层土壤水模拟带偏进而影响潜热和径流。3.3 生物地球化学过程碳氮循环与长时间尺度平衡生物地球化学模块是CLM里计算最重的部分它把陆地碳分为植被碳叶、茎、根、木质部、凋落物碳和土壤有机碳通过光合输入、自养呼吸、异养呼吸和分解过程驱动。氮循环通过限制冠层氮浓度影响光合参数决定碳氮耦合强度。简单说这个模块回答的是陆地生态系统到底能存多少碳、在气候变化下是源还是汇。运行碳氮耦合模式最核心的实践问题是spinup。由于土壤碳周转时间长达几十年甚至几百年直接从一个随意初始条件开始土壤碳库前500年都不会稳定。CLM官方提供两种做法一是常规长spinup依靠多年循环驱动数据反复跑直到碳通量年际变化平稳二是加速分解spinup用提高分解速率系数的方式让人为地快速达到近似平衡再恢复正常参数做正式模拟。我实际常用后者省时明显但有个前提spinup结束时的碳库结构要合理不能出现表层土壤碳几乎为0、深层碳突增的畸形分布。3.4 动态植被、冻土和林火三个交叉方向的配置经验动态植被模式DVM适合做百年以上气候-植被相互作用的研究。它让PFT竞争大小完全由碳累积和死亡率决定同时考虑气候限制的火烧清除。开启DVM后你不仅要给模型足够达到动态平衡的time spinup还要注意气候驱动数据不能有突变否则植被类型会在某一个转折点剧烈振荡出现森林-草原跳变的人为假象。冻土模块的核心是土壤水冰相变对温度场的反馈。冻土区土壤温度模拟的精度很大程度上取决于土壤有机质厚度和热导率参数。CLM5.0对有机质土壤的热性质做了改进但你需要保证surface data里有机质含量分布准确。做冻土研究时输出变量重点看TSOI每层土壤温度、SOILLIQ液态水含量、SOILICE冰含量三者之间有一种互锁关系温度在0度附近时液态水和冰的比例变化会释放/吸收相变潜热从而把温度拉住。如果模拟地温全年偏高大概率是初始地温给定得不对需要用更长的spinup把它拉平衡。林火模块是所有模块里最容易让新手惊讶的它不只是一个排放源更是一个生态扰动过程。火的发生需要可燃物燃料、可燃性燃料湿度和气象条件、火源人为或闪电三者通过火模型联合决定燃烧面积。CLM默认会使用2000年后的全球火源数据。做火模拟时一定要检查燃料载量是否合理——如果动态植被没有spinup好燃料一直很稀少火烧面积会被压到极低反过来如果燃料过高会烧出一大片异常的火烧迹地。4. 实操创建case、改namelist到提交运行的完整动作4.1 创建case命令模板与常用参数CLM通过CIME框架创建运行案例最常用的是从CESM发布包里的cime/scripts目录操作。假设你编译环境已经就绪我给出一个典型的离线全球试验创建命令cd $CESM/cime/scripts ./create_newcase \ --case /scratch/user/clm_run1 \ --res f09_f09_mg17 \ --compset 2000_DATM%GSWP3v1_CLM50%SP \ --machine atlas \ --run-unsupported这行命令的含义--res指定网格分辨率f09_f09_mg17表示大气和陆面都是0.9°x1.25°mg17是地球重力场模型版本--compset指定模拟配置2000_DATM%GSWP3v1_CLM50%SP表示以2000年土地利用和温室气体为基准用GSWP3v1大气数据驱动陆面使用CLM5.0物理SP是卫星植被物候。如果做碳循环和动态植被研究将SP换成BGC或BGCDV对应的compset即可。创建完成后进入case目录执行./case.setup这一步会生成环境变量文件和namelist文件之后你才有user_nl_clm和user_nl_datm等可编辑文件。4.2 user_nl_clm配置实战CLM行为主要通过user_nl_clm控制这个文件可以覆盖默认值或追加新配置。下面是我做全球水文-碳循环模拟时的常用配置片段! 地表数据文件 fsurdat /path/to/inputdata/lnd/clm2/surfdata_map/surfdata_0.9x1.25_hist_16pfts_Irrig_CMIP6_simyr1850_2020_c230914.nc ! 关闭从外部初始条件重启让模型自行spinup finidat ! 在默认月度输出基础上追加30年每日输出 hist_fincl2 FSH,EFLX_LH_TOT,FIRA,FSA,FSR,FCTR,FCEV,FGEV,TSOI,SOILLIQ,SOILICE,TOTVEGC,TOTLITC,TOTSOILC,H2OSFC,QRUNOFF hist_nhtfrq(2) -24 hist_mfilt(2) 730 ! 打开土壤水分限制对蒸散发的调节默认开 use_soil_moisture_stress .true.hist_nhtfrq(2) -24意思是每小时数据累积到一天输出一次所以hist_mfilt(2) 730对应30个完整年的日文件。这里有个坑历史文件的输出频率太密会让IO量爆炸全球0.9度网格日输出28个变量一年就要生成上百GB数据所以真做全球百年模拟时我通常只把关键变量按月输出日输出留给站点模拟或短时间段。如果做DATM大气数据配置还要检查user_nl_datm。尤其是循环多年时需要设置taxmode cycle把气象数据按年循环使用taxmode cycle这个看似不起眼的设置决定了你spinup能不能跑完。不设置成cycle模型跑完驱动数据时间范围后就停了。跑spinup时要让它无限循环跑正式试验时可以用limit模式精确对齐模拟时段。4.3 编译提交与log监控配置完成后运行./case.build。这一步会完成CLM的完全编译时间从十几分钟到一两个小时不等取决于机器和是否首次编译。编译通过后会生成可执行文件后./case.submit进入队列运行。很多人提交后就一直盯着*.log.*看其实更该关注的是CaseStatus和run/目录下的cesm.log。CLM运行过程中每个时间步都做能量和水分的全局守恒检查如果出现严重失衡CESM日志会打印警告甚至直接报错终止。我第一次跑CLM5时因为surface data时间坐标系写错模型跑了3个小时后土壤水全面发散日志里能量闭合误差从0.001逐步增长到0.5我愣是没早看白白浪费了一晚上计算。现在我的习惯是运行中隔几个小时就扫一眼cesm.log关键词ERROR、WARNING、balance check、NaN只要出现其中一个就尽早掐掉重来。4.4 输出变量与结果初判CLM输出的是NetCDF文件运行结束后用Python/NCL或CDO都能处理。我拿到第一件事不是画美丽的地图而是做三组合理性初判全球平均地表温度年循环是否合理是否出现极区冬季长时间低温但没崩溃。能量闭合对单点或多点计算净辐射与感热潜热之和的差看剩余项是否在5%以内。水分闭合降水减去径流减去蒸散发减去土壤水储量变化误差应趋近于0。对水文研究重点关注QRUNOFF总径流、QRGWL地下排水、QH2OSFC地表产流的空间分布看看湿润区径流系数是否大致符合观测认知。对碳循环研究看GPP总初级生产力的纬带分布热带最高、向两极递减热带湿润森林GPP年总量应该在全球碳收支的合理范围内。如果GPP出现赤道带空洞多半是地表数据集里常绿阔叶林的PFT比例出了问题回到surface data检查。5. 常见问题与排查技巧实录5.1 编译与运行阶段的高频报错现象常见原因解决方向编译时找不到NetCDF头文件环境变量NETCDF_HOME缺失或指向错误重新加载模块确认nc-config路径运行时出现CIME ERROR: inputdata missing输入数据不在本机模型尝试自动下载用./check_input_data --download或手动放置文件启动即退出提示DATM streaming file missing数据流文件路径下的驱动数据缺失检查user_nl_datm的streams文件列表和DATM_CLM目录某时间步出现NaN土壤水或温度发散检查初始条件降低时间步长或换更平滑的spinupMPI死锁或进程崩溃进程数超过网格块数调整NTASKS或PECount全局0.9度建议不超过384核这里想多说一句很多报错其实在官方文档和GitHub issue里都有记录。遇到报错先看日志文件尾部的CIME ERROR那几行然后把几行关键内容原文扔进搜索引擎比你自己瞎猜快得多。5.2 运行结果异常的排查思路结果异常分三类我对它们的处理逻辑完全不同。第一类是能量不平衡。如果某个月全球平均净辐射减去通量项的残差偏大优先检查是否有雪盖反照率的突变、土壤温度是否出现局部振荡。在站点模拟中我见过一个经典案例冬季积雪反照率被雪年龄方案调来调去导致3月融雪期FSA异常跳变。解决方案是检查雪盖层数、雪龄和反照率的日变化曲线。第二类是水分异常。比如径流常年为0可能是地表土壤导水率太差、入渗几乎全蒸发了或者地下水位顶到地表但产流方案没有触发饱和径流。这时候把土壤剖面含水量沿深度画出来往往能直观看到问题所在上层全干但下层全饱和那大概率是毛细上升或根系吸水参数的细节出了问题。第三类是碳库异常。如果土壤碳逐年单调递减不收敛通常是spinup时间不够或者初始土壤碳库给得太小。加速分解spinup有一种常见副作用把惰性碳的比例压得太低正式模拟后土壤碳开始缓慢回升看起来像碳汇其实是人为轨迹。解决方法是把加速因子控制在10倍以内并在正常分解参数下额外跑100年检查趋势。5.3 spinup与计算资源权衡的经验最后聊一点资源策略。CLM全球模拟的计算开销大头在BGC和动态植被SP模式下大约是BGC的三分之一。如果你只是研究水文过程没必要硬开碳氮耦合。做碳循环研究时建议第一步先用SP模式跑50年把物理状态土壤温湿度调到气候平衡再从这个物理状态作为初始条件开启BGC模式做spinup。这样比从头直接BGC spinup节省很多时间系统也更稳定。另一个实用技巧是用粗细分辨率两步法先在f191.9°x2.5°网格上完成长时间spinup得到平衡态再把这个平衡态文件通过插值作为f09网格模拟的初始条件。陆面变量里土壤温湿度和碳库结构相对平滑网格间插值的精度损失在可接受范围但这个策略能把高分辨率试验从百年尺度压到十年尺度我之前就是这么把全球0.25度的试验总计算时间压缩了接近一半。我做CLM模拟几年下来最大的体会是这个模型不怕你慢就怕你急。每个模块都有它自己的时间和空间尺度水文过程几小时就有响应碳循环却要跑几十年才给出信号动态植被和冻土更是典型的慢过程。刚开始接触的话别一上来就想着全球百年碳收支。先选一个你熟悉的小流域或站点用SP模式跑通流程把数据准备、namelist配置、日志监控这套技能练熟再逐步打开BGC、DVM和火模块。等你亲眼看到模型输出的GPP季节曲线、土壤温湿度和实测站点数据对上的那一刻你会觉得CLM这么多弯弯绕绕的配置其实都是值得的。