简介
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个字符的行,使用“&”符号进行截断,即截断尾加“&”符号,被截断的下一行首加“&”符号,如:
截断前:
截断后:
修改完成后,继续编译。