华为云计算 云知识 什么是FVCOM
什么是FVCOM

简介

FVCOM是无结构三角形网格架构、有限体积、自由表面、三维原始方程海洋数值模型,包含了多种物理、水质、生态计算模块。FVCOM模型输入输出基于标准化NETCDF格式,具有平台通用兼容性,并能使用VISIT可视化软件是输入输出结构进行快速二维/三维可视化。该模型基于Fortran 90/95标准,且在MPI(Message Passing Interface)的框架下实现计算并行化,可以在共享内存及分布式内存多计算节点的 高性能计算 机上实现并行快速模拟。

配置流程

1.获取源代码和测试数据

本文档所测试版本为:FVCOM v4.1

软件获取路径为:官网注册申请,获取授权后下载

FVCOM官网:http://fvcom.smast.umassd.edu/

METIS组件补丁包下载地址:https://www.math-linux.com/IMG/patch/metis-4.0.patch

本文以FVCOM v4.1为例,编译安装FVCOM。

1)执行以下步骤获取主程序源码:

通过官方网址注册(http://fvcom.smast.umassd.edu/wp-login.php?action=register)

注册成功后登陆(http://fvcom.smast.umassd.edu/wp-login.php)

点击下图红框链接

访问受限

获取授权后可通过如下方式执行主程序和补丁包文件下载:

wget http://fvcom.smast.umassd.edu/releases/fvcom-4.1.tar.gz
wget https://www.math-linux.com/IMG/patch/metis-4.0.patch

2.基础环境安装

1)执行如下命令,安装必要的系统组件

yum install-y curl-devel libcurl-devel zlib-devel

2)执行如下命令下载基础环境软件包

wget https://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc-9.1.0.tar.gz
wget https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.4.tar.gz
wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.5/src/hdf5-1.10.5.tar.gz
wget ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-c-4.7.0.tar.gz
wget ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-fortran-4.4.5.tar.gz

3)依次执行如下命令升级安装最新版gcc编译器(当前为gcc v9.1.0)

tar-zxvf gcc-9.1.0.tar.gz
cd gcc-9.1.0
./contrib/download_prerequisites
./configure--prefix=/usr/local/gcc/9.1.0
make-j 4
make install
cd-

4)依次执行如下命令安装并行库OpenMPI(v3.1.4)

export GCC_HOME=/usr/local/gcc/9.1.0/
export PATH=$GCC_HOME/bin:$PATH
export LD_LIBRARY_PATH=$GCC_HOME/lib:$GCC_HOME/lib64:$LD_LIBRARY_PATH
export INCLUDE=$GCC_HOME/include:$INCLUDE
tar-zxvf openmpi-3.1.4.tar.gz
cd openmpi-3.1.4
./configure--prefix=/usr/local/openmpi3--enable-orterun-prefix-by-default
make-j 4
make install
cd-

5)依次执行如下命令安装数据格式库HDF5(v1.10.5)

export MPI_HOME=/usr/local/openmpi3
export PATH=$MPI_HOME/bin:$PATH
export LD_LIBRARY_PATH=$MPI_HOME/lib:$LD_LIBRARY_PATH
export INCLUDE=$MPI_HOME/include:$INCLUDE
tar-zxvf hdf5-1.10.5.tar.gz
cd hdf5-1.10.5
./configure--prefix=/usr/local//hdf5--enable-fortran--enable-parallel CC=mpicc FC=mpif90 CXX=mpicxx
make-j 4
make install
cd-

6)依次执行如下命令安装数据格式库NetCDF(v4.x.x)

export HDF5=/usr/local/hdf5
export PATH=$HDF5/bin:$PATH
export LD_LIBRARY_PATH=$HDF5/lib:$LD_LIBRARY_PATH
export INCLUDE=$HDF5/include:$INCLUDE
tar-zxvf netcdf-c-4.7.0.tar.gz
cd netcdf-c-4.7.0
./configure--prefix=/usr/local/netcdf LDFLAGS="-L$HDF5/lib"CPPFLAGS="-I$HDF5/include"CC=mpicc--disable-dap
make-j 4
make install
cd-
export NETCDF=/usr/local/netcdf
export PATH=$NETCDF/bin:$PATH
export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH
export INCLUDE=$NETCDF/include:$INCLUDE
tar-zxvf netcdf-fortran-4.4.5.tar.gz
cd netcdf-fortran-4.4.5
./configure--prefix=/usr/local/netcdf CPPFLAGS="-I$HDF5/include-I$NETCDF/include"LDFLAGS="-L$HDF5/lib-L$NETCDF/lib"CC=mpicc FC=mpif90 F77=mpif90
make-j 4
make install
cd-

3.主程序安装

1)依次执行如下命令,创建主程序安装目录,并解压缩FVCOM源码和METIS组件补丁至安装目录

mkdir-p/usr/local/fvcom
tar xvf fvcom-4.1.tar.gz-C/usr/local/fvcom
cp metis-4.0.patch/usr/local/fvcom/FVCOM4.1/METIS_source/

2)依次使用如下命令,创建依赖组件环境变量加载脚本

vim/usr/local/fvcom/env-fvcom.sh

依次输入如下行:

export GCC_HOME=/usr/local/gcc/9.1.0/
export PATH=$GCC_HOME/bin:$PATH
export LD_LIBRARY_PATH=$GCC_HOME/lib:$GCC_HOME/lib64:$LD_LIBRARY_PATH
export INCLUDE=$GCC_HOME/include:$INCLUDE
export MPI_HOME=/usr/local/openmpi3
export PATH=$MPI_HOME/bin:$PATH
export LD_LIBRARY_PATH=$MPI_HOME/lib:$LD_LIBRARY_PATH
export INCLUDE=$MPI_HOME/include:$INCLUDE
export HDF5=/usr/local/hdf5
export PATH=$HDF5/bin:$PATH
export LD_LIBRARY_PATH=$HDF5/lib:$LD_LIBRARY_PATH
export INCLUDE=$HDF5/include:$INCLUDE
export NETCDF=/usr/local/netcdf
export PATH=$NETCDF/bin:$PATH
export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH
export INCLUDE=$NETCDF/include:$INCLUDE

保存并退出vim。

3)依次执行如下命令,进入安装目录并配置相关文件

cd/usr/local/fvcom/FVCOM4.1
cp Examples/Estuary/make.inc_example FVCOM_source/make.inc
ln-sf FVCOM_source/make.inc./
vim make.inc

修改TOPDIR变量值为源码目录,注意行尾不能出现空格,如:

TOPDIR=/usr/local/fvcom/FVCOM4.1/FVCOM_source

修改“#LOCAL INSTAL”行下边的“LIBDIR”和“INCDIR”变量值,如:

#LOCAL INSTAL
LIBDIR=-L$(INSTALLDIR)/lib-L../METIS_source/metis-L./libs/julian
INCDIR=-I$(INSTALLDIR)/include-I../METIS_source/metis-I./libs/julian

完善“IOLIBS”和“IOINCS”变量中HDF5和NetCDF的路径,如:

IOLIBS=-L/usr/local/netcdf/lib-L/usr/local/hdf5/lib-lnetcdff-lnetcdf-lhdf5_hl-lhdf5-lz-lcurl-lm
IOINCS=-I/usr/local/netcdf/include-I/usr/local/hdf5/include

注释“Intel/MPI Compiler Definitions(SMAST)”段落变量,如:

#Intel/MPI Compiler Definitions(SMAST)
#--------------------------------------------------------------------------
#CPP=/usr/bin/cpp
#COMPILER=-DIFORT
#CC=mpicc
#CXX=mpicxx
#CFLAGS=-O3
#FC=mpif90
#DEBFLGS=-check all–traceback
#Use'OPT=-O0-g'for fast compile to test the make
#Use'OPT=-xP'for fast run on em64t(Hydra and Guppy)
#Use'OPT=-xN'for fast run on ia32(Salmon and Minke)
#OPT=-O0–g
#OPT=-axN–xN
#OPT=-O3

在下方编辑和增加“gfortran defs”段落相关变量,如:

#gfortran defs
#--------------------------------------------------------------------------
CPP=/usr/bin/cpp
COMPILER=-DGFORTRAN
CC=mpicc
CXX=mpicxx
FC=mpif90
DEBFLGS=
OPT=-O3
CLIB=

保存并退出vim。

4)依次执行如下命令,编译METIS库

cd./METIS_source
tar-zxvf metis.tgz
cd metis
patch-p2<../metis-4.0.patch
source/usr/local/fvcom/env-fvcom.sh
make

5)依次执行如下命令,编译julian库

cd../../FVCOM_source/libs
tar-zxvf julian.tgz
cd julian
make

6)依次执行如下命令,编译FVCOM主程序

cd../../
make

编译过程中可能出现错误,解决方法详见下文“已知问题汇总”节。

正确编译完成后,当前目录下生成FVCOM可执行程序“fvcom”。

4.测试

1)依次执行如下命令,创建测试目录,进入测试目录,复制测试算例

mkdir-p/usr/local/fvcom/test
cd/usr/local/fvcom/test
cp-r/usr/local/fvcom/FVCOM4.1/Examples/Estuary/./

2)依次执行如下命令,进入运行目录,编辑算例输入文件

cd./Estuary/run
vim tst_run.nml

为“tst_grd.dat”增加单引号,如

GRID_FILE='tst_grd.dat'

保存并退出vim。

3)依次执行如下命令,执行测试

source/usr/local/fvcom/env-fvcom.sh
mpirun-n 4--allow-run-as-root/usr/local/fvcom/FVCOM4.1/FVCOM_source/fvcom--casename=tst

正确执行完成后,当前目录下生成计算结果,如下:

已知问题汇总

问题现象1

编译FVCOM主程序出现如下错误:

mod_newinp.f90:354:20:
write(*,'(A20,<size>F10.4)')trim(argname)//':',fval(1:SIZE)
1
Error:Unexpected element‘<’in format string at(1)

问题原因

write语句中的“<变量>”表示不被识别。

问题解决

1)编辑mod_newinp.F文件,在第一个“contains”语句(第)之后添加N_Fmt函数,如下

!----------------------------------------
!functions
!----------------------------------------
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

2)修改报错语句

共需修改4处,。具体如下:

第一处(约第354行):

修改前:write(*,'(A20,<size>F10.4)')trim(argname)//':',fval(1:SIZE)

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

第二处(约第423行)修改为:

修改前:write(*,'(A20,<size>I10)')trim(argname)//':',ival(1:SIZE)

修改后:write(*,N_Fmt('(A20,<size>I10)',SIZE))trim(argname)//':',ival(1:SIZE)

第三处(约第496行)修改为:

修改前:write(*,'(A20,<size>L10)')trim(argname)//':',cval(1:SIZE)

修改后:write(*,N_Fmt('(A20,<size>L10)',SIZE))trim(argname)//':',cval(1:SIZE)

第四处(约第569行)修改为:

修改前:write(*,'(A20,<size>A10)')trim(argname)//':',sval(1:SIZE)

修改后:write(*,N_Fmt('(A20,<size>A10)',SIZE))trim(argname)//':',sval(1:SIZE)

修改完成后,继续编译。

问题现象2

编译FVCOM主程序出现如下错误:

mod_scal.f90:184:12:
IF(BACKWARD_ADVECTION/=.TRUE.)THEN
1
Error:Logicals at(1)must be compared with.neqv.instead of/=

问题原因

对逻辑值进行比较时,符号错误,“==”应为“.eqv.”、“/=”应为“.neqv.”的问题。

问题解决

编辑mod_scal.F、internal_step.F、adv_t.F、adv_s.F文件,对文件中以“IF(BACKWARD_ADVECTION”开头的语句进行相应修改,修改“==”为“.eqv.”,修改“/=”为“.neqv.”,注意符号“.”。可通过如下命令快速修改:

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

修改完成后,继续编译。

问题现象3

编译FVCOM主程序出现如下错误:

mod_esmf_nesting.f90:305:132:
IF(NEST_NUM/=NEST_NUM_CELL)CALL FATAL_ERROR("THE NUMBER OF NESTING NODE FILES MUST EQUAL TO THE NUMBER OF NESTING CELL FILES!")
1
Error:Line truncated at(1)[-Werror=line-truncation]

问题原因

Fortran语句超长但未截断。

问题解决

根据报错信息,分别修改mod_esmf_nesting.F、adv_t.F、adv_s.F等文件,超过132个字符的行,使用“&”符号进行截断,即截断尾加“&”符号,被截断的下一行首加“&”符号,如:

截断前:

截断后:

修改完成后,继续编译。

 

上一篇:内容分发网络CDN:提升网络响应速度 下一篇:恢复云手机数据BatchImportCloudPhoneData