基本环境如下:%后表示获取该信息使用的命令, /表示或者
系统版本:CentOS Linux release 7.6.1810 (Core) %cat /etc/redhat-release
gnu编译器版本:4.8.5 %gcc/gfortran --version
openmpi版本:1.6.5
intel 编译器版本:2018
Funwave版本:3.3
安装过程:
(1)新建一个文件夹Funwave3.3,把Funwave的压缩包解压到该目录下(假设压缩包放在主目录下),过程如下:
cd $HOME
mkdir Funwave3.3
tar zxvf FUNWAVE-TVD-Version_3.3.tar.gz -C/$HOME/Funwave3.3/
(2)根据个人需求,修改makefile,这里只是一个示例。
cd Funwave3.3/FUNWAVE-TVD-Version_3.3
cd src
ln -sf Makefile-Mills Makefile %这里打开了并行计算,此时要确保系统上有并行编译器。
make
(3)编译的过程不同的环境难免出错,根据错误提示进行修改
3.1 错误1
io.f90(1184): error #6404: This name does not have a type, and must have an explicit type. [RAND]
Phase_LEFT(J,I)=rand(0)*2.0_SP*3.1415926
--------------------------^这里io.F这个源码里头引用了为定义的函数RAND
解决办法:
vim io.F
阅读模式下输入/Phase_LEFT(J,I)=rand*2.0_SP*3.1515926查找,可以发现SUBROUTINE READ_INPUT没有定义RAND,此时在io.F第133行输入如下一行来声明RAND为外部函数:
REAL(SP), EXTERNAL ::RAND
保存退出之后重新编译
make clean
make
错误2:(错误1之后又出现错误2,同样类型的错误,按照错误1的解决办法修改)
wavemaker.f90(193): error #6404: This name does not have a type, and must have an explicit type. [RAND]
Phase2D(J,I)=rand(0)*2.0_SP*pi
-----------------------^
wavemaker.f90(808): error #6404: This name does not have a type, and must have an explicit type. [RAND]
Phase_Ser(kf)=rand(0)*2.0_SP*3.1415926
------------------------^
wavemaker.f90(1112): error #6404: This name does not have a type, and must have an explicit type. [RAND]
Phase_Ser(kf)=rand(0)*2.0_SP*3.1415926
------------------------^
wavemaker.f90(1571): error #6404: This name does not have a type, and must have an explicit type. [RAND]
phi1(kf,ktheta)=rand(0)*2.0_SP*pi
--------------------------^
wavemaker.f90(1787): error #6404: This name does not have a type, and must have an explicit type. [RAND]
phi1(kf,ktheta)=rand(0)*2.0_SP*pi
--------------------------^
compilation aborted for wavemaker.f90 (code 1)
make: *** [wavemaker.o] Error 1
解决办法:
wavemaker.F中的第61, 934, 1267, 1549, 1833行分别添加以下一句:
REAL(SP), EXTERNAL :: RAND
make clean
make
编译完成。Makefile中用到的模型功能如下所示:
#==========================================================================
#--------------------------------------------------------------------------
# PRECISION DEFAULT PRECISION: SINGLE
# UNCOMMENT TO SELECT DOUBLE PRECISION
#--------------------------------------------------------------------------# FLAG_1 = -DDOUBLE_PRECISION
FLAG_2 = -DPARALLEL
FLAG_3 = -DCARTESIAN
# FLAG_4 = -DINTEL
# FLAG_5 = -DCOUPLING
# FLAG_6 = -DZALPHA
# FLAG_7 = -DMANNING
# FLAG_8 = -DVESSEL
# FLAG_9 = -DMETEO
# FLAG_10 = -DWIND
# FLAG_11 = -DSEDIMENT
# FLAG_12 = -DCHECK_MASS_CONSERVATION
#--------------------------------------------------------------------------
# mpi defs
#--------------------------------------------------------------------------
CPP = /usr/bin/cpp
CPPFLAGS = $(DEF_FLAGS)
FC = mpif90
DEBFLGS =
OPT =
CLIB =
#==========================================================================FFLAGS = $(DEBFLGS) $(OPT)
MDEPFLAGS = --cpp --fext=f90 --file=-
RANLIB = ranlib