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

Zhang, Hong hzhang at mcs.anl.gov
Tue Feb 13 20:09:36 CST 2024


Pierre,
Please review https://gitlab.com/petsc/petsc/-/merge_requests/7292#5479b9c001ff78d18f5236b7e21d8b1cb9acf476
I moved your checking PetscCheck((*C)->ops->productsymbolic,...) from MatProduct_Private() to MatProductSymbolic() .
With this fix, you can run ex195 with
./ex195 -test_nest*nest or ./ex195 -test_matproduct
...
[0]PETSC ERROR: No support for this operation for this object type
[0]PETSC ERROR: Unspecified symbolic phase for product AB with A nest, B nest. Call MatProductSetFromOptions() first or the product is not supported

Both tests give the same error output.

In the design of MatProduct routines, we set API calling process as
MatProductCreate()
MatProductSetType()
MatProductSetFromOptions() //determines the implementations of symbolic and numeric products, must be called!
MatProductSymbolic()
MatProductNumeric()

Hong

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



On 13 Feb 2024, at 9:21 PM, Zhang, Hong via petsc-users <petsc-users at mcs.anl.gov> wrote:

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));

Sure, I fixed a single MatProduct bug, my guts tell me there are other unhandled corner cases, and you indeed found another one.

./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);

I don’t see how this is less confusing.
In fact, to me, error message with conditionals in the sentence but without PETSc telling the value of each expression of the conditionals is infuriating.
How do I know if MatProductSetFromOptions() has not been called, or if the product is not supported?
This is very difficult to debug, to me, and if it would be possible to catch this with two different checks, it would be much better.
But the current design of MatProduct may not allow us to do it, so I will not be opposed to such a change.
Maybe add a Boolean à la pc->setupcalled or pc->setfromoptionscalled in the MatProduct structure to be able to distinguish better the cause of the failure?

Thanks,
Pierre

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/20240214/8c9df635/attachment-0001.html>


More information about the petsc-users mailing list