[petsc-users] MatSchurComplementGetPmat voes

Arne Morten Kvarving Arne.Morten.Kvarving at sintef.no
Fri Jun 3 08:09:13 CDT 2022


Hi!

I have a Chorin pressure correction solver with consistent pressure update, i.e.
pressure solve is based on the Schur complement

E = -A10*ainv(A00)*A01

with A10 = divergence, A00 the mass matrix and A01 the gradient.

I have had this implemented with petsc for a long time and it's working fine. However, I've done the schur-complement manually, ie using a MatShell.

I now wanted to see if I can implement this using the petsc facilities for the schur-complement, but I get a confusing error when I call MatSchurComplementGetPmat().

-----

Code snippet:

 MatCreateSchurComplement(m_blocks[0], m_blocks[0], m_blocks[1], m_blocks[2], nullptr, &E_operator);
< ... setup the ksp for A00 >
 MatSchurComplementSetAinvType(E_operator, MAT_SCHUR_COMPLEMENT_AINV_DIAG);
MatView(E_operator);
MatSchurComplementGetPmat(E_operator, MAT_INITIAL_MATRIX, &E_pc);

-----

This yields the output (I cut out the matrix elements):
Mat Object: 1 MPI processes
  type: schurcomplement
  Schur complement A11 - A10 inv(A00) A01
  A11 = 0
  A10
    Mat Object: 1 MPI processes
      type: seqaij
 KSP of A00
    KSP Object: 1 MPI processes
      type: preonly
      maximum iterations=1000, initial guess is zero
      tolerances:  relative=1e-06, absolute=1e-20, divergence=1e+06
      left preconditioning
      using DEFAULT norm type for convergence test
    PC Object: 1 MPI processes
      type: lu
        out-of-place factorization
        tolerance for zero pivot 2.22045e-14
        matrix ordering: nd
        factor fill ratio given 5., needed 1.02768
          Factored matrix follows:
            Mat Object: 1 MPI processes
              type: seqaij
              rows=72, cols=72
              package used to perform factorization: petsc
              total: nonzeros=4752, allocated nonzeros=4752
                using I-node routines: found 22 nodes, limit used is 5
      linear system matrix = precond matrix:
      Mat Object: 1 MPI processes
        type: seqaij
        rows=72, cols=72
        total: nonzeros=4624, allocated nonzeros=5184
        total number of mallocs used during MatSetValues calls=0
          using I-node routines: found 24 nodes, limit used is 5
  A01
    Mat Object: 1 MPI processes
      type: seqaij

[0]PETSC ERROR: --------------------- Error Message --------------------------------------------------------------
[0]PETSC ERROR: Invalid argument
[0]PETSC ERROR: Wrong type of object: Parameter # 1
[0]PETSC ERROR: See https://petsc.org/release/faq/ for trouble shooting.
[0]PETSC ERROR: Petsc Release Version 3.17.2, Jun 02, 2022
[0]PETSC ERROR: ../d/bin/Stokes on a linux-gnu-cxx-opt named akvalung by akva Fri Jun  3 14:48:06 2022
[0]PETSC ERROR: Configure options --with-mpi=0 --with-lapack-lib=-llapack --with-64-bit-indices=0 --with-shared-libraries=0 --COPTFLAGS=-O3 --CXXOPTFLAGS=-O3 --FOPTFLAGS=-O3 --with-blas-lib=-lblas --CFLAGS=-fPIC --CXXFLAGS=-fPIC --FFLAGS=-fPIC
[0]PETSC ERROR: #1 MatDestroy() at /home/akva/kode/petsc/petsc-3.17.2/src/mat/interface/matrix.c:1235
[0]PETSC ERROR: #2 MatCreateSchurComplementPmat() at /home/akva/kode/petsc/petsc-3.17.2/src/ksp/ksp/utils/schurm/schurm.c:763
[0]PETSC ERROR: #3 MatSchurComplementGetPmat_Basic() at /home/akva/kode/petsc/petsc-3.17.2/src/ksp/ksp/utils/schurm/schurm.c:785
[0]PETSC ERROR: #4 MatSchurComplementGetPmat() at /home/akva/kode/petsc/petsc-3.17.2/src/ksp/ksp/utils/schurm/schurm.c:835

where the errors come from the call call to obtain the preconditioner matrix.
I don't see what I've done wrong, as far as I can see it's all following https://petsc.org/release/docs/manualpages/KSP/MatCreateSchurComplement.html#MatCreateSchurComplement
MatCreateSchurComplement - Argonne National Laboratory<https://petsc.org/release/docs/manualpages/KSP/MatCreateSchurComplement.html#MatCreateSchurComplement>
Notes The Schur complement is NOT explicitly formed! Rather, this function returns a virtual Schur complement that can compute the matrix-vector product by using formula S = A11 - A10 A^{-1} A01 for Schur complement S and a KSP solver to approximate the action of A^{-1}.. All four matrices must have the same MPI communicator.
petsc.org


and
 https://petsc.org/release/docs/manualpages/KSP/MatSchurComplementGetPmat.html#MatSchurComplementGetPmat

Looking into the code it seems to try to call MatDestroy() for the Sp matrix but as Sp has not been set up it fails (schurm.c:763)
Removing that call as a test, it seems to succeed and I get the same solution as I do
with my manual code.

I'm sure I have done something stupid but I cannot see what, so any pointers would be appreciated.

cheers

arnem

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20220603/405da78e/attachment-0001.html>


More information about the petsc-users mailing list