xref: /petsc/include/petsc/private/pcbddcimpl.h (revision 7f7e2d37b439342284dbb27f06633343011d126f)
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