红联Linux门户
Linux帮助

fedora22下配置Trilinos/Anasazi,PETSc/SLEPc

发布时间:2015-09-25 09:51:47来源:linux网站作者:米饭的白色

为了用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 成功!