RTTOV v13.2 模型安装
一、RTTOV 背景介绍
RTTOV v13 是快速辐射传输模型的一个发展版本(最新已经更新到 v14 了,后续尽量持续更新),最初由 ECMWF(欧洲中期天气预报中心)在 1990 年代初期为电视红外观测卫星(Television InfraRed Observation Satellite,TIROS) 操作型垂直探测仪(TIROS Operational Vertical Sounder,TOVS)系统开发。此后,该模型经历了多次改进,近年来的发展主要在欧洲气象卫星开发组织(European Organisation for the Exploitation of Meteorological Satellites,EUMETSAT)的数值天气预报卫星应用设施(Numerical Weather Prediction Satellite Application Facility,NWP SAF)。
该模型能够快速模拟卫星紫外、可见光、红外或微波向下观测辐射计的辐亮度(在台式计算机上对 40 个通道的 ATOVS 模拟约需 1 毫秒),输入条件是一个包含温度、可变气体浓度、云和地表特性的大气廓线,称为 “状态向量”(state vector)。在 RTTOV v13 中,唯一必须的可变气体是水汽。其他气体如臭氧、二氧化碳、一氧化二氮、甲烷、一氧化碳和二氧化硫可以选择性地设为可变;所有未列出的气体则被视为恒定的。
二、模型安装
2.1 RTTOV 外部依赖库
首先,新建一个文件夹,用于放置各种外部依赖库。RTTOV 需要的外部库主要有 zlib、hdf5、netcdf (nc) 以及 lapack 库。
mkdir /wind1/home/yangzhy96/ExLibs # 新建文件放置外部依赖库
cd ExLibs
mkdir -p hdf5 nc lapack zlib # 防止后续 configure 过程不生成这些文件
2.1.1 安装 zlib 库
# 下载 zlib 库
wget https://www.zlib.net/fossils/zlib-1.2.11.tar.gz
# 解压缩
tar -zxvf zlib-1.2.11.tar.gz
# 将解压缩后的 zlib 转移至 ExLibs zlib 文件夹中
mv zlib-1.2.11 /wind1/home/yangzhy96/ExLibs/zlib/ # 更换成自己的路径
# 进入文件夹
cd /wind1/home/yangzhy96/ExLibs/zlib/zlib-1.2.11/
# 配置
./configure --prefix=/wind1/home/yangzhy96/ExLibs/zlib
# 编译
make
# 安装
make install
# 修改环境变量
vim ~/.bashrc
# 在 .bashrc 文件内添加如下语句:
# zlib
export ZLIB_HOME=/wind1/home/yangzhy96/ExLibs/zlib
export C_INCLUDE_PATH=$ZLIB_HOME/include:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=$ZLIB_HOME/lib:$LD_LIBRARY_PATH
export CPPFLAGS="-I$ZLIB_HOME/include $CPPFLAGS"
export LDFLAGS="-L$ZLIB_HOME/lib $LDFLAGS"
# 退出文件,并重新加载 .bashrc 文件
source ~/.bashrc
2.1.2 安装 hdf5 库
# 安装 hdf5
wget https://mirror.sobukus.de/files/src/hdf5/hdf5-1.10.1.tar.gz # 下载
tar -zxvf hdf5-1.10.1.tar.gz # 解压缩
mv hdf5-1.10.1 /wind1/home/yangzhy96/ExLibs/hdf5 # 移动
cd /wind1/home/yangzhy96/ExLibs/hdf5/hdf5-1.10.1/ # 进入文件夹
# 安装 hdf5 库需要依赖 zlib 库
# 其次要把 C++ 和 fortran 编译器全部打开 FC=gfortran CC=gcc --enable-fortran --enable-cxx,否者只会安装 c 库
# 在安装 RTTOV 的时候会报错找不到 hdf5.mod 文件
./configure --with-zlib=/wind1/home/yangzhy96/ExLibs/zlib --prefix=/wind1/home/yangzhy96/ExLibs/hdf5 FC=gfortran CC=gcc --enable-fortran --enable-cxx
make # 大部分 warning 可以忽略
make install # 只要 make install 不报错就可以
# 修改环境变量
vim ~/.bashrc
# 在 .bashrc 文件内添加如下语句:
# hdf5
export HDF5_HOME=/wind1/home/yangzhy96/ExLibs/hdf5
export PATH=$HDF5_HOME/bin:$PATH
export C_INCLUDE_PATH=$HDF5_HOME/include:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=$HDF5_HOME/lib:$LD_LIBRARY_PATH
export CPPFLAGS="-I$HDF5_HOME/include $CPPFLAGS"
export LDFLAGS="-L$HDF5_HOME/lib $LDFLAGS"
# 退出文件,并重新加载 .bashrc 文件
source ~/.bashrc
# 检验 hdf5 是否安装成功
h5cc -showconfig # 检查 hdf5 的版本
h5fc -showconfig # 检查 hdf5 的版本
检查结果如下:
注意:
- 在配置过程中不添加
FC=gfortran CC=gcc --enable-fortran --enable-cxx
则不会安装 Fortran 和 C++。
同时在安装 RTTOV 的时候会出现找不到 hdf5.mod 文件的报错:
- 在配置过程中添加
FC=gfortran CC=gcc --enable-fortran --enable-cxx
后:
在 hdf5 的头文件夹中也可以找到 hdf5.mod 文件:
使用tree -L 1 /wind1/home/yangzhy96/ExLibs/hdf5
命令检查文件结构:
2.1.3 安装 nc 库
在安装 nc 之前需要安装 m4 和 curl 库,因为学院服务器已经安装了,没有安装的可以参考这篇博客,在当前目录下进行安装。nc 库需要安装两部分:netCDF-C 和 netCDF-Fortran。
# 安装 netCDF-C
wget https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.7.4.tar.gz
tar -zxvf v4.7.4.tar.gz
mv netcdf-c-4.7.4 /wind1/home/yangzhy96/ExLibs/nc
cd /wind1/home/yangzhy96/ExLibs/nc/netcdf-c-4.7.4/
./configure --prefix=/wind1/home/yangzhy96/ExLibs/nc
make
make install
不报错,并出现下述字段表示安装成功:
# 修改环境变量
vim ~/.bashrc
# 在 .bashrc 文件内添加如下语句:
# nc
export NETCDF_HOME=/wind1/home/yangzhy96/ExLibs/nc
export PATH=$NETCDF_HOME/bin:$PATH
export C_INCLUDE_PATH=$NETCDF_HOME/include:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=$NETCDF_HOME/lib:$LD_LIBRARY_PATH
export CPPFLAGS="-I$NETCDF_HOME/include $CPPFLAGS"
export LDFLAGS="-L$NETCDF_HOME/lib $LDFLAGS"
# 退出文件,并重新加载 .bashrc 文件
source ~/.bashrc
# 检验 netcdf 是否安装成功
nc-config --all # 检查 netcdf 配置信息
检验结果如下:
# 安装 netCDF-Fortran
wget https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.5.3.tar.gz
tar -zxvf v4.5.3.tar.gz
mv netcdf-fortran-4.5.3 /wind1/home/yangzhy96/ExLibs/nc
cd /wind1/home/yangzhy96/ExLibs/nc/netcdf-fortran-4.5.3/
./configure --prefix=/wind1/home/yangzhy96/ExLibs/nc
make
make install
不报错,并出现下述字段表示安装成功:
# 检验 netcdf 是否安装成功
nf-config --all # 检查 netcdf 配置信息
检验结果如下:
2.1.4 安装 lapack 库
# 安装 lapack
wget https://github.com/Reference-LAPACK/lapack/archive/refs/tags/v3.10.1.tar.gz # 下载
tar -zxvf v3.10.1.tar.gz # 解压缩
mv lapack-3.10.1 /wind1/home/yangzhy96/ExLibs/lapack # 移动
cd /wind1/home/yangzhy96/ExLibs/lapack/lapack-3.10.1 # 进入文件夹
cp make.inc.example make.inc
# 修改 make.inc 文件中的变量,使用 -fPIC 选项
vim make.inc
CFLAGS = -O3 -fPIC
FFLAGS = -O2 -frecursive -fPIC
FFLAGS_NOOPT = -O0 -frecursive -fPIC
LDFLAGS = -fPIC
# 保存后退出 make.inc 文件
# 使用以下命令检查是否修改成功
grep '\-fPIC' make.inc
检查结果如下:
make.inc 文件修改结果如下:
如果编译 make.inc 文件的时候没有使用-fPIC
选项,在编译 rttov 会出现如下报错:
# 编译 BLAS CBLAS LAPACK LAPACKE 库
make blaslib
make cblaslib
make lapacklib # 此处编译时间较长,耐心等待
make lapackelib
# 检查编译后的静态库文件
ls *.a # 需要包含 libcblas.a liblapack.a liblapacke.a librefblas.a
# 新建文件夹 lib 和 include 放置编译后的库文件和头文件
mkdir -p /wind1/home/yangzhy96/ExLibs/lapack/lib
mkdir -p /wind1/home/yangzhy96/ExLibs/lapack/include
# 在 lapack-3.10.1 文件夹下,将库文件和头文件放到对应文件夹中
cp *.a ../lib
cp LAPACKE/include/*.h* ../include
cp CBLAS/include/*.h* ../include
# 修改环境变量
vim ~/.bashrc
# 在 .bashrc 文件内添加如下语句:
# lapack
export LAPACK_HOME=/wind1/home/yangzhy96/ExLibs/lapack
export C_INCLUDE_PATH=$LAPACK_HOME/include:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=$LAPACK_HOME/lib:$LD_LIBRARY_PATH
export CPPFLAGS="-I$LAPACK_HOME/include $CPPFLAGS"
export LDFLAGS="-L$LAPACK_HOME/lib $LDFLAGS"
# 退出文件,并重新加载 .bashrc 文件
source ~/.bashrc
所有外部依赖库的环境变量应该如下:
使用命令
tree -L 2 /wind1/home/yangzhy96/ExLibs
,查看安装的外部依赖库的目录结构:
2.2 安装 RTTOV
2.2.1 安装 RTTOV
在 RTTOV 官网下载 RTTOV v13.2。
# 回到用户名目录下
cd ~
# 在用目录下新建用于安装模型的文件夹
mkdir /wind1/home/yangzhy96/rttov13
cd rttov13
# 在 rttov13 文件夹下解压缩压缩包
tar -xvf rttov132.tar.xz
# 修改 build 文件夹下的 Makefile.local 文件
vim build/Makefile.local
# 修改 hdf5 路径
HDF5_PREFIX = /wind1/home/yangzhy96/ExLibs/hdf5
FFLAGS_HDF5 = -D_RTTOV_HDF $(FFLAG_MOD)$(HDF5_PREFIX)/include
LDFLAGS_HDF5 = -L$(HDF5_PREFIX)/lib -lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5
# 修改 nc 路径
NETCDF_PREFIX = /wind1/home/yangzhy96/ExLibs/nc
FFLAGS_NETCDF = -D_RTTOV_NETCDF -I$(NETCDF_PREFIX)/include
LDFLAGS_NETCDF = -L$(NETCDF_PREFIX)/lib -lnetcdff # 这里使用的是 4.2 版本之后的 nc 库
# 修改 lapack 路径
# 注意一定要将 lapack 静态库 -llapack
# 调整为 -llapacke -llapack -lcblas -lrefblas -lm -lgfortran 不要更换静态库的顺序
LAPACK_PREFIX = /wind1/home/yangzhy96/ExLibs/lapack
FFLAGS_LAPACK = $(FFLAG_MOD)$(LAPACK_PREFIX)/include
LDFLAGS_LAPACK = -L$(LAPACK_PREFIX)/lib -llapacke -llapack -lcblas -lrefblas -lm -lgfortran
Makefile.local 文件修改后如下:
如果不修改 lapack 静态库,即维持LDFLAGS_LAPACK = -L$(LAPACK_PREFIX)/lib -llapack
,则会出现未定义 dtrsm_、dgemm_ 和 idamax_ 等报错:
# 使用脚本执行编译
cd src
../build/rttov_compile.sh # 编译时间较长,耐心等候
这里 rttov 的安装路径为默认(在用户目录下),否则需要修改环境变量,指定 bin 等文件夹,编译过程的输入如下:
出现下列字段表示安装成功:
2.2.2 测试 RTTOV
# 使用 RTTOV 自带的测试模块测试 RTTOV 是否安装成功
cd ~/rttov13/rttov_test/
./test_rttov13.sh ARCH=gfortran
测试结果一切正常,说明 RTTOV 已经安装成功
三、注意事项
3.1 include 文件
include 文件中包含的是头文件(.h),用于向编译器声明函数的原型和接口信息,相当于函数和变量的 “说明书”。
3.2 lib 文件
lib 目录中存放的是库文件(如 .so 或 .a),包含函数的具体实现代码,程序在编译或运行时会调用这些库。它相当于一个执行具体任务的 “工具箱”。
3.3 LD_LIBRARY_PATH
动态库查找路径(Linker Dynamic Library Path,LD_LIBRARY_PATH)指定了程序运行时系统查找 .so 动态库的目录。
3.4 C_INCLUDE_PATH
C 语言头文件路径(C Header Include Path,C_INCLUDE_PATH)指定了在编译 C 程序时,编译器查找 .h 头文件的目录。
3.5 CPPFLAGS
C 预处理器参数(C PreProcessor Flags,CPPFLAGS)用于在编译前向编译器指定额外的头文件搜索路径或其他预处理相关选项。
3.6 LDFLAGS
链接器参数(Linker Flags,LDFLAGS)用于在链接阶段向链接器指定额外的库文件搜索路径或链接选项。
3.7 FFLAGS_HDF5
HDF5 的 Fortran 编译器标志(Fortran Compiler Flags for HDF5,FFLAGS_HDF5)作用是告诉 Fortran 编译器,在编译代码时,去 $(HDF5_PREFIX)/include 目录下查找与 HDF5 相关的头文件,并且启用 HDF5 特定的编译选项。