模型运行所需文件
本博文介绍了三种模型运行的必须文件,包括编译模型时的Makefile文件、控制模型运行的参数文件(input.txt)以及其它所需的数据文件(如初始水深文件depth.txt)。
此外,本人在NHWAVE原版源代码基础上,更新了垂向网格分层百分比可指定、被动示踪剂输移、温度场输入输出等模块,并修正了植被水流模型中的一些BUG。有兴趣的朋友请上我的GitHub下载代码。
欢迎各位朋友对此提出指导意见;大家可以一起交流,共同进步!
Makefile文件
在编译NHWAVE模型的内容中,我们提到过这个Makefile文件。它控制着模型(代码)的编译,让使用者有选择地更改模型中的各项设定、启闭模型中的各项功能等。
以下,是一个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
其中有两个部分尤其重要。一是10 ~ 23行的FLAG部分,该部分控制着编译时各功能及各模块的启闭;二是63 ~ 70行的源代码文件部分,该部分指定了要编译的源文件。
对于一个makefile文件,我们要知道行首的#号代表“注释行”之意;所以,若某行行首有#号,则代表该行指令不起作用,即所对应功能/设定不会在编译过程中启动。如上述例子中的
# FLAG_3 = -DLANDSLIDE
上述语句表示了所对应的 滑坡体模块LANDSLID 不会在此编译中启用,故所生成模型不能进行滑坡体运动的模拟计算。对于10 ~ 23行的FLAG部分,它们所对应的含义如下
- FLAG_1 = -DDOUBLE_PRECISION:模型中各个数据按双精度的方式计算、存取;
- FLAG_2 = -DPARALLEL:并行功能(开启后才能实现代码并行);
- FLAG_3 = -DLANDSLIDE:滑坡体模块LANDSLID module;
- FLAG_4 = -DSALINITY:盐度模块SALINITY module;
- FLAG_5 = -DTEMPERATURE:温度模块TEMPERATURE module;
- FLAG_6 = -DBUBBLE:气泡运动模块BUBBLE module;
- FLAG_7 = -DSEDIMENT:泥沙输移模拟模块SEDIMENT module;
- FLAG_8 = -DVEGETATION:植被水流模拟模块VEGETATION module;
- FLAG_9 = -DINTEL:若要使用Intel系的Fortran编译器(如IVF),则要开启此项;
- FLAG_10 = -DBALANCE2D:在模拟过程中估计y方向动量平衡的计算模块;
- FLAG_11 = -DOBSTACLE:使用浸没边界法的考虑障碍物的水流模型;
- FLAG_12 = -DTWOLAYERSLIDE:双层滑坡体模型TWOLAYERSLIDE module;
- FLAG_13 = -DCORALREEF:珊瑚礁水流模型CORALREEF module;
- FLAG_14 = -DPOROUSMEDIA:多孔介质流动模型POROUSMEDIA module。
由于多数模块都是后继研究者不断加入的,所以它们的功能在NHWAVE源代码所附带的用户手册中暂未提及。但我们仍可以搜索相关论文进行学习。
如果想要学习、修改源代码,对makefile及各模块间关系的理解是不可或缺的。
以后有机会,我再来结合源代码,和大家一起学习里面的各个模块(希望以后的自己能填上这个坑)。
对于63 ~ 70行这部分,它指定了代码源文件。其中,MODS指定的文件都是模块源代码,不含任何子程序与函数;而MAIN指定了这些子程序及自定义函数的源代码文件,主程序在nhwave.F中。SRC为上述MODS和MAIN的集合。
OBJS中提及的nspcg表示NHWAVE所调用的基于非对称预处理共轭梯度法(Nonsymmetric Preconditioned Conjugate Gradient, NSPCG)的大型线性方程组求解库。该库在我们求解动水压力时候被调用(pressure.F)。
input.txt文件
input是模型运行的参数文件,所有的参数均需在该文件中给出。而且,在运行前,input.txt文件必须要和nhwave可执行文件在同一目录下。
在input文件中,每个参数的设定指令都独占一行,且行末不可添加额外的标点符号(如行末句号、分号等);基本格式如下所示:
! cell numbers
Mglob = 550
Nglob = 1
Kglob = 3
上述语句表明了模型在三个方向上的网格数配置。对于input文件中的各类参数,有些需要指定数字、有些需要指定逻辑值 T 或者 F。尤其要注意的是,对于指定数字的参数,要仔细分辨该参数是整数型还是浮点数型;若为浮点数型且指定的值没有小数部分,则务必在设定值后补上 .0,例如:
Yield_Stress = 10.0
在每个参数前,都有行首为感叹号的各个注释行,其内容简要说明了参数的意义;在修改参数前,务必好好阅读这些注释。input.txt中包含了所有模块的参数设定,而对于大多数模拟,我们不会启用所有的参数,所以不必担心未开启模块的相关参数值影响了当前的模拟计算;如果模型启动时提示,要给这些”无关“参数一个输入值,则给定一个类型合适的值即可。
由于input.txt中内容繁多,以后会结合模拟实例一起讲解。
其它输入文件
除了参数文件input.txt以外,还有个需要的文件是水深文件depth.txt。这个文件指定了每个网格的初始水深值,它的数据格式如下:
D(1,1) D(2,1) D(3,1) D(4,1) ... D(Mglob,1)
D(1,2) D(2,2) D(3,2) ...
. ...
. ...
. ...
D(1,Nglob) D(2,Nglob) D(3,Nglob) D(4,Nglob) ... D(Mglob,Nglob)
注意,其实depth.txt并非不可或缺;若在input文件中将ANA_BATHY 设定为T,则计算域中的水深设定为恒定值且无需depth.txt也可启动模型。但此时我们需要修改源代码(initialize.F)中的内容来实现这一恒定水深的指定。所以,为了方便,我习惯于将ANA_BATHY 设定为F,而将depth.txt作为启动模型的必须文件。
此外,如有需要,计算域中的初始水位、初始流速场、初始盐度和温度场、波浪参数等都可用相应的.txt数据文件给出。其数据给是类似depth.txt。