1. 项目概述与环境准备
最近在帮一个做大气环境模拟的朋友搭建CMAQ5.2,连带WRF一起搞定。这活儿听起来就是个编译安装,但实际走一遍,你会发现它是个典型的“依赖地狱”项目,任何一个库的版本或者环境变量没设对,都可能让你卡上半天。网上能找到的教程不少,但要么年代久远,要么语焉不详,踩的坑多了,就想着把这次从头到尾的成功过程记录下来,给后来者铺条相对平坦的路。我们的目标是在一台干净的Ubuntu 22.04 LTS系统上,从零开始,成功编译并运行WRF(Weather Research and Forecasting Model)和CMAQ(Community Multiscale Air Quality modeling system)5.2版本。整个过程涉及大量科学计算库的编译和环境配置,需要耐心和细致的操作。
首先明确一下核心组件和工具链。WRF是气象驱动模型,为CMAQ提供气象场输入;CMAQ则是核心的大气化学传输模型。它们共同依赖一套底层的高性能计算库,比如NetCDF(用于科学数据存储)、HDF5(NetCDF的底层依赖)、MPICH或OpenMPI(并行计算支持)等。我们的安装策略是:先搭建一个稳定、兼容的底层库环境,然后依次编译WRF和CMAQ。操作系统选择Ubuntu 22.04 LTS,主要是因为其软件包较新且社区支持好,但这也意味着我们需要手动编译一些特定版本的库,以避免系统自带包可能存在的版本冲突。
在开始之前,你需要准备一台拥有足够计算资源和存储空间的机器。建议至少配备8核CPU、16GB内存和100GB的可用磁盘空间。我们将全部在用户目录下进行编译安装,避免需要root权限,这样更安全也更清晰。接下来,我们就从最基础的系统环境配置开始。
1.1 系统基础配置与依赖安装
首先,更新系统并安装一些基础的开发工具和依赖包。打开终端,执行以下命令:
sudo apt update sudo apt upgrade -y sudo apt install -y gcc gfortran g++ make m4 csh tcsh git curl wget vim build-essential \ libcurl4-openssl-dev autoconf automake libtool \ zlib1g-dev libssl-dev libreadline-dev \ ncurses-dev flex bison cmake \ perl perl-modules libperl-dev \ zip unzip这里安装的包涵盖了编译器套件(gcc, gfortran, g++)、构建工具(make, m4, cmake, autoconf)、脚本环境(csh, tcsh,因为某些NCAR工具仍依赖它)、版本控制(git)以及一些常用库。build-essential是Ubuntu上编译软件的基础元包,务必安装。
接下来,我们需要为科学计算创建一个独立的环境目录。我习惯在$HOME下创建一个Build_WRF_CMAQ目录,所有源码、编译中间文件和安装路径都放在这里,便于管理。
mkdir -p $HOME/Build_WRF_CMAQ cd $HOME/Build_WRF_CMAQ export BASE_DIR=$PWD设置环境变量BASE_DIR指向当前目录,后续所有操作都将基于这个路径。现在,我们开始搭建最关键的底层库:MPI、NetCDF-C和NetCDF-Fortran。
1.2 并行环境与基础科学库安装
WRF和CMAQ都支持并行计算以提升效率,因此我们需要先安装MPI库。这里选择MPICH,因为它与WRF/CMAQ的兼容性经过广泛测试。
1.2.1 安装MPICH
前往MPICH官网下载稳定版本,这里以3.4.3为例:
cd $BASE_DIR wget https://www.mpich.org/static/downloads/3.4.3/mpich-3.4.3.tar.gz tar -xzvf mpich-3.4.3.tar.gz cd mpich-3.4.3配置编译选项。我们将其安装到$BASE_DIR/mpich目录下,并禁用Fortran 2008绑定(有时会引起不必要的麻烦):
./configure --prefix=$BASE_DIR/mpich --disable-fortran make -j$(nproc) make install编译完成后,将MPICH的二进制路径添加到环境变量中,并使其生效:
echo 'export PATH='$BASE_DIR'/mpich/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH='$BASE_DIR'/mpich/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc验证安装:which mpicc和which mpif90应该指向你刚安装的路径下的文件。执行mpiexec --version检查版本。
1.2.2 安装NetCDF-C和NetCDF-Fortran
NetCDF是WRF和CMAQ输入输出数据的标准格式,必须安装。注意,NetCDF-Fortran依赖于NetCDF-C,且对版本有严格要求。CMAQ5.2官方推荐使用NetCDF-C 4.7.4和对应的NetCDF-Fortran 4.5.3。我们将采用这套经过验证的组合。
首先安装NetCDF-C的依赖库:HDF5和zlib(系统已安装,但为确保一致性,我们编译特定版本)。先安装zlib:
cd $BASE_DIR wget https://zlib.net/zlib-1.2.13.tar.gz tar -xzvf zlib-1.2.13.tar.gz cd zlib-1.2.13 ./configure --prefix=$BASE_DIR/libs make -j$(nproc) make install接着安装HDF5。这里选择与NetCDF-C 4.7.4兼容的HDF5 1.12.0版本:
cd $BASE_DIR wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.12/hdf5-1.12.0/src/hdf5-1.12.0.tar.gz tar -xzvf hdf5-1.12.0.tar.gz cd hdf5-1.12.0配置HDF5,关键是要启用hl(high-level)库,并指定我们刚才安装的zlib路径:
./configure --prefix=$BASE_DIR/libs \ --with-zlib=$BASE_DIR/libs \ --enable-hl \ --enable-fortran \ --enable-parallel \ CC=$BASE_DIR/mpich/bin/mpicc FC=$BASE_DIR/mpich/bin/mpif90 make -j$(nproc) make install现在安装NetCDF-C 4.7.4。配置时需要指向我们编译的HDF5和zlib,并启用并行I/O(NetCDF-4特性)和DAP(远程数据访问)支持:
cd $BASE_DIR wget https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.7.4.tar.gz -O netcdf-c-4.7.4.tar.gz tar -xzvf netcdf-c-4.7.4.tar.gz cd netcdf-c-4.7.4 ./configure --prefix=$BASE_DIR/libs \ CPPFLAGS="-I$BASE_DIR/libs/include" \ LDFLAGS="-L$BASE_DIR/libs/lib" \ --enable-netcdf-4 \ --enable-dap \ --enable-parallel-tests \ CC=$BASE_DIR/mpich/bin/mpicc make -j$(nproc) make install最后安装NetCDF-Fortran 4.5.3。这是最易出错的一步,必须确保其找到正确版本的NetCDF-C库:
cd $BASE_DIR wget https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.5.3.tar.gz -O netcdf-fortran-4.5.3.tar.gz tar -xzvf netcdf-fortran-4.5.3.tar.gz cd netcdf-fortran-4.5.3配置时,CPPFLAGS和LDFLAGS必须明确指向包含netcdf.h和libnetcdf.a的路径。同时,指定MPI的Fortran编译器:
export CPPFLAGS="-I$BASE_DIR/libs/include" export LDFLAGS="-L$BASE_DIR/libs/lib" export LD_LIBRARY_PATH=$BASE_DIR/libs/lib:$LD_LIBRARY_PATH ./configure --prefix=$BASE_DIR/libs \ CC=$BASE_DIR/mpich/bin/mpicc \ FC=$BASE_DIR/mpich/bin/mpif90 \ F77=$BASE_DIR/mpich/bin/mpif77 \ --enable-parallel-tests make -j$(nproc) make install注意:编译NetCDF-Fortran时,如果遇到“nf-config”找不到或版本不对的错误,通常是因为系统路径中混入了其他版本的NetCDF。务必确保
$BASE_DIR/libs/bin在PATH环境变量中靠前的位置,并在编译前执行source ~/.bashrc。一个验证方法是运行$BASE_DIR/libs/bin/nf-config --version,应该输出4.5.3。
将所有这些库的路径永久添加到环境变量中:
echo 'export NETCDF=$BASE_DIR/libs' >> ~/.bashrc echo 'export PATH=$NETCDF/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH' >> ~/.bashrc echo 'export CPPFLAGS="-I$NETCDF/include $CPPFLAGS"' >> ~/.bashrc echo 'export LDFLAGS="-L$NETCDF/lib $LDFLAGS"' >> ~/.bashrc echo 'export FCFLAGS="$CPPFLAGS"' >> ~/.bashrc # Fortran编译器也需要 source ~/.bashrc至此,一个为WRF和CMAQ定制的、版本兼容的并行科学计算基础环境就搭建好了。接下来,我们将进入WRF模型的编译阶段。
2. WRF模型编译与配置
WRF模型是整个模拟系统的前端,负责生成高时空分辨率的气象场。它的编译过程相对标准化,但选项繁多,需要根据你的计算资源和研究目的进行选择。
2.1 获取WRF源码与依赖库
首先,从官方GitHub仓库获取WRF源码。我们选择稳定的V4.4版本(与CMAQ5.2兼容性好):
cd $BASE_DIR git clone https://github.com/wrf-model/WRF.git cd WRF git checkout release-v4.4WRF编译还需要一些额外的依赖库,主要是JASPER、LIBPNG和ZLIB(用于处理GRIB2格式的气象数据)。虽然我们之前装了zlib,但WRF的脚本期望在固定位置找到它们。最稳妥的方式是使用WRF自带的脚本来安装这些库。
进入WRF目录,运行脚本来下载和编译这些依赖:
./configure在出现的交互菜单中,选择34. (dmpar) GNU (gfortran/gcc) (分布式内存并行,即MPI)。这是最常用的配置,适用于多核CPU或集群。选择后,配置脚本会开始下载LIBPNG、JASPER和ZLIB的源码并自动编译。这个过程是自动的,通常很顺利。完成后,你会看到提示信息,并生成一个configure.wrf文件。
实操心得:运行
./configure时,务必确保网络通畅。如果下载失败,可以手动从WRF官网的“Required Libraries”页面下载对应版本的tar包,放在WRF目录下,再重新运行配置脚本。有时脚本下载的版本可能过时,手动指定已知可用的版本更可靠。
2.2 编译WRF核心
生成configure.wrf后,就可以开始编译了。WRF的编译分为两个主要部分:real程序(用于处理真实数据初始化)和wrf模型核心。我们使用-j选项进行并行编译以加快速度:
./compile -j $(nproc) em_real 2>&1 | tee compile.log这个命令会编译中型研究尺度(em_real)的WRF,适用于真实气象案例模拟。2>&1 | tee compile.log将屏幕输出同时保存到compile.log文件,方便后续排查错误。
编译过程视机器性能,可能需要30分钟到数小时。你可以通过查看compile.log末尾或者检查主要可执行文件是否生成来判断是否成功:
ls -l main/*.exe你应该能看到至少四个关键的可执行文件:
real.exe: 用于将气象再分析数据(如GFS、ERA5)插值到WRF网格上。wrf.exe: WRF模型主程序。ndown.exe: 用于嵌套网格的下尺度处理。tc.exe: 用于理想热带气旋案例(我们这里用不到)。
如果这些文件都存在且大小正常(通常几十MB到上百MB),说明WRF编译基本成功。
常见问题与排查:
- Fortran编译错误:最常见的是“未定义的引用
__gxx_personality_v0”。这通常是C++和Fortran链接时的问题。解决方法是在configure.wrf文件中,找到SFC和SCC(串行编译器)以及DM_FC和DM_CC(并行编译器)相关的行,在链接标志LDFLAGS中添加-lstdc++。例如:LDFLAGS = -lstdc++。 - NetCDF库错误:如“nf_open_par”未找到。这几乎总是因为NetCDF-Fortran库不是并行版本,或者环境变量
NETCDF指向了错误的库。请回头仔细检查2.1.2节中NetCDF-Fortran的配置是否添加了--enable-parallel-tests,并用nf-config --has-parallel命令验证。 - 内存不足:编译
wrf.exe时可能因内存不足而杀死进程(Killed)。可以尝试减少并行编译核数:./compile -j 2 em_real,或者增加机器的交换空间(swap)。
2.3 编译WPS(WRF预处理系统)
WRF模型需要经过预处理的气象输入数据,这是由WPS(WRF Preprocessing System)完成的。我们需要单独编译它。
cd $BASE_DIR git clone https://github.com/wrf-model/WPS.git cd WPS git checkout release-v4.4清理环境并配置。WPS同样依赖之前编译的NetCDF和JASPER等库。
./clean -a ./configure在菜单中选择与WRF一致的选项,即3. (Linux x86_64, gfortran) (dmpar)。这会生成configure.wps文件。
接下来编辑configure.wps,确保其中指向的NetCDF、zlib、libpng、jasper的路径是正确的。通常脚本会自动检测,但最好确认一下以下几行:
# 查找 COMPRESSION_LIBS 和 COMPRESSION_INC 部分 COMPRESSION_LIBS = -L$(NETCDF)/lib -lnetcdf -lnetcdff -L/path/to/zlib/lib -L/path/to/libpng/lib -L/path/to/jasper/lib -ljasper -lpng -lz COMPRESSION_INC = -I$(NETCDF)/include -I/path/to/zlib/include -I/path/to/libpng/include -I/path/to/jasper/include将/path/to替换为实际的库路径。在我们的设置中,zlib、libpng、jasper都位于WRF目录下的external子目录里,路径类似$BASE_DIR/WRF/external/...。NetCDF路径就是我们的$NETCDF。
确认无误后,开始编译:
./compile 2>&1 | tee wps_compile.log编译成功后,在WPS目录下会生成三个主要程序:
geogrid.exe: 定义模拟区域和静态地理数据(如地形、土地利用)。ungrib.exe: 从GRIB格式的气象再分析数据中提取变量。metgrid.exe: 将ungrib提取的气象变量水平插值到geogrid定义的网格上。
使用ls -l *.exe检查。至此,WRF及WPS的编译安装全部完成。接下来,我们将进入更复杂的CMAQ系统的安装。
3. CMAQ5.2系统编译详解
CMAQ的编译比WRF更具挑战性,因为它包含数十个相互依赖的模块,对环境变量的敏感性极高。官方提供了bldit_project.csh等构建脚本,但我们需要根据我们的环境进行大量定制。
3.1 获取源码与构建环境设置
首先,从CMAQ官方仓库获取5.2版本源码。由于CMAQ仓库较大,建议使用--depth参数只克隆最新提交以节省时间和空间:
cd $BASE_DIR git clone https://github.com/USEPA/CMAQ.git CMAQ_REPO cd CMAQ_REPO git checkout 5.2.2 # 或最新的5.2.x标签CMAQ的编译需要一个集中的“安装目录”来存放编译好的库和可执行文件,以及一个“构建目录”用于存放编译时的中间文件。我们按如下结构创建:
export CMAQ_HOME=$BASE_DIR/CMAQ_v5.2.2 mkdir -p $CMAQ_HOME cd $CMAQ_HOME mkdir -p build lib include src data接下来,设置CMAQ所需的关键环境变量。编辑你的~/.bashrc文件,添加以下内容:
# CMAQ 环境变量 export CMAQ_HOME=$BASE_DIR/CMAQ_v5.2.2 export CMAQ_DATA=$CMAQ_HOME/data export M3HOME=$CMAQ_HOME export M3LIB=$CMAQ_HOME/lib export M3MODEL=$CMAQ_HOME/src # 编译器设置 export CC=$BASE_DIR/mpich/bin/mpicc export FC=$BASE_DIR/mpich/bin/mpif90 export CXX=$BASE_DIR/mpich/bin/mpicxx # 确保使用我们编译的NetCDF export NETCDF=$BASE_DIR/libs export NETCDFF=$NETCDF export PATH=$NETCDF/bin:$PATH export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH # 编译标志 export MY_CFLAGS="-O2 -fPIC" export MY_FFLAGS="-O2 -fPIC -fallow-argument-mismatch" # gfortran 10+ 需要后一个选项 export MY_LDFLAGS="-lm -lnetcdf -lnetcdff"执行source ~/.bashrc使环境变量生效。特别注意-fallow-argument-mismatch这个选项,对于gfortran 10及以上版本是必须的,因为它加强了参数类型检查,而CMAQ部分旧代码存在参数不严格匹配的情况,这个选项允许编译通过。
3.2 编译IOAPI库
IOAPI(Input/Output Applications Programming Interface)是CMAQ用于读写NetCDF格式文件的底层I/O库,必须首先成功编译。
cd $CMAQ_HOME/build cp -r $BASE_DIR/CMAQ_REPO/UTIL/ioapi-3.2/* .编辑Makefile或Makeinclude文件(具体文件名取决于版本,可能是Makefile.nocpl)。我们需要根据我们的环境修改关键参数。主要修改点包括:
- 编译器:将
CC、F77、F90指向我们的MPI包装器。 - NetCDF路径:将
NETCDF或NC_INC、NC_LIB指向$BASE_DIR/libs。 - 架构选项:通常选择
Linux2_x86_64gfort(对于64位Linux+gfortran)。
一个典型的Makeinclude.Linux2_x86_64gfort修改示例如下:
# 编译器定义 CC = $(BASE_DIR)/mpich/bin/mpicc F77 = $(BASE_DIR)/mpich/bin/mpif90 F90 = $(BASE_DIR)/mpich/bin/mpif90 # NetCDF 库 NETCDF = $(BASE_DIR)/libs # 编译和链接标志 CFLAGS = -O2 -I$(NETCDF)/include -DIOAPI_NCF4=1 -DWORD=8 FFLAGS = -O2 -I$(NETCDF)/include -fPIC -fallow-argument-mismatch LDFLAGS = -L$(NETCDF)/lib -lnetcdf -lnetcdff -lm保存修改后,开始编译:
make -f Makefile.nocpl Linux2_x86_64gfort 2>&1 | tee ioapi_compile.log编译成功后,在$CMAQ_HOME/build目录下会生成libioapi.a等静态库文件。将它们复制到$CMAQ_HOME/lib,并将模块文件(.mod)复制到$CMAQ_HOME/include:
cp *.a $CMAQ_HOME/lib/ cp *.mod $CMAQ_HOME/include/3.3 编译CMAQ主程序与各模块
IOAPI准备好后,就可以编译CMAQ的核心化学传输模型(CCTM)及其他工具了。CMAQ使用一套名为bldit的脚本进行模块化构建。
首先,设置模块构建的通用环境。进入$BASE_DIR/CMAQ_REPO/CCTM/scripts目录,你会找到bldit_cctm.csh或类似的脚本。但更推荐直接使用config_cmaq.csh范例文件来生成构建配置。
cd $BASE_DIR/CMAQ_REPO cp config_cmaq.csh.example config_cmaq.csh用文本编辑器(如vim)打开config_cmaq.csh,进行关键配置:
# 设置编译器 setenv compiler gcc # 或 intel, 我们用的是gcc setenv compilerVrsn 11 # 你的gcc版本号,可用`gcc --version`查看 # 设置并行选项 setenv PARALLEL Y setenv PAROPT mpich # 与我们安装的MPI一致 # 设置路径 setenv CMK_HOME $CMAQ_HOME setenv NETCDF $BASE_DIR/libs setenv NETCDFF $NETCDF setenv IOAPI $CMAQ_HOME # 设置编译标志,特别是针对gfortran高版本 setenv myFCflags "-O2 -fPIC -fallow-argument-mismatch"保存后,运行该配置脚本以生成构建文件:
csh config_cmaq.csh接下来,开始编译CCTM。进入CCTM的构建目录:
cd $BASE_DIR/CMAQ_REPO/CCTM/scripts ./bldit_cctm.csh gcc 11 2>&1 | tee bldit_cctm.log脚本会依次编译CCTM依赖的各个库(如BLD、M3UTILIO等)和主程序。这个过程较长,可能会遇到各种错误。
CMAQ编译常见问题与解决:
- “Cannot open module file ‘NETCDF.mod’”:这表示Fortran编译器找不到NetCDF的模块文件。确保
NETCDFF环境变量正确指向包含netcdf.mod和typesizes.mod的目录(即$BASE_DIR/libs/include),并且在编译标志myFCflags中通过-I选项包含了该路径。 - **“undefined reference to
pnetcdf_***’”**:CMAQ默认尝试链接并行NetCDF(pNetCDF)。如果你没有安装pNetCDF,需要在config_cmaq.csh中关闭相关选项:setenv pnetcdf N,并确保setenv ioapi_netcdf_par N`。 - 段错误(Segmentation fault)或编译中途卡死:可能是内存不足。尝试在编译时不要使用
-j(并行编译),或者增加系统的交换空间。 - 特定子程序参数不匹配错误:这是gfortran高版本严格检查导致的。确保在
myFCflags中已经添加了-fallow-argument-mismatch。如果还有个别文件报错,可能需要单独修改该源文件,但这比较棘手,通常添加全局标志即可解决。
编译成功后,会在$BASE_DIR/CMAQ_REPO/CCTM/scripts目录下生成一个以编译器版本命名的子目录(如BLD_CCTM_v5.2.2_gcc11),里面包含最终的cctm可执行文件。将其复制到你的运行目录(例如$CMAQ_HOME/run)备用。
用同样的方法,可以编译其他工具,如ICON(初始条件生成)、BCON(边界条件生成)、JPROC(光解速率计算)等。它们的构建脚本通常位于各自目录的scripts文件夹下,流程类似:先配置,再运行对应的bldit_*.csh脚本。
4. 集成测试与运行准备
编译成功只是第一步,确保WRF和CMAQ能协同工作才是关键。这需要准备一套测试数据并运行一个完整的案例。
4.1 WRF测试案例运行
我们可以使用WRF自带的测试数据来验证其运行是否正常。WRF官网提供了一些小型测试案例数据。这里以经典的“CONUS 12km”案例为例(数据较大,需要下载)。
- 获取测试数据:从WRF用户页面下载测试数据包(例如
conus_12km.tar.gz)。 - 运行WPS:
- 在
WPS目录下,链接地理静态数据(需要提前从WRF官网下载geog数据,并解压到某个路径,如/path/to/geog)。ln -sf /path/to/geog ./geogrid/GEOG - 编辑
namelist.wps,配置模拟域、时间等参数。 - 依次运行:
./geogrid.exe-> 链接GRIB气象数据 ->./ungrib.exe->./metgrid.exe。
- 在
- 运行WRF:
- 将
met_em.*文件从WPS目录复制到WRF/test/em_real目录。 - 编辑
WRF/test/em_real/namelist.input,使其与WPS设置匹配。 - 运行
real.exe生成初始和边界条件文件wrfinput_d01和wrfbdy_d01。 - 最后运行
mpirun -np 4 ./wrf.exe(-np后接处理器核心数)启动WRF积分。
- 将
如果WRF能正常运行并输出历史文件(wrfout_d01_*),则说明WRF部分安装成功。
4.2 CMAQ测试案例运行
CMAQ的测试更为复杂,需要WRF输出作为输入。USEPA提供了一个名为CMAQ_Benchmark的测试案例,但数据量巨大。对于初步验证,可以尝试运行一个极简的“单元测试”或者使用教程案例。
- 准备CMAQ输入数据:这包括:
- 气象数据:将WRF输出的
wrfout文件通过MCIP(Meteorology-Chemistry Interface Processor)工具转换为CMAQ可读的格式(如METCRO3D、METDOT3D)。MCIP是CMAQ工具集的一部分,需要单独编译(流程类似CCTM)。 - 排放数据:需要人为排放和生物源排放清单,通常由
SMOKE模型处理生成,这是一个独立且复杂的系统。对于测试,可以使用CMAQ基准案例中提供的预处理好的排放文件。 - 初始和边界条件:可以由
ICON和BCON工具生成,或者使用默认的清洁大气背景场。 - 光解速率文件:由
JPROC工具根据模拟时间、经纬度生成。
- 气象数据:将WRF输出的
- 配置CCTM运行:
- 创建一个运行目录(如
$CMAQ_HOME/run/test),将编译好的cctm可执行文件复制过来。 - 从CMAQ基准案例或教程中复制
runscript(运行脚本)和CTM_CONC、CTM_EMIS等输入文件到该目录。 - 编辑运行脚本,正确设置所有输入文件的路径、模拟时间步长、化学机制(如
cb6r3_ae7_aq)、输出选项等。 - 最关键的是编辑
CTM_CONC文件,指定化学机制、气溶胶方案、过程分析选项等。
- 创建一个运行目录(如
- 提交运行:
运行成功后,会生成一系列输出文件,如cd $CMAQ_HOME/run/test # 如果是并行运行 mpirun -np 8 ./cctmCONC(浓度)、DRYDEP(干沉降)、WETDEP(湿沉降)等。
注意事项:第一次运行CMAQ几乎一定会遇到输入文件路径错误、格式不匹配或时间设置错误。务必仔细核对运行脚本中每一个文件的路径,并使用
ncdump -h命令查看NetCDF文件的变量名、维度和属性,确保它们与CTM_CONC文件中的设定一致。从一个能跑通的简单案例(如官方教程案例)开始,逐步修改,是最稳妥的策略。
4.3 环境变量与路径最终检查
在长期使用中,为了确保每次打开终端都能正确运行WRF和CMAQ,需要将所有的环境变量设置固化在~/.bashrc或一个单独的配置脚本中。下面是一个整合后的环境变量设置示例,你可以将其添加到~/.bashrc末尾:
# ==== WRF & CMAQ 集成环境 ==== export BASE_DIR=$HOME/Build_WRF_CMAQ # MPI export PATH=$BASE_DIR/mpich/bin:$PATH export LD_LIBRARY_PATH=$BASE_DIR/mpich/lib:$LD_LIBRARY_PATH # NetCDF export NETCDF=$BASE_DIR/libs export PATH=$NETCDF/bin:$PATH export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH export CPPFLAGS="-I$NETCDF/include" export LDFLAGS="-L$NETCDF/lib" export FCFLAGS="$CPPFLAGS" # WRF export WRF_DIR=$BASE_DIR/WRF # CMAQ export CMAQ_HOME=$BASE_DIR/CMAQ_v5.2.2 export M3HOME=$CMAQ_HOME export M3LIB=$CMAQ_HOME/lib export M3MODEL=$CMAQ_HOME/src export CMAQ_DATA=$CMAQ_HOME/data # 编译器包装 export CC=mpicc export FC=mpif90 export CXX=mpicxx # 解决gfortran高版本兼容性问题 export FFLAGS="-fallow-argument-mismatch"保存后,执行source ~/.bashrc。可以通过which mpicc、nc-config --version、echo $CMAQ_HOME等命令验证所有路径是否设置正确。
整个安装过程从系统准备到测试运行,涉及步骤繁多,任何一个环节的疏漏都可能导致失败。最关键的体会是:环境隔离和版本控制。通过在我们自定义的$BASE_DIR下编译所有依赖,完全避开了系统包管理器的干扰,这是成功的基础。其次,耐心阅读错误信息,编译错误通常都会给出明确的文件和行号,根据错误信息去搜索解决方案,远比盲目尝试有效。最后,善用日志文件,无论是configure、make还是运行脚本,都使用tee命令将输出重定向到日志文件,这是事后排查问题的唯一可靠依据。