如何在 petsc/petsc4py 中将 MPIAIJ 转换为 SEQAIJ 矩阵?

计算科学 Python 稀疏矩阵 宠物 矩阵
2021-11-30 08:10:09

我很好奇,是否有一个函数可以将 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
1个回答

我没有通过 Python 使用过 PETSc,但我想你可以使用 PETSc 提供的所有功能。然后您可以MatGetSubmatrices()在处理器 0 上使用来获取所有行和列,从而获得本地副本。

以下关于 PETSc-maillist的讨论回答了一个非常相似的问题,并提供了一些示例代码,但不涉及 python。