1: #pragma once
3: #include <petscksp.h>
4: #include <petscbt.h>
6: /* special marks for interface graph: they cannot be enums
7: since PCBDDCGRAPH_SPECIAL_MARK ranges from -4 to -max_int */
8: #define PCBDDCGRAPH_NEUMANN_MARK -1
9: #define PCBDDCGRAPH_DIRICHLET_MARK -2
10: #define PCBDDCGRAPH_LOCAL_PERIODIC_MARK -3
11: #define PCBDDCGRAPH_SPECIAL_MARK -4
13: /* Metadata information on node */
14: typedef struct {
15: PetscBool touched;
16: PetscInt subset;
17: PetscInt which_dof;
18: PetscInt special_dof;
19: PetscInt local_sub;
20: PetscInt count;
21: PetscInt *neighbours_set;
22: PetscBool shared;
23: PetscInt local_groups_count;
24: PetscInt *local_groups;
25: } PCBDDCGraphNode;
27: /* Data structure for local graph partitioning */
28: struct _PCBDDCGraph {
29: PetscBool setupcalled;
30: /* graph information */
31: ISLocalToGlobalMapping l2gmap;
32: PetscInt nvtxs;
33: PetscInt nvtxs_global;
34: PCBDDCGraphNode *nodes;
35: PetscInt custom_minimal_size;
36: PetscBool twodim;
37: PetscBool twodimset;
38: PetscBool has_dirichlet;
39: PetscBool multi_element;
40: IS dirdofs;
41: IS dirdofsB;
42: PetscBool seq_graph;
43: PetscInt maxcount;
44: /* data for connected components */
45: PetscInt ncc;
46: PetscInt *cptr;
47: PetscInt *queue;
48: PetscBool queue_sorted;
49: /* data for interface subsets */
50: PetscInt n_subsets;
51: PetscInt *subset_size;
52: PetscInt **subset_idxs;
53: PetscInt *subset_ncc;
54: PetscInt *subset_ref_node;
55: PetscInt *gsubset_size;
56: PetscInt *interface_ref_rsize;
57: PetscSF interface_ref_sf;
58: PetscSF interface_subset_sf;
59: /* placeholders for connectivity relation between dofs */
60: PetscInt nvtxs_csr;
61: PetscInt *xadj;
62: PetscInt *adjncy;
63: PetscBool freecsr;
64: /* data for local subdomains (if any have been detected)
65: these are not intended to be exposed */
66: PetscInt n_local_subs;
67: PetscInt *local_subs;
68: /* coordinates (for corner detection) */
69: PetscBool active_coords;
70: PetscBool cloc;
71: PetscInt cdim, cnloc;
72: PetscReal *coords;
73: };
74: typedef struct _PCBDDCGraph *PCBDDCGraph;
76: struct _PCBDDCGraphCandidates {
77: PetscInt nfc, nec;
78: IS *Faces, *Edges, Vertices;
79: };
80: typedef struct _PCBDDCGraphCandidates *PCBDDCGraphCandidates;
82: /* Wrap to MatFactor solver in Schur complement mode. Provides
83: - standalone solver for interior variables
84: - forward and backward substitutions for correction solver
85: */
86: /* It assumes that interior variables are a contiguous set starting from 0 */
87: struct _PCBDDCReuseSolvers {
88: /* the factored matrix obtained from MatGetFactor(...,solver_package,...) */
89: Mat F;
90: /* placeholders for the solution and rhs on the whole set of dofs of A (size local_dofs - local_vertices)*/
91: Vec sol;
92: Vec rhs;
93: /* */
94: PetscBool has_vertices;
95: /* shell PCs to handle interior/correction solvers */
96: PC interior_solver;
97: PC correction_solver;
98: IS is_R;
99: /* objects to handle Schur complement solution */
100: Vec rhs_B;
101: Vec sol_B;
102: IS is_B;
103: VecScatter correction_scatter_B;
104: /* handle benign trick without change of basis on pressures */
105: PetscInt benign_n;
106: IS *benign_zerodiag_subs;
107: PetscScalar *benign_save_vals;
108: Mat benign_csAIB;
109: Mat benign_AIIm1ones;
110: Vec benign_corr_work;
111: Vec benign_dummy_schur_vec;
112: };
113: typedef struct _PCBDDCReuseSolvers *PCBDDCReuseSolvers;
115: /* structure to handle Schur complements on subsets */
116: struct _PCBDDCSubSchurs {
117: /* local Neumann matrix */
118: Mat A;
119: /* local Schur complement */
120: Mat S;
121: /* index sets */
122: IS is_I;
123: IS is_B;
124: /* whether Schur complements are explicitly computed with or not */
125: PetscBool schur_explicit;
126: /* BDDC or GDSW */
127: PetscBool gdsw;
128: /* matrices contained explicit schur complements cat together */
129: /* note that AIJ format is used but the values are inserted as in column major ordering */
130: Mat S_Ej_all;
131: Mat sum_S_Ej_all;
132: Mat sum_S_Ej_inv_all;
133: Mat sum_S_Ej_tilda_all;
134: IS is_Ej_all;
135: IS is_vertices;
136: IS is_dir;
137: /* l2g maps */
138: ISLocalToGlobalMapping l2gmap;
139: ISLocalToGlobalMapping BtoNmap;
140: /* number of local subproblems */
141: PetscInt n_subs;
142: /* connected components */
143: IS *is_subs;
144: PetscBT is_edge;
145: /* mat factor */
146: char mat_solver_type[64];
147: MatFactorType mat_factor_type;
148: PetscBool is_symmetric;
149: PetscBool is_hermitian;
150: PetscBool is_posdef;
151: /* data structure to reuse MatFactor with Schur solver */
152: PCBDDCReuseSolvers reuse_solver;
153: /* change of variables */
154: KSP *change;
155: IS *change_primal_sub;
156: PetscBool change_with_qr;
157: /* prefix */
158: char *prefix;
159: /* */
160: PetscBool restrict_comm;
161: /* debug */
162: PetscBool debug;
163: /* hook to PCBDDCGraph */
164: PCBDDCGraph graph;
165: };
166: typedef struct _PCBDDCSubSchurs *PCBDDCSubSchurs;
168: /* Structure for deluxe scaling */
169: struct _PCBDDCDeluxeScaling {
170: /* simple scaling on selected dofs (i.e. primal vertices and nodes on interface dirichlet boundaries) */
171: PetscInt n_simple;
172: PetscInt *idx_simple_B;
173: /* handle deluxe problems */
174: PetscInt seq_n;
175: PetscScalar *workspace;
176: VecScatter *seq_scctx;
177: Vec *seq_work1;
178: Vec *seq_work2;
179: Mat *seq_mat;
180: Mat *seq_mat_inv_sum;
181: KSP *change;
182: PetscBool change_with_qr;
183: };
184: typedef struct _PCBDDCDeluxeScaling *PCBDDCDeluxeScaling;
186: /* inexact solvers with nullspace correction */
187: struct _NullSpaceCorrection_ctx {
188: Mat basis_mat;
189: Mat inv_smat;
190: PC local_pc;
191: Vec *fw;
192: Vec *sw;
193: PetscScalar scale;
194: PetscLogEvent evapply;
195: PetscBool symm;
196: };
197: typedef struct _NullSpaceCorrection_ctx *NullSpaceCorrection_ctx;
199: /* MatShell context for benign mat mults */
200: struct _PCBDDCBenignMatMult_ctx {
201: Mat A;
202: PetscInt benign_n;
203: IS *benign_zerodiag_subs;
204: PetscScalar *work;
205: PetscBool apply_left;
206: PetscBool apply_right;
207: PetscBool apply_p0;
208: PetscBool free;
209: };
210: typedef struct _PCBDDCBenignMatMult_ctx *PCBDDCBenignMatMult_ctx;
212: /* feti-dp mat */
213: struct _FETIDPMat_ctx {
214: PetscInt n; /* local number of rows */
215: PetscInt N; /* global number of rows */
216: PetscInt n_lambda; /* global number of multipliers */
217: Vec lambda_local;
218: Vec temp_solution_B;
219: Vec temp_solution_D;
220: Mat B_delta;
221: Mat B_Ddelta;
222: PetscBool deluxe_nonred;
223: VecScatter l2g_lambda;
224: PC pc;
225: PetscBool fully_redundant;
226: /* saddle point */
227: VecScatter l2g_lambda_only;
228: Mat B_BB;
229: Mat B_BI;
230: Mat Bt_BB;
231: Mat Bt_BI;
232: Mat C;
233: VecScatter l2g_p;
234: VecScatter g2g_p;
235: Vec vP;
236: Vec xPg;
237: Vec yPg;
238: Vec rhs_flip;
239: IS lP_I;
240: IS lP_B;
241: IS pressure;
242: IS lagrange;
243: };
244: typedef struct _FETIDPMat_ctx *FETIDPMat_ctx;
246: /* feti-dp preconditioner */
247: struct _FETIDPPC_ctx {
248: Mat S_j;
249: Vec lambda_local;
250: Mat B_Ddelta;
251: VecScatter l2g_lambda;
252: PC pc;
253: /* saddle point */
254: Vec xPg;
255: Vec yPg;
256: };
257: typedef struct _FETIDPPC_ctx *FETIDPPC_ctx;
259: struct _BDdelta_DN {
260: Mat BD;
261: KSP kBD;
262: Vec work;
263: };
264: typedef struct _BDdelta_DN *BDdelta_DN;
266: /* Schur interface preconditioner */
267: struct _BDDCIPC_ctx {
268: VecScatter g2l;
269: PC bddc;
270: };
271: typedef struct _BDDCIPC_ctx *BDDCIPC_ctx;