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