
写这期的起因很简单群里不止一次有人问“em_opt后面那一串数字到底啥区别”还有人直接说“既然MAM4听起来高级是不是选它就行”。WRF-Chem里的气溶胶模拟方案对比确实是很多人卡了很久的关。namelist里改一个选项简单但这个整数背后对应的是完全不同的气溶胶描述框架跑出来的浓度分布、组分比例、昼夜变化都可能差很多。这期就把我这些年踩过的、试过的、对比过的经验整理成一份可参考的概览覆盖GOCART、MADE/SORGAM、MADE/VBS、MAM系列的原理差异、适用场景、配置要点和翻车细节。新手可以照着选型已经跑通的也可以用来回头审视自己的配置。1. 气溶胶方案不是开关先建立三个底层认知1.1 em_opt后面藏着一套“模型世界观”很多人第一次改namelist时会把化学选项当成一个“要不要开”的开关实际操作里却远不是这么回事。chem_opt、em_opt这些参数一旦选定了某套气溶胶方案等于强制整套模式进入一种特定的气溶胶表征方式。这个差异不是浓度高一点低一点那么简单。我举一个例子同样模拟硫酸盐气溶胶采用bulk思路的方案会把硫酸盐当成一种均匀混合的粒子群体来处理采用模态思路的方案会把粒子按Aitken核模态、积聚模态、粗模态分开描述。这两种思路在粒子粒径分布、干沉降速率、吸湿增长、云凝结核活化方面的表现完全不同最终落地的PM2.5浓度可能差出30%甚至更多。所以选方案之前先想明白你接受的是哪套“模型世界观”。WRF-Chem里每个方案背后都跟着一整套物理化学假设不是换个输出变量名就能绕过去的。1.2 冷启动问题气溶胶模拟高度依赖初始与边界条件另一个特别多人忽略的认知气溶胶模拟的效果一半看方案另一半看初始条件和边界条件。有人第一次跑化学模块打开wrfout发现气溶胶浓度在前两天几乎从零开始爬升就以为是方案出了问题其实更可能缺了边界输入。如果跑区域模拟时没有提供气溶胶边界场模式入口就只有气候态背景值或者干脆是零。模式内部在线生成的粒子要慢慢累积起来这时候前几天的结果基本不具备物理意义。更麻烦的是不同方案对边界气溶胶的响应也不同有些方案会把边界场里的粒径分布重新处理有些方案干脆忽视部分物种。这意味着你对比两个方案时如果初始边界条件不一致最后统计出的差异根本说不清是方案造成的还是入场气流本身造成的。我自己做方案对比试验时第一件事就是固定同一套初始场、同一套边界场、同一套排放清单只允许气溶胶方案这一个变量变化。否则后面所有分析都是白搭。1.3 气体机制与气溶胶机制锁与钥匙第三点认知是锁与钥匙的关系。气溶胶是气体化学的“下游产物”所以气溶胶方案必须和气相化学机制配套使用。单独看一个气溶胶方案好不好没有意义你还要看它跟前体物的气相氧化路径合不合。比如硫酸盐的生成依赖SO2被OH氧化或者被过氧化氢、臭氧等液相氧化硝酸盐的生成依赖NO2、N2O5等前体物。如果气相机制里根本没有包含某种关键中间产物后面的气溶胶模块就算设计得再精细也只是没有原料的加工厂。尤其是有机气溶胶SOA的前体物包括单萜烯、倍半萜烯、芳香烃等一系列VOC物种不同气相机制对这些物种的拆分粒度差异很大。选方案前先查版本配套表别凭感觉乱配。2. 四大类方案的技术拆解模态划分与化学内核2.1 GOCART轻量稳定的“bulk”路线GOCART应该是入门门槛最低的一套方案。它的基本思路是把气溶胶按物质类别分成几个大“袋子”来传输包括硫酸盐、黑碳、有机碳、海盐、沙尘这几类。每个袋子里面的粒子不区分粒径模态或者只做一个很粗略的亲水/疏水拆分。好处非常明显物种少、耦合简单、计算开销低跑业务预报或者做长时段模拟时非常稳定。尤其是需要跑几个月的季节模拟又不需要精细组分分析时GOCART是性价比很高的选择。它的湿沉降、干沉降参数化比较稳健不容易出现数值爆炸。但代价也很直接它基本不显式模拟二次有机气溶胶的生成过程对有机气溶胶的处理比较粗。你想回答“某一天PM2.5里硫酸盐、硝酸盐、铵盐和有机物各占多少”这种问题GOCART给不了太多信息。它更适合回答“今天沙尘和硫酸盐浓度大概多少”“能见度受气溶胶影响多大”这类总量级问题。2.2 MADE/SORGAM气溶胶走进模态时代MADE/SORGAM是很多人接触的第一套“正经”区域气溶胶方案。MADE负责气溶胶动力学把粒子划分成Aitken模态、积聚模态和粗模态三个对数正态分布SORGAM负责二次有机气溶胶把SOA分成亲水性和疏水性两部分。模态划分带来的直接好处是粒径信息回来了。不同模态的粒子在沉降、碰并、活化时表现不同所以模拟出的PM2.5日变化曲线比bulk方案更有“形状”。积聚模态里的硫铵盐会在湿度高时吸湿长大Aitken模态里的新鲜粒子会随着老化慢慢向积聚模态转移这些过程在GOCART里是看不到的。但SORGAM的SOA处理在今天来看相当“原始”它把有机气溶胶简单分成挥发性和非挥发性两个大类用一个分配系数决定它们在气相和颗粒相之间的分配。这个分配系数只要稍微调得不好SOA就容易高估或者被低估。实际跑下来MADE/SORGAM对有机气溶胶的峰值浓度经常偏高尤其在强光高温的夏季午后。如果你主要关心无机气溶胶硫酸盐、硝酸盐、铵盐这套方案还算顺手如果关心有机气溶胶就得看下面VBS路线。2.3 MADE/VBS把挥发性切成多级台阶VBSVolatility Basis Set挥发性分级框架解决的正是SORGAM在SOA处理上的短板。它的核心思想是有机气溶胶的前体物不是只有“挥发性”和“非挥发性”两个极端而是覆盖一个很宽的挥发性谱。VBS把这条谱按饱和浓度切成多个对数间隔的“台阶”每个台阶上的有机物可以在气相和颗粒相之间动态分配随着氧化老化逐步迁移到更低挥发性的台阶。这种描述方式让SOA的老化、粒径增长、氧化态升高都有了“过程感”。实际使用MADE/VBS时模拟出的SOA浓度随温度和光照的变化曲线更接近观测的日变化特征夜间SOA偏低、午后SOA抬升的趋势也更明显。代价是物种数量大增每个挥发性台阶都对应若干有机物种名额CPU开销明显上涨。VBS对排放清单的VOC物种拆分要求很高。如果清单里只给了总VOC而没有细分烷烃、烯烃、芳香烃VBS的氧化增量实际上是空算模式生成的SOA会凭空矮一大截。这直接引出后面第3章的选型判据你的排放清单配不配得上这套方案。2.4 MAM系列面向气溶胶-云相互作用的统一化尝试MAM系列Modal Aerosol Model走的是另一条路线。它不只为空气质量模拟服务更是为气溶胶-云相互作用和气候研究准备的。MAM3把粒子分成Aitken、积聚、粗三个模态MAM4则是加入了对碳质气溶胶的更细致处理MAM7则把硫酸盐、黑碳、有机碳、海盐、沙尘等分别设置独立模态。MAM系列与MOZART等较完整的气相机制联合使用时可以较全面地描述气体前体物、气溶胶粒子和云凝结核之间的耦合。如果你关心的是气溶胶对云滴数浓度的影响或者要研究间接辐射效应MAM系列几乎是必选项。它的气溶胶-云相互作用参数化比其他方案完整得多。但MAM系列的配置和调试难度也最大。物种多、过程多、可选参数多改一个参数可能同时影响几个过程出了问题很难定位。而且不同版本WRF-Chem里MAM的选项编号并不一致迁移版本后必须重新验证。很多用户第一次跑MAM时容易被wrfout里多出来的大量变量搞懵得花不少时间理清哪些是诊断量、哪些是预报量。2.5 四类方案一表对照方案气溶胶表征方式模态/分档SOA处理常见气相机制搭配计算开销典型用途GOCARTbulk分类按物种分袋粗略亲水/疏水基本不显式模拟CBMZ等低业务预报、长时段气候态模拟MADE/SORGAMlog-normal模态Aitken积聚粗模态SORGAM两挥发性档CBMZ系列中区域PM2.5组分研究、重污染过程分析MADE/VBSlog-normal模态三模态多挥发性台阶VBS多级分配和老化CBMZ系列中高有机气溶胶来源与演化研究MAM3/MAM4/MAM7统一模态微物理3/4/7个模态模态内有机气溶胶老化MOZART等高气溶胶-云相互作用、辐射反馈研究这张表只是路线图。落实到具体版本时还要看该版本WRF-Chem编译时启用了哪些选项某些组合在编译阶段就不支持。3. 选型判据先回答“要解决什么科学问题”3.1 科学目标决定方案四类典型问题对应关系选方案的第一原则不是“哪个高级”而是“我要回答什么”。我一般会把研究问题先拆成四类。第一类只想要气溶胶总量、消光系数、能见度不需要精细组分。这类选GOCART就够了稳定且便宜。第二类想分析PM2.5质量浓度与气象要素的关系关心重污染过程的维持和消散希望组分至少有无机盐和有机碳的区分。这类选MADE/SORGAM比较务实它会在气象要素和气溶胶之间建立较好的过程反馈。第三类想深究二次有机气溶胶的生成与老化比如“生物源排放贡献多大”“氧化程度如何变化”那就直接上MADE/VBS。第四类想讨论气溶胶对云和辐射的影响甚至做气候尺度的敏感性试验MAM系列是主流选择。把科学问题写在一张纸上再对着这张表选思路会清晰很多。3.2 计算资源怎么估一个三层嵌套算例很多人问“某方案跑得动吗”。这个问题没有绝对答案只能用相对比例来估。我在某次对比试验里做过一个大致的参照同样三层嵌套、同样区域的48小时模拟以GOCART的墙钟时间为1.0MADE/SORGAM大约需要1.3到1.6倍MADE/VBS大约需要1.8到2.2倍MAM4则要看具体配置常见的量级在2到3倍之间。神经网络里有个说法叫“没有免费午餐”气溶胶模拟也一样你每拿到一组额外信息粒径分布、SOA挥发性台阶、云凝结核活化就要多付一部分CPU开销。如果只是跑个例研究几天时间的模拟还在可接受范围内如果跑三个月长时段差距就会非常可观。我见过不少人一开始雄心勃勃选MAM4结果跑了两个星期只完成一个月模拟最后又悄悄换回MADE/SORGAM。一个建议正式批量跑之前先做一次24小时的单日模拟只换方案、其他不变测墙钟时间、看输出文件大小、盯log里有没有rtb错误。这一步能帮你省下后面几十天的时间成本。3.3 排放清单的物种映射选型时最容易忽略的“隐藏变量”方案选型还有一个非常容易忽略的变量排放清单处理工具里的化学物种映射表。同一个源清单在跑prep_chem_sources时选择不同的方案编号输出的物种列表和单位都是不一样的。举个例子MADE/SORGAM需要显式区分亲水有机碳和疏水有机碳而GOCART只需要总有机碳。如果清单处理时没有正确映射即使你后面namelist选的是MADE/SORGAM模式里也根本喂不进需要的物种结果自然异常。VBS则更挑剔它需要芳香烃、烷烃、烯烃、生物源VOC等分别归档清单里拆分不够细的话后面SOA计算结果就是“假完整”。选型前先打开你的排放清单处理脚本看看输出文件里有哪几个化学物种对得上哪个方案的物种接口。这一条比纠结方案本身的参数化细节重要得多——原料进不去机器再高级也白搭。4. 落地配置从namelist到输入文件的隐藏关卡4.1 namelist里与气溶胶相关的开关逐项过一遍以下是namelist.input里常见的气溶胶相关开关我用具体含义说明不确定具体取值的地方一定要去对照你编译版本的README和Registry文件因为不同版本选项编号确实有变动。chem chem_opt 3, 3, 3, ! 气相化学机制编号需与气溶胶方案配套 em_opt 3, 3, 3, ! 排放方案与气溶胶方案编号 aer_ic 1, 1, 1, ! 是否读取气溶胶初始条件 aer_bc 1, 1, 1, ! 是否读取气溶胶边界条件 aer_ra_feedback 0, 0, 0, ! 气溶胶辐射反馈开关 aer_op_opt 1, 1, 1, ! 气溶胶光学性质参数化方案 /这几个开关里aer_ic和aer_bc最容易被忽略。有人只改了chem_opt和em_opt忘了打开气溶胶初始边界读取结果模拟出来浓度低得离谱。aer_ra_feedback则是当你确定要让气溶胶参与辐射计算时才打开打开后计算量会上升同时气象场会响应气溶胶的消光效应。我特别提醒一点不要把网上教程里的chem_opt取值直接照抄。WRF-Chem不同版本之间的选项编号真的会变同一个数字在你本地的可执行文件里可能代表完全不同的机制。看namelist之前先打开你的Registry/目录下的相关文件确认编号。4.2 初始与边界气溶胶aer_ic / aer_bc怎么设aer_ic1表示从输入数据读取气溶胶初值aer_bc1表示从边界数据读取气溶胶边值。这两个打开后模式才能从外部获得气溶胶“种子”。实际工作中这份初始边界数据一般来自全球化学模式的输出再经过专门的工具转化成WRF-Chem能读的格式。这里有个容易踩的坑即使你打开了aer_bc边界文件里也要恰好包含当前气溶胶方案需要的物种和粒径分段否则模式要么读不到要么插值出一堆异常值。我遇到过一种情况边界数据是从全球模式粗网格插值过来的到区域模式细网格后边界附近出现了浓度“接缝”整个目标区域的水汽和气溶胶分布都受影响。排查了很久才发现是边界场在插值过程中没有做质量守恒处理。如果暂时拿不到合适的边界数据一个应急做法是把aer_bc设成0让气溶胶从零开始累积。但这种方案只适合做敏感性试验不适合任何定量分析。4.3 气溶胶辐射反馈aer_ra_feedback开还是关aer_ra_feedback是我建议每个方案对比试验都单独做一组的开关。打开后气溶胶的消光、散射、吸收会实时反馈给辐射传输计算从而影响温湿度场和边界层发展关闭后气溶胶只作为被动示踪物。实际模拟中这个开关的影响非常大。重污染过程里高浓度气溶胶会削弱到达地面的短波辐射导致地表温度降低、边界层高度下降进一步加剧污染积累。这个正反馈过程在关闭辐射反馈的模式里完全消失。所以研究重污染事件时至少要跑一组打开反馈的试验否则很难复现观测到的“污染-边界层”耦合过程。但打开反馈也意味着你每次改变气溶胶方案气象场也会跟着变。这时候两个方案之间的浓度差异就不再纯粹来自气溶胶过程还来自气象场反馈的间接效应。论文写作时需要说明这一点对比试验设计也必须包括“同气象场下的纯化学差异”和“反馈后的全耦合差异”两层。4.4 排放清单处理prep_chem_sources与方案编号排放清单处理是配置流程里最繁琐的一环。运行prep_chem_sources时需要选择与目标气溶胶方案匹配的化学机制选项。这一步产生的中间文件里有各种物种的排放通量单位一般是mol/km2/hr或kg/km2/hr。不同方案对排放物种的要求不同。我列一下常见的对应关系具体编号以你的版本为准如果运行GOCART方案重点关注SO2、BC、OC、海盐、沙尘排放通量。如果运行MADE/SORGAM需额外确认亲水OC、疏水OC的区分是否正确。如果运行MADE/VBS需检查VOC物种拆分是否细化到芳香烃、烷烃、烯烃、生物源萜烯等多个类别。如果运行MAM系列要确保排放物种命名与MAM内部变量名一致否则模式容易读入默认的“空排放”。这个环节的bug往往不会报错而是静默地让某个物种排放量为0。所以每配完一次排放清单我都建议先跑一个12小时试验wrfout里直接画出SO2和CO的排放源分布确认污染源位置和清单原始分布一致后再进入正式模拟。5. 跑完怎么对比评估指标与诊断思路5.1 输出变量先做一致化再谈对比不同方案输出的气溶胶变量并不统一。GOCART的输出可能是物种单独的质量浓度比如“硫酸盐”“黑碳”“有机碳”MADE系列会输出各模态内的质量浓度MAM系列还会输出数浓度、模态参数等额外量。如果直接比较“PM2.5”这个量你其实要先确认模式的PM2.5输出里包含哪些物种、做了怎样的截断。很多版本的WRF-Chem会直接输出PM2_5_DRY但它的定义在不同方案之间可能差一个干粒径上限或湿粒径扣除环节。我见过有人拿着GOCART的PM2.5和MADE/SORGAM的PM2.5直接相减其实根本不在同一物理定义下。对比前要做的一致化处理至少包括统一物种范围、统一粒径截断、统一干湿状态、统一单位微克每立方米是常用单位但有些中间量是千克每立方米或者摩尔每立方米。这些做完再谈谁高谁低。5.2 常用的统计指标与判断逻辑气溶胶方案对比的统计指标业内常用的还是那组老朋友平均偏差MB、归一化平均偏差NMB、均方根误差RMSE和相关系数R。平均偏差MB模拟值减去观测值的平均正数代表模拟系统性偏高。归一化平均偏差NMBMB除以观测平均直观告诉你有多少百分比的偏差。均方根误差RMSE对大误差更敏感能反映模式对极端事件的还原能力。相关系数R看时间序列的形状是否一致。只看平均值会掩盖很多问题一个方案可能全天都是5微克高估另一个方案是白天高估、夜间低估两者平均偏差接近但R值差很多。所以别只贴一个RMSE至少把MB、NMB、R放一起看再画一张时间序列散点图很多问题一眼就能看出来。5.3 一个对比试验的真实结果不同方案差异到底有多大我在某模拟项目X里做过一次对比试验内容包括同一区域、同一时段、同一排放清单分别跑GOCART、MADE/SORGAM和MAM4时间长度覆盖一个完整的重污染过程。结果很有意思。GOCART对PM2.5总量明显低估尤其在污染峰值日高值中心浓度比观测低30%以上MADE/SORGAM在峰值时段略高估且在夜间出现持续偏高日变化的“谷”填得太满MAM4校准后处于中间位置但它的有机碳部分对排放清单里VOC拆分方式极敏感我用两套不同拆分方式跑出来的SOA浓度差了快一倍。这个对比告诉我们方案间的差异本身不是线性的在污染积累期和清除期它们的偏差方向可能完全相反。只看平均结果很容易得出“差不多”的结论但深入逐时段分析就会发现每个方案的适用边界其实很清晰。5.4 敏感性测试如何验证“方案差异”不是数值噪音方案对比中最容易受到质疑的一句话是“差异是真实的还是数值噪音”。我习惯做几组强制性的敏感性测试来回答这个问题。第一步是改变积分时间步长比如把模式时间步长缩小一半看目标指标的扰动幅度。如果指标变化远小于方案间的差异说明差异具有统计稳健性。第二步是改变某方案的关键参数比如VBS里的老化速率、干沉降粒径分布做上下浮动看结果是否在一个可控范围内。如果参数的微小变化就让结果翻倍那这个方案在当前配置下就不算稳定。第三步是做“零排放清零试验”关闭所有人为排放看剩余气溶胶的时空分布是否合理。这个试验能快速暴露边界条件污染和模式内部数值泄漏的问题。整套流程走下来你对方案差异的信心会大很多。6. 气溶胶模拟最容易翻车的六个细节6.1 初始与边界气溶胶剖面根本没读进去这是最常见也最隐蔽的问题。namelist里开了aer_bc1但输入文件里缺少对应变量或者变量名不匹配模式不会报错只会在log里写一句“not found”然后直接跳过。最后你看到的wrfout依然有气溶胶浓度因为模式内部还在通过排放源源不断产生但整体浓度背景偏低。排查办法很简单看rsl.error.0000里的提示信息搜索“aerosol”或变量名。更直接的办法是画模拟第一小时的近地面气溶胶浓度分布如果区域边界有明显的一条低值带或跳跃带大概率就是边界场没读进去。6.2 化学机制与气溶胶机制不匹配选了MADE/VBS但气相机制里VOC拆分很粗SOA计算就会变成无源之水选了GOCART却期望它输出完整的有机气溶胶老化信息这也不现实。机制不匹配不会导致模式崩溃只会让结果在科学上站不住脚。选配置之前先把版本配套关系查清楚最好直接看该版本官方文档里列出的有效组合。我见过一组试验chem_opt和em_opt其实来自不同分支的组合结果硫酸盐和硝酸盐浓度同时异常偏高折腾了一个月才排查出根源。6.3 积分步长与分裂步长设得太“激进”气溶胶过程的时间尺度差异很大气相化学里有些反应的特征时间只有几秒到几分钟而气溶胶传输却慢得多。实际运行时模式会把化学和气溶胶过程分裂成多个子时间步。步长设得太大化学源项更新跟不上物理过程容易出现数值振荡步长太小计算开销又成倍上涨。如果你发现wrfout里某个气溶胶物种浓度在相邻输出时刻之间出现剧烈抖动先检查一下模式运行log里有没有“cfl”或者“negative concentration”的警告再考虑把化学子步长调小。稳妥起见重污染时段和清洁时段可以分开测试步长的敏感性。6.4 排放清单物种映射表未按方案更新更换气溶胶方案后排放清单必须重新处理。很多人跑GOCART时积累了一套清单脚本后来换MADE/VBS时只改了namelist没重跑prep_chem_sources结果物种映射还是老的。这时模式里VBS需要的芳香烃、烷烃等前体物排放全是0SOA自然低到离谱。规则很简单换方案就要重跑排放清单处理流程并且对处理后文件里的物种列表做一次人工核对。特别是修改过区域范围或网格分辨率后更要对排放总量做一次区域求和确认没有发生数量级丢失。6.5 改变分辨率后未重做粗细粒子平衡把模拟区域从27公里加密到3公里后气溶胶的粒径分布要重新面对“网格尺度的源汇”问题。高分辨率下局地强排放源的稀释和扩散特征与粗网格完全不同如果直接沿用粗网格方案跑出的粒径初始参数容易出现局地浓度梯度异常。应对办法是在中心嵌套启用前先做一段较长的spin-up让粒子粒径分布随气象场重新调整同时在初始场里提供与目标分辨率匹配的气溶胶模态参数。很多案例里后处理发现的内核区“糖葫芦状”高值点往往就是初始粒径没平衡的结果。6.6 后处理的粒径截断和单位换算最后这个坑在出图时出现得最多。模式里PM2.5和质量浓度变量的单位在netCDF里一般是微克每立方米但某些派生变量可能是摩尔分数直接画图会被当成浓度画出来。还有人把PM10当PM2.5输出图例写错了也没发现。我会在每次后处理脚本开头强制设一道“单位校验”把目标变量的单位属性打印出来人工看一眼再把区域平均值跟附近观测点做一次粗数量级比对偏差超过10倍就先别画图。省得辛苦跑完的试验最后在成图上翻车。最后关于“对比”这件事跑方案对比这几年我的体会是气溶胶模拟方案没有绝对的好坏只有适不适合当前科学问题。GOCART便宜可靠MADE/SORGAM适合常规组分分析MADE/VBS能回答更深入的SOA问题MAM系列则是气溶胶-云研究的通行券。不要迷信更复杂的方案更不要因为一篇文献用了某方案就盲目跟随。还有一个小建议正式投入大规模模拟前用同一组输入跑一个24小时快速试验把不同方案的输出画在同一套色标下做目视对比再决定最终配置。这个习惯帮我避开了好几次大规模试错。之后的调试中每次改动记录在案回头排查问题时能省非常多时间。