> On 13 Feb 2024, at 9:21 PM, Zhang, Hong via petsc-users 
> <[email protected]> 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 <[email protected]>
> Sent: Tuesday, February 13, 2024 12:08 AM
> To: Zhang, Hong <[email protected]>
> Cc: Hana Honnerová <[email protected]>; [email protected] 
> <[email protected]>
> Subject: Re: [petsc-users] question on PCLSC with matrix blocks of type 
> MATNEST
>  
> 
> 
>> On 13 Feb 2024, at 12:33 AM, Zhang, Hong <[email protected]> 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 <[email protected]>
>> Sent: Sunday, February 11, 2024 7:43 AM
>> To: Zhang, Hong <[email protected]>
>> Cc: Hana Honnerová <[email protected]>; [email protected] 
>> <[email protected]>
>> 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 
>> <[email protected]> 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 <[email protected]> on behalf of Hana 
>> Honnerová <[email protected]>
>> Sent: Thursday, February 8, 2024 4:45 AM
>> To: [email protected] <[email protected]>
>> 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

Reply via email to