petsc-3.7.1 2016-05-15
Report Typos and Errors

# PCFIELDSPLIT

Preconditioner created by combining separate preconditioners for individual fields or groups of fields. See the users manual section "Solving Block Matrices" for more details. To set options on the solvers for each block append -fieldsplit_ to all the PC Many broptions database keys. For example, -fieldsplit_pc_type ilu -fieldsplit_pc_factor_levels 1 Many br

To set the options on the solvers separate for each block call PCFieldSplitGetSubKSP() Many brand set the options directly on the resulting KSP object Many br

Many br

### Options Database Keys

| -pc_fieldsplit_%d_fields <a,b,..> | - indicates the fields to be used in the %d'th split Many br
| -pc_fieldsplit_default | - automatically add any fields to additional splits that have not Many brbeen supplied explicitly by -pc_fieldsplit_%d_fields Many br
| -pc_fieldsplit_block_size <bs> | - size of block that defines fields (i.e. there are bs fields) Many br
| -pc_fieldsplit_type <additive,multiplicative,symmetric_multiplicative,schur> | - type of relaxation or factorization splitting Many br
| -pc_fieldsplit_schur_precondition <self,selfp,user,a11,full> | - default is a11; see PCFieldSplitSetSchurPre() Many br
| -pc_fieldsplit_detect_saddle_point | - automatically finds rows with zero or negative diagonal and uses Schur complement with no preconditioner as the solver Many br

| Options prefix for inner solvers when using Schur complement preconditioner are | - fieldsplit_0_ and -fieldsplit_1_ Many brfor all other solvers they are -fieldsplit_%d_ for the dth field, use -fieldsplit_ for all fields Many br

### Notes

Use PCFieldSplitSetFields() to set fields defined by "strided" entries and PCFieldSplitSetIS() Many brto define a field by an arbitrary collection of entries. Many br

If no fields are set the default is used. The fields are defined by entries strided by bs, Many brbeginning at 0 then 1, etc to bs-1. The block size can be set with PCFieldSplitSetBlockSize(), Many brif this is not called the block size defaults to the blocksize of the second matrix passed Many brto KSPSetOperators()/PCSetOperators(). Many br

        For the Schur complement preconditioner if J = ( A00 A01 )

                                                       ( A10 A11 )

        the preconditioner using full factorization is

                 ( I   -ksp(A00) A01 ) ( inv(A00)     0  ) (     I          0  )

                 ( 0         I       ) (   0      ksp(S) ) ( -A10 ksp(A00)  I  )

where the action of inv(A00) is applied using the KSP solver with prefix -fieldsplit_0_. S is the Schur complement Many br

                 S = A11 - A10 ksp(A00) A01

which is usually dense and not stored explicitly. The action of ksp(S) is computed using the KSP solver with prefix -fieldsplit_splitname_ (where splitname was given Many brin providing the SECOND split or 1 if not give). For PCFieldSplitGetKSP() when field number is 0, Many brit returns the KSP associated with -fieldsplit_0_ while field number 1 gives -fieldsplit_1_ KSP. By default Many brA11 is used to construct a preconditioner for S, use PCFieldSplitSetSchurPre() for all the possible ways to construct the preconditioner for S. Many br

The factorization type is set using -pc_fieldsplit_schur_fact_type <diag, lower, upper, full>. The full is shown above, Many brdiag gives Many br

                 ( inv(A00)     0   )

                 (   0      -ksp(S) )

note that slightly counter intuitively there is a negative in front of the ksp(S) so that the preconditioner is positive definite. The lower factorization is the inverse of Many br

                 (  A00   0 )

                 (  A10   S )

where the inverses of A00 and S are applied using KSPs. The upper factorization is the inverse of Many br

                 ( A00 A01 )

                 (  0   S  )

where again the inverses of A00 and S are applied using KSPs. Many br

If only one set of indices (one IS) is provided with PCFieldSplitSetIS() then the complement of that IS Many bris used automatically for a second block. Many br

The fieldsplit preconditioner cannot currently be used with the BAIJ or SBAIJ data formats if the blocksize is larger than 1. Many brGenerally it should be used with the AIJ format. Many br

The forms of these preconditioners are closely related if not identical to forms derived as "Distributive Iterations", see, Many brfor example, page 294 in "Principles of Computational Fluid Dynamics" by Pieter Wesseling. Note that one can also use PCFIELDSPLIT Many brinside a smoother resulting in "Distributive Smoothers". Many br

There is a nice discussion of block preconditioners in Many br

[El08] A taxonomy and comparison of parallel block multi-level preconditioners for the incompressible Navier-Stokes equations Many brHoward Elman, V.E. Howle, John Shadid, Robert Shuttleworth, Ray Tuminaro, Journal of Computational Physics 227 (2008) 1790--1808 Many brhttp://chess.cs.umd.edu/~elman/papers/tax.pdf Many br

The Constrained Pressure Preconditioner (CPR) does not appear to be currently implementable directly with PCFIELDSPLIT. CPR solves first the Schur complemented pressure equation, updates the Many brresidual on all variables and then applies a simple ILU like preconditioner on all the variables. So it is very much like the full Schur complement with selfp representing the Schur complement but instead Many brof backsolving for the saturations in the last step it solves a full coupled (ILU) system for updates to all the variables. Many br

### See Also

PCCreate(), PCSetType(), PCType (for list of available types), PC, Block_Preconditioners, PCLSC,
PCFieldSplitGetSubKSP(), PCFieldSplitSetFields(), PCFieldSplitSetType(), PCFieldSplitSetIS(), PCFieldSplitSetSchurPre(), Many brMatSchurComplementSetAinvType() Many br

Level:intermediate
Location:src/ksp/pc/impls/fieldsplit/fieldsplit.c
Index of all PC routines
Table of Contents for all manual pages
Index of all manual pages

### Examples

src/ksp/ksp/examples/tutorials/ex43.c.html
src/snes/examples/tutorials/ex70.c.html