[petsc-users] question on PCLSC with matrix blocks of type MATNEST

Zhang, Hong hzhang at mcs.anl.gov
Tue Feb 13 14:21:34 CST 2024


Pierre,
I can repeat your change in ex27.c on petsc-release. However, replacing
+    Mat D;
+    PetscCall(MatMatMult(C, C, MAT_INITIAL_MATRIX, PETSC_DECIDE, &D));
+    PetscCall(MatDestroy(&D));
with
     PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, NULL, 2, NULL, array, &C));
+    Mat D;
+    PetscCall(MatProductCreate(C, C, NULL, &D));
+    PetscCall(MatProductSetType(D, MATPRODUCT_AB));
+    PetscCall(MatProductSetFromOptions(D));
+    PetscCall(MatProductSymbolic(D));
+    PetscCall(MatProductNumeric(D));
+    PetscCall(MatDestroy(&D));
./ex27 -f  farzad_B_rhs -truncate -solve_augmented
...
[0]PETSC ERROR: Petsc has generated inconsistent data
[0]PETSC ERROR: Unspecified symbolic phase for product AB with A nest, B nest. Call MatProductSetFromOptions() first or the product is not supported
...
[0]PETSC ERROR: #1 MatProductSymbolic() at /Users/hongzhang-sun/soft/petsc/src/mat/interface/matproduct.c:807
[0]PETSC ERROR: #2 main() at ex27.c:250

i.e., same confusing error message as reported by Hana, because this calling process does not call MatProduct_Private() with your fix. A fix to this is to modify the error message in MatProductSymbolic():

--- a/src/mat/interface/matproduct.c
+++ b/src/mat/interface/matproduct.c
@@ -804,7 +804,7 @@ PetscErrorCode MatProductSymbolic(Mat mat)
     ...
-    PetscCheck(!missing, PetscObjectComm((PetscObject)mat), PETSC_ERR_PLIB, "Unspecified symbolic phase for product %s. Call MatProductSetFromOptions() first", errstr);
+    PetscCheck(!missing, PetscObjectComm((PetscObject)mat), PETSC_ERR_PLIB, "Unspecified symbolic phase for product %s. Call MatProductSetFromOptions() first or the product is not supported", errstr);

with this fix, I get
./ex27 -f farzad_B_rhs -truncate -solve_augmented
...
[0]PETSC ERROR: Petsc has generated inconsistent data
[0]PETSC ERROR: Unspecified symbolic phase for product AB with A nest, B nest. Call MatProductSetFromOptions() first or the product is not supported

If you agree with this fix, I'll create a MR for it.
Hong


________________________________
From: Pierre Jolivet <pierre at joliv.et>
Sent: Tuesday, February 13, 2024 12:08 AM
To: Zhang, Hong <hzhang at mcs.anl.gov>
Cc: Hana Honnerová <hhornik at kma.zcu.cz>; petsc-users at mcs.anl.gov <petsc-users at mcs.anl.gov>
Subject: Re: [petsc-users] question on PCLSC with matrix blocks of type MATNEST



On 13 Feb 2024, at 12:33 AM, Zhang, Hong <hzhang at mcs.anl.gov> wrote:

Pierre,
I just modified the error message of MatProductSymbolic() and added a testing segment in src/mat/tests/ex195.c. I have not pushed my change yet.

Your fix at https://gitlab.com/petsc/petsc/-/commit/9dcea022de3b0309e5c16b8c554ad9c85dea29cf?merge_request_iid=7283 is more general. Has this fix merged to release and main? With latest main and release, I get same previous error message.

I don’t (anymore, but could prior to my fix).
The trigger is MatMatMult() with MAT_INITIAL_MATRIX in PCSetUp_LSC().
Reproducible with:
diff --git a/src/ksp/ksp/tutorials/ex27.c b/src/ksp/ksp/tutorials/ex27.c
index 116b7df8522..9bdf4d7334a 100644
--- a/src/ksp/ksp/tutorials/ex27.c
+++ b/src/ksp/ksp/tutorials/ex27.c
@@ -245,2 +245,5 @@ int main(int argc, char **args)
     PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, NULL, 2, NULL, array, &C));
+    Mat D;
+    PetscCall(MatMatMult(C, C, MAT_INITIAL_MATRIX, PETSC_DECIDE, &D));
+    PetscCall(MatDestroy(&D));
     if (!sbaij) PetscCall(MatNestSetVecType(C, VECNEST));
Which now generates:
$ ./ex27 -f ${DATAFILESPATH}/matrices/farzad_B_rhs -truncate -solve_augmented
Failed to load RHS, so use a vector of all ones.
Failed to load initial guess, so use a vector of all zeros.
[0]PETSC ERROR: --------------------- Error Message --------------------------------------------------------------
[0]PETSC ERROR: No support for this operation for this object type
[0]PETSC ERROR: MatProduct AB not supported for nest and nest
[0]PETSC ERROR: See https://petsc.org/release/faq/ for trouble shooting.

Thanks,
Pierre

Hong

________________________________
From: Pierre Jolivet <pierre at joliv.et>
Sent: Sunday, February 11, 2024 7:43 AM
To: Zhang, Hong <hzhang at mcs.anl.gov>
Cc: Hana Honnerová <hhornik at kma.zcu.cz>; petsc-users at mcs.anl.gov <petsc-users at mcs.anl.gov>
Subject: Re: [petsc-users] question on PCLSC with matrix blocks of type MATNEST


On 8 Feb 2024, at 5:37 PM, Zhang, Hong via petsc-users <petsc-users at mcs.anl.gov> wrote:

Hana,
"product AB with A nest, B nest" is not supported by PETSc. I do not know why PETSc does not display such an error message. I'll check it.

Did you?
A naive fix is to simply add the missing PetscCheck() in MatProduct_Private() right after MatProductSetFromOptions()https://petsc.org/release/src/mat/interface/matrix.c.html#line10026 (notice that it is there line 10048 in the other code branch)
I have this at https://gitlab.com/petsc/petsc/-/commit/9dcea022de3b0309e5c16b8c554ad9c85dea29cf?merge_request_iid=7283 (coupled with code refactoring to avoid missing any other operations), but maybe we could do things more elegantly.

Thanks,
Pierre

Hong
________________________________
From: petsc-users <petsc-users-bounces at mcs.anl.gov> on behalf of Hana Honnerová <hhornik at kma.zcu.cz>
Sent: Thursday, February 8, 2024 4:45 AM
To: petsc-users at mcs.anl.gov <petsc-users at mcs.anl.gov>
Subject: [petsc-users] question on PCLSC with matrix blocks of type MATNEST

Hi all,
I am trying to solve linear systems arising from isogeometric discretization (similar to FEM) of the Navier-Stokes equations in parallel using PETSc. The linear systems are of saddle-point type, so I would like to use the PCFIELDSPLIT preconditioner with the -pc_fieldsplit_detect_saddle_point option, Schur complement factorization and the LSC Schur complement preconditioner. I do not provide any user-defined operators for PCLSC in my codes (at least for now).
I store the matrix as a MATNEST consisting of 4 blocks (F for velocity-velocity part, Bt for velocity-pressure part, B for pressure-velocity part and NULL for pressure-pressure part). It is also convenient for me to store the blocks F, Bt and B as another MATNEST consisting of blocks corresponding to individual velocity components.

However, in this setting, I get the following error message:
[0]PETSC ERROR: Petsc has generated inconsistent data
[0]PETSC ERROR: Unspecified symbolic phase for product AB with A nest, B nest. Call MatProductSetFromOptions() first
[0]PETSC ERROR: See https://petsc.org/release/faq/ for trouble shooting.
[0]PETSC ERROR: Petsc Release Version 3.20.4, unknown
[0]PETSC ERROR: /home/hhornik/gismo/build-petsc-mpi/RelWithDebInfo/bin/gsINSSolverPETScTest on a arch-debug named ThinkPad-T14 by hhornik Thu Feb  8 11:04:17 2024
[0]PETSC ERROR: Configure options PETSC_ARCH=arch-debug --with-debugging=1 --download-mumps --download-scalapack
[0]PETSC ERROR: #1 MatProductSymbolic() at /home/hhornik/Software/PETSc/src/mat/interface/matproduct.c:807
[0]PETSC ERROR: #2 MatProduct_Private() at /home/hhornik/Software/PETSc/src/mat/interface/matrix.c:10027
[0]PETSC ERROR: #3 MatMatMult() at /home/hhornik/Software/PETSc/src/mat/interface/matrix.c:10103
[0]PETSC ERROR: #4 PCSetUp_LSC() at /home/hhornik/Software/PETSc/src/ksp/pc/impls/lsc/lsc.c:79
[0]PETSC ERROR: #5 PCSetUp() at /home/hhornik/Software/PETSc/src/ksp/pc/interface/precon.c:1080
[0]PETSC ERROR: #6 KSPSetUp() at /home/hhornik/Software/PETSc/src/ksp/ksp/interface/itfunc.c:415
[0]PETSC ERROR: #7 KSPSolve_Private() at /home/hhornik/Software/PETSc/src/ksp/ksp/interface/itfunc.c:832
[0]PETSC ERROR: #8 KSPSolve() at /home/hhornik/Software/PETSc/src/ksp/ksp/interface/itfunc.c:1079
[0]PETSC ERROR: #9 PCApply_FieldSplit_Schur() at /home/hhornik/Software/PETSc/src/ksp/pc/impls/fieldsplit/fieldsplit.c:1165
[0]PETSC ERROR: #10 PCApply() at /home/hhornik/Software/PETSc/src/ksp/pc/interface/precon.c:498
[0]PETSC ERROR: #11 KSP_PCApply() at /home/hhornik/Software/PETSc/include/petsc/private/kspimpl.h:383
[0]PETSC ERROR: #12 KSPFGMRESCycle() at /home/hhornik/Software/PETSc/src/ksp/ksp/impls/gmres/fgmres/fgmres.c:123
[0]PETSC ERROR: #13 KSPSolve_FGMRES() at /home/hhornik/Software/PETSc/src/ksp/ksp/impls/gmres/fgmres/fgmres.c:235
[0]PETSC ERROR: #14 KSPSolve_Private() at /home/hhornik/Software/PETSc/src/ksp/ksp/interface/itfunc.c:906
[0]PETSC ERROR: #15 KSPSolve() at /home/hhornik/Software/PETSc/src/ksp/ksp/interface/itfunc.c:1079
[0]PETSC ERROR: #16 applySolver() at /home/hhornik/gismo/optional/gsIncompressibleFlow/src/gsINSSolver.hpp:531

I could not find any solution for this so far. My question is: Is it possible to use the LSC preconditioner in such case, where the matrix blocks are of type MATNEST? And if so, how?
Thank you,
Hana Honnerova

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


More information about the petsc-users mailing list