聊WRF-Chem,气溶胶模拟方案是一个绕不开的话题,也是很多新手在最开始容易卡壳的地方。做第七期的时候,我回忆了一下自己踩坑的经历,决定把GOCART、MADE/SORGAM、MOSAIC这三套气溶胶方案的核心逻辑、选型思路和实操配置摊开来聊一聊。这篇文章不打算告诉你哪个方案最好——因为最优解永远取决于你的场景——而是把三套方案的设计逻辑、适用边界、计算代价和常见坑都过一遍,让准备跑气溶胶模拟的人心里有个谱。
如果你是第一次接触WRF-Chem,可以把它理解为把气象模式(WRF)和大气化学模式在线耦合在一起,让气象和污染物在每一步都互相反馈。气溶胶作为其中研究最热门的对象,直接影响辐射、云和降水,也决定灰霾、沙尘、空气质量事件的模拟能力。三套主流气溶胶方案——GOCART、MADE/SORGAM、MOSAIC——分别对应着不同精细程度和计算投入,理解它们怎么选、怎么配、怎么调,是做出高质量气溶胶模拟的第一道门槛。
1. 三套主流气溶胶模拟方案:GOCART、MADE/SORGAM与MOSAIC的逻辑拆解
1.1 先搞清楚一件事:气溶胶方案到底在管什么
气溶胶模拟方案不是单纯的"化学机制",它管的是颗粒物的整个生命周期,从排放、成核、凝结、碰并、化学转化,到干沉降、湿清除,再到与云和辐射的相互作用。你选什么方案,本质上是在回答一个问题:你希望模型用多细的粒度去描述颗粒物的粒径分布和化学组成。
这个粒度差异,决定了你能拿到什么输出变量,也决定了你的模拟结果能支撑什么样科学结论。很多人把chem_opt当成一个简单的数字填进namelist,结果模型跑完发现拿不到自己想要的变量,回过头来查文档才发现是方案选错了,这是最常见的返工原因之一。
1.2 GOCART:够用就好,但别期望太多
GOCART最早是从全球气溶胶模型迁移过来的,基因里带着"快速评估"的底色。它采用 bulk 方法,对每种气溶胶组分直接模拟质量浓度,不对粒径谱做完整解析。它真的完全不涉及粒径吗?也不是。沙尘和海盐因为沉降和辐射效应太依赖粒径了,GOCART内部给这两类单独分了5档和4档,但硫酸盐、黑碳、有机碳这些组分就是单一质量浓度。
GOCART最大的优势,我用一个词概括:皮实。它的控制方程相对简单,数值稳定性非常好,不太容易出现负浓度或者NaN崩溃。我跑过一个业务预报项目,360x360网格、36km分辨率、40层,用CBMZ-GOCART跑10天模拟,计算速度比MOSAIC 8档快五六倍不止。在需要长模拟时长、快出结果或者计算资源紧张的项目里,这个优势是碾压级的。
代价同样明显。GOCART不处理二次有机气溶胶(SOA),对硝酸盐的处理也很弱。只靠GOCART,你算出来的PM2.5在灰霾事件里大概率系统性偏低,因为有机气溶胶那一大块没有可靠来源。而且没有模态信息,气溶胶数浓度、吸湿增长、云凝结核活化这些全靠经验参数,想从GOCART的结果里挖气溶胶-云相互作用的机理,基本是巧妇难为无米之炊。
1.3 MADE/SORGAM:模态方案带来了数浓度视角
MADE/SORGAM是另一套思路,它来自欧洲的MADE模型(Modal Aerosol Dynamics Model for Europe),核心假设是气溶胶粒径分布可以用有限个对数正态模态来表征。经典配置是三个模态:爱根核模态、积聚模态、粗模态。每个模态内有独立的数浓度和各组分质量浓度,模态内部假设内混,模态之间可以不同。
这个设计最直接的收益是:你拿得到数浓度了。有了数浓度,才能做云凝结核的估算、气溶胶-云相互作用的模拟、间接强迫效应相关的研究。这是在GOCART里完全做不到的。
SORGAM负责二次有机气溶胶那一块。它的逻辑基于吸收分配理论:VOC氧化产物是半挥发性有机物,会在气态和颗粒相之间按饱和浓度分配。SORGAM相对简单,没有复杂的氧化老化和寡聚反应,但在WRF-Chem的生态位里,它和MADE的配合已经经过大量验证,稳定性好,可解释性强。如果你的研究关注灰霾过程中二次组分的贡献演变,MADE/SORGAM是一个性价比很高的选择。
1.4 MOSAIC:精细化分档与无机热力学的天花板
MOSAIC是目前WRF-Chem里最重、也最精细的气溶胶方案。它有两种主流配置:4档和8档,档位把粒径范围(大致覆盖0.04到10微米)离散成若干个bin。每个bin有独立的化学组成,bin之间允许不同的老化程度和混合状态。最关键的一点是,MOSAIC集成了完整的无机气溶胶热力学平衡模块(ISORROPIA),能够计算气溶胶液态水含量、pH值、硝酸铵和硫酸铵在气固两相间的分配。
这意味着什么?意味着你可以回答一些GOCART和MADE/SORGAM都无法回答的问题,比如颗粒物酸度对二次无机气溶胶生成的影响、液相反应对硫酸盐的贡献、不同组分的粒径分布怎么演化。这是做灰霾化学机理研究时最让人心动的地方。
代价也很直白:贵。8档MOSAIC的计算量大约是GOCART的5-10倍,内存占用也大得多。而且方案越精细,调试成本越高,排放数据、边界条件、云化学选项之间稍有配合问题,就容易出现异常结果。我个人的建议是:没有明确需要MOSAIC才能支撑科学问题的情况下,不要轻易上8档。
2. 气溶胶模拟方案怎么选?三个匹配维度决定性价比
2.1 按研究目标选:你要回答什么问题,方案就该给到什么程度
方案选型第一条,先问自己研究目标的颗粒度需求。做长期气候效应评估,你需要的是气溶胶的总负载、辐射强迫的合理量级,GOCART完全够格。跑业务化空气质量预报,GOCART的稳定和快速是最大优势,虽然有机气溶胶有一定失真,但在业务场景里"稳定产出+趋势可信"远比"机理完备"重要。
反过来,如果你的课题是冬季灰霾过程中二次气溶胶的爆发增长机制,GOCART连硝酸铵都算不清楚,方案直接就不匹配。这类研究至少需要MADE/SORGAM,把二次无机组分的分配过程和SOA的生成过程纳进来。要是再进一步,想讨论颗粒物pH对液相反应的影响、酸碱缓冲能力之类的问题,那就得MOSAIC出马,只有它具备完整无机热力学平衡输出。
2.2 按计算资源选:8档MOSAIC可能让你的集群罢工
计算资源这个维度经常被低估,尤其是在快出成果的deadline压力下。方案越精细,计算量增长不是线性的。MOSAIC 8档加上水相化学,跑一周模拟可能要三五天;GOCART可能一个晚上就出结果。如果你在共享集群上跑,占用的核心数和内存还有配额限制,8档MOSAIC的日均核时消耗可能直接把你的排队优先级拖垮。
遇到这种情况,我有两条降档经验:一是从MOSAIC 8档降到4档,很多机理研究其实4档已经够用,计算量能省一半以上;二是如果确实只有GOCART的资源预算,但有研究二次无机气溶胶的需求,可以折中在GOCART基础上配合更细的排放清单,至少把人为源空间分布抓准。方案降档带来的不确定性,可以通过多组敏感性实验来弥补,这比死磕某一个高配方案要务实得多。
2.3 按数据基础选:排放清单和边界条件能不能喂饱模型
第三个匹配维度是数据基础。你一定要想清楚一个问题:方案越精细,对输入数据的质量要求越高。MOSAIC 8档需要非常详细的人为源排放清单,尤其是物种分配和粒径谱分布信息。如果你的排放清单是粗颗粒度的,比如只有总PM2.5总量,没有组分拆分,那MOSAIC的精细化学过程其实是在"拿粗粮做细活",结果反而可能更差。
边界条件同理。MOSAIC和MADE/SORGAM对初始场和边界场里的气溶胶组分要求很高,如果边界条件里没有对应组分的合理分布,模型跑起来再精细也很难把浓度场拉回合理区间。我之前踩过一个小坑:用一套很粗的全球场做边界,GOCART跑出来的PM2.5还算正常,但切到MOSAIC 4档后整个区域浓度系统性偏低,后来发现是边界条件里的硝酸盐组分缺失导致的。方案升级前,先检查数据基础跟不跟得上,这个顺序不能反。
为了更直观,我把常见的选型场景做成一个参考表,方便查:
| 研究目标场景 | 推荐方案组合 | 核心理由 |
|---|---|---|
| 长期气候效应、辐射强迫 | CBMZ-GOCART | 计算量低,能给出基本气溶胶负载与辐射效应 |
| 业务化空气质量预报 | CBMZ-GOCART | 快速稳定,PM2.5趋势可信 |
| 灰霾过程机理与二次组分演变 | RADM2/CBMZ-MADE/SORGAM | 模态信息+SOA分配,兼顾性价比 |
| 气溶胶-云相互作用、间接效应 | MADE/SORGAM | 提供数浓度,可耦合云微物理 |
| 颗粒物pH、液相反应、酸碱平衡 | CBMZ-MOSAIC (4或8档) | 无机热力学平衡,能输出pH和水含量 |
| 沙尘暴事件模拟 | CBMZ-GOCART(打开沙尘模块) | GOCART本身就有沙尘分档,够用 |
2.4 化学机制与气溶胶方案的搭配:不是随心所欲的组合
这里要特别提一嘴化学机制的搭配问题。WRF-Chem里,气溶胶方案通常不是独立选项,而是通过chem_opt这个总开关和特定的气相化学机制绑定在一起的。比如MOSAIC几乎都是配CBMZ气相机制,MADE/SORGAM可以配RADM2,也可以配CBMZ,GOCART则常和CBMZ搭配。别想着把MOSAIC和RADM2硬凑在一起——不是所有组合都能通过模式检查,硬关掉错误检查跑下去,物理上也是说不通的。
所以你选择不只是一个"气溶胶方案",而是一整套"气相化学+气溶胶方案"的组合。气相化学机制的种类决定了氧化剂场的计算精度,进而影响气溶胶的化学生成速率。CBMZ在臭氧和氮氧化物化学上表现不错,RADM2对酸沉降研究是经典配置。选组合的时候,要把气相机制和气溶胶过程当成一个耦合系统来考虑。
3. namelist.input配置实操:chem_opt与气溶胶方案的对应关系
3.1 先读懂chem_opt这个总开关
WRF-Chem的化学选项集中在namelist.input的&chem这样一个section里,最核心的开关就是chem_opt。不同数值对应不同的气相化学机制和气溶胶方案组合。以我日常使用的版本为例,常见的chem_opt值有:
&chem chem_opt = 1 ! CBMZ-MOSAIC 8bin ! chem_opt = 2 ! CBMZ-MOSAIC 4bin ! chem_opt = 3 ! CBMZ-MOSAIC 8bin with aqueous ! chem_opt = 4 ! CBMZ-MOSAIC 4bin with aqueous ! chem_opt = 7 ! CBMZ-GOCART ! chem_opt = 10 ! RADM2-MADE/SORGAM /这只是对应关系举例,不同WRF-Chem版本之间会有调整,最靠谱的方法是查你安装版本的WRF-Chem用户手册里的化学选项表,或者直接去chem/目录下看Registry文件里的chem_opt设置说明。这一点务必重视,版本升级之后旧namelist直接搬过来跑出完全不同的化学配置,我是见过翻车的。
选择chem_opt之后,还要配套设置其他化学和排放相关选项。一套比较完整的气溶胶模拟配置,大致长这样:
&chem chem_opt = 7 ! CBMZ-GOCART,快速评估 emiss_opt = 3 ! 人为排放数据 bioemiss_opt = 3 ! 生物源排放 dust_opt = 1 ! 沙尘排放方案 seas_opt = 1 ! 海盐排放方案 wetscav_opt = 1 ! 湿清除方案 cldchem_opt = 0 ! 云化学开关 phot_opt = 1 ! 光解频率计算 aer_drydep_opt = 1 ! 气溶胶干沉降 aer_srf_opt = 1 ! 气溶胶表面反应选项 /注意这里有个容易被新手忽略的点:如果你要用MOSAIC的云化学(aqueous chemistry),cldchem_opt不能还是0。气溶胶的液相氧化(比如云内硫酸盐生成)是MOSAIC方案里很重要的过程,但这个选项会显著增加计算量,要斟酌。
3.2 排放数据与气溶胶过程开关:少了哪一个都跑不对
气溶胶模拟能不能出靠谱结果,排放清单是生命线。WRF-Chem里人为排放数据一般通过PREP-CHEM-SRC或者anthro_emiss这类工具把原始排放清单(比如MEIC或者各个国家的清单)处理成WRF-Chem能读的格式。关键是排放变量的组分和化学机制要匹配:CBMZ机制需要匹配对应的物种映射,如果映射表写错,硫氧化物或者氮氧化物进不了化学机制,后续一切都白搭。
生物源排放开关bioemiss_opt也要注意,如果模拟夏季区域高臭氧污染,生物源VOC的排放对SOA生成影响很大,MADE/SORGAM的SORGAM部分要是没有生物源VOC输入,SOA浓度会显著偏低。沙尘和海盐开关的配置则取决于模拟区域。
通常我建议在跑正式实验之前,做一次只打开物理过程、不打开化学过程的对照测试,先把met场和排放文件的格式错误排查干净。排排放文件的坑比排化学方案的坑要简单得多。
3.3 初始场与边界场:wrfchembc和全球化学模型数据的使用要点
很多跑WRF-Chem的新手都在初始和边界条件上栽过跟头。WRF的气象初始场和边界场来自再分析资料没问题,但化学模块的初始场和边界场要靠全球化学模式输出,常见的有MOZART-4或CAM-chem数据。WRF-Chem自带wrfchembc工具,用来把全球化学模式的输出变量垂直插值和重映射到WRF的网格上,生成化学初始和边界文件。
我遇到的高频问题有三个。一是时间覆盖不完整,全球化学数据只有某几天,而模拟时段横跨更长时间,跑到后半程边界条件缺失直接报错中断。解决方法是事先仔细核对数据时间范围,适当留出余量。二是垂直层数不匹配,wrfchembc需要知道你WRF的eta层设置,转换时如果参数给错,低层气溶胶浓度会被拉伸变形。三是组分映射缺失,这一点在切换气溶胶方案时尤其常见,比如用MOSAIC时发现生成的边界文件里没有硝酸盐组分。
一个务实的小经验:拿到新生成的边界文件后,第一时间用ncdump或者Python的xarray工具箱检查关键变量是否存在、数值是否在合理量级。这一步能帮你省掉多少盲目debug的时间,跑过的人都知道。
4. WRF-Chem气溶胶模拟踩坑实录:几个高频问题的排查思路
4.1 输出变量里没有气溶胶?先自查三个地方
气溶胶模拟跑完后,打开wrfout文件发现只有常规气象变量和少数几个气体浓度变量,完全找不到pm2_5、sulf、bc1这些气溶胶变量。遇到这种情况,我建议按顺序排查三处。
第一处,namelist的chem_opt有没有真的生效。有时候主namelist写对了,但在嵌套网格或者某个特定时段的配置里被覆盖了,检查所有域和时段的设置一致性。第二处,Registry里气溶胶变量的输出开关。WRF-Chem的部分变量默认不输出,需要确认Registry中对应变量的io字段是否配置正确。第三处,也是最容易被忽略的,就是是不是用了后处理脚本过滤变量时把气溶胶变量漏掉了,我曾经在一个自动化处理链里犯过这个错,排查了模式输出发现没问题,最后定位到是Python脚本的正则匹配漏写了以aer开头的字段。
4.2 跑着跑着出现NaN或者负浓度:数值稳定性问题清单
NaN和负浓度是气溶胶模拟的经典噩梦。我的排查经验可以浓缩成一个清单:先看是不是时间步长太大。化学过程的源汇项在局地排放强区会产生很大的浓度梯度,时间步长过大时数值振荡就会产生负值。把时间步长减小到气象配置对应CFL条件内的较低值,往往能解决大半问题。
再检查排放源有没有异常尖峰。排放文件单位错误某几小时出现极端排放量,局部浓度忽然爆表,瞬时的强梯度会击穿数值稳定性。处理办法是检查排放文件里浓度的极值是否合理,可以在读入排放时对每个时次做最大值判断。
最后看化学选项匹配问题。我之前试过一次将气相化学机制的机理参数文件替换成不兼容版本,导致硫酸盐生成项在特定条件下出现负源项,跑了十几个小时才崩溃。这种问题定位最费时间,建议在更换任何化学机理参数文件之前,做好同版本对照实验。
4.3 模拟的PM2.5浓度系统性偏低或偏高:从源头找偏差
模拟浓度和观测对比总是系统性偏低,我遇到的最常见原因是spin-up时间不足。化学场的初始条件很快被气象场的平流冲淡,如果边界条件给得又不够强,前12到24小时的模拟结果基本是过渡态。解决方案是预留充分的前置模拟时间,或者在分析时把前期数据舍去。
另一个原因是排放清单的基础年份。清单年份和模拟年份相差太远,经济和产业结构变化导致排放量与实际不符,这种系统性偏差在PM2.5上特别明显。用MEIC清单的时候,我通常会在对比前先查清楚清单描述的是哪一年的排放水平,再决定要不要做年际尺度上的比例修正。
如果模拟值系统性偏高,我一般会先怀疑湿清除设置。wetscav_opt的选项差异对颗粒物沉降效率影响非常大,尤其在有持续降水的时段。排查时可以做一个开关的敏感性测试,看浓度场的响应幅度是否匹配你的物理预期。
4.4 计算量爆炸:一套亲测有效的降档优化清单
为了完整性,我整理了一份降档优化操作清单,按性价比从高到低排序:
| 优化动作 | 预期收益 | 风险或代价 |
|---|---|---|
| MOSAIC 8档降为4档 | 计算量减少50%以上 | 粒径分辨率下降,粗模态信息受影响 |
| 关闭云化学(cldchem_opt=0) | 化学过程计算量明显下降 | 液相硫酸盐生成路径被忽略 |
| MOSAIC换成MADE/SORGAM | 计算量减少约60%-70% | 失去完整无机热力学平衡和pH输出 |
| 降低输出频率 | 磁盘IO压力大幅降低 | 对瞬变过程分析不完整 |
| 减少嵌套域天数 | 直接缩短墙钟时间 | 模拟连续性受损,需评估是否影响结论 |
| 调整平流方案为正定格式 | 消除负浓度震荡 | 计算量略有上升,但稳定性显著提高 |
这个清单我每次遇到"跑不完"的项目都会翻出来对照,普遍情况下,先降输出频率、再降档气溶胶方案,就能在尽量不影响核心结论的前提下保住进度。
4.5 切换方案后原有结果全变了:这是正常的
还有一类问题不算bug,但经常被用户当成bug来问,就是切换气溶胶方案之后,PM2.5绝对值、组分占比甚至空间分布形态都发生了显著变化。我要强调的是,这说明你的模拟对方案是敏感的,也说明不同方案之间确实存在系统性差异。这种差异不是错误,而是你必须纳入结论解释的"不确定性来源"。
实际操作中,如果一份研究要提交给对可靠性要求很高的用户,我建议至少跑两套对照方案,一套快速方案(比如GOCART)提供整体框架,一套精细方案(MOSAIC 4档)提供机理细节,两份结果之间的偏差范围就是你的模拟不确定性。很多时候,这种对比本身就是一个有价值的研究结论。
从最开始用GOCART做业务预报,到后来为了灰霾机理切到MADE/SORGAM,再到为了颗粒物pH问题升级到MOSAIC,每一次切换的阵痛我都经历过。跑了一周的新方案,画出第一张图发现和旧方案风格迥异,心里多少会打鼓。但回头来看,正是这种逐级升级让我对每套方案的脾气都有了体感,也让我明白了一个道理:模型方案永远服务于科学问题。选方案之前先想清楚你想回答什么,比纠结哪个方案更高级重要得多。如果你现在正在为选哪个气溶胶模拟方案纠结,不妨先把GOCART跑通、跑完、画出第一张浓度图,再根据研究目标的颗粒度需求逐步升级。链路通了,后面的一切都好说。