前言

SEPlib的源码已托管在GitLab上,具体链接为http://cees-gitlab.stanford.edu/bob/SEPlib ,为最新版本的官方源码。本文所安装的是6.5.3版本的SEPlib,最新版本的安装请参考另一篇博文。

软件下载

下载最新版本的 SEPlib,目前为6.5.3. 实际有7.0.5,但官网上没有链接了,估计人都转向 Madagascar 了。

下载地址: http://sepwww.stanford.edu/doku.php?id=sep:software:seplib

安装依赖包

安装 SEPlib-6.5.3,需要一些依赖包,由于笔者之前安装过 Madagascar 以及SU,因此 大部分的依赖包基本安装完毕,但还需要安装下列依赖包:

$ sudo apt-get install flex  # lex
$ sudo apt-get install libpawlib-lesstif3-dev # lesstif

这里需要注意的是lesstif包。不同版本的Debian系统可能含有的软件包不一样,具体以自己版本为主。

基础安装

最好使用ifort来编译代码,在configure前需要显式指出下列环境变量:

$ export CC=icc      # C 编译器
$ export FC=ifort    # Fortran 编译器
$ export CFCDEFINES=-DpgiFortran # 如果不设置此项,后面链接finitpar会出错

另外,一点需要注意的是,如果使用ifort来编译,运行下面的命令后,需要查看ifort是否已经设置为Fortran编译器,这点很重要,因为一般如果将 SEPlib 安装在/opt下的话,需要使用root权限,而我们一般将ifort的环境变量设置在自己的用户目录下,因此configure时检查ifort会出现没有ifort而采用系统的一些Fortran编译器。

$ ./configure --prefix=/opt/SEPlib --with-su=/su/installed/dir --with-local

configure完成后,在终端键入下面命令,将编译 SEPlib,并将其安装至指定地文件目录下

$ make
$ make install

在编译的过程中可能出现哑元类型不匹配的问题,主要原因是因为源程序super_chain_mod.f90部分代码输入参数定义不严谨所致,修改该程序中部分代码即可解决此类问题。需要修改的部分如下所示.

integer function flat_chain_exec( adj, add, model, data) ! W Grad K
  integer       ::stat
  logical,intent(in)      :: adj, add                                ! 28
  real          :: data(:), model(:)
integer function flat_chain_adj_exec( adj, add, model, data) ! K' Grad' W'
  integer       ::stat
  ! logical       :: adj, add,adj_new
  logical,intent(in)        :: adj, add                              ! 51
  logical       :: adj_new                                           ! 52
  real          :: data(:), model(:)
integer function flat3_chain_exec( adj, add, model, data)
  integer       ::stat
  logical,intent(in)        :: adj, add                              ! 115
  real          :: data(:), model(:)
integer function flat3_chain_adj_exec( adj, add, model, data)

  integer       ::stat
  logical,intent(in)        :: adj, add                              ! 142
  logical       :: adj_new                                           ! 143

环境变量的设置

环境变量的设置,这一步是非常重要的,正确设置环境变量对以后正常使用大有裨益。在此,笔者借鉴了 Madagascar 的环境变量设置方案,可以在 SEPlib 的安装目录SEPROOT下的share目录中建立一文件夹名叫seplib(读者可自行取其他名字),根据用户自己的shell类型来创建不同的环境变量执行脚本,对于csh用户,创建env.csh;而对bash用户,则创建env.sh.下面分别给出不同的shell类型的脚本,供大家参考,至于具体目录文件的设置,根据自己的喜好设置。

csh文件

#!/bin/csh
# Path for SEPlib installation directory
setenv SEPROOT /opt/seplib

# Path for SEPlib source directory
setenv SEPSRC /home/abc/seplib-6.5.3

# Path for Python packages
if ($?PYTHONPATH) then
setenv PYTHONPATH $SEPROOT/lib/python:${PYTHONPATH}
else
setenv PYTHONPATH $SEPROOT/lib/python
endif

# Path for binary data files part of SEP datasets
# setenv DATAPATH /var/tmp/

# Path for manual pages
setenv MANPATH `manpath`:$SEPROOT/man

# Path for shared object files
# if ($?LD_LIBRARY_PATH) then
# setenv LD_LIBRARY_PATH $SEPROOT/lib:${LD_LIBRARY_PATH}
# else
# setenv LD_LIBRARY_PATH $SEPROOT/lib
# endif

# Path for executables
set path = ($SEPROOT/bin $path)

# Path for vplot files
setenv VPLOTSPOOLDIR /var/tmp/SEP/Figs/

# Path for vplot fonts
setenv VPLOTFONTDIR $SEPROOT/include

# Path for SEP includedir
setenv SEPINC $SEPROOT/include

bash文件

#!/bin/sh

# Path for SEPlib installation directory
export SEPROOT=/opt/seplib

# Path for SEPlib source directory
export SEPSRC=/home/abc/seplib-6.5.3

# Path for Python packages
if [ -n "$PYTHONPATH" ]; then
export PYTHONPATH=$SEPROOT/lib/python:${PYTHONPATH}
else
export PYTHONPATH=$SEPROOT/lib/python
fi

# Path for binary data files part of SEP datasets
# export DATAPATH=/var/tmp/

# Path for manual pages
unset MANPATH
export MANPATH=`manpath`:$SEPROOT/man

# Path for shared object files
# if [ -n "$LD_LIBRARY_PATH" ]; then
# export LD_LIBRARY_PATH=$SEPROOT/lib:${LD_LIBRARY_PATH}
# else
# export LD_LIBRARY_PATH=$SEPROOT/lib
# fi

# Path for executables
export PATH=$SEPROOT/bin:$PATH

# Path for vplot files
export VPLOTSPOOLDIR=/var/tmp/SEP/Figs/

# Path for vplot fonts
export VPLOTFONTDIR=$SEPROOT/include

# Path for SEP includedir
export SEPINC=$SEPROOT/include

这样设置好了之后,我们需要修改自己的~/.bashrc文件,在文件最后面添加如下几句,这样环境变量就设置好了。

# SEPlib 6.5.3
export SEPROOT=/opt/seplib
source $SEPROOT/share/seplib/env.sh

修改~/.bashrc文件之后,我们只需要在当前终端键入如下命令,即可使环境变量马上生效:

$ source ~/.bashrc

安装更多功能的SEPlib

在成功安装了不带 FFTW 以及 MPI 库的 SEPlib. 下面介绍安装一个更完整的 SEPlib。

由于对 SEPlib 的源代码以及整个程序框架有了更进一步的了解,所以这次选择更高级一点的安装方式。首先在安装源文件的根目录执行如下命令:

$ cp docs/config-examples/RUN_THIS.base .

然后修改该文件,整体文件不再大改,只需要根据自己的需求修改其中的某些变量即可。由于这次主要是加入 OPENMP 和 FFTW。之所以没安装 MPI 主要是因为 OPENMP 适合于共享式内存计算机。下面列出一些基本的参数设置信息

setenv CC gcc
setenv FC ifort
setenv FFTW_FCLD "-L/usr/lib/x86_64-linux-gnu/ -lfftw3 -lfftw3f" # 根据自己 FFTW 的位置修改
setenv OMP_FCFLAGS -openmp # -openmp 为 Intel 编译器的选项,其他编译器不一样,需修改成该编译器的 OPENMP 选项
setenv OMP_FCLD "-L/opt/intel/compilers_and_libraries_2016/linux/lib/intel64/ -liomp5 -liompstubs5" # 根据自己 Intel openmp 动态链接库的位置修改
./configure --prefix=/opt/SEPlib --with-su=/su/installed/dir --with-local --with-fftw --with-omp

修改完成后,保存文件,在终端对文件添加可执行权限,并执行脚本:

$ chmod +x RUN_THIS.base
$ ./RUN_THIS.base #运行脚本

键入上述命令后,将会编译整个源文件,在编译的过程中遇到一些问题,主要原因是源文件的 Makefile 文件存在一些问题。这里列出本人安装过程中出现的一些错误:

Bug1: 编译Transf_fftw时出错,出现undefined reference omp_get_num_threads

解决: 修改Transf_fftw.f90所在文件目录的 Makefile 文件,在484行末尾,即Transf_fftw_LDADD这行末尾添加${OMP_FCLD},然后在504,506,508,511行中加入${OMP_FCFLAGS},修改完保存,再回到根目录重新$make一下就好了。上述 Bug1 在后面还有几次编译过程仍存在此问题,解决办法是找到出错的源文件位置,按照上面提到的解决方案,添加 openmp 动态链接库位置以及编译选项,即可解决此类问题。

Bug2: 编译RickMovie时会出现错误,主要是类似于undefined reference Xtadd/X11...这样的错误。

解决: 进入RickMovie目录,修改Makefile文件,修改其中的第212行,即Rickmovie_LDADD所在那行,在其后添加-lXt -lX11即可解决此类问题,其实思路与前面omp一致,无非是没有将相关库加入编译选项中。Bug2 在后面的编译中还会遇到,主要位于Ricksep中,运用同样方法可以解决,不再赘述。

解决完所有的Bug1、Bug2之类的错误后,后面的编译过程基本畅通无阻,$ make完之后再$ make install,即可安装完 SEPlib,最后再设置环境变量即可正常使用。

修订历史

  • 2016-05-13: 初稿
  • 2019-09-17: 修改SEPlib下载链接