在Ubuntu上编译非静压模型NHWAVE

  • Post author:
  • Post category:其他


其实,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库

的方法有:


  1. 推荐

    直接用sudo apt-get install mpich 安装
  2. 去官网下载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

说明:

  1. prefix后的参数值即hypre库的安装地址;
  2. 在安装前请预先配置好安装地址,如新建好名为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


注意

  1. 第4行的EXEC值表示生成可执行文件的名字;上述Makefile中EXEC=nhwave,所以编译后生成的可执行文件的名称是nhwave。
  2. 第10~23行的各个FLAG对应了源代码中的不同模块、功能等;若要开启/实现某功能,请将对应一行前的 # 号字符删去。其中FLAG_1对应了模型的数值计算精度为双精度,FLAG_4和FLAG_5分别对应了盐度和温度模块。
  3. LIBS和INCS为hpyre库的安装地址,请按操作电脑的实际情况设置好地址;其中LIBS参数值最后的 ‘-lHYPRE‘ 请不要删去,修改好地址后仍需保留。
  4. 若选择Intel的Fortran编译器,需要将FLAG_9=-DINTEL前的#号删去。
  5. 第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)



版权声明:本文为weixin_42848392原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。