xref: /petsc/src/ksp/pc/impls/bjacobi/bjacobi.h (revision 2ff79c18c26c94ed8cb599682f680f231dca6444)
1 #pragma once
2 /*
3     Private data for block Jacobi and block Gauss-Seidel preconditioner.
4 */
5 #include <petsc/private/pcimpl.h>
6 
7 /*
8        This data is general for all implementations
9 */
10 typedef struct {
11   PetscInt     n;              /* number of global blocks */
12   PetscInt     n_local;        /* number of blocks in this subcommunicator or in this process */
13   PetscInt     first_local;    /* number of first block on processor */
14   PetscBool    use_true_local; /* use block from true matrix, not the matrix used to construct the preconditioner for local MatMult() */
15   KSP         *ksp;            /* KSP contexts for blocks or for subcommunicator */
16   void        *data;           /* implementation-specific data */
17   PetscInt    *l_lens;         /* lens of each block */
18   PetscInt    *g_lens;
19   PetscSubcomm psubcomm; /* for multiple processors per block */
20 } PC_BJacobi;
21 
22 /*
23        This data is specific for certain implementations
24 */
25 
26 /*  This is for multiple blocks per processor */
27 typedef struct {
28   Vec      *x, *y;      /* work vectors for solves on each block */
29   PetscInt *starts;     /* starting point of each block */
30   Mat      *mat, *pmat; /* submatrices for each block */
31   IS       *is;         /* for gathering the submatrices */
32 } PC_BJacobi_Multiblock;
33 
34 /*  This is for a single block per processor */
35 typedef struct {
36   Vec x, y;
37 } PC_BJacobi_Singleblock;
38 
39 /*  This is for multiple processors per block */
40 typedef struct {
41   PC           pc;         /* preconditioner used on each subcommunicator */
42   Vec          xsub, ysub; /* vectors of a subcommunicator to hold parallel vectors of PetscObjectComm((PetscObject)pc) */
43   Mat          submats;    /* the matrices belong to a subcommunicator */
44   PetscSubcomm psubcomm;
45 } PC_BJacobi_Multiproc;
46