我很好奇,是否有一个函数可以将 MPIAIJ(AIJ 格式的分布式矩阵)转换为位于单个处理器上的 SEQAIJ 矩阵。VecScatterCreateToAll可以使用or对 PETSc 向量进行这样的操作VecScatterCreateToZero,但我找不到矩阵的类似函数。这显然不是可扩展的操作,但有助于轻松调试。
天真地,我认为下面会起作用,但这段代码的问题是每个进程都会生成不同的 SEQAIJ 矩阵。有趣的是,petsc4py 不会产生错误,只是简单地将矩阵保留为全零。
#Input A is an MPIAIJ matrix
def getSEQAIJ(A):
N=A.getSize()[0]
B=PETSc.Mat().create(comm=PETSc.COMM_SELF)
B.setType(PETSc.Mat.Type.SEQAIJ)
B.setSizes(N)
B.setUp()
rstart, rend = A.getOwnershipRange()
for i in xrange(rstart,rend):
cols,vals = A.getRow(i) #maybe restore later
B.setValues(i,cols,vals,addv=PETSc.InsertMode.INSERT)
B.assemble()
return B