首先要说明的是自己在用 PHG ,PHG 中解特征值和特征向量时要用到相关的包,首先是选择安装 Trilinos 和 PARPACK(这是两个独立的包,都可解特征值问题) ,其实我觉得只用安装 Trilinos 包就够用了,并且 PARPACK 官方已经放弃维护了,关于 Trilinos 的安装会在之后的文章中提及,这里先说安装 PARPACK 具体步骤。
要先安装gcc(c编译器),g++(c++编译器),gfortran(fortran编译器)
1.若是只选择安装 ARPACK 时,可以选择用 ubuntu 自带的包
sudo apt-get install build-essential
sudo apt-get install gfortran
sudo apt-get install libarpack2-dev
arpack官网上的库和补丁包已经没有维护了,代码里有很多问题,比如说second.f文件里面有bug, abs()函数里面规则过久,编译器大多已经不支持。相反,通过Linux包管理系统安装的arpack都没有这些问题,很干净。
2.要并行计算时还要安装 PARPACK ,这时就需要从最开始的源码进行安装了,源码的下载地址:http://www.caam.rice.edu/software/ARPACK/download.html
或者在上传的资源里: http://download.csdn.net/detail/mifangdebaise/8954649
要分别下载 arpack96.tar.gz,patch.tar.gz,parpack96.tar.gz,ppatch.tar.gz,并按此顺序依次解压缩,按照我自己的习惯是解压缩到 /usr/local/src/,注意这里依次解压缩后只归并得到一个文件夹 /usr/local/src/ARPACK/
3.下面就是要依次编译 ARPACK 和 PARPACK 了,但要有一些需要修改
1). 将 /usr/local/src/ARPACK/UTIL/second.f 文档中 external etime 那行注释掉,.f 是fortran文档,用!,c,C进行注释。
2). 修改 /usr/local/src/ARPACK/ARmake.inc 文档
a). 根据READEME,首先将 home 变量改为 home = /usr/local/src/ARPACK
b). FC = gfortran
FFLAGS = -O
这里要解释的是,首先将编译器改为了 gfortran,其次在flag中,要把cg89选项去掉,这个目前的fortran编译器已经不支持,所以会出各种奇怪的错误
c). PLAT = LINUX,其实这个地方改不改问题不大,改了,那只是一个符号,无妨碍的。
d). 至于
LAPACKLIB =
BLASLIB =
先空着(我不太确定要怎么填),因为 arpack 带了 blas 和 lapack 的源码,让 arpack 用它自己带的,如果提示有错误,再修改……
e). 至于 MAKE = /bin/make
你可以先用 which make,找出来哪个,就填哪个好了……,我的修改后为 MAKE = /usr/bin/make
然后在arpack根目录下 make lib就可以编译出arpack的lib了。
下面编译parpack的lib,注意,查看 makefile 的 plib: 选项(其实是 parpacklib: 下面的那些操作中变量在 ARmake.inc 中没定义),同时对比 lib: 选项(即是 arpacklib: 下面的那些操作中变量在 ARmake.inc 都有没定义),这样就需要将变量 PUTILdir,PSRCdir,PARPACKLIB 在 ARmake.inc 中给出定义,分别如下 f) 中(其实就是参考 arpacklib: 操作中变量 UTILdir,SRCdir,ARPACKLIB 的定义给出的):
f). PUTILdir = $(home)/UTIL
PSRCdir = $(home)/SRC
PARPACKLIB = $(home)/libarpack_$(PLAT).a
g). 还要参照 ARmake.inc 中 ALIBS = $(ARPACKLIB) $(LAPACKLIB) $(BLASLIB)
增添 PLIBS = $(PARPACKLIB) $(LAPACKLIB) $(BLASLIB)
3). 此外,在parpack/src/mpi下有pssaitr.f文件的第307行出错,它提示该行不能在data后,往前看几行,果然有个data,把这几行移过去就好了,然后回到arpack根目录下,执行make plib ,就可以成功的编译出plib了!
编译完 plib 时其实名字跟由 ARPACK 编译出来的 lib 相同,只是覆盖了原来的由 ARPACK 生成的 lib 。