Lines Matching refs:pcbddc
40 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCSetFromOptions_BDDC() local
56 …vel", "Verbose output for PCBDDC (intended for debug)", "none", pcbddc->dbg_flag, &pcbddc->dbg_fla… in PCSetFromOptions_BDDC()
58 …erfaceExtType", PCBDDCInterfaceExtTypes, (PetscEnum)pcbddc->interface_extension, (PetscEnum *)&pcb… in PCSetFromOptions_BDDC()
59 if (pcbddc->interface_extension == PC_BDDC_INTERFACE_EXT_DIRICHLET) { in PCSetFromOptions_BDDC()
60 … that we are using approximate Dirichlet solvers", "none", pcbddc->NullSpace_corr[0], &pcbddc->Nul… in PCSetFromOptions_BDDC()
61 …PCBDDC that we need to scale the Dirichlet solve", "none", pcbddc->NullSpace_corr[1], &pcbddc->Nul… in PCSetFromOptions_BDDC()
64 pcbddc->switch_static = PETSC_TRUE; in PCSetFromOptions_BDDC()
66 …DC that we are using approximate Neumann solvers", "none", pcbddc->NullSpace_corr[2], &pcbddc->Nul… in PCSetFromOptions_BDDC()
67 …m PCBDDC that we need to scale the Neumann solve", "none", pcbddc->NullSpace_corr[3], &pcbddc->Nul… in PCSetFromOptions_BDDC()
69 …djacency graph of local mat for interface analysis", "none", pcbddc->use_local_adj, &pcbddc->use_l… in PCSetFromOptions_BDDC()
70 …jacency graph of local mat for interface analysis", "none", pcbddc->local_adj_square, &pcbddc->loc… in PCSetFromOptions_BDDC()
71 …ber of shared subdomains for a connected component", "none", pcbddc->graphmaxcount, &pcbddc->graph… in PCSetFromOptions_BDDC()
72 …election", "Activates face-based corner selection", "none", pcbddc->corner_selection, &pcbddc->cor… in PCSetFromOptions_BDDC()
73 …_vertices", "Use or not corner dofs in coarse space", "none", pcbddc->use_vertices, &pcbddc->use_v… in PCSetFromOptions_BDDC()
74 …edges", "Use or not edge constraints in coarse space", "none", pcbddc->use_edges, &pcbddc->use_edg… in PCSetFromOptions_BDDC()
75 …faces", "Use or not face constraints in coarse space", "none", pcbddc->use_faces, &pcbddc->use_fac… in PCSetFromOptions_BDDC()
76 …o vertex size will be considered as primal vertices", "none", pcbddc->vertex_size, &pcbddc->vertex… in PCSetFromOptions_BDDC()
77 …l space attached to the matrix to compute constraints", "none", pcbddc->use_nnsp, &pcbddc->use_nns… in PCSetFromOptions_BDDC()
78 …ttached to the matrix to compute constraints as is", "none", pcbddc->use_nnsp_true, &pcbddc->use_n… in PCSetFromOptions_BDDC()
79 …always used when multiple constraints are present)", "none", pcbddc->use_qr_single, &pcbddc->use_q… in PCSetFromOptions_BDDC()
81 …ot internal change of basis on local edge nodes", "none", pcbddc->use_change_of_basis, &pcbddc->us… in PCSetFromOptions_BDDC()
82 …ot internal change of basis on local face nodes", "none", pcbddc->use_change_on_faces, &pcbddc->us… in PCSetFromOptions_BDDC()
83 if (!pcbddc->use_change_of_basis) pcbddc->use_change_on_faces = PETSC_FALSE; in PCSetFromOptions_BDDC()
85 …ndensation ops around the interface preconditioner", "none", pcbddc->switch_static, &pcbddc->switc… in PCSetFromOptions_BDDC()
86 …bution (significant only at the coarsest level)", "none", pcbddc->coarse_eqs_per_proc, &pcbddc->co… in PCSetFromOptions_BDDC()
87 i = pcbddc->coarsening_ratio; in PCSetFromOptions_BDDC()
90 i = pcbddc->max_levels; in PCSetFromOptions_BDDC()
93 …m number of equations on coarsest grid to aim for", "none", pcbddc->coarse_eqs_limit, &pcbddc->coa… in PCSetFromOptions_BDDC()
94 …, "Use estimated eigenvalues for coarse problem", "none", pcbddc->use_coarse_estimates, &pcbddc->u… in PCSetFromOptions_BDDC()
95 …se_deluxe_scaling", "Use deluxe scaling for BDDC", "none", pcbddc->use_deluxe_scaling, &pcbddc->us… in PCSetFromOptions_BDDC()
96 …i.e. define the interface without any adjacency)", "none", pcbddc->sub_schurs_rebuild, &pcbddc->su… in PCSetFromOptions_BDDC()
97 …tion of principal minors (i.e. -1 uses all dofs)", "none", pcbddc->sub_schurs_layers, &pcbddc->sub… in PCSetFromOptions_BDDC()
98 …ve layers (default is to use adj of local mat)", "none", pcbddc->sub_schurs_use_useradj, &pcbddc->… in PCSetFromOptions_BDDC()
99 … of the reduced one (which excludes size 1 cc)", "none", pcbddc->sub_schurs_exact_schur, &pcbddc->… in PCSetFromOptions_BDDC()
100 …s of deluxe operators associated with primal dofs", "none", pcbddc->deluxe_zerorows, &pcbddc->delu… in PCSetFromOptions_BDDC()
101 …ddc_deluxe_singlemat", "Collapse deluxe operators", "none", pcbddc->deluxe_singlemat, &pcbddc->del… in PCSetFromOptions_BDDC()
102 …pmat) in addition to those adaptively generated", "none", pcbddc->adaptive_userdefined, &pcbddc->a… in PCSetFromOptions_BDDC()
104 …, "Thresholds to be used for adaptive selection of constraints", "none", pcbddc->adaptive_threshol… in PCSetFromOptions_BDDC()
105 if (nt == 1) pcbddc->adaptive_threshold[1] = pcbddc->adaptive_threshold[0]; in PCSetFromOptions_BDDC()
106 …mum number of constraints per connected components", "none", pcbddc->adaptive_nmin, &pcbddc->adapt… in PCSetFromOptions_BDDC()
107 …mum number of constraints per connected components", "none", pcbddc->adaptive_nmax, &pcbddc->adapt… in PCSetFromOptions_BDDC()
108 … "Symmetric computation of primal basis functions", "none", pcbddc->symmetric_primal, &pcbddc->sym… in PCSetFromOptions_BDDC()
109 … processors where to map the coarse adjacency list", "none", pcbddc->coarse_adj_red, &pcbddc->coar… in PCSetFromOptions_BDDC()
110 …dle point problems with discontinuous pressures", "none", pcbddc->benign_saddle_point, &pcbddc->be… in PCSetFromOptions_BDDC()
111 …ompute the pressure change of basis explicitly", "none", pcbddc->benign_change_explicit, &pcbddc->… in PCSetFromOptions_BDDC()
112 …ompute the benign correction during PreSolve", "none", pcbddc->benign_compute_correction, &pcbddc-… in PCSetFromOptions_BDDC()
113 …ic computation of no-net-flux quadrature weights", "none", pcbddc->compute_nonetflux, &pcbddc->com… in PCSetFromOptions_BDDC()
114 …disconnected", "Detects disconnected subdomains", "none", pcbddc->detect_disconnected, &pcbddc->de… in PCSetFromOptions_BDDC()
115 …atrix when detecting disconnected subdomains", "none", pcbddc->detect_disconnected_filter, &pcbddc… in PCSetFromOptions_BDDC()
116 …want to eliminate dirichlet dofs during presolve", "none", pcbddc->eliminate_dirdofs, &pcbddc->eli… in PCSetFromOptions_BDDC()
123 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCView_BDDC() local
140 …PetscCall(PetscViewerASCIIPrintf(viewer, " Use verbose output: %" PetscInt_FMT "\n", pcbddc->dbg_… in PCView_BDDC()
141 …PetscCall(PetscViewerASCIIPrintf(viewer, " Use user-defined CSR: %d\n", !!pcbddc->mat_graph->nvtx… in PCView_BDDC()
142 …tscViewerASCIIPrintf(viewer, " Use local mat graph: %d\n", pcbddc->use_local_adj && !pcbddc->mat_… in PCView_BDDC()
143 if (pcbddc->mat_graph->twodim) { in PCView_BDDC()
148 …if (pcbddc->graphmaxcount != PETSC_INT_MAX) PetscCall(PetscViewerASCIIPrintf(viewer, " Graph max … in PCView_BDDC()
149 …CIIPrintf(viewer, " Corner selection: %d (selected %d)\n", pcbddc->corner_selection, pcbddc->corn… in PCView_BDDC()
150 …ewer, " Use vertices: %d (vertex size %" PetscInt_FMT ")\n", pcbddc->use_vertices, pcbddc->vertex… in PCView_BDDC()
151 PetscCall(PetscViewerASCIIPrintf(viewer, " Use edges: %d\n", pcbddc->use_edges)); in PCView_BDDC()
152 PetscCall(PetscViewerASCIIPrintf(viewer, " Use faces: %d\n", pcbddc->use_faces)); in PCView_BDDC()
153 …PetscCall(PetscViewerASCIIPrintf(viewer, " Use true near null space: %d\n", pcbddc->use_nnsp_true… in PCView_BDDC()
154 …PetscCall(PetscViewerASCIIPrintf(viewer, " Use QR for single constraints on cc: %d\n", pcbddc->us… in PCView_BDDC()
155 …erASCIIPrintf(viewer, " Use change of basis on local edge nodes: %d\n", pcbddc->use_change_of_bas… in PCView_BDDC()
156 …erASCIIPrintf(viewer, " Use change of basis on local face nodes: %d\n", pcbddc->use_change_on_fac… in PCView_BDDC()
157 …ewerASCIIPrintf(viewer, " User defined change of basis matrix: %d\n", !!pcbddc->user_ChangeOfBasi… in PCView_BDDC()
158 …PetscCall(PetscViewerASCIIPrintf(viewer, " Has change of basis matrix: %d\n", !!pcbddc->ChangeOfB… in PCView_BDDC()
159 …PetscCall(PetscViewerASCIIPrintf(viewer, " Eliminate dirichlet boundary dofs: %d\n", pcbddc->elim… in PCView_BDDC()
160 …tch on static condensation ops around the interface preconditioner: %d\n", pcbddc->switch_static)); in PCView_BDDC()
161 …PetscCall(PetscViewerASCIIPrintf(viewer, " Use exact dirichlet trick: %d\n", pcbddc->use_exact_di… in PCView_BDDC()
162 …CIIPrintf(viewer, " Interface extension: %s\n", PCBDDCInterfaceExtTypes[pcbddc->interface_extensi… in PCView_BDDC()
163 …PetscCall(PetscViewerASCIIPrintf(viewer, " Multilevel max levels: %" PetscInt_FMT "\n", pcbddc->m… in PCView_BDDC()
164 …SCIIPrintf(viewer, " Multilevel coarsening ratio: %" PetscInt_FMT "\n", pcbddc->coarsening_ratio)… in PCView_BDDC()
165 …ewerASCIIPrintf(viewer, " Use estimated eigs for coarse problem: %d\n", pcbddc->use_coarse_estima… in PCView_BDDC()
166 …PetscCall(PetscViewerASCIIPrintf(viewer, " Use deluxe scaling: %d\n", pcbddc->use_deluxe_scaling)… in PCView_BDDC()
167 … PetscCall(PetscViewerASCIIPrintf(viewer, " Use deluxe zerorows: %d\n", pcbddc->deluxe_zerorows)); in PCView_BDDC()
168 …PetscCall(PetscViewerASCIIPrintf(viewer, " Use deluxe singlemat: %d\n", pcbddc->deluxe_singlemat)… in PCView_BDDC()
169 …tf(viewer, " Rebuild interface graph for Schur principal minors: %d\n", pcbddc->sub_schurs_rebuil… in PCView_BDDC()
170 …s' layers for the computation of principal minors: %" PetscInt_FMT "\n", pcbddc->sub_schurs_layers… in PCView_BDDC()
171 …rintf(viewer, " Use user CSR graph to compute successive layers: %d\n", pcbddc->sub_schurs_use_us… in PCView_BDDC()
172 if (pcbddc->adaptive_threshold[1] != pcbddc->adaptive_threshold[0]) { in PCView_BDDC()
173 …fined %d): %g,%g\n", pcbddc->adaptive_selection, pcbddc->adaptive_userdefined, (double)pcbddc->ada… in PCView_BDDC()
175 …old (active %d, userdefined %d): %g\n", pcbddc->adaptive_selection, pcbddc->adaptive_userdefined, … in PCView_BDDC()
177 …tf(viewer, " Min constraints / connected component: %" PetscInt_FMT "\n", pcbddc->adaptive_nmin)); in PCView_BDDC()
178 …tf(viewer, " Max constraints / connected component: %" PetscInt_FMT "\n", pcbddc->adaptive_nmax)); in PCView_BDDC()
179 …(viewer, " Invert exact Schur complement for adaptive selection: %d\n", pcbddc->sub_schurs_exact_… in PCView_BDDC()
180 …rintf(viewer, " Symmetric computation of primal basis functions: %d\n", pcbddc->symmetric_primal)… in PCView_BDDC()
181 …iewer, " Num. Procs. to map coarse adjacency list: %" PetscInt_FMT "\n", pcbddc->coarse_adj_red)); in PCView_BDDC()
182 … eqs per proc (significant at the coarsest level): %" PetscInt_FMT "\n", pcbddc->coarse_eqs_per_pr… in PCView_BDDC()
183 …IPrintf(viewer, " Detect disconnected: %d (filter %d)\n", pcbddc->detect_disconnected, pcbddc->de… in PCView_BDDC()
184 …wer, " Benign subspace trick: %d (change explicit %d)\n", pcbddc->benign_saddle_point, pcbddc->be… in PCView_BDDC()
185 …PetscCall(PetscViewerASCIIPrintf(viewer, " Benign subspace trick is active: %d\n", pcbddc->benign… in PCView_BDDC()
186 …PetscCall(PetscViewerASCIIPrintf(viewer, " Algebraic computation of no-net-flux: %d\n", pcbddc->c… in PCView_BDDC()
204 loc[3] = pcbddc->local_primal_size; in PCView_BDDC()
206 …loc[5] = pcbddc->n_local_subs > 0 ? pcbddc->n_local_subs … in PCView_BDDC()
207 loc[6] = pcbddc->benign_n; in PCView_BDDC()
214 if (pcbddc->coarse_size) { in PCView_BDDC()
215 ratio1 = pc->pmat->rmap->N / (1. * pcbddc->coarse_size); in PCView_BDDC()
216 ratio2 = PetscRealPart(interface_size) / pcbddc->coarse_size; in PCView_BDDC()
218 …ATISTICS AT LEVEL %" PetscInt_FMT " **********************************\n", pcbddc->current_level)); in PCView_BDDC()
219 …tscInt_FMT "\n", pc->pmat->rmap->N, (PetscInt)PetscRealPart(interface_size), pcbddc->coarse_size)); in PCView_BDDC()
223 …if (pcbddc->benign_have_null) PetscCall(PetscViewerASCIIPrintf(viewer, " Benign subs : %" Pe… in PCView_BDDC()
235 …PetscCall(PetscViewerGetSubViewer(viewer, PetscObjectComm((PetscObject)pcbddc->ksp_D), &subviewer)… in PCView_BDDC()
239 PetscCall(KSPView(pcbddc->ksp_D, subviewer)); in PCView_BDDC()
243 PetscCall(KSPView(pcbddc->ksp_R, subviewer)); in PCView_BDDC()
247 …PetscCall(PetscViewerRestoreSubViewer(viewer, PetscObjectComm((PetscObject)pcbddc->ksp_D), &subvie… in PCView_BDDC()
249 if (pcbddc->coarse_ksp) color = 1; in PCView_BDDC()
259 PetscCall(KSPView(pcbddc->coarse_ksp, subviewer)); in PCView_BDDC()
272 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetDiscreteGradient_BDDC() local
276 PetscCall(MatDestroy(&pcbddc->discretegradient)); in PCBDDCSetDiscreteGradient_BDDC()
277 pcbddc->discretegradient = G; in PCBDDCSetDiscreteGradient_BDDC()
278 pcbddc->nedorder = order > 0 ? order : -order; in PCBDDCSetDiscreteGradient_BDDC()
279 pcbddc->nedfield = field; in PCBDDCSetDiscreteGradient_BDDC()
280 pcbddc->nedglobal = global; in PCBDDCSetDiscreteGradient_BDDC()
281 pcbddc->conforming = conforming; in PCBDDCSetDiscreteGradient_BDDC()
326 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetDivergenceMat_BDDC() local
330 PetscCall(MatDestroy(&pcbddc->divudotp)); in PCBDDCSetDivergenceMat_BDDC()
331 pcbddc->divudotp = divudotp; in PCBDDCSetDivergenceMat_BDDC()
332 pcbddc->divudotp_trans = trans; in PCBDDCSetDivergenceMat_BDDC()
333 pcbddc->compute_nonetflux = PETSC_TRUE; in PCBDDCSetDivergenceMat_BDDC()
336 PetscCall(ISDestroy(&pcbddc->divudotp_vl2l)); in PCBDDCSetDivergenceMat_BDDC()
337 pcbddc->divudotp_vl2l = vl2l; in PCBDDCSetDivergenceMat_BDDC()
381 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetChangeOfBasisMat_BDDC() local
385 PetscCall(MatDestroy(&pcbddc->user_ChangeOfBasisMatrix)); in PCBDDCSetChangeOfBasisMat_BDDC()
386 pcbddc->user_ChangeOfBasisMatrix = change; in PCBDDCSetChangeOfBasisMat_BDDC()
387 pcbddc->change_interior = interior; in PCBDDCSetChangeOfBasisMat_BDDC()
428 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetPrimalVerticesIS_BDDC() local
433 …if (pcbddc->user_primal_vertices) PetscCall(ISEqual(PrimalVertices, pcbddc->user_primal_vertices, … in PCBDDCSetPrimalVerticesIS_BDDC()
434 PetscCall(ISDestroy(&pcbddc->user_primal_vertices)); in PCBDDCSetPrimalVerticesIS_BDDC()
435 PetscCall(ISDestroy(&pcbddc->user_primal_vertices_local)); in PCBDDCSetPrimalVerticesIS_BDDC()
436 pcbddc->user_primal_vertices = PrimalVertices; in PCBDDCSetPrimalVerticesIS_BDDC()
437 if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCSetPrimalVerticesIS_BDDC()
469 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCGetPrimalVerticesIS_BDDC() local
472 *is = pcbddc->user_primal_vertices; in PCBDDCGetPrimalVerticesIS_BDDC()
502 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetPrimalVerticesLocalIS_BDDC() local
507 …if (pcbddc->user_primal_vertices_local) PetscCall(ISEqual(PrimalVertices, pcbddc->user_primal_vert… in PCBDDCSetPrimalVerticesLocalIS_BDDC()
508 PetscCall(ISDestroy(&pcbddc->user_primal_vertices)); in PCBDDCSetPrimalVerticesLocalIS_BDDC()
509 PetscCall(ISDestroy(&pcbddc->user_primal_vertices_local)); in PCBDDCSetPrimalVerticesLocalIS_BDDC()
510 pcbddc->user_primal_vertices_local = PrimalVertices; in PCBDDCSetPrimalVerticesLocalIS_BDDC()
511 if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCSetPrimalVerticesLocalIS_BDDC()
540 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCGetPrimalVerticesLocalIS_BDDC() local
543 *is = pcbddc->user_primal_vertices_local; in PCBDDCGetPrimalVerticesLocalIS_BDDC()
573 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetCoarseningRatio_BDDC() local
576 pcbddc->coarsening_ratio = k; in PCBDDCSetCoarseningRatio_BDDC()
611 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetUseExactDirichlet_BDDC() local
614 pcbddc->use_exact_dirichlet_trick = flg; in PCBDDCSetUseExactDirichlet_BDDC()
629 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetLevel_BDDC() local
632 pcbddc->current_level = level; in PCBDDCSetLevel_BDDC()
647 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetLevels_BDDC() local
651 pcbddc->max_levels = levels; in PCBDDCSetLevels_BDDC()
685 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetDirichletBoundaries_BDDC() local
690 …if (pcbddc->DirichletBoundaries) PetscCall(ISEqual(DirichletBoundaries, pcbddc->DirichletBoundarie… in PCBDDCSetDirichletBoundaries_BDDC()
692 PetscCall(ISDestroy(&pcbddc->DirichletBoundariesLocal)); in PCBDDCSetDirichletBoundaries_BDDC()
693 PetscCall(ISDestroy(&pcbddc->DirichletBoundaries)); in PCBDDCSetDirichletBoundaries_BDDC()
694 pcbddc->DirichletBoundaries = DirichletBoundaries; in PCBDDCSetDirichletBoundaries_BDDC()
695 if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCSetDirichletBoundaries_BDDC()
727 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetDirichletBoundariesLocal_BDDC() local
732 …if (pcbddc->DirichletBoundariesLocal) PetscCall(ISEqual(DirichletBoundaries, pcbddc->DirichletBoun… in PCBDDCSetDirichletBoundariesLocal_BDDC()
734 PetscCall(ISDestroy(&pcbddc->DirichletBoundariesLocal)); in PCBDDCSetDirichletBoundariesLocal_BDDC()
735 PetscCall(ISDestroy(&pcbddc->DirichletBoundaries)); in PCBDDCSetDirichletBoundariesLocal_BDDC()
736 pcbddc->DirichletBoundariesLocal = DirichletBoundaries; in PCBDDCSetDirichletBoundariesLocal_BDDC()
737 if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCSetDirichletBoundariesLocal_BDDC()
766 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetNeumannBoundaries_BDDC() local
771 …if (pcbddc->NeumannBoundaries) PetscCall(ISEqual(NeumannBoundaries, pcbddc->NeumannBoundaries, &is… in PCBDDCSetNeumannBoundaries_BDDC()
773 PetscCall(ISDestroy(&pcbddc->NeumannBoundariesLocal)); in PCBDDCSetNeumannBoundaries_BDDC()
774 PetscCall(ISDestroy(&pcbddc->NeumannBoundaries)); in PCBDDCSetNeumannBoundaries_BDDC()
775 pcbddc->NeumannBoundaries = NeumannBoundaries; in PCBDDCSetNeumannBoundaries_BDDC()
776 if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCSetNeumannBoundaries_BDDC()
808 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetNeumannBoundariesLocal_BDDC() local
813 …if (pcbddc->NeumannBoundariesLocal) PetscCall(ISEqual(NeumannBoundaries, pcbddc->NeumannBoundaries… in PCBDDCSetNeumannBoundariesLocal_BDDC()
815 PetscCall(ISDestroy(&pcbddc->NeumannBoundariesLocal)); in PCBDDCSetNeumannBoundariesLocal_BDDC()
816 PetscCall(ISDestroy(&pcbddc->NeumannBoundaries)); in PCBDDCSetNeumannBoundariesLocal_BDDC()
817 pcbddc->NeumannBoundariesLocal = NeumannBoundaries; in PCBDDCSetNeumannBoundariesLocal_BDDC()
818 if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCSetNeumannBoundariesLocal_BDDC()
847 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCGetDirichletBoundaries_BDDC() local
850 *DirichletBoundaries = pcbddc->DirichletBoundaries; in PCBDDCGetDirichletBoundaries_BDDC()
882 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCGetDirichletBoundariesLocal_BDDC() local
885 *DirichletBoundaries = pcbddc->DirichletBoundariesLocal; in PCBDDCGetDirichletBoundariesLocal_BDDC()
919 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCGetNeumannBoundaries_BDDC() local
922 *NeumannBoundaries = pcbddc->NeumannBoundaries; in PCBDDCGetNeumannBoundaries_BDDC()
954 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCGetNeumannBoundariesLocal_BDDC() local
957 *NeumannBoundaries = pcbddc->NeumannBoundariesLocal; in PCBDDCGetNeumannBoundariesLocal_BDDC()
991 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetLocalAdjacencyGraph_BDDC() local
992 PCBDDCGraph mat_graph = pcbddc->mat_graph; in PCBDDCSetLocalAdjacencyGraph_BDDC()
1031 pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCSetLocalAdjacencyGraph_BDDC()
1077 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetDofsSplittingLocal_BDDC() local
1082 if (pcbddc->n_ISForDofsLocal == n_is) { in PCBDDCSetDofsSplittingLocal_BDDC()
1085 PetscCall(ISEqual(ISForDofs[i], pcbddc->ISForDofsLocal[i], &isequalt)); in PCBDDCSetDofsSplittingLocal_BDDC()
1092 for (i = 0; i < pcbddc->n_ISForDofsLocal; i++) PetscCall(ISDestroy(&pcbddc->ISForDofsLocal[i])); in PCBDDCSetDofsSplittingLocal_BDDC()
1093 PetscCall(PetscFree(pcbddc->ISForDofsLocal)); in PCBDDCSetDofsSplittingLocal_BDDC()
1095 for (i = 0; i < pcbddc->n_ISForDofs; i++) PetscCall(ISDestroy(&pcbddc->ISForDofs[i])); in PCBDDCSetDofsSplittingLocal_BDDC()
1096 PetscCall(PetscFree(pcbddc->ISForDofs)); in PCBDDCSetDofsSplittingLocal_BDDC()
1097 pcbddc->n_ISForDofs = 0; in PCBDDCSetDofsSplittingLocal_BDDC()
1099 if (n_is) PetscCall(PetscMalloc1(n_is, &pcbddc->ISForDofsLocal)); in PCBDDCSetDofsSplittingLocal_BDDC()
1100 for (i = 0; i < n_is; i++) pcbddc->ISForDofsLocal[i] = ISForDofs[i]; in PCBDDCSetDofsSplittingLocal_BDDC()
1101 pcbddc->n_ISForDofsLocal = n_is; in PCBDDCSetDofsSplittingLocal_BDDC()
1102 if (n_is) pcbddc->user_provided_isfordofs = PETSC_TRUE; in PCBDDCSetDofsSplittingLocal_BDDC()
1103 if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCSetDofsSplittingLocal_BDDC()
1141 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetDofsSplitting_BDDC() local
1146 if (pcbddc->n_ISForDofs == n_is) { in PCBDDCSetDofsSplitting_BDDC()
1149 PetscCall(ISEqual(ISForDofs[i], pcbddc->ISForDofs[i], &isequalt)); in PCBDDCSetDofsSplitting_BDDC()
1156 for (i = 0; i < pcbddc->n_ISForDofs; i++) PetscCall(ISDestroy(&pcbddc->ISForDofs[i])); in PCBDDCSetDofsSplitting_BDDC()
1157 PetscCall(PetscFree(pcbddc->ISForDofs)); in PCBDDCSetDofsSplitting_BDDC()
1159 for (i = 0; i < pcbddc->n_ISForDofsLocal; i++) PetscCall(ISDestroy(&pcbddc->ISForDofsLocal[i])); in PCBDDCSetDofsSplitting_BDDC()
1160 PetscCall(PetscFree(pcbddc->ISForDofsLocal)); in PCBDDCSetDofsSplitting_BDDC()
1161 pcbddc->n_ISForDofsLocal = 0; in PCBDDCSetDofsSplitting_BDDC()
1163 if (n_is) PetscCall(PetscMalloc1(n_is, &pcbddc->ISForDofs)); in PCBDDCSetDofsSplitting_BDDC()
1164 for (i = 0; i < n_is; i++) pcbddc->ISForDofs[i] = ISForDofs[i]; in PCBDDCSetDofsSplitting_BDDC()
1165 pcbddc->n_ISForDofs = n_is; in PCBDDCSetDofsSplitting_BDDC()
1166 if (n_is) pcbddc->user_provided_isfordofs = PETSC_TRUE; in PCBDDCSetDofsSplitting_BDDC()
1167 if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCSetDofsSplitting_BDDC()
1205 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCPreSolve_BDDC() local
1214 …if (pcbddc->benign_apply_coarse_only || pcbddc->switch_static || !iscg || pc->mat != pc->pmat) Pet… in PCPreSolve_BDDC()
1216 …if (pcbddc->benign_apply_coarse_only || pcbddc->switch_static || pc->mat != pc->pmat) PetscCall(PC… in PCPreSolve_BDDC()
1219 if (!pcbddc->original_rhs) PetscCall(VecDuplicate(pcis->vec1_global, &pcbddc->original_rhs)); in PCPreSolve_BDDC()
1220 if (!pcbddc->temp_solution) PetscCall(VecDuplicate(pcis->vec1_global, &pcbddc->temp_solution)); in PCPreSolve_BDDC()
1222 pcbddc->temp_solution_used = PETSC_FALSE; in PCPreSolve_BDDC()
1227 PetscCall(PetscObjectReference((PetscObject)pcbddc->temp_solution)); in PCPreSolve_BDDC()
1228 used_vec = pcbddc->temp_solution; in PCPreSolve_BDDC()
1230 pcbddc->temp_solution_used = PETSC_TRUE; in PCPreSolve_BDDC()
1231 PetscCall(VecCopy(rhs, pcbddc->original_rhs)); in PCPreSolve_BDDC()
1233 pcbddc->eliminate_dirdofs = PETSC_TRUE; in PCPreSolve_BDDC()
1239 PetscCall(KSPGetInitialGuessNonzero(ksp, &pcbddc->ksp_guess_nonzero)); in PCPreSolve_BDDC()
1240 if (!pcbddc->ksp_guess_nonzero) PetscCall(VecSet(used_vec, 0.0)); in PCPreSolve_BDDC()
1243 pcbddc->rhs_change = PETSC_FALSE; in PCPreSolve_BDDC()
1245 if (rhs && pcbddc->eliminate_dirdofs) { in PCPreSolve_BDDC()
1249 PetscCall(PCBDDCGraphGetDirichletDofs(pcbddc->mat_graph, &dirIS)); in PCPreSolve_BDDC()
1272 pcbddc->rhs_change = PETSC_TRUE; in PCPreSolve_BDDC()
1278 if (pcbddc->rhs_change || (ksp && pcbddc->ksp_guess_nonzero)) { in PCPreSolve_BDDC()
1281 PetscCall(VecSwap(rhs, pcbddc->original_rhs)); in PCPreSolve_BDDC()
1284 pcbddc->rhs_change = PETSC_TRUE; in PCPreSolve_BDDC()
1286 PetscCall(MatMultAdd(pc->mat, used_vec, pcbddc->original_rhs, rhs)); in PCPreSolve_BDDC()
1288 PetscCall(VecCopy(used_vec, pcbddc->temp_solution)); in PCPreSolve_BDDC()
1289 pcbddc->temp_solution_used = PETSC_TRUE; in PCPreSolve_BDDC()
1297 …if (rhs && pcbddc->benign_compute_correction && (pcbddc->benign_have_null || pcbddc->benign_apply_… in PCPreSolve_BDDC()
1300 if (!pcbddc->benign_vec) PetscCall(VecDuplicate(rhs, &pcbddc->benign_vec)); in PCPreSolve_BDDC()
1302 pcbddc->benign_apply_coarse_only = pcbddc->benign_have_null ? PETSC_TRUE : PETSC_FALSE; in PCPreSolve_BDDC()
1303 if (!pcbddc->benign_skip_correction) { in PCPreSolve_BDDC()
1304 PetscCall(PCApply_BDDC(pc, rhs, pcbddc->benign_vec)); in PCPreSolve_BDDC()
1306 …if (pcbddc->temp_solution_used) PetscCall(VecAXPY(pcbddc->temp_solution, 1.0, pcbddc->benign_vec)); in PCPreSolve_BDDC()
1307 PetscCall(VecScale(pcbddc->benign_vec, -1.0)); in PCPreSolve_BDDC()
1309 if (save_rhs) PetscCall(VecSwap(rhs, pcbddc->original_rhs)); in PCPreSolve_BDDC()
1310 if (pcbddc->rhs_change) { in PCPreSolve_BDDC()
1311 PetscCall(MatMultAdd(pc->mat, pcbddc->benign_vec, rhs, rhs)); in PCPreSolve_BDDC()
1313 PetscCall(MatMultAdd(pc->mat, pcbddc->benign_vec, pcbddc->original_rhs, rhs)); in PCPreSolve_BDDC()
1315 pcbddc->rhs_change = PETSC_TRUE; in PCPreSolve_BDDC()
1317 pcbddc->benign_apply_coarse_only = PETSC_FALSE; in PCPreSolve_BDDC()
1319 PetscCall(VecDestroy(&pcbddc->benign_vec)); in PCPreSolve_BDDC()
1323 if (pcbddc->dbg_flag && benign_correction_computed) { in PCPreSolve_BDDC()
1327 if (pcbddc->ChangeOfBasisMatrix) { in PCPreSolve_BDDC()
1328 PetscCall(MatMultTranspose(pcbddc->ChangeOfBasisMatrix, rhs, v)); in PCPreSolve_BDDC()
1333 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "LEVEL %" PetscInt_FMT ": is the correction b… in PCPreSolve_BDDC()
1334 PetscCall(PetscScalarView(pcbddc->benign_n, pcbddc->benign_p0, pcbddc->dbg_viewer)); in PCPreSolve_BDDC()
1335 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCPreSolve_BDDC()
1340 pcbddc->exact_dirichlet_trick_app = PETSC_FALSE; in PCPreSolve_BDDC()
1341 if (x && pcbddc->use_exact_dirichlet_trick) { in PCPreSolve_BDDC()
1343 if (pcbddc->ChangeOfBasisMatrix && pcbddc->change_interior) { in PCPreSolve_BDDC()
1347 PetscCall(MatMultTranspose(pcbddc->ChangeOfBasisMatrix, rhs, pcis->vec1_global)); in PCPreSolve_BDDC()
1355 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCPreSolve_BDDC()
1356 PetscCall(KSPSolve(pcbddc->ksp_D, pcis->vec1_D, pcis->vec2_D)); in PCPreSolve_BDDC()
1357 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCPreSolve_BDDC()
1358 PetscCall(KSPCheckSolve(pcbddc->ksp_D, pc, pcis->vec2_D)); in PCPreSolve_BDDC()
1359 if (pcbddc->ChangeOfBasisMatrix && pcbddc->change_interior) { in PCPreSolve_BDDC()
1363 PetscCall(MatMult(pcbddc->ChangeOfBasisMatrix, pcis->vec1_global, x)); in PCPreSolve_BDDC()
1369 pcbddc->exact_dirichlet_trick_app = PETSC_TRUE; in PCPreSolve_BDDC()
1370 …} else if (pcbddc->ChangeOfBasisMatrix && pcbddc->change_interior && benign_correction_computed &&… in PCPreSolve_BDDC()
1378 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCPostSolve_BDDC() local
1382 if (x && pcbddc->rhs_change) { in PCPostSolve_BDDC()
1383 if (pcbddc->temp_solution_used) { in PCPostSolve_BDDC()
1384 PetscCall(VecAXPY(x, 1.0, pcbddc->temp_solution)); in PCPostSolve_BDDC()
1385 } else if (pcbddc->benign_compute_correction && pcbddc->benign_vec) { in PCPostSolve_BDDC()
1386 PetscCall(VecAXPY(x, -1.0, pcbddc->benign_vec)); in PCPostSolve_BDDC()
1389 if (ksp) pcbddc->temp_solution_used = PETSC_FALSE; in PCPostSolve_BDDC()
1393 if (rhs && pcbddc->rhs_change) { in PCPostSolve_BDDC()
1394 PetscCall(VecSwap(rhs, pcbddc->original_rhs)); in PCPostSolve_BDDC()
1395 pcbddc->rhs_change = PETSC_FALSE; in PCPostSolve_BDDC()
1399 PetscCall(KSPSetInitialGuessNonzero(ksp, pcbddc->ksp_guess_nonzero)); in PCPostSolve_BDDC()
1401 pcbddc->exact_dirichlet_trick_app = PETSC_FALSE; in PCPostSolve_BDDC()
1408 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCSetUp_BDDC() local
1432 rl = pcbddc->recompute_topography; in PCSetUp_BDDC()
1434 …PetscCallMPI(MPIU_Allreduce(&rl, &pcbddc->recompute_topography, 1, MPI_C_BOOL, MPI_LOR, PetscObjec… in PCSetUp_BDDC()
1435 if (pcbddc->recompute_topography) { in PCSetUp_BDDC()
1436 pcbddc->graphanalyzed = PETSC_FALSE; in PCSetUp_BDDC()
1443 if (!pcbddc->use_deluxe_scaling) pcbddc->deluxe_zerorows = PETSC_FALSE; in PCSetUp_BDDC()
1444 …pcbddc->adaptive_selection = (PetscBool)(pcbddc->adaptive_threshold[0] != 0.0 || pcbddc->adaptiv… in PCSetUp_BDDC()
1445 …pcbddc->use_deluxe_scaling = (PetscBool)(pcbddc->use_deluxe_scaling && (size > 1 || matis->allow… in PCSetUp_BDDC()
1446 …pcbddc->adaptive_selection = (PetscBool)(pcbddc->adaptive_selection && (size > 1 || matis->allow… in PCSetUp_BDDC()
1447 …pcbddc->adaptive_userdefined = (PetscBool)(pcbddc->adaptive_selection && pcbddc->adaptive_userdefi… in PCSetUp_BDDC()
1448 if (pcbddc->adaptive_selection) pcbddc->use_faces = PETSC_TRUE; in PCSetUp_BDDC()
1450 computesubschurs = (PetscBool)(pcbddc->adaptive_selection || pcbddc->use_deluxe_scaling); in PCSetUp_BDDC()
1453 if (pcbddc->compute_nonetflux) { in PCSetUp_BDDC()
1454 pcbddc->use_vertices = PETSC_TRUE; in PCSetUp_BDDC()
1455 pcbddc->use_edges = PETSC_TRUE; in PCSetUp_BDDC()
1456 pcbddc->use_faces = PETSC_TRUE; in PCSetUp_BDDC()
1460 if (pcbddc->dbg_flag) { in PCSetUp_BDDC()
1461 …if (!pcbddc->dbg_viewer) pcbddc->dbg_viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)pc… in PCSetUp_BDDC()
1462 PetscCall(PetscViewerASCIIPushSynchronized(pcbddc->dbg_viewer)); in PCSetUp_BDDC()
1463 PetscCall(PetscViewerASCIIAddTab(pcbddc->dbg_viewer, 2 * pcbddc->current_level)); in PCSetUp_BDDC()
1467 PetscCall(PetscLogEventBegin(PC_BDDC_Topology[pcbddc->current_level], pc, 0, 0, 0)); in PCSetUp_BDDC()
1468 if (pcbddc->recompute_topography) { in PCSetUp_BDDC()
1470 if (pcbddc->discretegradient) PetscCall(PCBDDCNedelecSupport(pc)); in PCSetUp_BDDC()
1472 if (pcbddc->corner_selected) pcbddc->use_vertices = PETSC_TRUE; in PCSetUp_BDDC()
1475 if (pcbddc->user_ChangeOfBasisMatrix) { in PCSetUp_BDDC()
1477 pcbddc->use_change_of_basis = PETSC_FALSE; in PCSetUp_BDDC()
1478 PetscCall(PCBDDCComputeLocalMatrix(pc, pcbddc->user_ChangeOfBasisMatrix)); in PCSetUp_BDDC()
1480 PetscCall(MatDestroy(&pcbddc->local_mat)); in PCSetUp_BDDC()
1482 pcbddc->local_mat = matis->A; in PCSetUp_BDDC()
1490 if (pcbddc->benign_saddle_point) { in PCSetUp_BDDC()
1493 …if (pcbddc->user_ChangeOfBasisMatrix || pcbddc->use_change_of_basis || !computesubschurs) pcbddc->… in PCSetUp_BDDC()
1495 …PetscCall(PCBDDCBenignDetectSaddlePoint(pc, (PetscBool)(!pcbddc->recompute_topography), &zerodiag)… in PCSetUp_BDDC()
1500 if (pcbddc->benign_n && (pcbddc->benign_change_explicit || pcbddc->dbg_flag)) { in PCSetUp_BDDC()
1512 if (isset) PetscCall(MatSetOption(pcbddc->local_mat, MAT_SYMMETRIC, issym)); in PCSetUp_BDDC()
1514 if (isset) PetscCall(MatSetOption(pcbddc->local_mat, MAT_SPD, isspd)); in PCSetUp_BDDC()
1521 matis->A = pcbddc->local_mat; in PCSetUp_BDDC()
1523 pcbddc->local_mat = matis->A; in PCSetUp_BDDC()
1528 if (!pcbddc->graphanalyzed) { in PCSetUp_BDDC()
1531 …PetscCheck(!(pcbddc->adaptive_selection && !pcbddc->use_deluxe_scaling && !pcbddc->mat_graph->twod… in PCSetUp_BDDC()
1532 if (pcbddc->compute_nonetflux) { in PCSetUp_BDDC()
1535 …PetscCheck(pcbddc->divudotp, PetscObjectComm((PetscObject)pc), PETSC_ERR_SUP, "Missing divudotp op… in PCSetUp_BDDC()
1536 …tscCall(PCBDDCComputeNoNetFlux(pc->pmat, pcbddc->divudotp, pcbddc->divudotp_trans, pcbddc->divudot… in PCSetUp_BDDC()
1544 PetscCall(PetscLogEventEnd(PC_BDDC_Topology[pcbddc->current_level], pc, 0, 0, 0)); in PCSetUp_BDDC()
1549 …if (pcbddc->benign_saddle_point && pcbddc->dbg_flag > 1) PetscCall(PCBDDCBenignCheck(pc, zerodiag)… in PCSetUp_BDDC()
1553 if (computesubschurs && pcbddc->recompute_topography) PetscCall(PCBDDCInitSubSchurs(pc)); in PCSetUp_BDDC()
1555 if (!pcbddc->use_deluxe_scaling) PetscCall(PCBDDCScalingSetUp(pc)); in PCSetUp_BDDC()
1558 sub_schurs = pcbddc->sub_schurs; in PCSetUp_BDDC()
1566 if (pcbddc->adaptive_selection) { in PCSetUp_BDDC()
1574 if (pcbddc->onearnullspace) { /* already used nearnullspace */ in PCSetUp_BDDC()
1579 if (nearnullspace != pcbddc->onearnullspace) { in PCSetUp_BDDC()
1589 if (pcbddc->onearnullvecs_state[i] != state) { in PCSetUp_BDDC()
1606 PetscCall(PetscLogEventBegin(PC_BDDC_LocalWork[pcbddc->current_level], pc, 0, 0, 0)); in PCSetUp_BDDC()
1607 pcbddc->new_primal_space = PETSC_FALSE; in PCSetUp_BDDC()
1608 pcbddc->new_primal_space_local = PETSC_FALSE; in PCSetUp_BDDC()
1616 if (pcbddc->use_change_of_basis) { in PCSetUp_BDDC()
1619 PetscCall(PCBDDCComputeLocalMatrix(pc, pcbddc->ChangeOfBasisMatrix)); in PCSetUp_BDDC()
1620 if (pcbddc->benign_change) { in PCSetUp_BDDC()
1621 PetscCall(MatDestroy(&pcbddc->benign_B0)); in PCSetUp_BDDC()
1629 …PetscCall(MatCreateSubMatrix(pcbddc->local_mat, pcis->is_B_local, pcis->is_B_local, MAT_INITIAL_MA… in PCSetUp_BDDC()
1630 …PetscCall(MatCreateSubMatrix(pcbddc->local_mat, pcis->is_I_local, pcis->is_B_local, MAT_INITIAL_MA… in PCSetUp_BDDC()
1631 …PetscCall(MatCreateSubMatrix(pcbddc->local_mat, pcis->is_B_local, pcis->is_I_local, MAT_INITIAL_MA… in PCSetUp_BDDC()
1634 } else if (!pcbddc->user_ChangeOfBasisMatrix && !pcbddc->benign_change) { in PCSetUp_BDDC()
1635 PetscCall(MatDestroy(&pcbddc->local_mat)); in PCSetUp_BDDC()
1637 pcbddc->local_mat = matis->A; in PCSetUp_BDDC()
1669 PetscCall(PetscLogEventEnd(PC_BDDC_LocalWork[pcbddc->current_level], pc, 0, 0, 0)); in PCSetUp_BDDC()
1674 if (pcbddc->use_deluxe_scaling) PetscCall(PCBDDCScalingSetUp(pc)); in PCSetUp_BDDC()
1677 pcbddc->recompute_topography = PETSC_FALSE; in PCSetUp_BDDC()
1682 if (pcbddc->dbg_flag) { in PCSetUp_BDDC()
1683 PetscCall(PetscViewerASCIISubtractTab(pcbddc->dbg_viewer, 2 * pcbddc->current_level)); in PCSetUp_BDDC()
1684 PetscCall(PetscViewerASCIIPopSynchronized(pcbddc->dbg_viewer)); in PCSetUp_BDDC()
1705 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCApply_BDDC() local
1717 if (pcbddc->switch_static) PetscCall(MatISGetLocalMat(pc->useAmat ? pc->mat : pc->pmat, &lA)); in PCApply_BDDC()
1719 if (pcbddc->ChangeOfBasisMatrix) { in PCApply_BDDC()
1722 PetscCall(MatMultTranspose(pcbddc->ChangeOfBasisMatrix, r, pcbddc->work_change)); in PCApply_BDDC()
1723 swap = pcbddc->work_change; in PCApply_BDDC()
1724 pcbddc->work_change = r; in PCApply_BDDC()
1727 …if (pcbddc->benign_apply_coarse_only && pcbddc->use_exact_dirichlet_trick && pcbddc->change_interi… in PCApply_BDDC()
1732 if (pcbddc->benign_have_null) { /* get p0 from r */ in PCApply_BDDC()
1735 …if (pcbddc->interface_extension == PC_BDDC_INTERFACE_EXT_DIRICHLET && !pcbddc->exact_dirichlet_tri… in PCApply_BDDC()
1745 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCApply_BDDC()
1747 PetscCall(KSPSolve(pcbddc->ksp_D, pcis->vec1_D, pcis->vec2_D)); in PCApply_BDDC()
1748 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCApply_BDDC()
1749 PetscCall(KSPCheckSolve(pcbddc->ksp_D, pc, pcis->vec2_D)); in PCApply_BDDC()
1751 if (pcbddc->switch_static) { in PCApply_BDDC()
1755 if (!pcbddc->switch_static_change) { in PCApply_BDDC()
1758 PetscCall(MatMult(pcbddc->switch_static_change, pcis->vec1_N, pcis->vec2_N)); in PCApply_BDDC()
1760 PetscCall(MatMultTranspose(pcbddc->switch_static_change, pcis->vec1_N, pcis->vec2_N)); in PCApply_BDDC()
1770 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCApply_BDDC()
1777 if (!pcbddc->benign_apply_coarse_only) PetscCall(PCBDDCScalingRestriction(pc, r, pcis->vec1_B)); in PCApply_BDDC()
1779 if (pcbddc->interface_extension == PC_BDDC_INTERFACE_EXT_LUMP) { in PCApply_BDDC()
1780 …PetscCheck(pcbddc->switch_static, PetscObjectComm((PetscObject)pc), PETSC_ERR_SUP, "You forgot to … in PCApply_BDDC()
1791 if (pcbddc->interface_extension == PC_BDDC_INTERFACE_EXT_LUMP) { in PCApply_BDDC()
1800 if (pcbddc->switch_static) { in PCApply_BDDC()
1805 if (!pcbddc->switch_static_change) { in PCApply_BDDC()
1808 PetscCall(MatMult(pcbddc->switch_static_change, pcis->vec1_N, pcis->vec2_N)); in PCApply_BDDC()
1810 PetscCall(MatMultTranspose(pcbddc->switch_static_change, pcis->vec1_N, pcis->vec2_N)); in PCApply_BDDC()
1817 } else if (pcbddc->switch_static) { /* n_B is zero */ in PCApply_BDDC()
1818 if (!pcbddc->switch_static_change) { in PCApply_BDDC()
1821 PetscCall(MatMult(pcbddc->switch_static_change, pcis->vec1_D, pcis->vec1_N)); in PCApply_BDDC()
1823 PetscCall(MatMultTranspose(pcbddc->switch_static_change, pcis->vec2_N, pcis->vec3_D)); in PCApply_BDDC()
1826 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCApply_BDDC()
1827 PetscCall(KSPSolve(pcbddc->ksp_D, pcis->vec3_D, pcis->vec4_D)); in PCApply_BDDC()
1828 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCApply_BDDC()
1829 PetscCall(KSPCheckSolve(pcbddc->ksp_D, pc, pcis->vec4_D)); in PCApply_BDDC()
1831 if (!pcbddc->exact_dirichlet_trick_app && !pcbddc->benign_apply_coarse_only) { in PCApply_BDDC()
1832 if (pcbddc->switch_static) { in PCApply_BDDC()
1840 if (pcbddc->switch_static) { in PCApply_BDDC()
1848 if (pcbddc->benign_have_null) { /* set p0 (computed in PCBDDCApplyInterface) */ in PCApply_BDDC()
1849 …if (pcbddc->benign_apply_coarse_only) PetscCall(PetscArrayzero(pcbddc->benign_p0, pcbddc->benign_n… in PCApply_BDDC()
1853 if (pcbddc->ChangeOfBasisMatrix) { in PCApply_BDDC()
1854 pcbddc->work_change = r; in PCApply_BDDC()
1855 PetscCall(VecCopy(z, pcbddc->work_change)); in PCApply_BDDC()
1856 PetscCall(MatMult(pcbddc->ChangeOfBasisMatrix, pcbddc->work_change, z)); in PCApply_BDDC()
1864 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCApplyTranspose_BDDC() local
1873 if (pcbddc->switch_static) PetscCall(MatISGetLocalMat(pc->useAmat ? pc->mat : pc->pmat, &lA)); in PCApplyTranspose_BDDC()
1874 if (pcbddc->ChangeOfBasisMatrix) { in PCApplyTranspose_BDDC()
1877 PetscCall(MatMultTranspose(pcbddc->ChangeOfBasisMatrix, r, pcbddc->work_change)); in PCApplyTranspose_BDDC()
1878 swap = pcbddc->work_change; in PCApplyTranspose_BDDC()
1879 pcbddc->work_change = r; in PCApplyTranspose_BDDC()
1882 …if (pcbddc->benign_apply_coarse_only && pcbddc->exact_dirichlet_trick_app && pcbddc->change_interi… in PCApplyTranspose_BDDC()
1887 if (pcbddc->benign_have_null) { /* get p0 from r */ in PCApplyTranspose_BDDC()
1890 if (!pcbddc->exact_dirichlet_trick_app && !pcbddc->benign_apply_coarse_only) { in PCApplyTranspose_BDDC()
1901 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCApplyTranspose_BDDC()
1902 PetscCall(KSPSolveTranspose(pcbddc->ksp_D, pcis->vec1_D, pcis->vec2_D)); in PCApplyTranspose_BDDC()
1903 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCApplyTranspose_BDDC()
1904 PetscCall(KSPCheckSolve(pcbddc->ksp_D, pc, pcis->vec2_D)); in PCApplyTranspose_BDDC()
1906 if (pcbddc->switch_static) { in PCApplyTranspose_BDDC()
1910 if (!pcbddc->switch_static_change) { in PCApplyTranspose_BDDC()
1913 PetscCall(MatMult(pcbddc->switch_static_change, pcis->vec1_N, pcis->vec2_N)); in PCApplyTranspose_BDDC()
1915 PetscCall(MatMultTranspose(pcbddc->switch_static_change, pcis->vec1_N, pcis->vec2_N)); in PCApplyTranspose_BDDC()
1945 if (pcbddc->switch_static) { in PCApplyTranspose_BDDC()
1950 if (!pcbddc->switch_static_change) { in PCApplyTranspose_BDDC()
1953 PetscCall(MatMult(pcbddc->switch_static_change, pcis->vec1_N, pcis->vec2_N)); in PCApplyTranspose_BDDC()
1955 PetscCall(MatMultTranspose(pcbddc->switch_static_change, pcis->vec1_N, pcis->vec2_N)); in PCApplyTranspose_BDDC()
1962 } else if (pcbddc->switch_static) { /* n_B is zero */ in PCApplyTranspose_BDDC()
1963 if (!pcbddc->switch_static_change) { in PCApplyTranspose_BDDC()
1966 PetscCall(MatMult(pcbddc->switch_static_change, pcis->vec1_D, pcis->vec1_N)); in PCApplyTranspose_BDDC()
1968 PetscCall(MatMultTranspose(pcbddc->switch_static_change, pcis->vec2_N, pcis->vec3_D)); in PCApplyTranspose_BDDC()
1971 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCApplyTranspose_BDDC()
1972 PetscCall(KSPSolveTranspose(pcbddc->ksp_D, pcis->vec3_D, pcis->vec4_D)); in PCApplyTranspose_BDDC()
1973 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCApplyTranspose_BDDC()
1974 PetscCall(KSPCheckSolve(pcbddc->ksp_D, pc, pcis->vec4_D)); in PCApplyTranspose_BDDC()
1975 if (!pcbddc->exact_dirichlet_trick_app && !pcbddc->benign_apply_coarse_only) { in PCApplyTranspose_BDDC()
1976 if (pcbddc->switch_static) { in PCApplyTranspose_BDDC()
1984 if (pcbddc->switch_static) { in PCApplyTranspose_BDDC()
1992 if (pcbddc->benign_have_null) { /* set p0 (computed in PCBDDCApplyInterface) */ in PCApplyTranspose_BDDC()
1995 if (pcbddc->ChangeOfBasisMatrix) { in PCApplyTranspose_BDDC()
1996 pcbddc->work_change = r; in PCApplyTranspose_BDDC()
1997 PetscCall(VecCopy(z, pcbddc->work_change)); in PCApplyTranspose_BDDC()
1998 PetscCall(MatMult(pcbddc->ChangeOfBasisMatrix, pcbddc->work_change, z)); in PCApplyTranspose_BDDC()
2005 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCReset_BDDC() local
2019 PetscCall(VecDestroy(&pcbddc->temp_solution)); in PCReset_BDDC()
2020 PetscCall(VecDestroy(&pcbddc->original_rhs)); in PCReset_BDDC()
2025 kspD = pcbddc->ksp_D; in PCReset_BDDC()
2026 kspR = pcbddc->ksp_R; in PCReset_BDDC()
2027 kspC = pcbddc->coarse_ksp; in PCReset_BDDC()
2028 PetscCall(PetscMemzero(pc->data, sizeof(*pcbddc))); in PCReset_BDDC()
2032 pcbddc->use_local_adj = PETSC_TRUE; in PCReset_BDDC()
2033 pcbddc->use_vertices = PETSC_TRUE; in PCReset_BDDC()
2034 pcbddc->use_edges = PETSC_TRUE; in PCReset_BDDC()
2035 pcbddc->symmetric_primal = PETSC_TRUE; in PCReset_BDDC()
2036 pcbddc->vertex_size = 1; in PCReset_BDDC()
2037 pcbddc->recompute_topography = PETSC_TRUE; in PCReset_BDDC()
2038 pcbddc->coarse_size = -1; in PCReset_BDDC()
2039 pcbddc->use_exact_dirichlet_trick = PETSC_TRUE; in PCReset_BDDC()
2040 pcbddc->coarsening_ratio = 8; in PCReset_BDDC()
2041 pcbddc->coarse_eqs_per_proc = 1; in PCReset_BDDC()
2042 pcbddc->benign_compute_correction = PETSC_TRUE; in PCReset_BDDC()
2043 pcbddc->nedfield = -1; in PCReset_BDDC()
2044 pcbddc->nedglobal = PETSC_TRUE; in PCReset_BDDC()
2045 pcbddc->graphmaxcount = PETSC_INT_MAX; in PCReset_BDDC()
2046 pcbddc->sub_schurs_layers = -1; in PCReset_BDDC()
2047 pcbddc->ksp_D = kspD; in PCReset_BDDC()
2048 pcbddc->ksp_R = kspR; in PCReset_BDDC()
2049 pcbddc->coarse_ksp = kspC; in PCReset_BDDC()
2055 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCDestroy_BDDC() local
2059 PetscCall(KSPDestroy(&pcbddc->ksp_D)); in PCDestroy_BDDC()
2060 PetscCall(KSPDestroy(&pcbddc->ksp_R)); in PCDestroy_BDDC()
2061 PetscCall(KSPDestroy(&pcbddc->coarse_ksp)); in PCDestroy_BDDC()
2095 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCSetCoordinates_BDDC() local
2096 PCBDDCGraph mat_graph = pcbddc->mat_graph; in PCSetCoordinates_BDDC()
2106 pcbddc->recompute_topography = PETSC_TRUE; in PCSetCoordinates_BDDC()
2107 pcbddc->corner_selected = PETSC_FALSE; in PCSetCoordinates_BDDC()
2123 PC_BDDC *pcbddc; in PCBDDCMatFETIDPGetRHS_BDDC() local
2128 pcbddc = (PC_BDDC *)mat_ctx->pc->data; in PCBDDCMatFETIDPGetRHS_BDDC()
2132 if (!pcbddc->original_rhs) PetscCall(VecDuplicate(pcis->vec1_global, &pcbddc->original_rhs)); in PCBDDCMatFETIDPGetRHS_BDDC()
2134 PetscCall(VecPointwiseMult(pcbddc->original_rhs, standard_rhs, mat_ctx->rhs_flip)); in PCBDDCMatFETIDPGetRHS_BDDC()
2136 PetscCall(VecCopy(standard_rhs, pcbddc->original_rhs)); in PCBDDCMatFETIDPGetRHS_BDDC()
2140 …PetscCall(VecScatterBegin(mat_ctx->g2g_p, fetidp_flux_rhs, pcbddc->original_rhs, INSERT_VALUES, SC… in PCBDDCMatFETIDPGetRHS_BDDC()
2141 …PetscCall(VecScatterEnd(mat_ctx->g2g_p, fetidp_flux_rhs, pcbddc->original_rhs, INSERT_VALUES, SCAT… in PCBDDCMatFETIDPGetRHS_BDDC()
2150 PetscCall(PCPreSolve_BDDC(mat_ctx->pc, NULL, pcbddc->original_rhs, NULL)); in PCBDDCMatFETIDPGetRHS_BDDC()
2151 if (pcbddc->ChangeOfBasisMatrix) { in PCBDDCMatFETIDPGetRHS_BDDC()
2152 …PetscCall(MatMultTranspose(pcbddc->ChangeOfBasisMatrix, pcbddc->original_rhs, pcbddc->work_change)… in PCBDDCMatFETIDPGetRHS_BDDC()
2153 work = pcbddc->work_change; in PCBDDCMatFETIDPGetRHS_BDDC()
2155 work = pcbddc->original_rhs; in PCBDDCMatFETIDPGetRHS_BDDC()
2167 if (!pcbddc->switch_static) { in PCBDDCMatFETIDPGetRHS_BDDC()
2169 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][0], mat_ctx->pc, 0, 0, 0)); in PCBDDCMatFETIDPGetRHS_BDDC()
2170 PetscCall(KSPSolve(pcbddc->ksp_D, mat_ctx->temp_solution_D, pcis->vec1_D)); in PCBDDCMatFETIDPGetRHS_BDDC()
2171 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][0], mat_ctx->pc, 0, 0, 0)); in PCBDDCMatFETIDPGetRHS_BDDC()
2185 if (pcbddc->switch_static) PetscCall(VecCopy(mat_ctx->temp_solution_D, pcis->vec1_D)); in PCBDDCMatFETIDPGetRHS_BDDC()
2187 PetscCall(PetscArrayzero(pcbddc->benign_p0, pcbddc->benign_n)); in PCBDDCMatFETIDPGetRHS_BDDC()
2189 PetscCall(PetscArrayzero(pcbddc->benign_p0, pcbddc->benign_n)); in PCBDDCMatFETIDPGetRHS_BDDC()
2199 if (pcbddc->switch_static) { in PCBDDCMatFETIDPGetRHS_BDDC()
2245 PC_BDDC *pcbddc; in PCBDDCMatFETIDPGetSolution_BDDC() local
2251 pcbddc = (PC_BDDC *)mat_ctx->pc->data; in PCBDDCMatFETIDPGetSolution_BDDC()
2266 if (pcbddc->switch_static) { in PCBDDCMatFETIDPGetSolution_BDDC()
2275 PetscCall(PetscArrayzero(pcbddc->benign_p0, pcbddc->benign_n)); in PCBDDCMatFETIDPGetSolution_BDDC()
2279 if (pcbddc->ChangeOfBasisMatrix) work = pcbddc->work_change; in PCBDDCMatFETIDPGetSolution_BDDC()
2283 if (!pcbddc->switch_static) { in PCBDDCMatFETIDPGetSolution_BDDC()
2287 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][0], mat_ctx->pc, 0, 0, 0)); in PCBDDCMatFETIDPGetSolution_BDDC()
2288 PetscCall(KSPSolve(pcbddc->ksp_D, pcis->vec1_D, pcis->vec1_D)); in PCBDDCMatFETIDPGetSolution_BDDC()
2289 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][0], mat_ctx->pc, 0, 0, 0)); in PCBDDCMatFETIDPGetSolution_BDDC()
2297 …if (pcbddc->ChangeOfBasisMatrix) PetscCall(MatMult(pcbddc->ChangeOfBasisMatrix, work, standard_sol… in PCBDDCMatFETIDPGetSolution_BDDC()
2463 PC_BDDC *pcbddc = (PC_BDDC *)fetidpmat_ctx->pc->data; in PCBDDCCreateFETIDPOperators_BDDC() local
2467 …if ((isset && issym) || pcbddc->symmetric_primal) PetscCall(MatSetOption(newmat, MAT_SYMMETRIC, PE… in PCBDDCCreateFETIDPOperators_BDDC()
2563 PC_BDDC *pcbddc = (PC_BDDC *)fetidpmat_ctx->pc->data; in PCBDDCCreateFETIDPOperators_BDDC() local
2577 if (pcbddc->user_primal_vertices_local || pcbddc->n_ISForDofsLocal > 2) { in PCBDDCCreateFETIDPOperators_BDDC()
2578 if (pcbddc->user_primal_vertices_local) { in PCBDDCCreateFETIDPOperators_BDDC()
2581 PetscCall(MatISSubMatrixEmbedLocalIS(M, pcbddc->user_primal_vertices_local, &primals)); in PCBDDCCreateFETIDPOperators_BDDC()
2585 if (pcbddc->n_ISForDofsLocal > 2) { /* no need to propagate info if nfields < 3 */ in PCBDDCCreateFETIDPOperators_BDDC()
2589 PetscCall(PetscCalloc1(pcbddc->n_ISForDofsLocal, &split)); in PCBDDCCreateFETIDPOperators_BDDC()
2590 for (i = 0, nf = 0; i < pcbddc->n_ISForDofsLocal; i++) { in PCBDDCCreateFETIDPOperators_BDDC()
2593 PetscCall(MatISSubMatrixEmbedLocalIS(M, pcbddc->ISForDofsLocal[i], &split[nf])); in PCBDDCCreateFETIDPOperators_BDDC()
2809 PC_BDDC *pcbddc; in PCCreate_BDDC() local
2812 PetscCall(PetscNew(&pcbddc)); in PCCreate_BDDC()
2813 pc->data = pcbddc; in PCCreate_BDDC()
2818 PetscCall(PCBDDCGraphCreate(&pcbddc->mat_graph)); in PCCreate_BDDC()
2821 pcbddc->use_nnsp = PETSC_TRUE; in PCCreate_BDDC()
2822 pcbddc->use_local_adj = PETSC_TRUE; in PCCreate_BDDC()
2823 pcbddc->use_vertices = PETSC_TRUE; in PCCreate_BDDC()
2824 pcbddc->use_edges = PETSC_TRUE; in PCCreate_BDDC()
2825 pcbddc->symmetric_primal = PETSC_TRUE; in PCCreate_BDDC()
2826 pcbddc->vertex_size = 1; in PCCreate_BDDC()
2827 pcbddc->recompute_topography = PETSC_TRUE; in PCCreate_BDDC()
2828 pcbddc->coarse_size = -1; in PCCreate_BDDC()
2829 pcbddc->use_exact_dirichlet_trick = PETSC_TRUE; in PCCreate_BDDC()
2830 pcbddc->coarsening_ratio = 8; in PCCreate_BDDC()
2831 pcbddc->coarse_eqs_per_proc = 1; in PCCreate_BDDC()
2832 pcbddc->benign_compute_correction = PETSC_TRUE; in PCCreate_BDDC()
2833 pcbddc->nedfield = -1; in PCCreate_BDDC()
2834 pcbddc->nedglobal = PETSC_TRUE; in PCCreate_BDDC()
2835 pcbddc->graphmaxcount = PETSC_INT_MAX; in PCCreate_BDDC()
2836 pcbddc->sub_schurs_layers = -1; in PCCreate_BDDC()
2837 pcbddc->adaptive_threshold[0] = 0.0; in PCCreate_BDDC()
2838 pcbddc->adaptive_threshold[1] = 0.0; in PCCreate_BDDC()