简介
CMAQ(Community Multiscale Air Quality通用多尺度空气质量)模型,是美国环保局开发的第三代空气质量预报和评估系统(Models-3)的核心组成之一。是一套三维欧拉网格化的大气化学和传输模拟系统,能够模拟整个对流层的臭氧,酸沉降,能见度和细颗粒物。整个模式遵循“一个大气”理念,可以同时处理从局地到半球的不同空间尺度的多个复杂的空气质量问题,作为一个有效的第三代空气质量模型与评价工具,其能够支持从策略分析到大气科学研究的各类空气质量模拟应用。
配置流程
1.获取源代码和测试数据
本文档所测试版本为:CMAQ-5.2
软件获取路径为:
主程序源码:https://github.com/USEPA/CMAQ/tree/5.2
依赖库源码:https://github.com/cjcoats/ioapi-3.2
测试 数据集 :https://www.epa.gov/cmaq/cmaq-inputs-and-test-case-data
CMAQ官网:https://www.epa.gov/cmaq
本文以CMAQ-5.2为例,编译安装CMAQ。
依次使用如下命令,下载主程序源码和依赖库源码,测试数据集需注册后下载
git clone-b 5.2 https://github.com/USEPA/CMAQ.git CMAQ-5.2 git clone https://github.com/cjcoats/ioapi-3.2
2.基础环境安装
1)执行如下命令,安装必要的系统组件
yum install-y curl-devel libcurl-devel zlib-devel tcsh
2)执行如下命令下载基础环境软件包
wget https://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc-9.1.0.tar.gz wget https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.4.tar.gz wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.5/src/hdf5-1.10.5.tar.gz wget ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-c-4.7.0.tar.gz wget ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-fortran-4.4.5.tar.gz
3)依次执行如下命令升级安装最新版gcc编译器(当前为gcc v9.1.0)
tar-zxvf gcc-9.1.0.tar.gz cd gcc-9.1.0 ./contrib/download_prerequisites ./configure--prefix=/usr/local/gcc/9.1.0 make-j 4 make install cd-
4)依次执行如下命令安装并行库OpenMPI(v3.1.4)
export GCC_HOME=/usr/local/gcc/9.1.0/ export PATH=$GCC_HOME/bin:$PATH export LD_LIBRARY_PATH=$GCC_HOME/lib:$GCC_HOME/lib64:$LD_LIBRARY_PATH export INCLUDE=$GCC_HOME/include:$INCLUDE tar-zxvf openmpi-3.1.4.tar.gz cd openmpi-3.1.4 ./configure--prefix=/usr/local/openmpi3--enable-orterun-prefix-by-default make-j 4 make install cd-
5)依次执行如下命令安装数据格式库HDF5(v1.10.5)
export MPI_HOME=/usr/local/openmpi3 export PATH=$MPI_HOME/bin:$PATH export LD_LIBRARY_PATH=$MPI_HOME/lib:$LD_LIBRARY_PATH export INCLUDE=$MPI_HOME/include:$INCLUDE cd hdf5 ./configure--prefix=/usr/local//hdf5--enable-fortran--enable-parallel CC=mpicc FC=mpif90 CXX=mpicxx make-j 4 make install cd-
6)依次执行如下命令安装数据格式库NetCDF(v4.x.x)
export HDF5=/usr/local/hdf5 export PATH=$HDF5/bin:$PATH export LD_LIBRARY_PATH=$HDF5/lib:$LD_LIBRARY_PATH export INCLUDE=$HDF5/include:$INCLUDE tar-zxvf netcdf-c-4.7.0.tar.gz cd netcdf-c-4.7.0 ./configure--prefix=/usr/local/netcdf LDFLAGS="-L$HDF5/lib"CPPFLAGS="-I$HDF5/include"CC=mpicc--disable-dap make-j 4 make install cd- export NETCDF=/usr/local/netcdf export PATH=$NETCDF/bin:$PATH export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH export INCLUDE=$NETCDF/include:$INCLUDE tar-zxvf netcdf-fortran-4.4.5.tar.gz cd netcdf-fortran-4.4.5 ./configure--prefix=/usr/local/netcdf CPPFLAGS="-I$HDF5/include-I$NETCDF/include"LDFLAGS="-L$HDF5/lib-L$NETCDF/lib"CC=mpicc FC=mpif90 F77=mpif90 make-j 4 make install cd-
3.安装环境准备
1)依次使用如下命令,创建安装目录,拷贝下载的源码至安装目录
mkdir-p/usr/local/cmaq cp-r CMAQ-5.2/usr/local/cmaq cp-r ioapi-3.2/usr/local/cmaq
1)依次使用如下命令,创建依赖组件环境变量加载脚本
vim/usr/local/cmaq/env-cmaq.sh
依次输入如下行:
export GCC_HOME=/usr/local/gcc/9.1.0/ export PATH=$GCC_HOME/bin:$PATH export LD_LIBRARY_PATH=$GCC_HOME/lib:$GCC_HOME/lib64:$LD_LIBRARY_PATH export INCLUDE=$GCC_HOME/include:$INCLUDE export MPI_HOME=/usr/local/openmpi3 export PATH=$MPI_HOME/bin:$PATH export LD_LIBRARY_PATH=$MPI_HOME/lib:$LD_LIBRARY_PATH export INCLUDE=$MPI_HOME/include:$INCLUDE export HDF5=/usr/local/hdf5 export PATH=$HDF5/bin:$PATH export LD_LIBRARY_PATH=$HDF5/lib:$LD_LIBRARY_PATH export INCLUDE=$HDF5/include:$INCLUDE export NETCDF=/usr/local/netcdf export PATH=$NETCDF/bin:$PATH export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH export INCLUDE=$NETCDF/include:$INCLUDE
保存并退出vim。
2)使用如下命令,加载环境变量
source/usr/local/cmaq/env-cmaq.sh
4.依赖库安装
1)依次使用如下命令,进入依赖库安装目录,并复制相关配置文件
cd/usr/local/cmaq/ioapi-3.2 cp ioapi/Makeinclude.Linux2_ia64gfort ioapi/Makeinclude.Linux4_aarch64
2)使用如下命令,编辑上述复制的配置文件
vim ioapi/Makeinclude.Linux4_aarch64
注释FSFLAGS关键字对应的行,如:
#FSFLAGS=-save#gfortran不识别-save参数,此参数用于保存子程序每次运行时的变量值。
保存并退出vim。
3)依次使用如下命令,复制并编辑配置文件
cp m3tools/Makefile.nocpl m3tools/Makefile vim m3tools/Makefile
为LIBS变量完善NetCDF路径,如:
LIBS=-L${OBJDIR}-lioapi-L/usr/local/netcdf/lib-lnetcdff-lnetcdf$(OMPLIBS)$(ARCHLIB)$(ARCHLIBS)
保存并退出vim。
4)依次使用如下命令,复制并编辑配置文件
rm-f Makefile cp Makefile.template Makefile vim Makefile
修改BIN变量值,与上文一致,如:
BIN=Linux4_aarch64
修改NCFLIBS环境变量,完善HDF5和NetCDF路径,如:
NCFLIBS=-L/usr/local/netcdf/lib-lnetcdff-lnetcdf-L/usr/local/hdf5/lib-lhdf5_hl-lhdf5-lz
去除IOAPIDEFS的注释,并确认其值,如:
IOAPIDEFS="-DIOAPI_NCF4"
保存并退出vim。
5)使用如下命令,执行依赖库编译
make BIN=Linux4_aarch64
5.主程序安装
1)依次使用如下命令,进入主程序源码目录,并编辑配置文件
cd/usr/local/cmaq/CMAQ-5.2 vim bldit_project.csh
变更CMAQ_HOME的值,明确工作目录,如:
set CMAQ_HOME=/usr/local/cmaq/CMAQ_Project
保存并退出vim。
2)使用如下命令,创建初始化所需文件
./bldit_project.csh
3)依次使用如下命令,进入工作目录并编辑配置文件
cd../CMAQ_Project/ vim config_cmaq.csh
在“case gcc”段落区域修改依赖库等的路径信息,如:
setenv IOAPI_MOD_DIR/usr/local/cmaq/ioapi-3.2/Linux4_aarch64/ setenv IOAPI_INCL_DIR/usr/local/cmaq/ioapi-3.2/ioapi/ setenv IOAPI_LIB_DIR/usr/local/cmaq/ioapi-3.2/Linux4_aarch64/ setenv NETCDF_LIB_DIR/usr/local/netcdf/lib/ setenv NETCDF_INCL_DIR/usr/local/netcdf/include/ setenv MPI_LIB_DIR/usr/local/openmpi3/
为“netcdf_lib”变量添加openmp属性,如:
setenv netcdf_lib"-lnetcdf-lnetcdff-lgomp"#>-lnetcdff-lnetcdf for netCDF v4.2.0 and later
保存并退出vim。
4)使用如下命令,链接各种依赖库
./config_cmaq.csh gcc 9.1.0
5)依次使用如下命令,进入编译目录,并编译主程序
cd CCTM/scripts/ ./bldit_cctm.csh gcc 9.1.0
编译完成后,会在BLD_CCTM_v52_gcc9.1.0目录下生成CMAQ的可执行程序
6.测试
1)执行如下命令,进入测试目录并配置运行脚本
cd/usr/local/cmaq/CMAQ_Project/CCTM/scripts vim run_cctm.csh
修改“compiler变量值”为“gcc”,如:
setenv compiler gcc
新增“compilerVrsn”变量并赋值“9.1.0”,如:
set compilerVrsn=9.1.0
修改“NPCOL”和“NPROW”变量值,其值的乘积与并行核心数相等,如:
NPCOL=2; NPROW=2
修改OpenMPI运行参数,如:
time mpirun-np$NPROCS--allow-run-as-root$BLD/$EXEC
保存并退出vim。
2)执行如下命令,解压缩注册下载得到的算例输入文件至工作目录
tar-zxvf CMAQv5.2_Benchmark_inputdata.tar.gz.xz-C/usr/local/cmaq/CMAQ_project/data
3)使用如下命令,运行测试脚本
./run_cctm.csh
正确执行完成后,计算结果保存在如下目录:
/data/cuibotao/cmaq/CMAQ_Project/data/output_CCTM_v52_gcc9.1.0_inputdata
已知问题汇总
问题现象1
运行测试脚本时,报如下错误:
问题原因
测试脚本使用cshell,无权限移除限制。
问题解决
注释测试脚本中“unlimit”关键字对应行,在shell终端执行如下命令后,然后运行测试脚本,如:
ulimit-s unlimited ./run_cctm.csh
问题现象2
编译主程序出现如下错误:
问题原因
数据格式错误
问题解决
删除“/usr/local/cmaq/ioapi-3.2/ioapi/STATE3.EXT”文件中末尾若干行的行尾“&”符号,如下图,删除红色框中的“&”符号: