OpenFOAM sparse matrix 内存管理
-
好吧!我先自己回复下自己。在稀疏矩阵存储中,通用有两种格式,如下矩阵
A = [ a00 a01 0 0 0 a11 a12 0 a20 0 a22 0 a30 0 0 a33];
引用一篇博士论文 CRS scheme stores the non-zero elements the matrix in left-to-right and top-to-bottom order in vector v (row-wise storge). 存储格式如下
v = [a00, a01, a11,a12,a20,a22,a30,a33] cI = [0,1,1,2,0,2,0,3] rI = [0,1,1,2,0,2,0,3]
但是在openfoam中,不是这么存储的
openfoam是一种 LDU 格式 对角线 lowerAddr() upperAddr()A = [ d0 u0 u1 0 0 0 l0 d1 u2 0 0 0 0 l1 l2 d2 u4 u5 . . . ]
l = [l0 l1 l2 ...] d = [d0 d1 d2 d3 d4 ...] u = [u0 u1 u2 u3 ...] L = [0 0 1 1 2 2 3 ...] U = [1 2 2 3 3 4 4 ..]
具体可参见lduAddressing.H 头文件
因为计算流体力学中,大部分矩阵都是对称(因为一个internal face对应两个体)除了特别的边界条件外,基本上都是对称矩阵。而矩阵对角元素就更好求了,大部分情况直接把该行相加就得到主对角元素。这种sparse matrix设计是符合cfd计算原理的,但是我的问题还是没解决。看到相关资料分享一下。
稀疏矩阵也分好多种,openfoam中的renumberMesh就是尽量保证在是多对角阵。
谢谢!