WRF编译

近期需要用到气象预测软件WRF,这里记录一下下WRF软件的过程。目前由于电脑是Intel,所以后续均采用了Intel Oneapi带的编译器

这一部分主要参考了下面的链接:

Full WRF and WPS Installation Example (Intel) | WRF & MPAS-A Support Forum

依赖库编译

所有的依赖库均选择在一个指定的目录$HOME/WRF-OF/DEPS/dir,指定`export DIR=$HOME/WRF-OF/DEPS/dir,方便后续指定prefix。

Update 20241205: Arch Linux下还需要sudo pacman -Sy time

加载编译器和指定环境变量:

#!/bin/bash
module load mpi/latest compiler/latest

export DIR=$HOME/WRF-OF/DEPS/dir
export PATH=.:$DIR/bin:${PATH}
export LD_LIBRARY_PATH=$DIR/lib:$LD_LIBRARY_PATH
export JASPERLIB=$DIR/lib
export JASPERINC=$DIR/include
export NETCDF=$DIR

export CC=icx
export CXX=icpx
export F77=ifx
export FC=ifx
export F90=ifx

export CPP='icx -E'
export CXXCPP='icpx -E'

export CFLAGS='-O3 -xHost'
# add -Wstrict-prototypes for jasper 1.900.29
# export CFLAGS='-O3 -xHost -Wstrict-prototypes'
export CXXFLAGS='-O3 -xHost'
export FFLAGS='-O3 -xHost'
export LDFLAGS="-L$DIR/lib"
export CPPFLAGS="-I$DIR/include"

ZLIB

./configure --prefix=$DIR
make 
make install

HDF5

HDF5这里选择编译并行版本的

./configure --enable-fortran --enable-cxx --enable-parallel --prefix=$DIR --with-zlib=$DIR --enable-build-mode=production
make -j 6
make install

NETCDF

新版本的NETCDF需要先编译C版本的,才能编译Fortran版本的

NETCDF-C编译

./configure --prefix=${DIR} --disable-dap --enable-netcdf-4
make -j 6
make install

NETCDF-FORTRAN编译

/configure --prefix=$DIR --disable-dap
make -j 6
make install

LIBPNG编译

./configure --prefix=${DIR}
make
make install

JASPER编译

由于WPS的支持问题,请选择jasper-2.0.14

cd build
cmake -DCMAKE_INSTALL_PREFIX=$DIR ..
make 
make install

Update 2024.12.11: 采用jasper-1.900.29

export CFLAGS="$CFLAGS -Wstrict-prototypes"
./configure --prefix=$DIR
make -j 
make install

CDO编译

./configure --prefix=${DIR} --with-netcdf=$DIR
make -j 6
make install

WRF编译

对于使用Arch Linux和Intel 最新的DPC++h编译器,还需要手动更改一部分配置configure.wrf或者configure.wps

- 将DM_FC和DM_CC分别从mpif90和mpicc改成mpiifx和mpiicx
- 将cpp的路径/lib/cpp改为直接使用cpp调用

WRF本体编译

export NETCDF=$DIR
./clean -a # 清除上次的编译文件
./configure
./compile -j 6 em_real

WPS软件编译

export NETCDF=$DIR
# 手动指定jasper库位置,不然会找不到定义
export JASPERLIB=$DIR/lib
export JASPERINC=$DIR/include
./clean -a 
./configure
./compile

ARWPost编译

这个由于软件源码古早,编译的时候需要对configure.arwp配置文件进行修改:

export LDFLAGS="`nf-config --flibs`"
export FFLAGS="$FFLAGS -fallow-argument-mismatch"

测试案例的运行

目前是尝试分离合作方提供的测试案例(合作方提供的是WRF程序代码目录和案例配置文件混在一起的目录),这里简单梳理一下WRF运行一个案例,需要那些流程,文件,以及他们背后的含义。这里主要参考了官网教程

graph TD
subgraph "External data"
	A(Static Geographical Data) 
	C(Gridded Meteorological Data)
end
subgraph "WRF Preprocessing System"
    A --> B(geogrid)
    C --> D(ungrib)
    B --> E(metgrid)
    D --> E
end
subgraph "        WRF Model "
    E --> F(real)
    F --> G(wrf)
end

数据预处理

这一部分主要是使用WPS软件,使用的程序是:

geogrid.exe

  1. 下载地面数据
  2. 编辑namelist.wps文件中的&share&geogrid
  3. 运行geogrid.exe,生成每个domain对应的geo_em.dxx.nc格式文件

ungrib.exe

  1. 下载气象数据
  2. 链接正确的Vtable
# link the correct Vtable
ln -sf /path/to/WPS/ungrib/Variable_Tables/Vtable.GFS Vtable
  1. 链接处理脚本
ln -sf /path/to/WPS/link_grib.csh .
./link_grib.csh path_to_data
  1. 修改namelist.wps中的&share&ungrib部分,尤其注意以下的参数:start_date ; end_date ; interval_seconds ; prefix
  2. 运行ungrib.exe,生成相应的中间格式文件,格式为:_FILE:YYYY-MM-DD_hh_

metgrid.exe

  1. 编辑namelist.wps文件中的&share&metgrid部分
  2. 运行metgrid.exe生成模型文件met_em.d0X_.YYYY-MM-DD_hh_:00:00.nc,需要注意**metgrid.exe需要来自geogrid.exegeo_em.d_xx_.nc和来自ungrib.exeFILE:YYYY-MM-DD_hh**

至此,数据的预处理部分已经完成。下面将开始运行WRF程序进行计算。

WRF

运行WRF模型需要2步,首先是通过real.exe将上面的预处理文件变成wrf的输入文件。