Actual source code: bddcstructs.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;

 64: };
 65: typedef struct _PCBDDCGraph *PCBDDCGraph;

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

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

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

166: /* inexact solvers with nullspace correction */
167: struct _NullSpaceCorrection_ctx {
168:   Mat           basis_mat;
169:   Mat           inv_smat;
170:   PC            local_pc;
171:   Vec           *fw;
172:   Vec           *sw;
173:   PetscScalar   scale;
174:   PetscLogEvent evapply;
175:   PetscBool     symm;
176: };
177: typedef struct _NullSpaceCorrection_ctx *NullSpaceCorrection_ctx;

179: /* MatShell context for benign mat mults */
180: struct _PCBDDCBenignMatMult_ctx {
181:   Mat         A;
182:   PetscInt    benign_n;
183:   IS          *benign_zerodiag_subs;
184:   PetscScalar *work;
185:   PetscBool   apply_left;
186:   PetscBool   apply_right;
187:   PetscBool   apply_p0;
188:   PetscBool   free;
189: };
190: typedef struct _PCBDDCBenignMatMult_ctx *PCBDDCBenignMatMult_ctx;

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

224: /* feti-dp preconditioner */
225: struct _FETIDPPC_ctx {
226:   Mat        S_j;
227:   Vec        lambda_local;
228:   Mat        B_Ddelta;
229:   VecScatter l2g_lambda;
230:   PC         pc;
231:   /* saddle point */
232:   Vec        xPg;
233:   Vec        yPg;
234: };
235: typedef struct _FETIDPPC_ctx *FETIDPPC_ctx;

237: struct _BDdelta_DN {
238:   Mat BD;
239:   KSP kBD;
240:   Vec work;
241: };
242: typedef struct _BDdelta_DN *BDdelta_DN;

244: /* Schur interface preconditioner */
245: struct _BDDCIPC_ctx {
246:   VecScatter g2l;
247:   PC         bddc;
248: };
249: typedef struct _BDDCIPC_ctx *BDDCIPC_ctx;

251: #endif