如果你刚开始接触大气污染数值模式最容易被一堆缩写砸晕WRF、WRF-Chem、SMOKE、CAMx、CMAQ、WPS、排放清单、化学机理……每个词单独看都认识凑在一起就像天书。我当年入坑的时候光搞清楚这些模式之间的关系就花了两周更别提后面还有装环境、编译、跑通流程这些坎。这篇东西就是写给零基础朋友的用我能想到的最直白的语言把这套大气污染模式体系的来龙去脉、安装步骤、实操细节和常见坑全部捋一遍。目标是让一个完全没碰过模式的人能照着这篇文章一步步把WRF-Chem或者CAMx跑起来知道每一步在干什么、为什么这么干、出了问题去哪里查。这套东西能解决的问题很实在模拟污染物浓度时空分布、分析重污染过程的成因、评估减排方案的效果、做空气质量预报。搞环境管理、做科研、写毕业论文、进环保公司做咨询的人都会用到。内容量很大我尽量按“先建骨架、再填细节”的方式来写你看完哪怕暂时不动手脑子里的地图也会清晰很多。1. 先搞明白这几个模式到底在干什么1.1 一张关系图看懂模式分工靠文字描述理清先说结论WRF是气象模式只算温度、风、湿度、气压这些大气物理量WRF-Chem是在WRF的框架里加了化学模块让气象场和污染物浓度能在线耦合着算CAMx是一个独立的三维空气质量模式它自己不算气象而是把WRF算好的气象场拿过来用专业术语叫“离线耦合”SMOKE是一个排放清单处理工具不管你用WRF-Chem还是CAMx都得先把原始排放数据变成模式能读的格式SMOKE干的就是这个活。这四者的关系可以这么理解WRF-Chem是“气象化学全家桶”一次编译全搞定但排放处理比较粗放CAMx是“只算污染的专用计算器”气象场由WRF喂给它排放处理用SMOKE三条线配合起来各管一段。科研圈里两条路线都有人用大气化学机理研究多用WRF-Chem法规类的空气质量评估、减排情景分析则更常见CAMx/CMAQ。1.2 零基础从哪里开始学我的建议非常朴素先别碰WRF-Chem先把纯气象版WRF跑通。理由很简单WRF-Chem等于在WRF基础上增改了很多代码排放部分还牵扯化学机理如果连WRF都跑不顺叠加了化学模块之后报错你根本分不清是气象的问题还是化学的问题。当年我跳过这步直接在WRF-Chem上折腾一个星期都在跟各种段错误搏斗最后老老实实回去跑WRF案例两三天就把整个流程顺下来了。学习路径大概是Linux基础命令 → WRF模式原理与文件结构 → WPS前处理geogrid/ungrib/metgrid→ WRF核心运行 → 气象场结果可视化 → 再进WRF-Chem或CAMx路线。每一步都需要动手敲命令光看不练是不行的。1.3 版本选择也是个讲究事WRF目前主流版本是4.x常见的有4.3、4.4、4.5、4.6不同版本对编译器、依赖库版本的要求有细微差别。经验是如果是新手选一个和身边人一致的版本或者按官方Release Notes里“经过测试的组合”去选。别盲目追新也别用太老的版本。4.6出来之后我跑过一阵子稳定性好很多但有些老脚本参数名变了得改。这里没有绝对标准关键是“版本之间保持兼容”——编译器、MPI、NetCDF、HDF5这些库的版本要和WRF要求的对得上。2. 环境准备把Linux环境配到“能跑模式”的状态2.1 为什么必须用LinuxWindows没法省事WRF全家桶原生支持Linux/Unix虽然Windows下用Cygwin或者WSL也能折腾但性能和兼容性问题非常多尤其涉及MPI并行、NetCDF库时Windows下各种路径问题能把人逼疯。直接上Ubuntu 18.04/20.04/22.04都是网络上验证过的版本装个双系统或者用服务器都行。我自己最推荐的是Ubuntu 20.04资料多、遇到报错到处能搜到答案。新手装环境务必学会一个习惯全程用普通用户操作不要用root。很多人在root下编译没问题一换普通用户就各种权限报错。另外模式运算需要大量磁盘空间气象数据输出文件动不动几十个G装之前看清楚磁盘配额。2.2 编译器、MPI、NetCDF等依赖库选型WRF编译需要几个核心武器Fortran/C编译器gfortran/gcc、MPI并行库mpich或openmpi、NetCDF处理气象数据的核心I/O库、HDF5NetCDF4的底层依赖、还有zlib、libpng、jasper用于处理GRIB格式数据。新手期最容易翻车的就是库之间的版本兼容。我的建议是整套环境自己手动编译安装不要一股脑用apt装。用apt装NetCDF虽然快但版本和路径经常跟WRF编译器配置对不上后面报错会让你怀疑人生。我踩过的坑就是apt装的netcdfWRF编译时提示版本过旧最后全部重来。手动编译虽然麻烦一点但每一步都在自己掌控之下出了问题也知道该查哪里。注意NetCDF的安装路径要记好后面配置环境变量时要用。很多新手unset掉环境变量后重新打开终端发现编译好的WRF又挂了就是因为没写进~/.bashrc。2.3 WPS下载与编译完整实录wrf前处理wps下载的关键细节WPS是WRF前处理系统的总称包含三个工具geogrid定义模拟区域和地形数据、ungrib把气象再分析资料转成中间格式、metgrid将气象数据水平插值到模拟网格上。很多新手问“wrf前处理wps下载”其实就是从WRF官网下载WPS源码包版本要和WRF匹配。比如WRF 4.5对应WPS 4.5不要混搭。下载解压后需要进行环境变量配置我习惯在~/.bashrc里加上这样一段路径以你的实际安装目录为准export DIR/home/yourname/models export PATH$DIR/netcdf/bin:$PATH export NETCDF$DIR/netcdf export JASPERLIB$DIR/grib2/lib export JASPERINC$DIR/grib2/include export WRF_DIR/home/yourname/models/WRF-4.5 export PATH$DIR/mpich/bin:$PATH配完执行source ~/.bashrc然后进入WPS目录运行./configure界面会出现一串选项。对新手选Linux gfortran serial也就是不带并行如果是练习跑通流程serial就够了要跑真实案例就选dmpar。然后./compile等待输出一堆exe。编译完成后用ls -l检查是否有geogrid.exe、ungrib.exe、metgrid.exe三个可执行文件缺哪个说明编译有问题。这里有一条经验WPS编译报错八成是环境变量没设对尤其是JASPERLIB和JASPERINC如果路径和实际安装位置不一致ungrib.exe就编不出来。很多新手卡在“WPS编译报错libjasper.a找不到”就是这个原因。3. WRF核心从WPS前处理到wrf.exe跑通全流程3.1 WPS的三大步骤分别干什么WPS全称WRF Preprocessing System一共三步每步对应一个可执行文件geogrid.exe定义模拟区域生成geo_em.d01.nc文件。它读的是地形、土地利用、土壤类型等静态地理数据这些数据在WPS自带的geogrid文件夹里部分有部分要单独下载新版WPS要求下载完整的geog_complete.tar.gz解压到一个大硬盘目录然后在namelist.wps里指定geog_data_path路径这个坑很常见——如果你geogrid报错找不到geo_data多半是路径没写对。ungrib.exe把GRIB格式的气象再分析资料FNL、GDAS、ERA5等解压并转换成中间格式。使用之前要先链接Vtable比如./link_grib.csh /path/to/fnl_xxx然后ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable不同气象数据源对应不同Vtable选错了后面metgrid就会报错。metgrid.exe将ungrib处理出的中间气象场水平插值到geogrid定义的网格点上输出met_em.d01.*.nc文件。这步完成后前处理就结束了接下来进入WRF主体。3.2 namelist.wps关键参数怎么填namelist.wps是整个前处理的控制中心核心内容是两个时间设置和区域设置share wrf_core ARW, max_dom 1, start_date 2021-01-01_00:00:00, end_date 2021-01-03_00:00:00, interval_seconds 21600, / geogrid parent_grid_ratio 1, i_parent_start 1, j_parent_start 1, e_we 120, e_sn 120, geog_data_res default, dx 27000, dy 27000, map_proj lambert, ref_lat 34.0, ref_lon 108.0, stand_lon 108.0, geog_data_path /home/yourname/WPS_GEOG, / ungrib out_format WPS, prefix FNL, /区域大小e_we、e_sn和格距dx、dy是核心。新手学跑通流程dx27000就是27km的粗网格区域范围国内大约相当于覆盖一个大省跑3天模拟也就几十GB。核心经验是dx增大一倍计算量减小四倍面积比例跑测试别一上来就设1km的精细网格慢慢来。3.3 wrf.exe运行与输出检查前处理生成met_em文件后进入WRF目录先链接气象输入ln -sf /home/yourname/WPS/met_em.* .然后修改namelist.input。这个文件和namelist.wps的日期、区域要完全一致否则会报错。关键参数包括time_control start_year 2021, start_month 01, start_day 01, start_hour 00, end_year 2021, end_month 01, end_day 03, end_hour 00, interval_seconds 21600, / domains e_we 120, e_sn 120, dx 27000, dy 27000, / physics ra_lw_physics 1, ra_sw_physics 1, sf_sfclay_physics 1, sf_surface_physics 2, bl_pbl_physics 1, cu_physics 3, /选定后运行./compile em_real编译出wrf.exe、real.exe。然后先运行real.exe生成wrfinput_d01和wrfbdy_d01再运行mpirun -np 4 ./wrf.exe执行主程序。跑完后用ncdump或者Python的xarray打开wrfout_d01_2021-01-01_00:00:00文件看看变量有没有数据画个温度场、风场就知道模式跑没跑对了。4. WRF-Chem让气象模式“会算污染”4.1 从WRF到WRF-Chem需要多做什么WRF-Chem不是单独下载的另一个包而是用WRF源码里的chem子目录编译出来的一个选项。在configure阶段选择带有CHEM的选项比如Linux x86_64, gfortran, dmpar, ARW, Chem。编译命令依然是./compile em_real但系统会连带编译chem模块下的代码。装WRF-Chem前强烈建议你再用WRF-Chem官网提供的一个练习案例比如RADM2/MADE-SORGAM那个测试算例跑一遍确保化学模块本身没问题再做自己的真实案例。额外需要准备的东西是化学机理文件、光解数据、排放清单。化学机理一般在WRF-Chem源码里带了一部分光解数据需要单独下载如photolysis data排放清单就更复杂见下文。4.2 排放清单接入方式这是WRF-Chem新手最容易崩溃的环节。WRF-Chem读取排放有两种方式一种是直接把排放源数据写在wrfinput里prep_chem_sources工具干的事另一种是跑在线排放模型。常见工具是prep_chem_sources它读原始排放清单MEIC、EDGAR、MIX等生成wrfchemi_d01_YYYY-MM-DD_HH.nc文件。国内做空气质量模拟MEIC清单用得很广泛结合自己的网格设置做空间分配和时间分配。关键步骤是先把MEIC的经纬度网格数据重映射到你的WRF网格上来这通常需要用到Python的xesmf或者cdo工具然后再跑prep_chem_sources。新手别想一步到位先下载业务部门公开的现成处理脚本搞清楚每个参数含义再改。4.3 SMOKE在WRF-Chem路线里的定位实际上原生的WRF-Chem不强制用SMOKESMOKE更多用于CMAQ/CAMx这条线。但如果你手里的排放清单是SMOKE处理过的很多环境规划项目都有也可以把它的输出转成WRF-Chem格式。这里核心是理解格式差异SMOKE输出的nc文件时间维度是hourly化学成分按CB05或SAPRC机理命名跟WRF-Chem的RADM2/MADE-SORGAM命名不一样需要写映射脚本转换。除非你在做非常规范的大规模研究否则新手别一上来就整SMOKEWRF-Chem的串联工作量很大。建议第一步直接用prep_chem_sources吃MEIC数据跑通之后再考虑SMOKE的精细处理。5. CAMx与SMOKE另一条主流路线怎么入门5.1 CAMx是什么和WRF-Chem有什么不同CAMxComprehensive Air quality Model with eXtensions是由Ramboll公司开发的三维欧拉空气质量模式目前版本到7.x/8.x。它与WRF-Chem的核心区别CAMx不参与气象计算气象场完全依赖WRF输出离线耦合好处是气象场可以反复使用、调试方便坏处是没办法考虑气溶胶辐射反馈这些气象-污染双向作用。CAMx的化学机理选项丰富支持CB6、SAPRC07、SAPRC11等对付臭氧和二次气溶胶问题很顺手。CAMx有臭氧源解析工具OSAT、颗粒物源解析工具PSAT这是它的杀手锏做污染物来源追踪非常方便。很多环保规划项目用CAMx做PM2.5来源解析、减排情景评估因为这个模式的历史资料多、工具链完整、后处理生态成熟。5.2 CAMx跑通需要哪几类输入CAMx的运行需要四大类输入wrfout气象场先用WRF跑出wrfout文件再用CAMx自带的工具wrf2camx转换成CAMx格式。排放清单SMOKE处理后输出camx格式的排放文件或者用工具把MEIC直接转换。初始条件和边界条件可以用CAMx自带的profile文件也可以用全球模式如GEOS-Chem、MOZART的模拟结果来提供侧边界。光解速率用CAMx的TUV模块计算或者用在线方案直接调用。新手跑CAMx最重要的是把CAMx的control文件搞清楚。这个文件类似namelist指定了各种输入文件路径、起止时间、输出频次、化学机理名称等。每一样都要和你的输入文件一一对应报错通常也是从这里开始。5.3 SMOKE处理排放的核心流程SMOKESparse Matrix Operator Kernel Emissions是一个很庞大的工具套件核心逻辑是“把原始排放清单磨成模式能用的shape”。流程大致为清单数据标准化 → 时空分配把年排放量分配到月/时把行政区划排放量分配到网格→ 物种映射把清单里的污染物种类映射成模式机理的物种→ 点源处理处理烟囱高度、烟气流量等参数→ 输出netCDF格式排放文件。SMOKE的编译非常考验耐心它需要许多Perl模块和库的支持官方文档也不太好读。我是建议新手先别自己从零编译SMOKE可以基于项目已有的处理成果来学或者先用WRF-Chem线上排放模块顶上等基本概念都熟了再回头啃SMOKE。6. 常见问题与排查技巧实录6.1 编译阶段最容易翻车的三个地方NetCDF路径不对configure阶段提示找不到netcdf十有八九是NETCDF环境变量没导出。检查echo $NETCDF是否有值。Fortran编译器版本不匹配gfortran太新或太旧都容易出问题尤其是gfortran 10以上的版本经常在WRF 4.3以下版本编译时报错要么换旧版WRF要么加编译参数。内存爆掉编译WRF-Chem时非常占内存如果服务器只有2G内存make -j4必挂用make -j1甚至直接make慢慢编。6.2 运行阶段典型报错速查表报错现象可能原因解决办法real.exe运行后没生成wrfinputnamelist.wps和namelist.input的起止时间/区域设置不一致逐项对比两个文件的时间、e_we、e_sn、dx、dywrf.exe运行瞬间退出rsl.error.0000报错met_em文件缺失或链接错误物理方案选错输入数据不完整确认met_em文件存在且日期匹配CFL崩溃cfl错气象场出现极端值多为地形或嵌套边界处理不当检查地形数据、降低时间步长、检查嵌套区域设置化学浓度全是0或者NaN排放清单没读进去检查wrfchemi文件命名检查化学机理开关看rsl.out里的化学模块初始化日志6.3 排放数据相关的坑MEIC清单下载后往往是二维栅格如0.25度必须先做重映射再插值到模式网格。这里常见的坑是经纬度方向搞反导致整个浓度场偏移我碰到过很多次解决办法是画一张先验对比图把排放源的位置和城市分布叠在一张图上人工检查。另一个坑是时间维度MEIC给的是月排放量你要先按照小时系数分配到小时WRF-Chem的小时排放文件每小时一个记录24小时一个周期循环如果没处理好模拟出来会看出很奇怪的日变化。6.4 给零基础朋友的一条规划建议你最需要的是“先跑通一个简单案例再逐步加深”。别贪多别一开始就追求“高精度嵌套”“完整排放清单”“气溶胶反馈”这些进阶玩法。先把WRF练习案例跑通再跑WRF-Chem自带的chem案例最后换自己的模拟区域和清单数据。整个过程心态要稳因为数值模式的编译和运行报错实在太多了排查一个问题可能要几天时间这是正常节奏。我当年有一次为了找模数据异常的原因连续两周晚上都在看rsl.error文件最后发现是namelist里时间步长太大导致CFL崩溃改小就过了。这类经验只有自己踩过才有感觉。如果后续要继续扩展建议掌握Python的可视化和数据处理技能尤其要用好xarray、matplotlib、cartopy这三个库做模式场和观测站点的对比验证几乎天天用得到。还可以把CMAQ、GEOS-Chem也了解起来它们和WRF-Chem、CAMx的原理相通学会了其中一个其他的都只是参数和接口的问题了。