为了用PHG解特征值问题,这些天一直在苦恼如何安装特征值解法器,PHG/manual里面提到了一些特征值解法器,并且部分给出了rpm包,可最开始用的是ubuntu系统,所以自己从网上下的这些包的源码安装的,结果安装好后在./phg中进行./configure 时就是识别不出所安装的包,无奈只得又重装的fedora22。
在fedora22下,从PHG提供的网站ftp://159.226.92.111/pub/RPMS/下载的.src.rpm文件,然后参照http://blog.youkuaiyun.com/mifangdebaise/article/details/48338101介绍的安装方式(我用方法二安装),然后在./phg中进行./configure 时可以识别初所安装的特征值解法器,但跑./phg/examples中maxwell-eigen例子时发现这些解法器不靠谱啊!!!例如arpack就直接提示说‘这些解可能不准确’。
一. 安装Trilinos/Anasazi
所以将目光投向Trilinos/Anasazi,下面是Trilinos/Anasazi安装过程,当然前提是g++, gcc, gfortran, mpich 都已经安装好了
1>. 下载trilinos并解压,得到 ./trilinos
2>. a).cd ./trilinos
b). mkdir MY_BUILD
c). cd MY_BUILD/
d). 用下面的cmake命令及具体的安装的选项
cmake \
-D TPL_ENABLE_MPI=ON \
-D MPI_BASE_DIR="/usr/local/mpich-3.1.4/" \
-D Trilinos_ENABLE_ALL_PACKAGES=ON \
-D Trilinos_ENABLE_Epetra=ON \
-D Trilinos_ENABLE_Anasazi=ON \
-D Trilinos_ENABLE_Zoltan=ON \
-D Trilinos_ENABLE_TESTS=ON \
-D Trilinos_ENABLE_ALL_FORWARD_DEP_PACKAGES=ON \
-D CMAKE_INSTALL_PREFIX=/usr/local/trilinos \
..
e). make -j 4 这命令是说用4个进程进行make
f). make install
这就安装好Trilinos中的Anasazi了。
接下来在./phg中进行./configure 过程中也能识别出Trilinos/Anasazi,接着 make clean; make 过程中没出现错误,但在 make all 时有下面的错误提示:
/usr/local/trilinos/lib/libifpack.a(Ifpack.cpp.o):在函数‘Ifpack::Create(std::string, Epetra_RowMatrix*, int, bool)’中:
Ifpack.cpp:(.text+0x18b8):对‘Teuchos::StringToIntMap::get(std::string const&, std::string const&) const’未定义的引用
/usr/local/trilinos/lib/libifpack.a(Ifpack.cpp.o):在函数‘_GLOBAL__sub_I__ZN6Ifpack14precTypeValuesE’中:
Ifpack.cpp:(.text.startup+0x6a):对‘Teuchos::StringToIntMap::StringToIntMap(std::string const&, int, char const**)’未定义的引用
........
1>.分析应该是缺乏某个库 或者没有加上, 在连接的时候需要一个额外的库
-lxxx
看目录, /usr/local/trilinos/lib/, 它的下面可能有某个库需要链接, 例如
-lteuchos
2>.查了下在/usr/local/trilinos/lib/下有
libteuchoscomm.a
libteuchoscore.a
libteuchosnumerics.a
libteuchosparameterlist.a
libteuchosremainder.a
3>. 修改 Makefile.inc
在LDFLAG 或者什么变量上加上 -L/usr/local/trilinos/lib/ -lxxx
xxx 表示需要的库, 例如 libxxx.a, libxxx.so 都用 -lxxx 即可.
在查看最开始的Makefile.inc 时,发现在其中的
LIBS= ... -lteuchoscore -lteuchosnumerics -lteuchoscomm -lteuchosparameterlist ...
有这4个链接,而此时的错误提示是(也即是最初的错误提示,同时为了描述,我自己添加了编号1. 2. 3. ):
1. /usr/local/trilinos/lib/libifpack.a(Ifpack.cpp.o):在函数‘Ifpack::Create(std::string, Epetra_RowMatrix*, int, bool)’中:
Ifpack.cpp:(.text+0x18b8):对‘Teuchos::StringToIntMap::get(std::string const&, std::string const&) const’未定义的引用
2. /usr/local/trilinos/lib/libifpack.a(Ifpack.cpp.o):在函数‘_GLOBAL__sub_I__ZN6Ifpack14precTypeValuesE’中:
Ifpack.cpp:(.text.startup+0x6a):对‘Teuchos::StringToIntMap::StringToIntMap(std::string const&, int, char const**)’未定义的引用
3. /usr/local/trilinos/lib/libteuchoscomm.a(Teuchos_TimeMonitor.cpp.o):在函数‘Teuchos::(anonymous namespace)::getDefaultComm()’中:
Teuchos_TimeMonitor.cpp:(.text+0x832):对‘Teuchos::LabeledObject::LabeledObject()’未定义的引用
...
我对比后发现,/usr/local/trilinos/lib/ 中是有5个与 teuchos 相关的库,所以我在
LIBS= 添加了路径 -L/usr/local/trilinos/lib/ 以及添加 -lteuchosremainder 在
LIBS= ... -lteuchosremainder -lteuchoscore -lteuchosnumerics -lteuchoscomm -lteuchosparameterlist ... 中,
这时执行 make clean; make 没有错误,而在 make all 时仍然是有错误,
此时的错误提示已经没有上面的 1. 2. 了,直接从 3. 开始的。
4>. 错误提示直接从3. 开始的,猜测可能是 -lteuchosremainder -lteuchoscore -lteuchosnumerics -lteuchoscomm -lteuchosparameterlist
这几个顺序有关系:Linux 的 gcc 对库的位置敏感, 从前往后搜索, 被依赖的库要放在后面...
经过几次不同顺序的调换,最终可以确定的这几个库的顺序如下
-lteuchoscomm -lteuchosparameterlist -lteuchoscore -lteuchosremainder -lteuchosnumerics
然后 make clean; make; make all,此时在make all 时仍有一个amesos.a 关于Teuchos的错误提示,
将LIBS= ...-lteuchoscomm -lteuchosparameterlist -lteuchoscore -lteuchosremainder -lteuchosnumerics...-lamesos... 中
-lamesos 放到前面 LIBS= ...-lamesos...-lteuchoscomm -lteuchosparameterlist -lteuchoscore -lteuchosremainder -lteuchosnumerics...
然后再 make clean; make; make all 成功!
二. 安装PETSc/SLEPc
安装完Trilinos/Anasazi后,发现这个解法器也没能跑完自己的例子就提示一些不知道该怎么办的错误,例如
./maxwell-eigen -eigen_solver "trilinos"
一直提示:'Anasazi::LOBPCGSolMgr::solve() caught unexpected exception from Anasazi::LOBPCG::iterate() at iteration 142'
所以又得转向PETSc/SLEPc,关于PETSc/SLEPc的安装,可以百度一篇“SLEPC软件使用指南.pdf“,里面有比较详细的介绍安装过程,
或者直接从http://download.youkuaiyun.com/download/mifangdebaise/9138297直接下载。
下面是我的安装过程
1>. 首先需要安装 PETSc,PETSc 的计算可以在实数和复数上进行,所以对于 PETSc 的安装需要分成两个部分,对于实数域上的计算:
# tar zxvf petsc-3.6.1.tar.gz
# cd petsc-3.6.1
# export PETSC_DIR=/usr/local/src/petsc-3.6.1/
# export PETSC_ARCH=linux-real (说明是实数域上的计算)
# ./configure --prefix=/usr/local/petsc-3.6.1 --download-f2cblaslapack
(如果之前的g++,gcc,gfortran,mpich都装好的话,不用再额外添加其他的选项,会自动检测.而这里添加--prefix=/usr/local/petsc-3.6.1 纯粹是为了最后的make install,不过好像有没有make install 没什么关系,因为export PETSC_DIR=/usr/local/src/petsc-3.6.1/,并且在./PHG中./configure时检测的petsc路径就是/usr/local/src/petsc-3.6.1/,而--download-f2cblaslapack, 则是为了避免检测不到blas和lapack而加入的, --download 选项可以有很多选择,需要再仔细看看...)
# make
# make install
为了使在phg中./configure时能检测到petsc需要如下的操作:最后在普通权限下,在 ~/.bashrc or ~/.cshrc 中添加 export PETSC_DIR=/path/to/petsc-x-y-z,然后进行操作 . ~/.bashrc 使生效即可。
这里我只需要在实数上计算所以没有再安装复数域上的,需要说明的是,这两个只能安装一个,因为在环境变量的设置上
export PETSC_ARCH=linux-real ,环境变量 PETSC_ARCH 只能为一个值,所以要么是linux-real,要么是linux-complex
2>. 接下来安装SLEPc
# tar zxvf slepc-3.6.1.tar.gz
# cd slepc-3.6.1
#export SLEPC_DIR=/usr/local/src/slepc-3.6.1
#./configure
从系统中找出 PETSc 的安装信息,其次执行:
#make
#make install
上面如果make install不成功,则干脆可以不用make install,因为会提示要在./configure时用 --prefix=选项指定路径,而自己在加上--prefix=/usr/local/slepc-3.6.1时又提示什么‘要跟PETSC路径一样’类似的,所以干脆没有make install,这里 SLEPc Users Manual 中也没有进行 make install,而是在 make 后直接 make test 做的测试。
三. 这里要指明自己在./PHG 中 ./configure 过程中识别出PETSc,但没有识别出SLEPc,然后通过自己的修改了一点configure文件,才识别出SLEPc,下面即自己的调试方法
因为自己也不确定到底是哪里出问题了,所以就只能一行一行来查找错误了,(这里只是针对SLEPc3.6以后的版本,而3.5的版本是不需要修改的)
在#---------------------------------------------------SLEPc 这一栏中
只能在每个 if 语句中用 #echo $SLEPC_DIR 来检验该 if 语句是否执行了,
如下面图中的红框所表示的
就是这样一行一行的检查 if 语句的执行情况(其中的 #nimei 只是自己方便查找自己所修改的地方加入的一个标识),
当我检查到如下图中红框的地方时发现了问题
注意红框中的路径是我已经修改过的了,最开始的路径为 "${SLEPC_DIR}/bmake/slepc_common";,
而我在查找 slepc_common 时,发现不是这个路径,所以将路径改为 "${SLEPC_DIR}/lib/slepc/conf/slepc_common";
这样最后是知道问题出现在哪了,改完路径之后再在./phg 下./configure 就可以识别出SLEPc,
配置成功!
三. 应用出现的问题
1. 配置成功后,在PHG解特征值方程时,仍有一些问题,就是在 PETSc3.6 版本后不能直接用并行了,例如 mpirun -np 2 ./maxwell-eigen 就会报错,需要另外加参数:
mpirun -np 2 ./maxwell-eigen -oem_options "-st_ksp_type gmres -st_pc_type bjacobi -st_ksp_rtol 1e-3"
其中 -oem_options 可以参考 PHG manual 中关于 PETSc解法器的说明,而关于PETSc3.6 版本后不能直接用并行的讨论可以参考:https://github.com/dealii/dealii/issues/1117
这里的讨论其实给出了最后的解决方法,但是我好像看不懂,所以搁下了。
2. 即使 mpirun -np 2 ./maxwell-eigen -oem_options "-st_ksp_type gmres -st_pc_type bjacobi -st_ksp_rtol 1e-3" 这样加参数后,程序仍不能很好的运行,可以说没运行成功,跑了一段时间没结果就 ctrl-c了,可能再看看 SLEPc 的manual吧。
3. 为了能够尽快使用上程序,所以干脆将 PETSc 和 SLEPc 改为了3.5.4版本,然后由重新配置的,也不需要修改 phg/configure 文件。当phg安装好后,mpirun -np 2 ./maxwell-eigen就可以运行了。
4. 为了能够用上3.6之后的版本,还是要尽量看懂这里https://github.com/dealii/dealii/issues/1117 这里最终给出的解决方法。