Skip to main content
`Ctrl`+`K`

# MatShellSetOperation

Allows user to set a matrix operation for a `MATSHELL` shell matrix.

## Synopsis

    #include "petscmat.h"
    PetscErrorCode MatShellSetOperation(Mat mat, MatOperation op, PetscErrorCodeFn *g)

Logically Collective

## Input Parameters

- mat - the `MATSHELL` shell matrix

- op - the name of the operation

- g - the function that provides the operation.

## Example Usage

      extern PetscErrorCode usermult(Mat, Vec, Vec);

      MatCreateShell(comm, m, n, M, N, ctx, &A);
      MatShellSetOperation(A, MATOP_MULT, (void(*)(void))usermult);

## Notes

See the file include/petscmat.h for a complete list of matrix operations, which all have the form MATOP_<OPERATION>, where <OPERATION> is the name (in all capital letters) of the user interface routine (e.g., `MatMult()` -> `MATOP_MULT`).

All user-provided functions (except for `MATOP_DESTROY`) should have the same calling sequence as the usual matrix interface routines, since they are intended to be accessed via the usual matrix interface routines, e.g.,

      MatMult(Mat, Vec, Vec) -> usermult(Mat, Vec, Vec)

In particular each function MUST return an error code of `PETSC_SUCCESS` on success and nonzero on failure.

Within each user-defined routine, the user should call `MatShellGetContext()` to obtain the user-defined context that was set by `MatCreateShell()`.

Use `MatSetOperation()` to set an operation for any matrix type. For matrix product operations (i.e. `MatMatXXX()`, `MatTransposeMatXXX()` etc) use `MatShellSetMatProductOperation()`

## Fortran Note

For `MatCreateVecs()` the user code should check if the input left or right vector is -1 and in that case not generate a vector. See `src/mat/tests/ex120f.F`

## See Also

Matrices, `Mat`, `MATSHELL`, `MatCreateShell()`, `MatShellGetContext()`, `MatShellGetOperation()`, `MatShellSetContext()`, `MatSetOperation()`, `MatShellSetManageScalingShifts()`, `MatShellSetMatProductOperation()`

## Level

advanced

## Location

src/mat/impls/shell/shell.c

## Examples

src/mat/tutorials/ex20f.F90
src/tao/leastsquares/tutorials/tomography.c
src/tao/unconstrained/tutorials/eptorsion1.c
src/tao/pde_constrained/tutorials/elliptic.c
src/tao/pde_constrained/tutorials/hyperbolic.c
src/snes/tutorials/ex36.c
src/tao/bound/tutorials/plate2.c
src/ksp/ksp/tutorials/ex14f.F90
src/tao/pde_constrained/tutorials/parabolic.c
src/snes/tutorials/ex12.c

## Implementations

MatShellSetOperation_Shell() in src/mat/impls/shell/shell.c

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