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;