该项目将使用到三种编译器gcc,g++,gfortran
原因是:WRF-Hydro模型是使用Fortran语言开发的。而环境中对依赖库使用到了C、Fortran和C++。
which gcc
which g++
which gfortran
使用which来检查自己是否安装了相关的编译器。
没有返回结果的可以使用包管理器安装
apt-get install xxx
主要有三个依赖大项需要安装:MPI,Fortran netCDF,CMake
MPI:一种通信标准,相关依赖项用于实现mpi程序在多计算结点环境下的正确执行和高效通信
Fortran netCDF:Fortran接口,使得Fortran程序能够方便地使用NetCDF数据格式(一种能够高效组织多维数据的数据格式)
1、CMake好说,可以用包管理器简单搞定。
2、对于剩下的两个依赖项,主要步骤为
MPI依赖项的安装
wget https://www.mpich.org/static/downloads/4.2.2/mpich-4.2.2.tar.gz
tar zxvf mpich-4.2.2.tar.gz
cd mpich-4.2.2
./config --prefix=/xxx/mpich %检查编译是否满足编译条件,选择安装路径
xxx指安装mpich的路径,可以创建一个lib来存放依赖项。
网络下载的依赖项可能特别慢,可以通过远程连接或者先下好直接用U盘拷贝。
配置好后,编译+安装:
sudo make
make make install
修改环境变量,将生成的可执行目录的根目录添加进环境变量
vim ~/.bashrc
export PATH=xxx/mpich/bin:$PATH %这个xxx就是上面安装mpich的目录
#保存退出后
source ~/.bashrc #刷新环境变量
接着是Fortran netCDF依赖项的安装
安装该依赖项需要先后安装其他的小的依赖项,分别是zlib、hdf5、netcdf-c、netcdf-fortran
zlib用于提供无损高效的压缩和解压缩算法
hdf5是一种数据存储和管理库,能够实现大量数据、不同类型数据的处理,并提供封装使用接口。
netcdf-c提供一种组织管理多维数据的方法以高效处理科学数据。
netcdf-fortran同理于netcdf-c
依赖项的安装大同小异:下载、解压、检查编译环境、编译、安装、配置环境变量,本次直接下好依赖项的安装包,一口气传到虚拟机里开始安装。
zlib:
tar zxvf zlib-1.2.7.tar.gz
cd ./zlib-1.2.7
./configure --prefix=/xxx/zlib %同理于前面,都安装在lib目录下
make
make install
hdf5:
tar zxvf hdf5-1.12.2.tar.gz
cd ./hdf5-1.12.2
./configure --prefix=/xxx/hdf5 --with-zlib=/xxx/zlib --enable-fortran --enable-cxx
make
make install
vim ~/.bashrc
export PATH=/xxx/hdf5/bin:$PATH
export LD_LIBRARY_PATH=/xxx/hdf5/lib:$LD_LIBRARY_PATH
%第二个环境配置的路径,会让程序在运行时,会在该目录下寻找所需对应的动态链接库文件
这里出现过一些失败的情况,鉴于网上的经验分享,升级为最高版本就能解决了。
netcdf-c:
tar zxvf netcdf-4.4.1.1.tar.gz
cd ./netcdf-4.4.1.1
export LD_LIBRARY_PATH=/xxx/zlib/lib:/xxx/hdf5/lib:$LD_LIBRARY_PATH
export CPPFLAGS="-I/xxx/zlib/include -I/xxx/hdf5/include"
%包含了两个-I选项,分别指向zlib和HDF5的头文件目录。
export LDFLAGS="-L/xxx/zlib/lib -L/xxx/hdf5/lib"
%包含了两个-L选项,分别指向zlib和HDF5的库文件目录。
./configure --prefix=/xxx/netcdf --disable-dap--enable-netcdf4 --enable-shared
%禁用DAP,启用NetCDF-4格式,编译和安装共享库
make
make install
tar zxvf netcdf-fortran-4.4.4.tar.gz
cd ./netcdf-fortran-4.4.4
export LD_LIBRARY_PATH=/xxx/netcdf/lib:/xxx/zlib/lib:/xxx/hdf5/lib:$LD_LIBRARY_PATH
%将/xxx/netcdf/lib、/xxx/zlib/lib和/xxx/hdf5/lib这三个目录添加到LD_LIBRARY_PATH环境变量中,以便在运行时系统能够在这几个目录下搜索动态链接库
CPPFLAGS="-I/xxx/netcdf/include" LDFLAGS="-L/xxx/netcdf/lib"
%它告诉编译器在编译时包含/xxx/netcdf/include目录下的头文件
%它告诉链接器在链接时搜索/xxx/netcdf/lib目录下的库文件.
./configure --prefix=/xxx/netcdf
make
make install
添加环境变量:
vim ~/.bashrc
export NETCDF=/xxx/netcdf %设置环境变量NETCDF
export PATH=/xxx/netcdf/bin:$PATH
export LD_LIBRARY_PATH=/xxx/netcdf/lib:$LD_LIBRARY_PATH
source ~/.bashrc
tar zxfv wrf_hydro_nwm_public-5.2.0.tar.gz
cd wrf_hydro_nwm_public-5.2.0/trunk/NDHMS
cp template/setEnvar.sh ./ %复制该环境变量至当前目录
vim setEnvar.sh %进入该环境变量添加:
export WRFIO_NCD_LARGE_FILE_SUPPORT=1
%刷新,检查并编译
source setEnvar.sh
./configure
./compile_offline_NoahMP.sh setEnvar.sh
出现:
编译成功,生成可执行文件,在RUN目录下可以找到对应的可执行文件
下载测试数据包https://github.com/NCAR/wrf_hydro_nwm_public/releases/download/v5.2.0/croton_NY_training_example_v5.2.tar.gz
并对其进行解压,将其存放在xx(xxx目录即lib目录的父目录下)
wget https://github.com/NCAR/wrf_hydro_nwm_public/releases/download/v5.2.0/croton_NY_training_example_v5.2.tar.gz
tar zxvf croton_NY_training_example_v5.2.tar.gz
在xxx的父目录(假设为xx,比lib少了个x)下创建测试数据存放目录
mkdir example_case && cd example_case
mkdir NWM
mkdir FORCING
mkdir Gridded_no_lakes
mkdir Reach
mkdir supplemental
mkdir Gridded && cd Gridded
mkdir DOMAIN
mkdir RESTART
cp -r example_case/FORCING/ /xx/example_case/Gridded
cp -r example_case/NWM/DOMAIN /xx/example_case/Gridded
cp -r example_case/NWM/RESTART /xx/example_case/Gridded
cp -r example_case/NWM/nudgingTimeSliceObs/ /xx/example_case/Gridded
cp -r example_case/NWM/namelist.hrldas /xx/example_case/Gridded
cp -r example_case/NWM/hydro.namelist /xx/example_case/Gridded
在之前的run目录下,将所有TBL文件和wrf_hydro.exe这个可执行文件copy到Gridded文件夹
cd xx
cp wrf_hydro_nwm_public-5.2.0/trunk/NDHMS/Run/*.TBL example_case/Gridded
cp wrf_hydro_nwm_public-5.2.0/trunk/NDHMS/Run/wrf_hydro.exe example_case/Gridded
运行:
cd ~/wrf/example_case/Gridded
mpirun -np 2 ./wrf_hydro.exe
%启用并行程序,指定处理器数量
tail -1 diag_hydro.00000
%显示文件 diag_hydro.00000 的最后一行内容即:
%The model finished successfully.......
将里面所有需要刷新的内容打包成一个脚本就不用一个个刷新了,每次开启就运行该脚本:
%netcdf-c:
export LD_LIBRARY_PATH=/xxx/zlib/lib:/xxx/hdf5/lib:$LD_LIBRARY_PATH
export CPPFLAGS="-I/xxx/zlib/include -I/xxx/hdf5/include"
export LDFLAGS="-L/xxx/zlib/lib -L/xxx/hdf5/lib"
%netcdf-fortran:
export LD_LIBRARY_PATH=/xxx/netcdf/lib:/xxx/zlib/lib:/xxx/hdf5/lib:$LD_LIBRARY_PATH
CPPFLAGS="-I/xxx/netcdf/include" LDFLAGS="-L/xxx/netcdf/lib"
wrf-hydro环境部署