Pierre, ________________________________ Well, that’s just not an option. I don’t want the code to error, I want a fallback mechanism so that I can do the MatMatMult myself, column by column (or implement this as part of issue #608 in the case of dense B and C so neither José nor me have to bother about this again). That makes MatMatMult very hard to use now, because you can’t tell a priori if your code will run or not if the types of your A and B are variable (because of an unimplemented MatMatMult).
I'll add this support. What you propose there looks good to me. (Though I’d like to be able to skip MatProductSymbolic() in the case of a dense Wmat allocated in user code, but this is very minor) Since you Wmat is allocated, you should skip MatProductSymbolic() by calling MatProductCreateWithMat( , , ...,Wmat); .. MatProductSetFromOptions() MatProductNumeric() // skip MatProductSymbolic() The new API is introduced to unify and cleanup previous random design of mat-mat operations, which becomes inextensible and difficult to manage. The new API is more flexible, allowing options for various algorithmic implementations, but would take a while to be bug-free and ensure needed features are maintained. Report to me -- I'll do my best to provided needed support. Hong ________________________________ From: Pierre Jolivet <pierre.joli...@enseeiht.fr<mailto:pierre.joli...@enseeiht.fr>> Sent: Tuesday, April 21, 2020 10:53 AM To: Zhang, Hong <hzh...@mcs.anl.gov<mailto:hzh...@mcs.anl.gov>> Cc: petsc-dev <petsc-dev@mcs.anl.gov<mailto:petsc-dev@mcs.anl.gov>> Subject: Re: [petsc-dev] MATOP_MAT_MULT On 21 Apr 2020, at 5:22 PM, Zhang, Hong <hzh...@mcs.anl.gov<mailto:hzh...@mcs.anl.gov>> wrote: Pierre, MatMatMult_xxx() is removed from MatOps table. Shouldn’t there be a deprecation notice somewhere? There is nothing about MATOP_MAT_MULT in the 3.13 changelog https://www.mcs.anl.gov/petsc/documentation/changes/313.html For example, I see that in SLEPc, José is currently making these checks, which are in practice useless as they always return PETSC_FALSE? https://gitlab.com/slepc/slepc/-/blob/master/src/sys/classes/bv/impls/contiguous/contig.c#L191 (Maybe José is aware of this and this is just for testing) MatMatMult() is replaced by MatProductCreate() MatProductSetType(,MATPRODUCT_AB) MatProductSetFromOptions() MatProductSymbolic() MatProductNumeric() Where/when do you need query a single matrix for its product operation? I didn’t want to bother at first with the new API, because I’m only interested in C = A*B with C and B being dense. Of course, I can update my code, but if I understand Stefano’s issue correctly, and let’s say my A is of type SBAIJ, for which there is no MatMatMult, the code will now error out in the MatProduct? There is no fallback mechanism? Meaning I could in fact _not_ use the new API and will just have to loop on all columns of B, even for AIJ matrices. Thanks, Pierre Hong ________________________________ From: petsc-dev <petsc-dev-boun...@mcs.anl.gov<mailto:petsc-dev-boun...@mcs.anl.gov>> on behalf of Pierre Jolivet <pierre.joli...@enseeiht.fr<mailto:pierre.joli...@enseeiht.fr>> Sent: Tuesday, April 21, 2020 7:50 AM To: petsc-dev <petsc-dev@mcs.anl.gov<mailto:petsc-dev@mcs.anl.gov>> Subject: [petsc-dev] MATOP_MAT_MULT Hello, Am I seeing this correctly? #include <petsc.h> int main(int argc,char **args) { Mat A; PetscBool hasMatMult; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&args,NULL,NULL);if (ierr) return ierr; ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetType(A,MATMPIAIJ);CHKERRQ(ierr); ierr = MatHasOperation(A,MATOP_MAT_MULT,&hasMatMult);CHKERRQ(ierr); printf("%s\n", PetscBools[hasMatMult]); ierr = PetscFinalize(); return ierr; } => FALSE I believe this is a regression (or at least an undocumented change) introduced here: https://gitlab.com/petsc/petsc/-/merge_requests/2524/ I also believe Stefano raised a similar point there: https://gitlab.com/petsc/petsc/-/issues/608 This is a performance killer in my case because I was previously using this check to know whether I could use MatMatMult or had to loop on all columns and call MatMult on all of them. There is also a bunch of (previously functioning but now) broken code, e.g., https://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/transpose/transm.c.html#line105 or https://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/nest/matnest.c.html#line2105 Is this being addressed/documented? Thanks, Pierre