Skip to main content
`Ctrl`+`K`

# MatMatMatMult

Performs matrix-matrix-matrix multiplication D=ABC.

## Synopsis

    #include "petscmat.h"
    PetscErrorCode MatMatMatMult(Mat A, Mat B, Mat C, MatReuse scall, PetscReal fill, Mat *D)

Neighbor-wise Collective

## Input Parameters

- A - the left matrix

- B - the middle matrix

- C - the right matrix

- scall - either `MAT_INITIAL_MATRIX` or `MAT_REUSE_MATRIX`

- fill - expected fill as ratio of nnz(D)/(nnz(A) + nnz(B)+nnz(C)), use `PETSC_DETERMINE` or `PETSC_CURRENT` if you do not have a good estimate if the result is a dense matrix this is irrelevant

## Output Parameter

- D - the product matrix

## Notes

Unless `scall` is `MAT_REUSE_MATRIX` `D` will be created.

`MAT_REUSE_MATRIX` can only be used if the matrices `A`, `B`, and `C` have the same nonzero pattern as in the previous call

This is a convenience routine that wraps the use of the `MatProductCreate()` with a `MatProductType` of `MATPRODUCT_ABC` functionality into a single function call. For more involved matrix-matrix operations see `MatProductCreate()`.

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 `MAT_REUSE_MATRIX` in all calls but the first

The deprecated `PETSC_DEFAULT` in `fill` also means use the current value

## See Also

Matrices, `Mat`, `MatProductCreate()`, `MATPRODUCT_ABC`, `MatMatMult`, `MatPtAP()`, `MatMatTransposeMult()`, `MatTransposeMatMult()`

## Level

intermediate

## Location

src/mat/interface/matrix.c

## Examples

src/ksp/pc/tutorials/ex4.c

Index of all Mat routines
Table of Contents for all manual pages
Index of all manual pages