FVCOM编译&测试

FVCOM编译&测试

FVCOM介绍:

FVCOM 是由 UMASSD-WHOI 联合开发的预测性、非结构化网格、有限体积、自由表面、3-D 原始方程沿海海洋环流模型。该模型由动量、连续性、温度、盐度和密度方程组成,并使用湍流闭合子模型进行物理和数学闭合。水平网格由非结构化三角形单元组成,不规则底部使用广义地形跟踪坐标呈现。由德国 Burchard 研究小组(Burchard,2002 年)开发的通用海洋湍流模型 (GOTM) 已添加到 FVCOM 中,以提供可选的垂直湍流闭合方案。FVCOM 是通过在非结构化三角形网格上以控制方程的积分形式进行的二阶精确离散通量计算来数值求解的。这种方法结合了有限元方法(网格灵活性)和有限差分方法(数值效率和代码简单性)的最佳特性,并提供了更好的局部和全局动量、质量、盐、热和示踪剂守恒的数值表示. 除了非结构化网格提供的拓扑灵活性和编码结构的简单性之外,FVCOM 准确求解标量守恒方程的能力使 FVCOM 非常适合许多沿海和跨学科科学应用。

编译前准备

安装HDF5

源码地址为https://s3.amazonaws.com/hdf-wordpress-1/wp-content/uploads/manual/HDF5/HDF5_1_10_5/source/hdf5-1.10.5.tar.gz,使用wget下载并解压源码

1
2
3
wget https://s3.amazonaws.com/hdf-wordpress-1/wp-content/uploads/manual/HDF5/HDF5_1_10_5/source/hdf5-1.10.5.tar.gz
tar -xvf hdf5-1.10.5.tar.gz
cd hdf5-1.10.5

执行以下命令进行配置、编译及安装

1
2
3
./configure --prefix=/path/to/install/HDF5 --enable-fortran --enable-parallel CC=mpicc FC=mpif90 CXX=mpicxx
make -j
make install

安装NetCDF-C

在安装NetCDF-C时,使用4.7.0版本的安装包报错,在GitHub上查到issue,更换最新版本解决

1
2
checking whether byte range support is enabled... no
configure: error: curl required for byte range support. Install curl or build without --enable-byterange.

源码地址为https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.8.1.tar.gz,使用wget下载并解压源码

1
2
3
wget https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.8.1.tar.gz
tar -zxvf netcdf-c-4.8.1.tar.gz
cd netcdf-c-4.8.1

执行以下命令进行配置、编译及安装

1
2
3
./configure --prefix=/path/to/NETCDF LDFLAGS="-L$HDF5/lib" CPPFLAGS="-I$HDF5/include" CC=mpicc --disable-dap
make -j
make install

编辑环境变量

1
2
3
4
vim ~/.bashrc
export PATH="/path/to/NETCDF/bin:$PATH"
export LD_LIBRARY_PATH="/path/to/NETCDF/lib:$LD_LIBRARY_PATH "
export NETCDF="/path/to/NETCDF"

安装NetCDF-Fortran

源码地址为https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.5.4.tar.gz,使用wget下载并解压

1
2
3
wget https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.5.4.tar.gz
tar -xzvf netcdf-fortran-4.5.4.tar.gz
cd netcdf-fortran-4.5.4.tar.gz

执行以下命令进行配置

1
2
3
./configure --prefix=/path/to/NETCDF CPPFLAGS="-I$HDF5/include -I$NETCDF/include" LDFLAGS="-L$HDF5/lib -L$NETCDF/lib" CC=mpicc FC=mpif90 F77=mpif90
make -j
make install

编译FVCOM主程序

获取安装包

源码地址为http://fvcom.smast.umassd.edu/releases/fvcom-4.1.tar.gz,将其下载到本地并解压

1
2
3
4
wget http://fvcom.smast.umassd.edu/releases/fvcom-4.1.tar.gz
mv fvcom-4.1.tar.gz /path/to/FVCOM
tar -xzvf fvcom-4.1.tar.gz
cd FVCOM4.1

配置

若要使用Estuary算例,则使用Examples/Estuary/make.inc_example;若要使用Inlet算例,则应使用Examples/Inlets/make.inc_example,在确认样例之后,将所选的模版文件复制到FVCOM_source之下.

1
2
3
4
5
# 复制模版文件(以Estuary为例)
cp Examples/Estuary/make.inc_example FVCOM_source/make.inc

# 创建软连接
ln -sf FVCOM_source/make.inc ./

编辑make.inc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
############
# make.inc #
############

######################################################################################
# TOPDIR = /path/to/FVCOM/FVCOM4.1/FVCOM_source
51 TOPDIR = /es01/yeesuan/yeesuan003/lhxone-test/software/FVCOM/FVCOM4.1/FVCOM_source

######################################################################################

79 LIBDIR = -L$(INSTALLDIR)/lib -L../METIS_source/metis -L./libs/julian
80 INCDIR = -I$(INSTALLDIR)/include -I../METIS_source/metis -I./libs/julia

######################################################################################

97 IOLIBS = -L/es01/yeesuan/yeesuan003/lhxone-test/software/NETCDF/lib -L/es01/yeesuan/yeesuan003/lhxone-test/software/HDF5/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lz -lm

######################################################################################

532 #--------------------------------------------------------------------------
533 # Intel/MPI Compiler Definitions (SMAST)
534 #--------------------------------------------------------------------------
535 CPP = /usr/bin/cpp
536 COMPILER = -DIFORT
537 CC = mpiicc
538 CXX = mpiicpc
539 CFLAGS = -O3
540 FC = mpiifort

编译Metis库

执行以下命令编译metis库

1
2
3
4
5
6
7
8
cd /path/to//FVCOM/FVCOM4.1/METIS_source
tar -zxvf metis.tgz
cd metis
mkdir -p /path/to/FVCOM/FVCOM4.1/FVCOM_source/libs/install/lib
mkdir -p /path/to/FVCOM/FVCOM4.1/FVCOM_source/libs/install/include
mkdir -p /path/to/FVCOM/FVCOM4.1/FVCOM_source/libs/install/bin
make -j
make install

编译julian库

执行以下命令编译julian库

1
2
3
4
5
cd /path/to/FVCOM4.1/FVCOM_source/libs
tar -zxvf julian.tgz
cd julian
make -j
make install

安装主程序

执行以下命令以编译安装FVCOM主程序

1
2
3
4
5
6
cd  /path/to/FVCOM/FVCOM4.1/FVCOM_source
vim swmod2.F
# 修改104行内容
104 !!!!$OMP& KM_WAM, KM01, SIGM_10, SIGM01)
:wq!
vim mod_newinp.F

mod_newinp.F中修改如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
! 第一个"contains"语句添加如下内容。
! line_50
contains
Character(Len=256) Function N_Fmt(c, n)
Character(Len=*), Intent(IN) :: c
Integer, Intent(IN) :: n
integer :: i, j
character(len=16) :: cn
i = index(c, '<')
j = index(c, '>')
write (cn, '(g0)') n
N_Fmt = c(:i - 1)//Trim(adjustL(cn))//c(j + 1:)
End Function N_Fmt

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

! line_352
write(*,N_Fmt('(A20,<size>F10.4)',SIZE))trim(argname)//': ',fval(1:SIZE)

! line_421
write(*,N_Fmt('(A20,<size>I10)',SIZE))trim(argname)//': ',ival(1:SIZE)

! line_494
write(*,N_Fmt('(A20,<size>L10)',SIZE))trim(argname)//': ',cval(1:SIZE)

! line_567
write(*,N_Fmt('(A20,<size>A10)',SIZE))trim(argname)//': ',sval(1:SIZE)

执行以下命令以修改“==”为“.eqv.”,修改“/=”为“.neqv”

1
2
3
4
sed -i 's/\/=\.TRUE\./\.neqv\.\.TRUE\./g' mod_scal.F
sed -i 's/==\.TRUE/\.eqv\.\.TRUE/g' internal_step.F
sed -i 's/==\.FALSE\./\.eqv\.\.FALSE\./g' adv_t.F
sed -i 's/==\.FALSE\./\.eqv\.\.FALSE\./g' adv_s.F

修改完成后执行make命令,即可在当前目录下看到fvcom

1
2
3
make
find fvcom
fvcom

测试运算

复制算例到测试目录

1
2
3
4
mkdir -p /path/to/FVCOM/test
cd /path/to/FVCOM/test
cp cp -r /path/to/FVCOM/FVCOM4.1/Examples/Estuary/ ./
cd Estuary/run

运行算例

1
2
# 在当前目录下生成tst_0001.nc结果文件
mpirun -n 24 --bind-to core /path/to/fvcom --casename=tst