为了用PHG解特征值问题,这些天一直在苦恼如何安装特征值解法器,PHG/manual里面提到了一些特征值解法器,并且部分给出了rpm包,可最开始用的是ubuntu系统,所以自己从网上下的这些包的源码安装的,结果安装好后在./phg中进行./configure 时就是识别不出所安装的包,无奈只得又重装的fedora22。
在fedora22下,从PHG提供的网站ftp://159.226.92.111/pub/RPMS/下载的.src.rpm文件,然后参照http://www.linuxdiyf.com/linux/14412.html介绍的安装方式(我用方法二安装),然后在./phg中进行./configure 时可以识别初所安装的特征值解法器,但跑./phg/examples中maxwell-eigen例子时发现这些解法器不靠谱啊!!!例如arpack就直接提示说‘这些解可能不准确’。
所以将目光投向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 成功!