Actual source code: pcbddcstructsimpl.h

  1: #ifndef PETSC_PCBDDCSTRUCTSIMPL_H
  2: #define PETSC_PCBDDCSTRUCTSIMPL_H

  4: #include <petscksp.h>
  5: #include <petscbt.h>

  7: /* special marks for interface graph: they cannot be enums
  8:    since PCBDDCGRAPH_SPECIAL_MARK ranges from -4 to -max_int */
  9: #define PCBDDCGRAPH_NEUMANN_MARK        -1
 10: #define PCBDDCGRAPH_DIRICHLET_MARK      -2
 11: #define PCBDDCGRAPH_LOCAL_PERIODIC_MARK -3
 12: #define PCBDDCGRAPH_SPECIAL_MARK        -4

 14: /* Structure for local graph partitioning */
 15: struct _PCBDDCGraph {
 16:   PetscBool setupcalled;
 17:   /* graph information */
 18:   ISLocalToGlobalMapping l2gmap;
 19:   PetscInt               nvtxs;
 20:   PetscInt               nvtxs_global;
 21:   PetscBT                touched;
 22:   PetscInt              *count;
 23:   PetscInt             **neighbours_set;
 24:   PetscInt              *subset;
 25:   PetscInt              *which_dof;
 26:   PetscInt              *special_dof;
 27:   PetscInt               custom_minimal_size;
 28:   PetscBool              twodim;
 29:   PetscBool              twodimset;
 30:   PetscBool              has_dirichlet;
 31:   IS                     dirdofs;
 32:   IS                     dirdofsB;
 33:   PetscInt               commsizelimit;
 34:   PetscInt               maxcount;
 35:   /* data for connected components */
 36:   PetscInt  ncc;
 37:   PetscInt *cptr;
 38:   PetscInt *queue;
 39:   PetscBool queue_sorted;
 40:   /* data for interface subsets */
 41:   PetscInt   n_subsets;
 42:   PetscInt  *subset_size;
 43:   PetscInt **subset_idxs;
 44:   PetscInt  *subset_ncc;
 45:   PetscInt  *subset_ref_node;
 46:   /* data for periodic dofs */
 47:   PetscInt  *mirrors;
 48:   PetscInt **mirrors_set;
 49:   /* placeholders for connectivity relation between dofs */
 50:   PetscInt  nvtxs_csr;
 51:   PetscInt *xadj;
 52:   PetscInt *adjncy;
 53:   PetscBool freecsr;
 54:   /* data for local subdomains (if any have been detected)
 55:      these are not intended to be exposed */
 56:   PetscInt  n_local_subs;
 57:   PetscInt *local_subs;
 58:   /* coordinates (for corner detection) */
 59:   PetscBool  active_coords;
 60:   PetscBool  cloc;
 61:   PetscInt   cdim, cnloc;
 62:   PetscReal *coords;
 63: };
 64: typedef struct _PCBDDCGraph *PCBDDCGraph;

 66: struct _PCBDDCGraphCandidates {
 67:   PetscInt nfc, nec;
 68:   IS      *Faces, *Edges, Vertices;
 69: };
 70: typedef struct _PCBDDCGraphCandidates *PCBDDCGraphCandidates;

 72: /* Wrap to MatFactor solver in Schur complement mode. Provides
 73:    - standalone solver for interior variables
 74:    - forward and backward substitutions for correction solver
 75: */
 76: /* It assumes that interior variables are a contiguous set starting from 0 */
 77: struct _PCBDDCReuseSolvers {
 78:   /* the factored matrix obtained from MatGetFactor(...,solver_package,...) */
 79:   Mat F;
 80:   /* placeholders for the solution and rhs on the whole set of dofs of A (size local_dofs - local_vertices)*/
 81:   Vec sol;
 82:   Vec rhs;
 83:   /* */
 84:   PetscBool has_vertices;
 85:   /* shell PCs to handle interior/correction solvers */
 86:   PC interior_solver;
 87:   PC correction_solver;
 88:   IS is_R;
 89:   /* objects to handle Schur complement solution */
 90:   Vec        rhs_B;
 91:   Vec        sol_B;
 92:   IS         is_B;
 93:   VecScatter correction_scatter_B;
 94:   /* handle benign trick without change of basis on pressures */
 95:   PetscInt     benign_n;
 96:   IS          *benign_zerodiag_subs;
 97:   PetscScalar *benign_save_vals;
 98:   Mat          benign_csAIB;
 99:   Mat          benign_AIIm1ones;
100:   Vec          benign_corr_work;
101:   Vec          benign_dummy_schur_vec;
102: };
103: typedef struct _PCBDDCReuseSolvers *PCBDDCReuseSolvers;

105: /* structure to handle Schur complements on subsets */
106: struct _PCBDDCSubSchurs {
107:   /* local Neumann matrix */
108:   Mat A;
109:   /* local Schur complement */
110:   Mat S;
111:   /* index sets */
112:   IS is_I;
113:   IS is_B;
114:   /* whether Schur complements are explicitly computed with or not */
115:   char      mat_solver_type[64];
116:   PetscBool schur_explicit;
117:   /* BDDC or GDSW */
118:   PetscBool gdsw;
119:   /* matrices contained explicit schur complements cat together */
120:   /* note that AIJ format is used but the values are inserted as in column major ordering */
121:   Mat S_Ej_all;
122:   Mat sum_S_Ej_all;
123:   Mat sum_S_Ej_inv_all;
124:   Mat sum_S_Ej_tilda_all;
125:   IS  is_Ej_all;
126:   IS  is_vertices;
127:   IS  is_dir;
128:   /* l2g maps */
129:   ISLocalToGlobalMapping l2gmap;
130:   ISLocalToGlobalMapping BtoNmap;
131:   /* number of local subproblems */
132:   PetscInt n_subs;
133:   /* connected components */
134:   IS     *is_subs;
135:   PetscBT is_edge;
136:   /* mat flags */
137:   PetscBool is_symmetric;
138:   PetscBool is_hermitian;
139:   PetscBool is_posdef;
140:   /* data structure to reuse MatFactor with Schur solver */
141:   PCBDDCReuseSolvers reuse_solver;
142:   /* change of variables */
143:   KSP      *change;
144:   IS       *change_primal_sub;
145:   PetscBool change_with_qr;
146:   /* prefix */
147:   char *prefix;
148:   /* */
149:   PetscBool restrict_comm;
150:   /* debug */
151:   PetscBool debug;
152: };
153: typedef struct _PCBDDCSubSchurs *PCBDDCSubSchurs;

155: /* Structure for deluxe scaling */
156: struct _PCBDDCDeluxeScaling {
157:   /* simple scaling on selected dofs (i.e. primal vertices and nodes on interface dirichlet boundaries) */
158:   PetscInt  n_simple;
159:   PetscInt *idx_simple_B;
160:   /* handle deluxe problems  */
161:   PetscInt     seq_n;
162:   PetscScalar *workspace;
163:   VecScatter  *seq_scctx;
164:   Vec         *seq_work1;
165:   Vec         *seq_work2;
166:   Mat         *seq_mat;
167:   Mat         *seq_mat_inv_sum;
168:   KSP         *change;
169:   PetscBool    change_with_qr;
170: };
171: typedef struct _PCBDDCDeluxeScaling *PCBDDCDeluxeScaling;

173: /* inexact solvers with nullspace correction */
174: struct _NullSpaceCorrection_ctx {
175:   Mat           basis_mat;
176:   Mat           inv_smat;
177:   PC            local_pc;
178:   Vec          *fw;
179:   Vec          *sw;
180:   PetscScalar   scale;
181:   PetscLogEvent evapply;
182:   PetscBool     symm;
183: };
184: typedef struct _NullSpaceCorrection_ctx *NullSpaceCorrection_ctx;

186: /* MatShell context for benign mat mults */
187: struct _PCBDDCBenignMatMult_ctx {
188:   Mat          A;
189:   PetscInt     benign_n;
190:   IS          *benign_zerodiag_subs;
191:   PetscScalar *work;
192:   PetscBool    apply_left;
193:   PetscBool    apply_right;
194:   PetscBool    apply_p0;
195:   PetscBool    free;
196: };
197: typedef struct _PCBDDCBenignMatMult_ctx *PCBDDCBenignMatMult_ctx;

199: /* feti-dp mat */
200: struct _FETIDPMat_ctx {
201:   PetscInt   n;        /* local number of rows */
202:   PetscInt   N;        /* global number of rows */
203:   PetscInt   n_lambda; /* global number of multipliers */
204:   Vec        lambda_local;
205:   Vec        temp_solution_B;
206:   Vec        temp_solution_D;
207:   Mat        B_delta;
208:   Mat        B_Ddelta;
209:   PetscBool  deluxe_nonred;
210:   VecScatter l2g_lambda;
211:   PC         pc;
212:   PetscBool  fully_redundant;
213:   /* saddle point */
214:   VecScatter l2g_lambda_only;
215:   Mat        B_BB;
216:   Mat        B_BI;
217:   Mat        Bt_BB;
218:   Mat        Bt_BI;
219:   Mat        C;
220:   VecScatter l2g_p;
221:   VecScatter g2g_p;
222:   Vec        vP;
223:   Vec        xPg;
224:   Vec        yPg;
225:   Vec        rhs_flip;
226:   IS         pressure;
227:   IS         lagrange;
228: };
229: typedef struct _FETIDPMat_ctx *FETIDPMat_ctx;

231: /* feti-dp preconditioner */
232: struct _FETIDPPC_ctx {
233:   Mat        S_j;
234:   Vec        lambda_local;
235:   Mat        B_Ddelta;
236:   VecScatter l2g_lambda;
237:   PC         pc;
238:   /* saddle point */
239:   Vec xPg;
240:   Vec yPg;
241: };
242: typedef struct _FETIDPPC_ctx *FETIDPPC_ctx;

244: struct _BDdelta_DN {
245:   Mat BD;
246:   KSP kBD;
247:   Vec work;
248: };
249: typedef struct _BDdelta_DN *BDdelta_DN;

251: /* Schur interface preconditioner */
252: struct _BDDCIPC_ctx {
253:   VecScatter g2l;
254:   PC         bddc;
255: };
256: typedef struct _BDDCIPC_ctx *BDDCIPC_ctx;

258: #endif // PETSC_PCBDDCSTRUCTSIMPL_H