#include "petscmat.h" PetscErrorCode MatMatMult(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)Neighbor-wise Collective on Mat
| A | - the left matrix | |
| B | - the right matrix | |
| scall | - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX | |
| fill | - expected fill as ratio of nnz(C)/(nnz(A) + nnz(B)), use PETSC_DEFAULT if you do not have a good estimate if the result is a dense matrix this is irrelevant |
| C | - the product matrix |
MAT_REUSE_MATRIX can only be used if the matrices A and B have the same nonzero pattern as in the previous call and C was obtained from a previous call to this function with MAT_INITIAL_MATRIX.
To determine the correct fill value, run with -info and search for the string "Fill ratio" to see the value actually needed.
If you have many matrices with the same non-zero structure to multiply, you should use MatProductCreate()/MatProductSymbolic()/MatProductReplaceMats(), and call MatProductNumeric() repeatedly.
In the special case where matrix B (and hence C) are dense you can create the correctly sized matrix C yourself and then call this routine with MAT_REUSE_MATRIX, rather than first having MatMatMult() create it for you. You can NEVER do this if the matrix C is sparse.
MatProductCreate(A,B,NULL,&C);
MatProductSetType(C,MATPRODUCT_AB);
MatProductSymbolic(C);
MatProductNumeric(C); // compute C=A * B
MatProductReplaceMats(A1,B1,NULL,C); // compute C=A1 * B1
MatProductNumeric(C);
MatProductReplaceMats(A2,NULL,NULL,C); // compute C=A2 * B1
MatProductNumeric(C);