簡(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ù)編譯。