WRF/CMAQ模型的编译

一、WPS和WRF编译

Compiling WRFhttps://www2.mmm.ucar.edu/wrf/OnLineTutorial/compilation_tutorial.phpFull WRF and WPS Installation Example (GNU) | WRF & MPAS-A Support Forumhttps://forum.mmm.ucar.edu/threads/full-wrf-and-wps-installation-example-gnu.12385/

二、CMAQ编译

Intel编译器安装WRF-CMAQ-CSDN博客https://blog.csdn.net/weixin_55713760/article/details/120943523WRF编译也可以按照这个链接

2.1. 修改化学机制
setenv Mechanism saprc07tic_ae7i_aq

set ModMech = MECHS/${Mechanism}

自己修改(增减)机制参考下面的链接
CMAQ/DOCS/Users_Guide/Tutorials/CMAQ_UG_tutorial_chemicalmechanism.md at 5.5+ · USEPA/CMAQ · GitHubhttps://github.com/USEPA/CMAQ/blob/5.5%2B/DOCS/Users_Guide/Tutorials/CMAQ_UG_tutorial_chemicalmechanism.md

三、环境库的安装

# 文件夹定义

export DIR=/data/home/gzq25_slurm/libraries

export TARDIR=${DIR}/tar_gz

3.1 # intel

直接copy之前的文件夹

source /data/home/gzq25_slurm/libraries/intel/oneapi/setvars.sh --force

which icc

which ifort

which mpiifort

mpiifort -show

3.2 # zlib

cd ${DIR}

rm -rf zlib-1.2.11

tar -xzf ${TARDIR}/zlib-1.2.11.tar.gz

mkdir -p ${DIR}/zlib/1.2.11

cd ${DIR}/zlib-1.2.11

CC=icc CXX=icc FC=ifort CPP='icpc -E' CPPFLAGS='-fPIC' ./configure --prefix=${DIR}/zlib/1.2.11 |& tee configure.log

make -j4 |& tee make.log
make check |& tee make_check.log
make install |& tee make_install.log

3.3 # curl

export ZLIB=${DIR}/zlib/1.2.11
export PATH=${ZLIB}/bin:${PATH}
export LD_LIBRARY_PATH=${ZLIB}/lib:${LD_LIBRARY_PATH}

cd ${DIR}

rm -rf curl-7.75.0

tar -xzf ${DIR}/tar_gz/curl-7.75.0.tar.gz

mkdir -p ${DIR}/curl/7.75.0

cd ${DIR}/curl-7.75.0

CC=icc CXX=icc FC=ifort CPP='icpc -E' CPPFLAGS='-fPIC' ./configure --prefix=${DIR}/curl/7.75.0 --with-zlib=${ZLIB} --without-ssl |& tee configure.log

make -j4 |& tee make.log

make install |& tee make_install.log

export CURL=${DIR}/curl/7.75.0

ls -lh \
${CURL}/bin/curl \
${CURL}/bin/curl-config \
${CURL}/lib/libcurl.a \
${CURL}/include/curl/curl.h

export PATH=${CURL}/bin:${PATH}
export LD_LIBRARY_PATH=${CURL}/lib:${ZLIB}/lib:${LD_LIBRARY_PATH}

3.4 # hdf5

cd ${DIR}

rm -rf hdf5-1.10.5

tar -xjf ${TARDIR}/hdf5-1.10.5.tar.bz2

mkdir -p ${DIR}/hdf5/1.10.5

cd ${DIR}/hdf5-1.10.5

CC=icc CXX=icpc FC=ifort F77=ifort F90=ifort CFLAGS="-O2 -fPIC" CXXFLAGS="-O2 -fPIC" FFLAGS="-O2 -fPIC" FCFLAGS="-O2 -fPIC" ./configure --prefix=${DIR}/hdf5/1.10.5 --with-zlib=${ZLIB} --enable-fortran --enable-hl --enable-static --enable-shared |& tee configure.log

make -j4 |& tee make.log
make check |& tee make_check.log
make install |& tee make_install.log

export HDF5=${DIR}/hdf5/1.10.5
export PATH=${HDF5}/bin:${PATH}
export LD_LIBRARY_PATH=${HDF5}/lib:${LD_LIBRARY_PATH}

ls -lh \
${HDF5}/lib/libhdf5.a \
${HDF5}/lib/libhdf5.so \
${HDF5}/lib/libhdf5_hl.a \
${HDF5}/lib/libhdf5_hl.so \
${HDF5}/lib/libhdf5_fortran.a \
${HDF5}/lib/libhdf5_fortran.so \
${HDF5}/include/hdf5.h

which h5cc
which h5fc
which h5dump

h5cc -showconfig | head -n 80

h5dump -V

3.5 # netcdf-c

cd ${DIR}

rm -rf netcdf-c-4.7.0
tar -xzf ${TARDIR}/netcdf-c-4.7.0.tar.gz

mkdir -p ${DIR}/netcdf/4.7.0
cd ${DIR}/netcdf-c-4.7.0

CC=icc CXX=icc FC=ifort CPP='icpc -E' CPPFLAGS="-fPIC -I${HDF5}/include -I${ZLIB}/include -I${CURL}/include" LDFLAGS="-L${HDF5}/lib -L${ZLIB}/lib -L${CURL}/lib" ./configure --prefix=${DIR}/netcdf/4.7.0 --enable-netcdf-4 --enable-static --enable-shared --disable-dap |& tee configure.log

make -j4 |& tee make.log
make check |& tee make_check.log
make install |& tee make_install.log

export NETCDF=${DIR}/netcdf/4.7.0
export PATH=${NETCDF}/bin:${PATH}
export LD_LIBRARY_PATH=${NETCDF}/lib:${LD_LIBRARY_PATH}

which nc-config
which ncdump

nc-config --version
nc-config --all
ncdump -version

ls -lh \
${NETCDF}/include/netcdf.h \
${NETCDF}/lib/libnetcdf.a \
${NETCDF}/lib/libnetcdf.so \
${NETCDF}/bin/nc-config \
${NETCDF}/bin/ncdump

3.6 # netcdf-fortran

cd ${DIR}

rm -rf ${DIR}/netcdf-fortran-4.4.5

tar -xzf ${TARDIR}/netcdf-fortran-4.4.5.tar.gz

cd ${DIR}/netcdf-fortran-4.4.5

export NETCDF=${DIR}/netcdf/4.7.0
export PATH=${NETCDF}/bin:${PATH}
export LD_LIBRARY_PATH=${NETCDF}/lib:${LD_LIBRARY_PATH}

which nc-config
nc-config --version
which ifort
which icc

注意这个版本的文件有问题,执行这个命令对第14行进行修正

sed -i '14c\ include "netcdf.inc"' nf_test/ftst_rengrps.F

CC=icc CXX=icc FC=ifort F77=ifort CPP='icpc -E' CPPFLAGS="-fPIC -I${NETCDF}/include" LDFLAGS="-L${NETCDF}/lib" LD_LIBRARY_PATH="${NETCDF}/lib:$LD_LIBRARY_PATH" ./configure --prefix=${NETCDF} --enable-static --enable-shared 2>&1 | tee configure.log

make -j4 2>&1 | tee make.log

make check 2>&1 | tee make_check.log

make install 2>&1 | tee make_install.log

which nf-config
nf-config --version
nf-config --all

ls -lh \
${NETCDF}/bin/nf-config \
${NETCDF}/lib/libnetcdff.a \
${NETCDF}/lib/libnetcdff.so \
${NETCDF}/include/netcdf.mod \
${NETCDF}/include/netcdf.inc

file ${NETCDF}/lib/libnetcdff.so.6.1.1
ldd ${NETCDF}/lib/libnetcdff.so

3.7 # ioapi

CMAQ安装教程(基于intel编译器) - 知乎https://zhuanlan.zhihu.com/p/710326443Intel编译器安装WRF-CMAQ-CSDN博客https://blog.csdn.net/weixin_55713760/article/details/120943523下载网址:wget ​​​​​​https://www.cmascenter.org/ioapi/download/ioapi-3.2.tar.gz

这里对文件进行了修改,适用多文件处理程序:ioapi-3.2-large

mkdir -p /data/home/gzq25_slurm/libraries/ioapi-3.2-large

tar -xzf /data/home/gzq25_slurm/libraries/tar_gz/ioapi-3.2-large.tar.gz -C /data/home/gzq25_slurm/libraries/ioapi-3.2-large

cd /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2

grep -nE 'MXFILE3|MXVARS3' \
ioapi/PARMS3.EXT \
ioapi/fixed_src/PARMS3.EXT \
ioapi/PARMS3-LARGE.EXT \
ioapi/parms3.h \
ioapi/parms3-large.h

INTEGER, PARAMETER :: MXFILE3 = 512 ! max number of open files
INTEGER, PARAMETER :: MXVARS3 =16384 ! max number of variables per file

export BIN=Linux2_x86_64ifort

mkdir Linux2_x86_64ifort

cd /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2

vi Makefile 修改如下

BIN = Linux2_x86_64ifort

VERSION = 3.2-${CPLMODE}

BASEDIR = /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2

NCFLIBS = -L/data/home/gzq25_slurm/libraries/netcdf/4.7.0/lib -lnetcdff -lnetcdf -L/data/home/gzq25_slurm/libraries/hdf5/1.10.5/lib -lhdf5_hl -lhdf5 -lhdf5hl_fortran -L/data/home/gzq25_slurm/libraries/zlib/1.2.11/lib -lz

IODIR = $(BASEDIR)/ioapi

FIXDIR = $(IODIR)/fixed_src

HTMLDIR = $(BASEDIR)/HTML

TOOLDIR = $(BASEDIR)/m3tools

OBJDIR = $(BASEDIR)/$(BIN)

INSTALL = /data/home/gzq25_slurm/libraries/ioapi

LIBINST = $(INSTALL)/$(BIN)

BININST = $(INSTALL)/$(BIN)

CPLMODE = nocpl

PVMINCL =

make configure

可以不再手动修改 ioapi/Makefile 和 m3tools/Makefile,可由make configure生成,

但需要手动修改ioapi/Makeinclude.Linux2_x86_64ifort

cd /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2/ioapi

vi Makefile

BASEDIR = /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2
INSTDIR = /data/home/gzq25_slurm/libraries/ioapi/${BIN}

IODIR = ${BASEDIR}/ioapi

# OBJDIR = ${IODIR}/../lib
# OBJDIR = ${IODIR}/../${BIN}
OBJDIR = ${BASEDIR}/${BIN}

FIXDIR = ${IODIR}/fixed_src

# Architecture dependent stuff

include /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2/ioapi/Makeinclude.$(BIN)

DEFINEFLAGS = $(ARCHFLAGS) $(PARFLAGS)
#DEFINEFLAGS = -DIOAPICPL=1 $(ARCHFLAGS) $(PARFLAGS)
#DEFINEFLAGS = -DIOAPI_PNCF=1 $(ARCHFLAGS) $(PARFLAGS)
#DEFINEFLAGS = -DIOAPI_NCF4=1 $(ARCHFLAGS) $(PARFLAGS)
#DEFINEFLAGS = -DIOAPI_PNCF=1 -DIOAPI_NCF4=1 $(ARCHFLAGS) $(PARFLAGS)

这个需要手动修改

vi Makeinclude.Linux2_x86_64ifort
# Version "$Id: Makeinclude.Linux2_x86_64ifort 1 2017-06-10 18:05:20Z coats $"
#
# Michael Bane (UManchester UK) reports that for ifort version 9,
# -stack_temps -safe_cray_ptr are not supported and that there are
# problems with "-unroll" without an unroll-count (bug reported
# to Intel)

AR = ar
CC = icc
CXX = icpc
FC = ifort -auto -warn notruncated_source -static-intel
M4 = m4
LINK = $(CC)

## Module-include-directory command
MODI = -I
E132 = -extend-source 132

# MFLAGS = -traceback # generic
# MFLAGS = -traceback -msse4.1 -xSSE4.1 # penryn
# MFLAGS = -traceback -mavx2 -xAVX -march=corei7-avx # SandyBridge
# MFLAGS = -traceback -mavx -xAVX2 -march=corei7-avx2 # Haswell
MFLAGS = -traceback -march=core-avx2

OMPFLAGS =
OMPLIBS =

#OMPFLAGS = -openmp # for Intel compilers, version 15 or earlier
#OMPLIBS = -openmp
# OMPFLAGS = -openmp -qopenmp
# OMPLIBS = -openmp -qopenmp -qopenmp-link=static -shared_intel

COPTFLAGS = -O3 ${MFLAGS}
FOPTFLAGS = -O3 -unroll -stack_temps -safe_cray_ptr \
-convert big_endian -assume byterecl ${MFLAGS}
FPPFLAGS = -DF90=1
FSFLAGS = -save
ARCHFLAGS = \
-DAUTO_ARRAYS=1 \
-DF90=1 -DFLDMN=1 \
-DFSTR_L=int \
-DIOAPI_NO_STDOUT=1 \
-DAVOID_FLUSH=1 -DBIT32=1
PARFLAGS =
ARCHLIB =
#ARCHLIB = -Bstatic

# M4DEFFILE = $(PVM_ROOT)/conf/$(PVM_ARCH).m4
# PVMLIBS = -L$(PVM_ROOT)/lib/$(PVM_ARCH) -lpvm3

PVMLIBS =

cd /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2/m3tools

vi Makefile

BASEDIR = /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2
SRCDIR = ${BASEDIR}/m3tools
IODIR = ${BASEDIR}/ioapi
OBJDIR = ${BASEDIR}/${BIN}
INSTDIR = /data/home/gzq25_slurm/libraries/ioapi/${BIN}

# Architecture dependent stuff
# Assumes FC is an f90

include /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2/ioapi/Makeinclude.${BIN}

FFLAGS = -I$(IODIR) ${MODI}$(OBJDIR) -DIOAPI_NCF4 $(ARCHFLAGS) $(PARFLAGS) $(FOPTFLAGS) $(ARCHFLAGS)

LDFLAGS = -I$(IODIR) $(DEFINEFLAGS) $(ARCHFLAGS)

# Incompatibility between netCDF versions before / after v4.1.1:
# For netCDF v4 and later, you may also need the extra libraries
# given by netCDF commands
#
# nc-config --libs
# nf-config --libs
#
# Cygwin libraries need "-lnetcdff.dll -lnetcdf.dll" below
#
LIBS = -L${OBJDIR} -lioapi -L/data/home/gzq25_slurm/libraries/netcdf/4.7.0/lib -lnetcdff -lnetcdf -L/data/home/gzq25_slurm/libraries/hdf5/1.10.5/lib -lhdf5_hl -lhdf5 -lhdf5hl_fortran -L/data/home/gzq25_slurm/libraries/zlib/1.2.11/lib -lz $(OMPLIBS) $(ARCHLIB) $(ARCHLIBS)
#LIBS = -L${OBJDIR} -lioapi -lnetcdf $(OMPLIBS) $(ARCHLIB) $(ARCHLIBS)

cd /data/home/gzq25_slurm/libraries/ioapi-3.2-large/ioapi-3.2

make configure
make all
make install
cp ioapi/fixed_src/* /data/home/gzq25_slurm/libraries/ioapi/fixed_src/