稀疏矩阵线性解析库SPOOLES的简单应用.docVIP

  • 5
  • 0
  • 约7.22千字
  • 约 7页
  • 2017-08-09 发布于重庆
  • 举报

稀疏矩阵线性解析库SPOOLES的简单应用.doc

稀疏矩阵线性解析库SPOOLES的简单应用.doc

稀疏矩阵线性解析库SPOOLES的简单应用 ysm cleverysm@ SPOOLES的全称是SParse Object Oriented Linear Equations Solver,中文名大概就是面向对象的稀疏线性等式解析器。顾名思义,就是可以用来解稀疏矩阵为参数的线性方程组的数学函数库。所谓面向对象是指的应用了面向对象的封装思想,但实际上SPOOLES是用非面向对象的C语言来写的。 SPOOLES的主页是/linalg/spooles/spooles.2.2.html ,最新版是2.2,支持单线程,多线程和MPI三种计算模式。主页上的文档也比较齐全,对SPOOLES的使用介绍的也很清晰,仔细看看用不了很长时间就能解自己的方程组。如果说只是拿来用的话,Install.ps.gz ,ReferenceManual.ps.gz ,LinSol.ps.gz , AllInOne.ps.gz 这四个文档就足够用了,Install.ps.gz 不用多说是安装指南,ps格式,down下来转换成pdf看就行,其他几个也一样。ReferenceManual.ps.gz 是SPOOLES的功能参考手册,AllInOne.ps.gz 是比较详细的介绍了在单线程,多线程和MPI环境下应用SPOOLES解线性方程AX=Y的步骤,包括LU和QR两种因式分解的方法。不过AllInOne.ps.gz 里的解决方法步骤比较多,调用的函数也多了一点,所以就有人作了一个LinSol的库,也就是LinSol.ps.gz 中介绍的库。我在本文中介绍的也是应用LinSol的解决方法。 Spooles的安装 首先是安装SPOOLES。从网站的down下来,解压到某文件夹下,比如我们就解压缩到/home/mpi/spooles下。编译代码之前要修改一下Make.inc文件的某些内容,Make.inc这个文件会在makefile里include进去。需要改的地方有设定编译器,比如设为CC = gcc,MPI_INSTALL_DIR为mpi安装的路径,如在我的机器上是MPI_INSTALL_DIR = /home/mpi/mpich2,mpi的库位置MPI_LIB_PATH,如MPI_LIB_PATH = -L$(MPI_INSTALL_DIR)/lib,mpi的库MPI_LIBS可以按照自己需要修改,mpi的头文件地址,MPI_INCLUDE_DIR = -I$(MPI_INSTALL_DIR)/include。然后就可以编译程序了。 如果需要使用单线程的spooles库,只需在存放spooles的根目录下,make lib,这个命令将编译所需要的代码在spooles的根目录下生成一个spooles.a的静态库。不过make lib需要使用一个perl脚本,所以机器上需要安装了perl。如果机器没有perl的话,可以使用make global。不过在我的机器上make global没有成功,而且官方的安装文档也说make global不太保险。如果需要多线程版的spooles的话,就需要到MT/src目录下,make spoolesMT.a,就可以在这个目录下生成库文件spoolesMT.a,如果想把多线程库编译到根目录的spooles.a中的话,可以用,make makeLib。但是,官方安装文档中推荐使用第一种方式。MPI版的情况与多线程的类似,存放目录是在MPI/src中。 不过,直接使用spooles的api来计算的话相对来说有点烦琐,需要调用的函数和各种参数比较繁杂一点,所以在spooles的发行版中还附带了一个封装好了的辅助库,代码放在在LinSol目录下,叫做Wrapper Objects for Spooles,或者也称作是一种spooles的bridge,我就是用的这个工具。同样的也分为单线程,多线程和MPI版,分别在LinSol目录下的srcST,srcMT和srcMPI目录下。我们只需要在LinSol目录下make lib就可以分别编译生成这三个版本对应的静态库文件,以单线程版为例,就是Bridge.a。 解方程 简单的讲,用spooles的LinSol解一个AX=B方程可分为四个基本的步骤,初始化,因式分解,解出结果,释放资源。 初始化 初始化的过程首先要构造矩阵A,B矩阵和X。系数矩阵A是按照稀疏矩阵的模式来存储的,也就是仅仅保存非零元素既可,而B和X则是稠密矩阵。 a) 构造矩阵A 矩阵A使用InpMtx对象来存储。代码如下。 InpMtx *mtxA; mtxA = InpMtx_new() ; InpMtx_init(mtxA, coordType, inputMode, 0, 0) ; 参数coordType是i

文档评论(0)

1亿VIP精品文档

相关文档