# PCFieldSplitSetSchurPre#

Indicates from what operator the preconditioner is constructed for the Schur complement. The default is the A11 matrix.

## Synopsis#

```
#include "petscpc.h"
PetscErrorCode PCFieldSplitSetSchurPre(PC pc, PCFieldSplitSchurPreType ptype, Mat pre)
```

Collective

## Input Parameters#

the preconditioner context**pc -**which matrix to use for preconditioning the Schur complement:**ptype -**`PC_FIELDSPLIT_SCHUR_PRE_A11`

(default),`PC_FIELDSPLIT_SCHUR_PRE_SELF`

,`PC_FIELDSPLIT_SCHUR_PRE_USER`

,`PC_FIELDSPLIT_SCHUR_PRE_SELFP`

, and`PC_FIELDSPLIT_SCHUR_PRE_FULL`

matrix to use for preconditioning, or**pre -**`NULL`

## Options Database Keys#

default is**-pc_fieldsplit_schur_precondition <self,selfp,user,a11,full> -**`a11`

. See notes for meaning of various argumentsthe preconditioner algorithm that is used to construct the preconditioner from the operator**-fieldsplit_1_pc_type**-

## Notes#

If ptype is

the preconditioner for the Schur complement is generated from the block diagonal part of the preconditioner matrix associated with the Schur complement (i.e. A11), not the Schur complement matrix**a11 -**the preconditioner for the Schur complement is generated from the symbolic representation of the Schur complement matrix: The only preconditioners that currently work with this symbolic representation matrix object are**self -**`PCLSC`

and`PCHPDDM`

the preconditioner for the Schur complement is generated from the user provided matrix (pre argument to this function).**user -**the preconditioning for the Schur complement is generated from an explicitly-assembled approximation Sp = A11 - A10 inv(diag(A00)) A01 This is only a good preconditioner when diag(A00) is a good preconditioner for A00. Optionally, A00 can be lumped before extracting the diagonal using the additional option**selfp -**`-fieldsplit_1_mat_schur_complement_ainv_type lump`

the preconditioner for the Schur complement is generated from the exact Schur complement matrix representation computed internally by**full -**`PCFIELDSPLIT`

(this is expensive) useful mostly as a test that the Schur complement approach can work for your problem

When solving a saddle point problem, where the A11 block is identically zero, using `a11`

as the ptype only makes sense
with the additional option `-fieldsplit_1_pc_type none`

. Usually for saddle point problems one would use a ptype of self and
`-fieldsplit_1_pc_type lsc`

which uses the least squares commutator to compute a preconditioner for the Schur complement.

## See Also#

Solving Block Matrices, `PC`

, `PCFieldSplitGetSchurPre()`

, `PCFieldSplitGetSubKSP()`

, `PCFIELDSPLIT`

, `PCFieldSplitSetFields()`

, `PCFieldSplitSchurPreType`

,
`MatSchurComplementSetAinvType()`

, `PCLSC`

## Level#

intermediate

## Location#

## Examples#

src/snes/tutorials/ex70.c

src/dm/impls/stag/tutorials/ex4.c

src/ksp/ksp/tutorials/ex87.c

## Implementations#

PCFieldSplitSetSchurPre_FieldSplit() in src/ksp/pc/impls/fieldsplit/fieldsplit.c

Index of all PC routines

Table of Contents for all manual pages

Index of all manual pages