Internet_worm
Internet_worm的博客

导航

 

CMAQ 5.3 在曙光 DCU 服务器(CPU 模式)安装部署方案

本文档基于曙光服务器环境(module avail 输出),提供了一套完整的 CMAQ 5.3 安装步骤,使用 GCC 11.2.0OpenMPI 4.1.1,所有依赖库及 CMAQ 均安装在 ~/CMAQ 目录下。本方案仅使用 CPU 计算资源,为后续可能的 DCU 优化奠定基础。


一、环境准备

1. 加载编译器和 MPI

# 加载 GCC 11.2.0
module load compiler/gcc/11.2.0

# 加载 OpenMPI(与 GCC 7.3.1 兼容,但 mpif90 会调用当前 GCC)
module load mpi/openmpi/4.1.1/gcc-7.3.1

# 验证
which gcc gfortran mpif90
gcc --version

说明:OpenMPI 模块名中虽带有 gcc-7.3.1,但它提供的是 MPI 包装器(mpif90),实际编译时会调用当前已加载的 gcc/11.2.0 编译器。

2. 创建安装目录

源代码目录在~/CMAQ/
安装目录在~/cmaq/

二、下载所有源码包

~/CMAQ 目录下执行以下下载命令:

cd ~/CMAQ/

1. HDF5 1.10.5

wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.5/src/hdf5-1.10.5.tar.gz

2. NetCDF-C 4.7.4

wget https://downloads.unidata.ucar.edu/netcdf-c/4.7.4/netcdf-c-4.7.4.tar.gz

3. NetCDF-Fortran 4.5.3

wget https://downloads.unidata.ucar.edu/netcdf-fortran/4.5.3/netcdf-fortran-4.5.3.tar.gz

4. I/O API 3.2

wget https://www.cmascenter.org/ioapi/download/ioapi-3.2.tar.gz

5. CMAQ 5.3 源码

wget https://github.com/USEPA/CMAQ/archive/CMAQv5.3_27Aug2019.tar.gz -O CMAQv5.3.tar.gz
# 验证 SHA256(可选)
echo "e245c291c7e88d481b13f577d1af9aeb5aef4de8c59f7fa06fa41d19bb2ed18c  CMAQv5.3.tar.gz" | sha256sum -c

6. (可选)基准测试数据

https://drive.google.com/drive/folders/1jAKw1EeEzxLSsmalMplNwYtUv08pwUYk

下载速度较慢,可使用 Free download Manager(https://www.freedownloadmanager.org/zh/) 等工具下载。
下载5.3.2数据包与5.3完全兼容,5.4之后数据包格式有较大变化,配置比较复杂:CMAQv5.3.2_Benchmark_2Day_Input.tar.gz

三、编译安装依赖库(按顺序)

1. HDF5

cd ~/CMAQ/src
tar -xzf hdf5-1.10.5.tar.gz
cd hdf5-1.10.5
./configure --prefix=~/CMAQ/hdf5 --enable-fortran --enable-cxx --enable-hl 
#此处可能会提示 configure: error: expected an absolute directory name for --prefix: ~/CMAQ/hdf5 将路径换成绝对路径即可,使用以下指令替换
# ./configure --prefix=/public/home/zhaizf/CMAQ/hdf5 --with-quadmath=/public/software/apps/gcc/11.2.0/gcc/lib64/libquadmath.la --enable-fortran --enable-cxx --enable-hl
# ./configure --prefix=/public/home/zhaizf/CMAQ/hdf5 --libdir=/public/software/apps/gcc/11.2.0/gcc/lib64 --enable-fortran --enable-cxx --enable-hl
# 最终的安装指令是
/configure --prefix=/public/home/zhaizf/cmaq/hdf5 --libdir=/public/home/zhaizf/CMAQ/packages/hdf5-1.10.5 --enable-fortran --enable-cxx --enable-hl 
make && make install

因此HDF5的include路径是"/public/home/zhaizf/cmaq/hdf5/include" HDF5的lib路径是"/public/home/zhaizf/CMAQ/packages/hdf5-1.10.5"

2. NetCDF-C

cd ~/CMAQ/src
tar -xzf netcdf-c-4.7.4.tar.gz
cd netcdf-c-4.7.4
# CPPFLAGS="-I~/cmaq/hdf5/include" LDFLAGS="-L~/CMAQ/packages/hdf5-1.10.5" \
# ./configure --prefix=/public/home/zhaizf/cmaq/netcdf --disable-dap
./configure CPPFLAGS="-I/public/home/zhaizf/cmaq/hdf5/include" LDFLAGS="-L/public/home/zhaizf/CMAQ/packages/hdf5-1.10.5" --prefix=/public/home/zhaizf/cmaq/netcdf --disable-dap
  
make -j4
make install

# 临时设置路径(后续会持久化)
 export PATH=~/cmaq/netcdf/bin:$PATH
 export LD_LIBRARY_PATH=~/cmaq/netcdf/lib:$LD_LIBRARY_PATH

3. NetCDF-Fortran

cd ~/CMAQ/src
tar -xzf netcdf-fortran-4.5.3.tar.gz
cd netcdf-fortran-4.5.3
CPPFLAGS="-I~/cmaq/netcdf/include -I~/cmaq/hdf5/include" \
LDFLAGS="-L~/cmaq/netcdf/lib -L~/CMAQ/packages/hdf5-1.10.5" \
./configure --prefix=/public/home/zhaizf/cmaq/netcdf

./configure CPPFLAGS="-D_FILE_OFFSET_BITS=64 -I/public/home/zhaizf/cmaq/netcdf/include -I/public/home/zhaizf/cmaq/hdf5/include" LDFLAGS="-L/public/home/zhaizf/cmaq/netcdf/lib -L/public/home/zhaizf/CMAQ/packages/hdf5-1.10.5" --prefix=/public/home/zhaizf/cmaq/netcdf


make -j4
make install

4. I/O API 3.2

进入ioapi-3.2的安装目录

$ cp ioapi/Makeinclude.Linux2_x86_64gfort10 ioapi/Makeinclude.Linux2
$ cp ioapi/Makefile.nocpl ioapi/Makefile

$ vim ioapi/Makefile.nocpl.sed
# 修改 BASEDIR、INSTALL 的路径为当前目录
# 解开 CPLMODE    = nocpl 的注释,并确认其值,如:CPLMODE    = nocpl 或在文件中添加值,如:CPLMODE    = nocpl ,建议手动添加到"VERSION    = 3.2-${CPLMODE}" 前一行
BASEDIR    = /public/home/zhaizf/CMAQ/ioapi-3.2
INSTALL    = /public/home/zhaizf/cmaq/ioapi
# 保存并退出 vim

$ cp m3tools/Makefile.nocpl m3tools/Makefile

$ vim m3tools/Makefile.nocpl.sed
# 为 LIBS 变量完善 NetCDF 路径,如:
LIBS = -L${OBJDIR} -lioapi -L/public/home/zhaizf/cmaq/netcdf/lib -lnetcdff -lnetcdf $(OMPLIBS) $(ARCHLIB) $(ARCHLIBS)

# 修改 BASEDIR 的路径为当前目录
BASEDIR =  /public/home/zhaizf/CMAQ/ioapi-3.2
# 保存并退出 vim。

$ cp Makefile.template Makefile
$ vim Makefile
# 修改BIN=Linux2
# 修改 NCFLIBS 环境变量,完善 HDF5 和 NetCDF 路径,如:
NCFLIBS = -L/public/home/zhaizf/cmaq/netcdf/lib -lnetcdff -lnetcdf -L/public/home/zhaizf/CMAQ/packages/hdf5-1.10.5 -lhdf5_hl -lhdf5 

# 去除 IOAPIDEFS 的注释,并确认其值,如:
IOAPIDEFS = "-DIOAPI_NCF4"

# 修改 BASEDIR、INSTALL 的路径为当前目录
BASEDIR = /public/home/zhaizf/CMAQ/ioapi-3.2
INSTALL = /public/home/zhaizf/cmaq/ioapi
# 保存并退出 vim

$ make BIN=Linux2

安装成功后在当前目录(ioapi-3.2)的Linux2目录下会有很多可执行文件


创建目标目录结构(如果尚未创建):

bash
mkdir -p /public/home/zhaizf/cmaq/ioapi/{include,lib,bin}
复制头文件:

bash
cp /public/home/zhaizf/CMAQ/ioapi-3.2/ioapi/*.h /public/home/zhaizf/cmaq/ioapi/include/
cp /public/home/zhaizf/CMAQ/ioapi-3.2/ioapi/*.EXT /public/home/zhaizf/cmaq/ioapi/include/
复制库文件和模块文件:

bash
cp /public/home/zhaizf/CMAQ/ioapi-3.2/Linux2/libioapi.a /public/home/zhaizf/cmaq/ioapi/lib/
cp /public/home/zhaizf/CMAQ/ioapi-3.2/Linux2/*.mod /public/home/zhaizf/cmaq/ioapi/include/   # 模块通常放在 include 或与库同目录
复制可执行工具:

bash
cp /public/home/zhaizf/CMAQ/ioapi-3.2/Linux2/m3* /public/home/zhaizf/cmaq/ioapi/bin/
验证安装
完成复制后,可以运行一个工具测试:

bash
/public/home/zhaizf/cmaq/ioapi/bin/m3diff
如果显示帮助信息,说明工具可用。

如果缺少包,比如./m3diff: error while loading shared libraries: libnetcdff.so.7: cannot open shared object file: No such file or directory 等,是因为我们没有将NetCDF-Fortran的库路径添加到LD_LIBRARY_PATH中,可以通过以下命令添加:export LD_LIBRARY_PATH=/public/home/zhaizf/cmaq/netcdf/lib:$LD_LIBRARY_PATH  ,基本上就是一些我们安装的前期安装的包没有做持久化环境变量导致的, 可以临时添加环境变量,最终再持久化到.bashrc文件中
遇到了一个是gcc中的libgfortran.so.5为加载到,我是临时将gcc的lib64目录也添加到了LD_LIBRARY_PATH环境变量中,最终临时变量的命令是:
export LD_LIBRARY_PATH=/public/software/apps/gcc/11.2.0/gcc/lib64:/public/home/zhaizf/CMAQ/packages/hdf5-1.10.5:/public/home/zhaizf/cmaq/netcdf/lib:$LD_LIBRARY_PATH

---
## 四、安装 CMAQ 5.3

### 1. 解压源码并设置 CMAQ_HOME

```bash
cd /public/home/zhaizf/CMAQ
tar -xzf CMAQv5.3.tar.gz
mv CMAQ-CMAQv5.3_27Aug2019 /public/home/zhaizf/cmaq/cmaq-5.3   # 重命名并移动到用户目录
cd /public/home/zhaizf/cmaq/cmaq-5.3

2. 运行项目构建脚本

编辑 
vi bldit_project.csh
修改:set CMAQ_HOME = /public/home/zhaizf/cmaq/cmaq-5.3
./bldit_project.csh

3. 配置编译选项

编辑 config_cmaq.csh

vi config_cmaq.csh

找到 case $compiler 中的 gcc 分支(约在文件后半部分),修改如下关键路径:

bash
setenv IOAPI_INCL_DIR   /public/home/zhaizf/cmaq/ioapi/include   #> I/O API include header files
setenv IOAPI_LIB_DIR    /public/home/zhaizf/cmaq/ioapi/lib   #> I/O API libraries
setenv NETCDF_LIB_DIR   /public/home/zhaizf/cmaq/netcdf/lib  #> netCDF C directory path
setenv NETCDF_INCL_DIR  /public/home/zhaizf/cmaq/netcdf/include  #> netCDF C directory path
setenv NETCDFF_LIB_DIR  /public/home/zhaizf/cmaq/netcdf/lib #> netCDF Fortran directory path
setenv NETCDFF_INCL_DIR /public/home/zhaizf/cmaq/netcdf/include #> netCDF Fortran directory path
setenv MPI_LIB_DIR      /public/software/mpi/openmpi/4.1.1/lib     #> MPI directory path
#> Compiler Aliases and Flags
#> set the compiler flag -fopt-info-missed to generate a missed optimization report in the bldit logfile
setenv myFC mpif90
setenv myCC mpicc
setenv myFSTD "-O3 -funroll-loops -finit-character=32 -Wtabs -Wsurprising -march=x86-64 -ftree-vectorize  -ftree-loop-if-convert -finline-limit=512"
setenv myDBG  "-Wall -O0 -g -fcheck=all -ffpe-trap=invalid,zero,overflow -fbacktrace"
setenv myFFLAGS "-std=legacy -fallow-argument-mismatch -ffixed-form -ffixed-line-length-132 -funroll-loops -finit-character=32"
setenv myFRFLAGS "-ffree-form -ffree-line-length-none -funroll-loops -finit-character=32"
setenv myCFLAGS "-O2"
setenv myLINK_FLAG "-fopenmp" # "-fopenmp" openMP not supported w/ CMAQ
setenv extra_lib ""
#setenv mpi_lib "-lmpi_mpifh"   #> -lmpich for mvapich or -lmpi for openmpi
setenv mpi_lib ""   #> -lmpich for mvapich or -lmpi for openmpi

4. 加载配置

cd /public/home/zhaizf/cmaq/cmaq-5.3
 ./config_cmaq.csh gcc

5. 编译 CCTM

cd /public/home/zhaizf/cmaq/cmaq-5.3/CCTM/scripts
./bldit_cctm.csh gcc

编译约需 10-20 分钟,成功后会在 BLD_CCTM_v53_gcc 目录生成 CCTM_v53.exe

6. 验证可执行文件

ls -l /public/home/zhaizf/cmaq/cmaq-5.3/CCTM/scripts/BLD_CCTM_v53_gcc/CCTM_v53.exe
# 应显示可执行文件存在
-rwxrwxr-x 1 zhaizf zhaizf 151043888 Feb 27 10:53 /public/home/zhaizf/cmaq/cmaq-5.3/CCTM/scripts/BLD_CCTM_v53_gcc/CCTM_v53.exe

五、运行基准测试(验证安装)

1. 准备输入数据

cd /public/home/zhaizf/cmaq/cmaq-5.3/data
tar -zxvf CMAQv5.3.2_Benchmark_2Day_Input.tar.gz
# 解压后应生成 2_day_benchmark_input 目录

2. 创建运行目录和脚本

申请计算节点 30核心 ssh 进入节点

salloc -p normal -N 1 --ntasks-per-node=30

加载gcc、mpi模块

module load compiler/gcc/11.2.0
module load mpi/openmpi/4.1.1/gcc-7.3.1

查看环境变量 LD_LIBRARY_PATH,确保包含netcdf、hdf5的库路径

echo $LD_LIBRARY_PATH

如果缺少路径,则添加

export LD_LIBRARY_PATH=/public/home/zhaizf/cmaq/netcdf/lib:/public/home/zhaizf/CMAQ/packages/hdf5-1.10.5:$LD_LIBRARY_PATH

gcc的库路径一般是不会缺失的,如果缺失了也要添加进去

export LD_LIBRARY_PATH=/public/software/apps/gcc/11.2.0/gcc/lib64:/public/home/zhaizf/cmaq/netcdf/lib:/public/home/zhaizf/CMAQ/packages/hdf5-1.10.5:$LD_LIBRARY_PATH

准备运行脚本

cd /public/home/zhaizf/cmaq/cmaq-5.3/CCTM/scripts
cp ./run_cctm_Bench_2016_12SE1.csh ./run_cctm_Bench_2016_12SE1_1.csh

修改运行脚本

vim -R run_cctm_Bench_2016_12SE1_1.csh

添加环境变量

setenv compiler gcc
setenv compilerVrsn v53
setenv compilerString gcc

修改参数 这里可以配置环境变量CMAQ_HOME也可以直接设置绝对路径,为了清晰明了看到参数正确性,我使用了绝对路径的方式

原参数

set BLD       = ${CMAQ_HOME}/CCTM/scripts/BLD_CCTM_${VRSN}_${compilerString}
set EXEC      = CCTM_${VRSN}.exe 

修改为

set BLD = /public/home/zhaizf/cmaq/cmaq-5.3/CCTM/scripts/BLD_CCTM_v53_gcc
set EXEC = CCTM_v53.exe

修改环境变量 工作、输入、输出目录

setenv WORKDIR /public/home/zhaizf/cmaq/cmaq-5.3/CCTM/scripts #> Working Directory. Where the runscript is.
setenv OUTDIR /public/home/zhaizf/cmaq/cmaq-5.3/data/output_CCTM_${RUNID} #> Output Directory
setenv INPDIR /public/home/zhaizf/cmaq/cmaq-5.3/data/CMAQv5.3.2_Benchmark_2Day_Input/2016_12SE1 #Input Directory
setenv LOGDIR ${OUTDIR}/LOGS #> Log Directory Location
setenv NMLpath ${BLD} #> Location of Namelists. Common places are:
#> ${WORKDIR} | ${CCTM_SRC}/MECHS/${MECH} | ${BLD}

修改环境变量 开始日期、结束日期、开始时间、结束时间、输出步长等

> Set Start and End Days for looping

setenv NEW_START TRUE #> 启动时重新开始计算
set START_DATE = "2016-07-01" #> beginning date (July 1, 2016)
set END_DATE = "2016-07-02" #> ending date (July 14, 2016)

> Set Timestepping Parameters

set STTIME = 000000 #> beginning GMT time (HHMMSS) 开始时间 000000 表示 00:00:00
set NSTEPS = 240000 #> time duration (HHMMSS) for this run 运行时间 240000 表示 24 小时
set TSTEP = 010000 #> output time step interval (HHMMSS) 输出时间步长 010000 表示 1 小时

设置核心数 此处我修改了默认配置为6列5行,共30核心,一定要与申请计算节点时的--ntasks-per-node=30参数一致

> Horizontal domain decomposition

if ( $PROC == serial ) then
setenv NPCOL_NPROW "1 1"; set NPROCS = 1 # single processor setting
else
@ NPCOL = 6; @ NPROW = 5
@ NPROCS = $NPCOL * $NPROW
setenv NPCOL_NPROW "$NPCOL $NPROW";
endif

六、后续 DCU 优化前的准备

本方案已为后续 DCU 优化打下基础:

  • 模块化环境:所有依赖库安装在 ~/CMAQ 下,便于替换为 DCU 专用版本。
  • 明确的路径:在 config_cmaq.csh 中集中管理路径,未来可复制一份 config_cmaq_dcu.csh 并修改库路径指向 DCU 优化版库。
  • 编译器分离:使用 module 管理编译器,DCU 开发时可切换至 compiler/rocm/dtk-xx 模块。

当需要 DCU 优化时,主要工作将是:

  1. 重新编译 HDF5/NetCDF 等库以支持 DCU(可能需要 ROCm/HIP 版本)。
  2. 修改 config_cmaq.csh 中的编译器为 hipcc 或添加 OpenMP target 编译选项。
  3. 替换数学库(如使用 rocBLAS 替代 BLAS)。

七、常见问题

问题 解决方法
configure: error: C compiler cannot create executables 检查 module load 是否成功,gcc --version 应有输出。
I/O API 编译失败 确认已复制正确的 Makefile.linux_x86_64_gfortran,并设置 BIN=Linux2_x86_64gfort
运行时报错 libnetcdf.so.XX not found 在提交脚本中添加 export LD_LIBRARY_PATH=~/CMAQ/netcdf/lib:$LD_LIBRARY_PATH
MPI 进程数与 NPCOL*NPROW 不匹配 修改 run_benchmark.csh 中的 NPCOL/NPROW,确保乘积等于 Slurm 的 --ntasks-per-node

CMAQ5.3主程序编译问题:
_cgi-bin_mmwebwx-bin_webwxgetmsgimg__&MsgID=219641142987802190&skey=@crypt_ff03be52_b1dfba2c38241d7f4b4755e8212807f1&mmweb_appid=wx_webfilehelper

类似于 STATE3.EXT:174:27
Error:Syntax error in COMMON statement at(1)
STATE3.EXT:191:27
删除 /public/home/zhaizf/cmaq/cmaq-5.3/lib/x86_64/gcc/ioapi/include_files/STATE3.EXT 文件中第174行至第191行结尾处的 "&",重新编译即可主程序即可。

附录:持久化环境变量

建议将以下内容添加到 ~/.bashrc 中,以便每次登录自动加载编译器及库路径(但需注意模块加载顺序):

# 加载编译器(具体版本号可替换)
module load compiler/gcc/11.2.0
module load mpi/openmpi/4.1.1/gcc-7.3.1

# 设置 NetCDF 库路径
export PATH=$HOME/CMAQ/netcdf/bin:$PATH
export LD_LIBRARY_PATH=$HOME/CMAQ/netcdf/lib:$HOME/CMAQ/hdf5/lib:$LD_LIBRARY_PATH

然后执行 source ~/.bashrc 使生效。

posted on 2026-03-02 10:49  Develoven  阅读(0)  评论(0)    收藏  举报