1 #pragma once 2 3 #include <petsc/private/pcisimpl.h> 4 #include <petsc/private/pcbddcstructsimpl.h> 5 6 #if !defined(PETSC_PCBDDC_MAXLEVELS) 7 #define PETSC_PCBDDC_MAXLEVELS 8 8 #endif 9 10 PETSC_EXTERN PetscLogEvent PC_BDDC_Topology[PETSC_PCBDDC_MAXLEVELS]; 11 PETSC_EXTERN PetscLogEvent PC_BDDC_LocalSolvers[PETSC_PCBDDC_MAXLEVELS]; 12 PETSC_EXTERN PetscLogEvent PC_BDDC_LocalWork[PETSC_PCBDDC_MAXLEVELS]; 13 PETSC_EXTERN PetscLogEvent PC_BDDC_CorrectionSetUp[PETSC_PCBDDC_MAXLEVELS]; 14 PETSC_EXTERN PetscLogEvent PC_BDDC_CoarseSetUp[PETSC_PCBDDC_MAXLEVELS]; 15 PETSC_EXTERN PetscLogEvent PC_BDDC_ApproxSetUp[PETSC_PCBDDC_MAXLEVELS]; 16 PETSC_EXTERN PetscLogEvent PC_BDDC_ApproxApply[PETSC_PCBDDC_MAXLEVELS]; 17 PETSC_EXTERN PetscLogEvent PC_BDDC_CoarseSolver[PETSC_PCBDDC_MAXLEVELS]; 18 PETSC_EXTERN PetscLogEvent PC_BDDC_AdaptiveSetUp[PETSC_PCBDDC_MAXLEVELS]; 19 PETSC_EXTERN PetscLogEvent PC_BDDC_Scaling[PETSC_PCBDDC_MAXLEVELS]; 20 PETSC_EXTERN PetscLogEvent PC_BDDC_Schurs[PETSC_PCBDDC_MAXLEVELS]; 21 PETSC_EXTERN PetscLogEvent PC_BDDC_Solves[PETSC_PCBDDC_MAXLEVELS][3]; 22 23 /* Private context (data structure) for the BDDC preconditioner. */ 24 typedef struct { 25 /* First MUST come the following line, for the stuff that is common to FETI and Neumann-Neumann. */ 26 PC_IS pcis; 27 /* Coarse stuffs needed by BDDC application in KSP */ 28 Vec coarse_vec; 29 KSP coarse_ksp; 30 Mat coarse_phi_B; 31 Mat coarse_phi_D; 32 Mat coarse_psi_B; 33 Mat coarse_psi_D; 34 PetscInt local_primal_size; 35 PetscInt coarse_size; 36 PetscInt *global_primal_indices; 37 VecScatter coarse_loc_to_glob; 38 /* Local stuffs needed by BDDC application in KSP */ 39 Vec vec1_P; 40 Vec vec1_C; 41 Mat local_auxmat1; 42 Mat local_auxmat2; 43 Vec vec1_R; 44 Vec vec2_R; 45 IS is_R_local; 46 VecScatter R_to_B; 47 VecScatter R_to_D; 48 KSP ksp_R; 49 KSP ksp_D; 50 /* Quantities defining constraining details (local) of the preconditioner */ 51 /* These quantities define the preconditioner itself */ 52 PetscInt n_vertices; 53 Mat ConstraintMatrix; 54 PetscBool new_primal_space; 55 PetscBool new_primal_space_local; 56 PetscInt *primal_indices_local_idxs; 57 PetscInt local_primal_size_cc; 58 PetscInt *local_primal_ref_node; 59 PetscInt *local_primal_ref_mult; 60 PetscBool use_change_of_basis; 61 PetscBool use_change_on_faces; 62 PetscBool fake_change; 63 Mat ChangeOfBasisMatrix; 64 Mat user_ChangeOfBasisMatrix; 65 PetscBool change_interior; 66 Mat switch_static_change; 67 Vec work_change; 68 Vec original_rhs; 69 Vec temp_solution; 70 Mat local_mat; 71 PetscBool use_exact_dirichlet_trick; 72 PetscBool exact_dirichlet_trick_app; 73 PetscBool ksp_guess_nonzero; 74 PetscBool rhs_change; 75 PetscBool temp_solution_used; 76 /* benign subspace trick */ 77 PetscBool benign_saddle_point; 78 PetscBool benign_have_null; 79 PetscBool benign_skip_correction; 80 PetscBool benign_compute_correction; 81 Mat benign_change; 82 Mat benign_original_mat; 83 IS *benign_zerodiag_subs; 84 Vec benign_vec; 85 Mat benign_B0; 86 PetscSF benign_sf; 87 PetscScalar *benign_p0; 88 PetscInt benign_n; 89 PetscInt *benign_p0_lidx; 90 PetscInt *benign_p0_gidx; 91 PetscBool benign_null; 92 PetscBool benign_change_explicit; 93 PetscBool benign_apply_coarse_only; 94 95 /* Some defaults on selecting vertices and constraints*/ 96 PetscBool use_local_adj; 97 PetscInt local_adj_square; 98 PetscBool use_vertices; 99 PetscBool use_faces; 100 PetscBool use_edges; 101 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; 139 140 /* no-net-flux */ 141 PetscBool compute_nonetflux; 142 Mat divudotp; 143 PetscBool divudotp_trans; 144 IS divudotp_vl2l; 145 146 /* nedelec */ 147 Mat discretegradient; 148 PetscInt nedorder; 149 PetscBool conforming; 150 PetscInt nedfield; 151 PetscBool nedglobal; 152 Mat nedcG; 153 IS nedclocal; 154 155 /* local disconnected subdomains */ 156 PetscBool detect_disconnected; 157 PetscBool detect_disconnected_filter; 158 PetscInt n_local_subs; 159 IS *local_subs; 160 161 /* scaling */ 162 Vec work_scaling; 163 PetscBool use_deluxe_scaling; 164 PCBDDCDeluxeScaling deluxe_ctx; 165 PetscBool deluxe_zerorows; 166 PetscBool deluxe_singlemat; 167 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; 175 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; 187 188 /* For verbose output of some bddc data structures */ 189 PetscInt dbg_flag; 190 PetscViewer dbg_viewer; 191 } PC_BDDC; 192