# MatCreateSchurComplement
Creates a new `Mat` that behaves like the Schur complement of a matrix 
## Synopsis
```
#include "petscksp.h" 
PetscErrorCode MatCreateSchurComplement(Mat A00, Mat Ap00, Mat A01, Mat A10, Mat A11, Mat *S)
```
Collective


## Input Parameters

- ***A00,A01,A10,A11  -*** the four parts of the original matrix A = [A00 A01; A10 A11] (A11 is optional)
- ***Ap00             -*** preconditioning matrix for use in ksp(A00,Ap00) to approximate the action of A^{-1}



## Output Parameter

- ***S -*** the matrix that behaves as the Schur complement S = A11 - A10 ksp(A00,Ap00) A01





## Notes
The Schur complement is NOT explicitly formed! Rather, this function returns a virtual Schur complement
that can compute the matrix-vector product by using formula S = A11 - A10 A^{-1} A01
for Schur complement S and a `KSP` solver to approximate the action of A^{-1}.

All four matrices must have the same MPI communicator.

A00 and  A11 must be square matrices.

`MatGetSchurComplement()` takes as arguments the index sets for the submatrices and returns both the virtual Schur complement (what this returns) plus
a sparse approximation to the Schur complement (useful for building a preconditioner for the Schur complement) which can be obtained from this
matrix with `MatSchurComplementGetPmat()`


## Developer Note
The API that includes `MatGetSchurComplement()`, `MatCreateSchurComplement()`, `MatSchurComplementGetPmat()` should be refactored to
remove redundancy and be clearer and simpler.


## See Also
 [](chapter_ksp), `MatCreateNormal()`, `MatMult()`, `MatCreate()`, `MatSchurComplementGetKSP()`, `MatSchurComplementUpdateSubMatrices()`, `MatCreateTranspose()`, `MatGetSchurComplement()`,
`MatSchurComplementGetPmat()`, `MatSchurComplementSetSubMatrices()`

## Level
intermediate

## Location
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ksp/ksp/utils/schurm/schurm.c.html#MatCreateSchurComplement">src/ksp/ksp/utils/schurm/schurm.c</A>


---
[Edit on GitLab](https://gitlab.com/petsc/petsc/-/edit/release/src/ksp/ksp/utils/schurm/schurm.c)


[Index of all KSP routines](index.md)  
[Table of Contents for all manual pages](/docs/manualpages/index.md)  
[Index of all manual pages](/docs/manualpages/singleindex.md)  
