4: #include <../src/ksp/pc/impls/is/pcis.h> 5: #include <../src/ksp/pc/impls/bddc/bddcstructs.h> 7: #if !defined(PETSC_PCBDDC_MAXLEVELS) 8: #define PETSC_PCBDDC_MAXLEVELS 8 9: #endif 11: PETSC_EXTERN PetscLogEvent PC_BDDC_Topology[PETSC_PCBDDC_MAXLEVELS]; 12: PETSC_EXTERN PetscLogEvent PC_BDDC_LocalSolvers[PETSC_PCBDDC_MAXLEVELS]; 13: PETSC_EXTERN PetscLogEvent PC_BDDC_LocalWork[PETSC_PCBDDC_MAXLEVELS]; 14: PETSC_EXTERN PetscLogEvent PC_BDDC_CorrectionSetUp[PETSC_PCBDDC_MAXLEVELS]; 15: PETSC_EXTERN PetscLogEvent PC_BDDC_CoarseSetUp[PETSC_PCBDDC_MAXLEVELS]; 16: PETSC_EXTERN PetscLogEvent PC_BDDC_ApproxSetUp[PETSC_PCBDDC_MAXLEVELS]; 17: PETSC_EXTERN PetscLogEvent PC_BDDC_ApproxApply[PETSC_PCBDDC_MAXLEVELS]; 18: PETSC_EXTERN PetscLogEvent PC_BDDC_CoarseSolver[PETSC_PCBDDC_MAXLEVELS]; 19: PETSC_EXTERN PetscLogEvent PC_BDDC_AdaptiveSetUp[PETSC_PCBDDC_MAXLEVELS]; 20: PETSC_EXTERN PetscLogEvent PC_BDDC_Scaling[PETSC_PCBDDC_MAXLEVELS]; 21: PETSC_EXTERN PetscLogEvent PC_BDDC_Schurs[PETSC_PCBDDC_MAXLEVELS]; 22: PETSC_EXTERN PetscLogEvent PC_BDDC_Solves[PETSC_PCBDDC_MAXLEVELS][3]; 24: /* Private context (data structure) for the BDDC preconditioner. */ 25: typedef struct { 26: /* First MUST come the folowing line, for the stuff that is common to FETI and Neumann-Neumann. */ 27: PC_IS pcis; 28: /* Coarse stuffs needed by BDDC application in KSP */ 29: Vec coarse_vec; 30: KSP coarse_ksp; 31: Mat coarse_phi_B; 32: Mat coarse_phi_D; 33: Mat coarse_psi_B; 34: Mat coarse_psi_D; 35: PetscInt local_primal_size; 36: PetscInt coarse_size; 37: PetscInt* global_primal_indices; 38: VecScatter coarse_loc_to_glob; 39: /* Local stuffs needed by BDDC application in KSP */ 40: Vec vec1_P; 41: Vec vec1_C; 42: Mat local_auxmat1; 43: Mat local_auxmat2; 44: Vec vec1_R; 45: Vec vec2_R; 46: IS is_R_local; 47: VecScatter R_to_B; 48: VecScatter R_to_D; 49: KSP ksp_R; 50: KSP ksp_D; 51: /* Quantities defining constraining details (local) of the preconditioner */ 52: /* These quantities define the preconditioner itself */ 53: PetscInt n_vertices; 54: Mat ConstraintMatrix; 55: PetscBool new_primal_space; 56: PetscBool new_primal_space_local; 57: PetscInt *primal_indices_local_idxs; 58: PetscInt local_primal_size_cc; 59: PetscInt *local_primal_ref_node; 60: PetscInt *local_primal_ref_mult; 61: PetscBool use_change_of_basis; 62: PetscBool use_change_on_faces; 63: PetscBool fake_change; 64: Mat ChangeOfBasisMatrix; 65: Mat user_ChangeOfBasisMatrix; 66: PetscBool change_interior; 67: Mat switch_static_change; 68: Vec work_change; 69: Vec original_rhs; 70: Vec temp_solution; 71: Mat local_mat; 72: PetscBool use_exact_dirichlet_trick; 73: PetscBool exact_dirichlet_trick_app; 74: PetscBool ksp_guess_nonzero; 75: PetscBool rhs_change; 76: PetscBool temp_solution_used; 77: /* benign subspace trick */ 78: PetscBool benign_saddle_point; 79: PetscBool benign_have_null; 80: PetscBool benign_skip_correction; 81: PetscBool benign_compute_correction; 82: Mat benign_change; 83: Mat benign_original_mat; 84: IS *benign_zerodiag_subs; 85: Vec benign_vec; 86: Mat benign_B0; 87: PetscSF benign_sf; 88: PetscScalar *benign_p0; 89: PetscInt benign_n; 90: PetscInt *benign_p0_lidx; 91: PetscInt *benign_p0_gidx; 92: PetscBool benign_null; 93: PetscBool benign_change_explicit; 94: PetscBool benign_apply_coarse_only; 96: /* Some defaults on selecting vertices and constraints*/ 97: PetscBool use_local_adj; 98: PetscBool use_vertices; 99: PetscBool use_faces; 100: PetscBool use_edges; 102: /* Some customization is possible */ 103: PetscBool corner_selection; 104: PetscBool corner_selected; 105: PetscBool recompute_topography; 106: PetscBool graphanalyzed; 107: PCBDDCGraph mat_graph; 108: PetscInt graphmaxcount; 109: MatNullSpace onearnullspace; 110: PetscObjectState *onearnullvecs_state; 111: PetscBool NullSpace_corr[4]; 112: IS user_primal_vertices; 113: IS user_primal_vertices_local; 114: PetscBool use_nnsp; 115: PetscBool use_nnsp_true; 116: PetscBool use_qr_single; 117: PetscBool user_provided_isfordofs; 118: PetscInt n_ISForDofs; 119: PetscInt n_ISForDofsLocal; 120: IS *ISForDofs; 121: IS *ISForDofsLocal; 122: IS NeumannBoundaries; 123: IS NeumannBoundariesLocal; 124: IS DirichletBoundaries; 125: IS DirichletBoundariesLocal; 126: PetscBool eliminate_dirdofs; 127: PetscBool switch_static; 128: PetscInt coarsening_ratio; 129: PetscInt coarse_adj_red; 130: PetscInt current_level; 131: PetscInt max_levels; 132: PetscInt coarse_eqs_per_proc; 133: PetscInt coarse_eqs_limit; 134: IS coarse_subassembling; 135: PetscBool use_coarse_estimates; 136: PetscBool symmetric_primal; 137: PetscInt vertex_size; 138: PCBDDCInterfaceExtType interface_extension; 140: /* no-net-flux */ 141: PetscBool compute_nonetflux; 142: Mat divudotp; 143: PetscBool divudotp_trans; 144: IS divudotp_vl2l; 146: /* nedelec */ 147: Mat discretegradient; 148: PetscInt nedorder; 149: PetscBool conforming; 150: PetscInt nedfield; 151: PetscBool nedglobal; 152: Mat nedcG; 153: IS nedclocal; 155: /* local disconnected subdomains */ 156: PetscBool detect_disconnected; 157: PetscBool detect_disconnected_filter; 158: PetscInt n_local_subs; 159: IS *local_subs; 161: /* scaling */ 162: Vec work_scaling; 163: PetscBool use_deluxe_scaling; 164: PCBDDCDeluxeScaling deluxe_ctx; 165: PetscBool deluxe_zerorows; 166: PetscBool deluxe_singlemat; 168: /* schur complements on interface's subsets */ 169: PCBDDCSubSchurs sub_schurs; 170: PetscBool sub_schurs_rebuild; 171: PetscBool sub_schurs_exact_schur; 172: PetscInt sub_schurs_layers; 173: PetscBool sub_schurs_use_useradj; 174: PetscBool computed_rowadj; 176: /* adaptive selection of constraints */ 177: PetscBool adaptive_selection; 178: PetscBool adaptive_userdefined; 179: PetscReal adaptive_threshold[2]; 180: PetscInt adaptive_nmin; 181: PetscInt adaptive_nmax; 182: PetscInt* adaptive_constraints_n; 183: PetscInt* adaptive_constraints_idxs; 184: PetscInt* adaptive_constraints_idxs_ptr; 185: PetscScalar* adaptive_constraints_data; 186: PetscInt* adaptive_constraints_data_ptr; 188: /* For verbose output of some bddc data structures */ 189: PetscInt dbg_flag; 190: PetscViewer dbg_viewer; 191: } PC_BDDC; 193: #endif /* __pcbddc_h */