在Ubuntu上编译NHWAVE模型
其实,Win10用户也可以通过Windows系统应用——Ubuntu子系统上进行编译运行。有兴趣的朋友请到up主大佬的b站视频(
开源非静压波浪模型NHWAVE编译安装教程
)上了解更详细的内容。
NHWAVE模型
NHWAVE模型(Non-Hydrostatic Wave Model)由特拉华大学应用海岸研究中心开发,是基于不可压缩Navier-Stokes方程的水动力数学模型。该模型计算采用分步法,网格设置采用Kellor-Box格式,网格垂向采用σ坐标系。模型中包含各类常用的紊流模型。
数值离散采用Godunov型有限体积法和有限差分法,时间积分采用二阶龙格-库塔法计算。模型可模拟海浪近岸传播,且能考虑波浪破碎。此外,模型还能求解盐度、泥沙等对流扩散方程,能模拟物质在水流中的运输过程。
本人在NHWAVE原版源代码基础上,更新了
垂向网格分层指定等功能,被动示踪剂输移、温度场输入输出等
模块,有兴趣的朋友请上
我的GitHub
下载代码。
欢迎各位朋友对此提出指导意见;大家可以一起交流,共同进步!
编译准备
这里选择gfortran+MPICH2的配置,编译可并行的NHWAVE代码。
当然,也可以使用Intel的Fortran编译器进行编译(注意,在选择IVF时,要对Makefile的对应内容进行修改)。
源代码下载
NHWAVE开发组GitHub:
JimKirby / NHWAVE
.
Fortran编译器安装
以下以gfortran编译器为例进行说明。
首先执行以下命令:
sudo apt-get update
sudo apt-get install gcc-c++
sudo apt-get install gfortran
之后可通过以下指令查看gfortran是否安装成功
gfortran -v
MPICH库安装
安装MPICH库
的方法有:
-
推荐
直接用sudo apt-get install mpich 安装 - 去官网下载MPHICH,解压并编译安装
此处不再介绍方法2,仅考虑上述方法1;在安装完成后,用 mpich –version 检查mpich的版本。之后在终端中输入:
export PATH=/usr/bin:$PATH
上述语句大致意思就是修改.bashrc文件,并在最后一行添加上面那句命令。但是注意命令里的路径需要修改。
以添加环境变量。(附上Linux系统中
修改环境变量的教程
)
HYPRE库的安装
首先下载hypre库,我这里以hypre-2.0.0为例。
下载完成后解压压缩包,之后再终端中进入 …/hypre/src 文件夹;
之后再在终端中输入:
./configure --prefix=/mnt/f/NHWAVE/hypre
说明:
- prefix后的参数值即hypre库的安装地址;
- 在安装前请预先配置好安装地址,如新建好名为hypre的这一个文件夹。
在完成上述指令后,再在终端中输入
make install
之后等待安装成功。
编译代码
编辑Makefile文件
NHWAVE源代码的Makefile内容如下:
#-----------BEGIN MAKEFILE-------------------------------------------------
SHELL = /bin/sh
DEF_FLAGS = -P -F -C -traditional
EXEC = nhwave
#==========================================================================
#--------------------------------------------------------------------------
# PRECISION DEFAULT PRECISION: SINGLE
# UNCOMMENT TO SELECT DOUBLE PRECISION
#--------------------------------------------------------------------------
FLAG_1 = -DDOUBLE_PRECISION
FLAG_2 = -DPARALLEL
# FLAG_3 = -DLANDSLIDE
FLAG_4 = -DSALINITY
FLAG_5 = -DTEMPERATURE
# FLAG_6 = -DBUBBLE
# FLAG_7 = -DSEDIMENT
# FLAG_8 = -DVEGETATION
# FLAG_9 = -DINTEL
# FLAG_10 = -DBALANCE2D
# FLAG_11 = -DOBSTACLE
# FLAG_12 = -DTWOLAYERSLIDE
# FLAG_13 = -DCORALREEF
# FLAG_14 = -DPOROUSMEDIA
#--------------------------------------------------------------------------
# mpi defs
#--------------------------------------------------------------------------
CPP = /usr/bin/cpp
CPPFLAGS = $(DEF_FLAGS)
FC =mpif90
# FC = mpiifort
DEBFLGS =
OPT = #-g
LDFLAGS =-ffpe-summary='none'
CLIB =
#==========================================================================
FFLAGS = $(DEBFLGS) $(OPT)
MDEPFLAGS = --cpp --fext=f90 --file=-
RANLIB = ranlib
#--------------------------------------------------------------------------
# CAT Preprocessing Flags
#--------------------------------------------------------------------------
CPPARGS = $(CPPFLAGS) $(DEF_FLAGS) $(FLAG_1) $(FLAG_2) $(FLAG_3) \
$(FLAG_4) $(FLAG_5) $(FLAG_6) $(FLAG_7) $(FLAG_8) $(FLAG_9) \
$(FLAG_10) $(FLAG_11) $(FLAG_12) $(FLAG_13) $(FLAG_14)
#--------------------------------------------------------------------------
# Libraries
#--------------------------------------------------------------------------
LIBS = -L/mnt/f/NHWAVE/hypre/lib -lHYPRE
INCS = -L/mnt/f/NHWAVE/hypre/include
#--------------------------------------------------------------------------
# Preprocessing and Compilation Directives
#--------------------------------------------------------------------------
.SUFFIXES: .o .f90 .F .F90
.F.o:
$(CPP) $(CPPARGS) $*.F > $*.f90
$(FC) -c $(FFLAGS) $(INCS) $*.f90
# \rm $*.f90
#--------------------------------------------------------------------------
# NHWAVE Source Code.
#--------------------------------------------------------------------------
MODS = mod_global.F mod_util.F
MAIN = nhwave.F initialize.F two_layer_slide.F fluid_slide.F deformable_slide.F\
source_terms.F waves.F pressure.F
SRCS = $(MODS) $(MAIN)
OBJS = $(SRCS:.F=.o) nspcg.o
#--------------------------------------------------------------------------
# Linking Directives
#--------------------------------------------------------------------------
$(EXEC): $(OBJS)
$(FC) $(FFLAGS) $(LDFLAGS) -o $(EXEC) $(OBJS) $(LIBS)
#--------------------------------------------------------------------------
# Cleaning targets.
#--------------------------------------------------------------------------
clean:
/bin/rm -f *.o *.mod
clobber: clean
/bin/rm -f *.f90 *.o nhwave
注意
- 第4行的EXEC值表示生成可执行文件的名字;上述Makefile中EXEC=nhwave,所以编译后生成的可执行文件的名称是nhwave。
- 第10~23行的各个FLAG对应了源代码中的不同模块、功能等;若要开启/实现某功能,请将对应一行前的 # 号字符删去。其中FLAG_1对应了模型的数值计算精度为双精度,FLAG_4和FLAG_5分别对应了盐度和温度模块。
- LIBS和INCS为hpyre库的安装地址,请按操作电脑的实际情况设置好地址;其中LIBS参数值最后的 ‘-lHYPRE‘ 请不要删去,修改好地址后仍需保留。
- 若选择Intel的Fortran编译器,需要将FLAG_9=-DINTEL前的#号删去。
- 第27~34对应了一些编译器的选项;其中,CPP的值表示cpp编译器的路径,可在终端中用 ‘which cpp’ 查看cpp的路径;此外FC的值表示Fortran编译器的路径,若以上述内容进行配置,FC=mpif90,若采用了Intel的编译器,FC一般为mpiffort。
编译结果
进入NHWAVE源代码包的src文件夹,输入命令
make
进行编译。
编译过程中可能会多次出现Warning,但只要不出现Error,NHWAVE就能成功编译。
编译成功时,终端上会出现:
mpif90 -ffpe-summary='none' -o nhwave mod_global.o mod_util.o nhwave.o initialize.o two_layer_slide.o fluid_slide.o deformable_slide.o source_terms.o waves.o pressure.o nspcg.o -L/mnt/f/NHWAVE/hypre/lib -lHYPRE
然后,检查文件夹中是否生成了nhwave可执行文件。若文件夹中有nhwave,则编译过程结束,编译NHWAVE成功!
之后输入以下指令:
make clean
以清除编译过程中生成的一系列(如 .o、.mod等)中间文件。
最后,只要输入如下指令,即可运行nhwave:
mpirun -np 5 ./nhwave
(注:其中数字5为并行的计算核心数;若采用N_core核心并行,运行指令为:mpirun -np N_core ./nhwave)