对于大规模稀疏矩阵线性方程组的求解,直接法相对迭代法有其本身的优势,例如一次求解多列右端项,面对不同问题形成的不同矩阵求解也相对稳定,其相对于迭代法,劣势是所需要的内存较大,在超大规模矩阵时需要更多的内存容量来进行。目前直接法基本以LU分解为基础,常见的求解库包括MUMPS,Pardiso,SuperLU,UMFPACK等。
MUMPS是一个基于多波前法的直接求解库,其具有良好的性能和稳定性,在商业软件中也不乏见到直接求解调用MUMPS。其可以用于求解对称和非对称矩阵,在内存不够的时候采用out of core进行求解,支持的语言包含C,Fortran,Matlab和Scilab,并行方式以分布式MPI为主,在每一个MPI进程中又支持openmp共享内存并行。
PARDISO是一个直接法求解库,其通过调用metis对矩阵进行重排后再分解,具有良好的求解性能。商用版支持的并行方式包括共享内存,分布式内存和NVIDA的GPU并行。目前个人用户通常用MKL版本的PARDISO,在安装了mkl后即可直接使用。有意思的是,PARDISO官方网站特地给出了一个说明:
PARDISO明确强调 MKL-PARDISO是基于PARDISO的2006版本,许多PARDISO的新特性在MKL库中无效。不仅如此,PARDISO官方还给出了官方PARDISO与MKL-PARDISO性能的对比图:
SuperLU是一个用C语言编写的基于LU分解的直接求解器,支持的语言接口包含C和Fortran,并行方式包括openmp,MPI和CUDA。SuperLU通常又可分为superLU单机版本,superLU_MT共享内存版本和superLU_Dist分布式内存版本。
一般情况下,直接法求解采用以上三个库均可获得准确解。有很多有经验的用户认为,MUMPS稳定性好,求解效率高,十分好用。然而本文作者就遇到过一个采用MUMPS无法求解而PARDISO可以求解的矩阵。该矩阵的下载地址为:
链接: https://pan.baidu.com/s/16YHFpSLwom5sQ4Np7AYRPA
提取码: ch4a
该矩阵的非0矩阵分布为:
当采用MUMPS求解时,无法得到正确结果:
而如果采用PARDISO求解,计算结果为:
经过网友 deal.ii群的管理员 罪与罚 对多个直接法求解器的测试,该矩阵在各个求解器下的表现如下:
MUMPS和SUPERLU_DISP没能成功求解。
以上,即是该矩阵采用不同求解器的求解结果呈现,一向认为稳定性较好的MUMPS在面对该矩阵时未能成功求解。当然,上述测试仅仅是直接调用MUMPS进行,如果采用其他参数调整,也许MUMPS和SUPERLU_DISP也能成功求解。该矩阵来源于网络,主要测试工作由 罪与罚 大师完成,在此表示感谢!
以上,即是本文的全部内容,感谢阅读!