什么是FVCOM

簡(jiǎn)介

FVCOM是無結(jié)構(gòu)三角形網(wǎng)格架構(gòu)、有限體積、自由表面、三維原始方程海洋數(shù)值模型,包含了多種物理、水質(zhì)、生態(tài)計(jì)算模塊。FVCOM模型輸入輸出基于標(biāo)準(zhǔn)化NETCDF格式,具有平臺(tái)通用兼容性,并能使用VISIT可視化軟件是輸入輸出結(jié)構(gòu)進(jìn)行快速二維/三維可視化。該模型基于Fortran 90/95標(biāo)準(zhǔn),且在MPI(Message Passing Interface)的框架下實(shí)現(xiàn)計(jì)算并行化,可以在共享內(nèi)存及分布式內(nèi)存多計(jì)算節(jié)點(diǎn)的高性能計(jì)算機(jī)上實(shí)現(xiàn)并行快速模擬。

配置流程

1.獲取源代碼和測(cè)試數(shù)據(jù)

本文檔所測(cè)試版本為:FVCOM v4.1

軟件獲取路徑為:官網(wǎng)注冊(cè)申請(qǐng),獲取授權(quán)后下載

FVCOM官網(wǎng):http://fvcom.smast.umassd.edu/

METIS組件補(bǔ)丁包下載地址:https://www.math-linux.com/IMG/patch/metis-4.0.patch

本文以FVCOM v4.1為例,編譯安裝FVCOM。

1)執(zhí)行以下步驟獲取主程序源碼:

通過官方網(wǎng)址注冊(cè)(http://fvcom.smast.umassd.edu/wp-login.php?action=register)

注冊(cè)成功后登陸(http://fvcom.smast.umassd.edu/wp-login.php)

點(diǎn)擊下圖紅框鏈接

訪問受限

獲取授權(quán)后可通過如下方式執(zhí)行主程序和補(bǔ)丁包文件下載:

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.基礎(chǔ)環(huán)境安裝

1)執(zhí)行如下命令,安裝必要的系統(tǒng)組件

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

2)執(zhí)行如下命令下載基礎(chǔ)環(huán)境軟件包

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)依次執(zhí)行如下命令升級(jí)安裝最新版gcc編譯器(當(dāng)前為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)依次執(zhí)行如下命令安裝并行庫(kù)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)依次執(zhí)行如下命令安裝數(shù)據(jù)格式庫(kù)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)依次執(zhí)行如下命令安裝數(shù)據(jù)格式庫(kù)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)依次執(zhí)行如下命令,創(chuàng)建主程序安裝目錄,并解壓縮FVCOM源碼和METIS組件補(bǔ)丁至安裝目錄

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)依次使用如下命令,創(chuàng)建依賴組件環(huán)境變量加載腳本

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)依次執(zhí)行如下命令,進(jìn)入安裝目錄并配置相關(guān)文件

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變量值為源碼目錄,注意行尾不能出現(xiàn)空格,如:

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”段落相關(guān)變量,如:

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

保存并退出vim。

4)依次執(zhí)行如下命令,編譯METIS庫(kù)

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

5)依次執(zhí)行如下命令,編譯julian庫(kù)

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

6)依次執(zhí)行如下命令,編譯FVCOM主程序

cd../../
make

編譯過程中可能出現(xiàn)錯(cuò)誤,解決方法詳見下文“已知問題匯總”節(jié)。

正確編譯完成后,當(dāng)前目錄下生成FVCOM可執(zhí)行程序“fvcom”。

4.測(cè)試

1)依次執(zhí)行如下命令,創(chuàng)建測(cè)試目錄,進(jìn)入測(cè)試目錄,復(fù)制測(cè)試算例

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

2)依次執(zhí)行如下命令,進(jìn)入運(yùn)行目錄,編輯算例輸入文件

cd./Estuary/run
vim tst_run.nml

為“tst_grd.dat”增加單引號(hào),如

GRID_FILE='tst_grd.dat'

保存并退出vim。

3)依次執(zhí)行如下命令,執(zhí)行測(cè)試

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

正確執(zhí)行完成后,當(dāng)前目錄下生成計(jì)算結(jié)果,如下:

已知問題匯總

問題現(xiàn)象1

編譯FVCOM主程序出現(xiàn)如下錯(cuò)誤:

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語句中的“<變量>”表示不被識(shí)別。

問題解決

1)編輯mod_newinp.F文件,在第一個(gè)“contains”語句(第)之后添加N_Fmt函數(shù),如下

!----------------------------------------
!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)修改報(bào)錯(cuò)語句

共需修改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)

修改完成后,繼續(xù)編譯。

問題現(xiàn)象2

編譯FVCOM主程序出現(xiàn)如下錯(cuò)誤:

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

問題原因

對(duì)邏輯值進(jìn)行比較時(shí),符號(hào)錯(cuò)誤,“==”應(yīng)為“.eqv.”、“/=”應(yīng)為“.neqv.”的問題。

問題解決

編輯mod_scal.F、internal_step.F、adv_t.F、adv_s.F文件,對(duì)文件中以“IF(BACKWARD_ADVECTION”開頭的語句進(jìn)行相應(yīng)修改,修改“==”為“.eqv.”,修改“/=”為“.neqv.”,注意符號(hào)“.”??赏ㄟ^如下命令快速修改:

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

修改完成后,繼續(xù)編譯。

問題現(xiàn)象3

編譯FVCOM主程序出現(xiàn)如下錯(cuò)誤:

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語句超長(zhǎng)但未截?cái)唷?/p>

問題解決

根據(jù)報(bào)錯(cuò)信息,分別修改mod_esmf_nesting.F、adv_t.F、adv_s.F等文件,超過132個(gè)字符的行,使用“&”符號(hào)進(jìn)行截?cái)啵唇財(cái)辔布?ldquo;&”符號(hào),被截?cái)嗟南乱恍惺准?ldquo;&”符號(hào),如:

截?cái)嗲埃?/p>

截?cái)嗪螅?/p>

修改完成后,繼續(xù)編譯。