Lines Matching refs:pcbddc

155   PC_BDDC               *pcbddc = (PC_BDDC *)pc->data;  in PCBDDCNedelecSupport()  local
180 order = pcbddc->nedorder; in PCBDDCNedelecSupport()
181 conforming = pcbddc->conforming; in PCBDDCNedelecSupport()
182 field = pcbddc->nedfield; in PCBDDCNedelecSupport()
183 global = pcbddc->nedglobal; in PCBDDCNedelecSupport()
212pcbddc->n_ISForDofsLocal || field < pcbddc->n_ISForDofsLocal, comm, PETSC_ERR_USER, "Invalid field… in PCBDDCNedelecSupport()
213 if (pcbddc->n_ISForDofsLocal && field >= 0) { in PCBDDCNedelecSupport()
214 PetscCall(PetscObjectReference((PetscObject)pcbddc->ISForDofsLocal[field])); in PCBDDCNedelecSupport()
215 nedfieldlocal = pcbddc->ISForDofsLocal[field]; in PCBDDCNedelecSupport()
217 } else if (!pcbddc->n_ISForDofsLocal && field != PETSC_DECIDE) { in PCBDDCNedelecSupport()
226 PetscCall(MatGetOwnershipRange(pcbddc->discretegradient, &rst, &ren)); in PCBDDCNedelecSupport()
230 PetscCall(MatGetRow(pcbddc->discretegradient, i, &nc, NULL, NULL)); in PCBDDCNedelecSupport()
232 PetscCall(MatRestoreRow(pcbddc->discretegradient, i, &nc, NULL, NULL)); in PCBDDCNedelecSupport()
246 …PetscCheck(!pcbddc->user_ChangeOfBasisMatrix, comm, PETSC_ERR_SUP, "Cannot generate Nedelec suppor… in PCBDDCNedelecSupport()
320 …if (matis->allow_repeated) PetscCall(PetscObjectQuery((PetscObject)pcbddc->discretegradient, "_ele… in PCBDDCNedelecSupport()
323 …PetscCall(MatViewFromOptions(pcbddc->discretegradient, (PetscObject)pc, "-pc_bddc_discrete_gradien… in PCBDDCNedelecSupport()
324 PetscCall(MatDuplicate(pcbddc->discretegradient, MAT_COPY_VALUES, &G)); in PCBDDCNedelecSupport()
367 PetscCall(PetscCalloc1(pcbddc->n_local_subs * pcbddc->n_local_subs, &lGn)); in PCBDDCNedelecSupport()
368 PetscCall(PetscMalloc1(pcbddc->n_local_subs, &is_rows)); in PCBDDCNedelecSupport()
369 PetscCall(PetscMalloc1(pcbddc->n_local_subs, &tcols)); in PCBDDCNedelecSupport()
370 for (PetscInt i = 0; i < pcbddc->n_local_subs; i++) { in PCBDDCNedelecSupport()
372 … PetscCall(ISGlobalToLocalMappingApplyIS(fl2g, IS_GTOLM_MASK, pcbddc->local_subs[i], &is_rows[i])); in PCBDDCNedelecSupport()
374 PetscCall(PetscObjectReference((PetscObject)pcbddc->local_subs[i])); in PCBDDCNedelecSupport()
375 is_rows[i] = pcbddc->local_subs[i]; in PCBDDCNedelecSupport()
377 …PetscCall(MatCreateSubMatrix(lG, is_rows[i], NULL, MAT_INITIAL_MATRIX, &lGn[i * (1 + pcbddc->n_loc… in PCBDDCNedelecSupport()
378 PetscCall(MatSeqAIJCompactOutExtraColumns_SeqAIJ(lGn[i * (1 + pcbddc->n_local_subs)], &mapn)); in PCBDDCNedelecSupport()
391 PetscCall(ISConcatenate(PETSC_COMM_SELF, pcbddc->n_local_subs, tcols, &tmap)); in PCBDDCNedelecSupport()
403 …PetscCall(MatCreateNest(PETSC_COMM_SELF, pcbddc->n_local_subs, is_rows, pcbddc->n_local_subs, NULL… in PCBDDCNedelecSupport()
404 for (PetscInt i = 0; i < pcbddc->n_local_subs; i++) { in PCBDDCNedelecSupport()
405 PetscCall(MatDestroy(&lGn[i * (1 + pcbddc->n_local_subs)])); in PCBDDCNedelecSupport()
469 if (pcbddc->DirichletBoundariesLocal) { in PCBDDCNedelecSupport()
473 …PetscCall(ISGlobalToLocalMappingApplyIS(fl2g, IS_GTOLM_MASK, pcbddc->DirichletBoundariesLocal, &is… in PCBDDCNedelecSupport()
475 is = pcbddc->DirichletBoundariesLocal; in PCBDDCNedelecSupport()
488 if (pcbddc->NeumannBoundariesLocal) { in PCBDDCNedelecSupport()
492 …PetscCall(ISGlobalToLocalMappingApplyIS(fl2g, IS_GTOLM_MASK, pcbddc->NeumannBoundariesLocal, &is)); in PCBDDCNedelecSupport()
494 is = pcbddc->NeumannBoundariesLocal; in PCBDDCNedelecSupport()
587 PetscInt cum_subs = 0, n_subs = pcbddc->n_local_subs, bs, emnr, emnl, vmnr, vmnl; in PCBDDCNedelecSupport()
621 PetscCall(ISGetLocalSize(pcbddc->local_subs[i], &ns)); in PCBDDCNedelecSupport()
622 PetscCall(ISGetIndices(pcbddc->local_subs[i], &idxs)); in PCBDDCNedelecSupport()
629 PetscCall(ISRestoreIndices(pcbddc->local_subs[i], &idxs)); in PCBDDCNedelecSupport()
858 if (pcbddc->mat_graph->nvtxs_csr) { /* the user has passed in a CSR graph */ in PCBDDCNedelecSupport()
859 …ck(pcbddc->mat_graph->nvtxs_csr == n, PETSC_COMM_SELF, PETSC_ERR_USER, "Invalid size of CSR graph … in PCBDDCNedelecSupport()
860 iiu = pcbddc->mat_graph->xadj; in PCBDDCNedelecSupport()
861 jju = pcbddc->mat_graph->adjncy; in PCBDDCNedelecSupport()
862 } else if (pcbddc->use_local_adj) { in PCBDDCNedelecSupport()
918 pcbddc->mat_graph->twodim = PETSC_FALSE; in PCBDDCNedelecSupport()
921 …PetscCall(PCBDDCGraphGetCandidatesIS(pcbddc->mat_graph, NULL, NULL, &nee, &alleedges, &allprimals)… in PCBDDCNedelecSupport()
1138 …PetscCall(PCBDDCGraphRestoreCandidatesIS(pcbddc->mat_graph, NULL, NULL, &nee, &alleedges, &allprim… in PCBDDCNedelecSupport()
1144 pcbddc->mat_graph->twodim = PETSC_FALSE; in PCBDDCNedelecSupport()
1145 …PetscCall(PCBDDCGraphGetCandidatesIS(pcbddc->mat_graph, NULL, NULL, &nee, &alleedges, &allprimals)… in PCBDDCNedelecSupport()
1205 if (print) PetscCall(PCBDDCGraphASCIIView(pcbddc->mat_graph, 5, PETSC_VIEWER_STDOUT_SELF)); in PCBDDCNedelecSupport()
1367 PetscCall(MatDestroy(&pcbddc->nedcG)); in PCBDDCNedelecSupport()
1368 PetscCall(ISDestroy(&pcbddc->nedclocal)); in PCBDDCNedelecSupport()
1369 if (pcbddc->current_level < pcbddc->max_levels) { in PCBDDCNedelecSupport()
1376 PetscCall(ISLocalToGlobalMappingApplyIS(fl2g, wis, &pcbddc->nedclocal)); in PCBDDCNedelecSupport()
1379 pcbddc->nedclocal = wis; in PCBDDCNedelecSupport()
1396 PetscCall(MatCreate(comm, &pcbddc->nedcG)); in PCBDDCNedelecSupport()
1397 PetscCall(MatSetSizes(pcbddc->nedcG, PETSC_DECIDE, PETSC_DECIDE, cne, cnv)); in PCBDDCNedelecSupport()
1398 PetscCall(MatSetType(pcbddc->nedcG, MATAIJ)); in PCBDDCNedelecSupport()
1399 PetscCall(MatSeqAIJSetPreallocation(pcbddc->nedcG, 2, NULL)); in PCBDDCNedelecSupport()
1400 PetscCall(MatMPIAIJSetPreallocation(pcbddc->nedcG, 2, NULL, 2, NULL)); in PCBDDCNedelecSupport()
1401 PetscCall(MatSetLocalToGlobalMapping(pcbddc->nedcG, cel2g, cvl2g)); in PCBDDCNedelecSupport()
1411 PetscCall(MatGetNullSpace(pcbddc->discretegradient, &nnsp)); in PCBDDCNedelecSupport()
1420 PetscCall(MatCreateVecs(pcbddc->discretegradient, &V, NULL)); in PCBDDCNedelecSupport()
1471 lev = pcbddc->current_level; in PCBDDCNedelecSupport()
1480 …if (pcbddc->nedcG) PetscCall(ISCreateGeneral(PETSC_COMM_SELF, 2, corners + 2 * i, PETSC_USE_POINTE… in PCBDDCNedelecSupport()
1499 …PetscCheck(ncc == 1 || !pcbddc->nedcG, PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot generate the coarse… in PCBDDCNedelecSupport()
1505 if (pcbddc->nedcG) { in PCBDDCNedelecSupport()
1510 PetscCall(MatSetValuesLocal(pcbddc->nedcG, 1, &i, 2, cols, cvals, INSERT_VALUES)); in PCBDDCNedelecSupport()
1587 if (pcbddc->nedcG) PetscCall(MatAssemblyBegin(pcbddc->nedcG, MAT_FINAL_ASSEMBLY)); in PCBDDCNedelecSupport()
1598 PCBDDCGraph graph = pcbddc->mat_graph; in PCBDDCNedelecSupport()
1604 if (pcbddc->nedclocal) { in PCBDDCNedelecSupport()
1605 PetscCall(ISGetIndices(pcbddc->nedclocal, (const PetscInt **)&idxs)); in PCBDDCNedelecSupport()
1631 if (pcbddc->nedclocal) PetscCall(ISRestoreIndices(pcbddc->nedclocal, (const PetscInt **)&idxs)); in PCBDDCNedelecSupport()
1635 …PetscCall(PCBDDCGraphRestoreCandidatesIS(pcbddc->mat_graph, NULL, NULL, &nee, &alleedges, &allprim… in PCBDDCNedelecSupport()
1636 PetscCall(PCBDDCGraphResetCSR(pcbddc->mat_graph)); in PCBDDCNedelecSupport()
1650 if (pcbddc->nedcG) { in PCBDDCNedelecSupport()
1651 PetscCall(MatAssemblyEnd(pcbddc->nedcG, MAT_FINAL_ASSEMBLY)); in PCBDDCNedelecSupport()
1652 …PetscCall(MatViewFromOptions(pcbddc->nedcG, (PetscObject)pc, "-pc_bddc_nedelec_coarse_change_view"… in PCBDDCNedelecSupport()
1796 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCAddPrimalVerticesLocalIS() local
1800 if (pcbddc->user_primal_vertices_local) { in PCBDDCAddPrimalVerticesLocalIS()
1804 list[1] = pcbddc->user_primal_vertices_local; in PCBDDCAddPrimalVerticesLocalIS()
1808 pcbddc->user_primal_vertices_local = newp; in PCBDDCAddPrimalVerticesLocalIS()
1828 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCComputeLocalTopologyInfo() local
1842 if (pcbddc->vertex_size == 1) PetscCall(MatGetBlockSize(pc->pmat, &pcbddc->vertex_size)); in PCBDDCComputeLocalTopologyInfo()
1846 if (pcbddc->user_provided_isfordofs) { in PCBDDCComputeLocalTopologyInfo()
1847 if (pcbddc->n_ISForDofs) { in PCBDDCComputeLocalTopologyInfo()
1850 PetscCall(PetscMalloc1(pcbddc->n_ISForDofs, &pcbddc->ISForDofsLocal)); in PCBDDCComputeLocalTopologyInfo()
1851 for (i = 0; i < pcbddc->n_ISForDofs; i++) { in PCBDDCComputeLocalTopologyInfo()
1854 …PetscCall(PCBDDCGlobalToLocal(matis->rctx, global, local, pcbddc->ISForDofs[i], &pcbddc->ISForDofs… in PCBDDCComputeLocalTopologyInfo()
1855 PetscCall(ISGetBlockSize(pcbddc->ISForDofs[i], &bs)); in PCBDDCComputeLocalTopologyInfo()
1856 PetscCall(ISSetBlockSize(pcbddc->ISForDofsLocal[i], bs)); in PCBDDCComputeLocalTopologyInfo()
1857 PetscCall(ISDestroy(&pcbddc->ISForDofs[i])); in PCBDDCComputeLocalTopologyInfo()
1859 pcbddc->n_ISForDofsLocal = pcbddc->n_ISForDofs; in PCBDDCComputeLocalTopologyInfo()
1860 pcbddc->n_ISForDofs = 0; in PCBDDCComputeLocalTopologyInfo()
1861 PetscCall(PetscFree(pcbddc->ISForDofs)); in PCBDDCComputeLocalTopologyInfo()
1864 if (!pcbddc->n_ISForDofsLocal) { /* field split not present */ in PCBDDCComputeLocalTopologyInfo()
1874 PetscCall(PetscMalloc1(nf, &pcbddc->ISForDofsLocal)); in PCBDDCComputeLocalTopologyInfo()
1878 … PetscCall(PCBDDCGlobalToLocal(matis->rctx, global, local, fields[i], &pcbddc->ISForDofsLocal[i])); in PCBDDCComputeLocalTopologyInfo()
1880 PetscCall(ISSetBlockSize(pcbddc->ISForDofsLocal[i], bs)); in PCBDDCComputeLocalTopologyInfo()
1884 pcbddc->n_ISForDofsLocal = nf; in PCBDDCComputeLocalTopologyInfo()
1897 pcbddc->n_ISForDofsLocal = i; in PCBDDCComputeLocalTopologyInfo()
1898 PetscCall(PetscMalloc1(pcbddc->n_ISForDofsLocal, &pcbddc->ISForDofsLocal)); in PCBDDCComputeLocalTopologyInfo()
1899pcbddc->n_ISForDofsLocal; i++) PetscCall(ISCreateStride(PetscObjectComm((PetscObject)pc), n / pcbd… in PCBDDCComputeLocalTopologyInfo()
1905 …for (i = 0; i < pcbddc->n_ISForDofsLocal; i++) PetscCall(PCBDDCConsistencyCheckIS(pc, MPI_LAND, &p… in PCBDDCComputeLocalTopologyInfo()
1910 if (!pcbddc->DirichletBoundariesLocal && pcbddc->DirichletBoundaries) { in PCBDDCComputeLocalTopologyInfo()
1911 …PetscCall(PCBDDCGlobalToLocal(matis->rctx, global, local, pcbddc->DirichletBoundaries, &pcbddc->Di… in PCBDDCComputeLocalTopologyInfo()
1912 } else if (pcbddc->DirichletBoundariesLocal) { in PCBDDCComputeLocalTopologyInfo()
1913 PetscCall(PCBDDCConsistencyCheckIS(pc, MPI_LAND, &pcbddc->DirichletBoundariesLocal)); in PCBDDCComputeLocalTopologyInfo()
1915 if (!pcbddc->NeumannBoundariesLocal && pcbddc->NeumannBoundaries) { in PCBDDCComputeLocalTopologyInfo()
1916 …PetscCall(PCBDDCGlobalToLocal(matis->rctx, global, local, pcbddc->NeumannBoundaries, &pcbddc->Neum… in PCBDDCComputeLocalTopologyInfo()
1917 } else if (pcbddc->NeumannBoundariesLocal) { in PCBDDCComputeLocalTopologyInfo()
1918 PetscCall(PCBDDCConsistencyCheckIS(pc, MPI_LOR, &pcbddc->NeumannBoundariesLocal)); in PCBDDCComputeLocalTopologyInfo()
1920pcbddc->user_primal_vertices_local && pcbddc->user_primal_vertices) PetscCall(PCBDDCGlobalToLocal(… in PCBDDCComputeLocalTopologyInfo()
1924 if (pcbddc->detect_disconnected || matis->allow_repeated) { in PCBDDCComputeLocalTopologyInfo()
1927 PetscBool filter = pcbddc->detect_disconnected_filter; in PCBDDCComputeLocalTopologyInfo()
1929 … for (PetscInt i = 0; i < pcbddc->n_local_subs; i++) PetscCall(ISDestroy(&pcbddc->local_subs[i])); in PCBDDCComputeLocalTopologyInfo()
1930 PetscCall(PetscFree(pcbddc->local_subs)); in PCBDDCComputeLocalTopologyInfo()
1935 pcbddc->n_local_subs = nel; in PCBDDCComputeLocalTopologyInfo()
1937 PetscCall(PetscMalloc1(nel, &pcbddc->local_subs)); in PCBDDCComputeLocalTopologyInfo()
1939 PetscCall(ISCreateStride(PETSC_COMM_SELF, elsizes[i], c, 1, &pcbddc->local_subs[i])); in PCBDDCComputeLocalTopologyInfo()
1943 …PetscCall(PCBDDCDetectDisconnectedComponents(pc, filter, &pcbddc->n_local_subs, &pcbddc->local_sub… in PCBDDCComputeLocalTopologyInfo()
1975 PetscCall(PetscFree(pcbddc->mat_graph->coords)); in PCBDDCComputeLocalTopologyInfo()
1976 PetscCall(PetscMalloc1(dof * n * cdim, &pcbddc->mat_graph->coords)); in PCBDDCComputeLocalTopologyInfo()
1980 PetscCall(PetscArraycpy(pcbddc->mat_graph->coords, coords, cdim * n * dof)); in PCBDDCComputeLocalTopologyInfo()
1982 PetscReal *bcoords = pcbddc->mat_graph->coords; in PCBDDCComputeLocalTopologyInfo()
1992 pcbddc->mat_graph->cdim = cdim; in PCBDDCComputeLocalTopologyInfo()
1993 pcbddc->mat_graph->cnloc = dof * n; in PCBDDCComputeLocalTopologyInfo()
1994 pcbddc->mat_graph->cloc = PETSC_FALSE; in PCBDDCComputeLocalTopologyInfo()
2029 pcbddc->corner_selected = PETSC_TRUE; in PCBDDCComputeLocalTopologyInfo()
2030 pcbddc->corner_selection = PETSC_TRUE; in PCBDDCComputeLocalTopologyInfo()
2036 if (pcbddc->corner_selection && !pcbddc->mat_graph->cdim) { in PCBDDCComputeLocalTopologyInfo()
2137 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCBenignRemoveInterior() local
2140 if (!pcbddc->benign_have_null) PetscFunctionReturn(PETSC_SUCCESS); in PCBDDCBenignRemoveInterior()
2141 if (pcbddc->ChangeOfBasisMatrix) { in PCBDDCBenignRemoveInterior()
2144 PetscCall(MatMultTranspose(pcbddc->ChangeOfBasisMatrix, r, pcbddc->work_change)); in PCBDDCBenignRemoveInterior()
2145 swap = pcbddc->work_change; in PCBDDCBenignRemoveInterior()
2146 pcbddc->work_change = r; in PCBDDCBenignRemoveInterior()
2151 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCBDDCBenignRemoveInterior()
2152 PetscCall(KSPSolve(pcbddc->ksp_D, pcis->vec1_D, pcis->vec2_D)); in PCBDDCBenignRemoveInterior()
2153 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][0], pc, 0, 0, 0)); in PCBDDCBenignRemoveInterior()
2154 PetscCall(KSPCheckSolve(pcbddc->ksp_D, pc, pcis->vec2_D)); in PCBDDCBenignRemoveInterior()
2158 if (pcbddc->ChangeOfBasisMatrix) { in PCBDDCBenignRemoveInterior()
2159 pcbddc->work_change = r; in PCBDDCBenignRemoveInterior()
2160 PetscCall(VecCopy(z, pcbddc->work_change)); in PCBDDCBenignRemoveInterior()
2161 PetscCall(MatMult(pcbddc->ChangeOfBasisMatrix, pcbddc->work_change, z)); in PCBDDCBenignRemoveInterior()
2264 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCBenignShellMat() local
2271 PCBDDCReuseSolvers reuse = pcbddc->sub_schurs ? pcbddc->sub_schurs->reuse_solver : NULL; in PCBDDCBenignShellMat()
2273 …PetscCheck(!pcbddc->benign_original_mat, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Benign original mat has… in PCBDDCBenignShellMat()
2274 …if (!pcbddc->benign_change || !pcbddc->benign_n || pcbddc->benign_change_explicit) PetscFunctionRe… in PCBDDCBenignShellMat()
2286 ctx->benign_n = pcbddc->benign_n; in PCBDDCBenignShellMat()
2295 PetscCall(PetscMalloc1(pcbddc->benign_n, &ctx->benign_zerodiag_subs)); in PCBDDCBenignShellMat()
2296 …for (i = 0; i < pcbddc->benign_n; i++) PetscCall(ISGlobalToLocalMappingApplyIS(N_to_D, IS_GTOLM_DR… in PCBDDCBenignShellMat()
2309 pcbddc->benign_original_mat = pcis->A_BI; in PCBDDCBenignShellMat()
2312 if (!pcbddc->benign_original_mat) PetscFunctionReturn(PETSC_SUCCESS); in PCBDDCBenignShellMat()
2318 pcis->A_BI = pcbddc->benign_original_mat; in PCBDDCBenignShellMat()
2319 pcbddc->benign_original_mat = NULL; in PCBDDCBenignShellMat()
2334 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCBenignProject() local
2339 PetscCall(MatPtAP(matis->A, pcbddc->benign_change, MAT_INITIAL_MATRIX, 2.0, &An)); in PCBDDCBenignProject()
2340 PetscCall(MatZeroRowsColumns(An, pcbddc->benign_n, pcbddc->benign_p0_lidx, 1.0, NULL, NULL)); in PCBDDCBenignProject()
2713 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCBenignCheck() local
2719 PetscCall(PCBDDCGraphGetDirichletDofs(pcbddc->mat_graph, &dirIS)); in PCBDDCBenignCheck()
2779 for (i = 0; i < pcbddc->benign_n; i++) pcbddc->benign_p0[i] = -PetscGlobalRank - i; in PCBDDCBenignCheck()
2781 for (i = 0; i < pcbddc->benign_n; i++) pcbddc->benign_p0[i] = 1; in PCBDDCBenignCheck()
2783 for (i = 0; i < pcbddc->benign_n; i++) { in PCBDDCBenignCheck()
2784 PetscInt val = PetscRealPart(pcbddc->benign_p0[i]); in PCBDDCBenignCheck()
2785 …tP0! Found %g at %" PetscInt_FMT " instead of %g", (double)PetscRealPart(pcbddc->benign_p0[i]), i,… in PCBDDCBenignCheck()
2792 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCBenignDetectSaddlePoint() local
2801 PetscCall(PetscSFDestroy(&pcbddc->benign_sf)); in PCBDDCBenignDetectSaddlePoint()
2802 PetscCall(MatDestroy(&pcbddc->benign_B0)); in PCBDDCBenignDetectSaddlePoint()
2803 for (n = 0; n < pcbddc->benign_n; n++) PetscCall(ISDestroy(&pcbddc->benign_zerodiag_subs[n])); in PCBDDCBenignDetectSaddlePoint()
2804 PetscCall(PetscFree(pcbddc->benign_zerodiag_subs)); in PCBDDCBenignDetectSaddlePoint()
2813 if (pcbddc->n_ISForDofsLocal) { in PCBDDCBenignDetectSaddlePoint()
2818 PetscCall(PetscMalloc1(pcbddc->n_ISForDofsLocal, &pp)); in PCBDDCBenignDetectSaddlePoint()
2819 n = pcbddc->n_ISForDofsLocal; in PCBDDCBenignDetectSaddlePoint()
2826 pp[0] = pcbddc->n_ISForDofsLocal - 1; in PCBDDCBenignDetectSaddlePoint()
2833 …PetscCheck(pp[p] >= 0 && pp[p] < pcbddc->n_ISForDofsLocal, PetscObjectComm((PetscObject)pc), PETSC… in PCBDDCBenignDetectSaddlePoint()
2834 if (blocked) PetscCall(ISGetBlockSize(pcbddc->ISForDofsLocal[pp[p]], &bs)); in PCBDDCBenignDetectSaddlePoint()
2843 if (blocked) PetscCall(ISGetBlockSize(pcbddc->ISForDofsLocal[pp[p]], &bs)); in PCBDDCBenignDetectSaddlePoint()
2844 PetscCall(ISGetLocalSize(pcbddc->ISForDofsLocal[pp[p]], &npl)); in PCBDDCBenignDetectSaddlePoint()
2845 PetscCall(ISGetIndices(pcbddc->ISForDofsLocal[pp[p]], &idxs)); in PCBDDCBenignDetectSaddlePoint()
2855 PetscCall(ISRestoreIndices(pcbddc->ISForDofsLocal[pp[p]], &idxs)); in PCBDDCBenignDetectSaddlePoint()
2874 PetscCall(MatGetLocalSize(pcbddc->local_mat, &n, NULL)); in PCBDDCBenignDetectSaddlePoint()
2875 if (!n) pcbddc->benign_change_explicit = PETSC_TRUE; in PCBDDCBenignDetectSaddlePoint()
2876 PetscCall(MatFindZeroDiagonals(pcbddc->local_mat, &zerodiag)); in PCBDDCBenignDetectSaddlePoint()
2895 …if (pcbddc->NeumannBoundariesLocal) PetscCall(ISGetLocalSize(pcbddc->NeumannBoundariesLocal, &nneu… in PCBDDCBenignDetectSaddlePoint()
2896 checkb = (PetscBool)(!pcbddc->NeumannBoundariesLocal || pcbddc->current_level); in PCBDDCBenignDetectSaddlePoint()
2916 subs = pcbddc->local_subs; in PCBDDCBenignDetectSaddlePoint()
2917 nsubs = pcbddc->n_local_subs; in PCBDDCBenignDetectSaddlePoint()
2955 PetscCall(MatGetLocalSize(pcbddc->local_mat, &nl, NULL)); in PCBDDCBenignDetectSaddlePoint()
2989 PetscCall(ISGetIndices(pcbddc->NeumannBoundariesLocal, &idxs)); in PCBDDCBenignDetectSaddlePoint()
2991 PetscCall(ISRestoreIndices(pcbddc->NeumannBoundariesLocal, &idxs)); in PCBDDCBenignDetectSaddlePoint()
3048 PetscCall(MatGetLocalSize(pcbddc->local_mat, &n, NULL)); in PCBDDCBenignDetectSaddlePoint()
3086 …PetscCallMPI(MPIU_Allreduce(&have_null, &pcbddc->benign_null, 1, MPI_C_BOOL, MPI_LAND, PetscObject… in PCBDDCBenignDetectSaddlePoint()
3089 if (pcbddc->compute_nonetflux && !pcbddc->divudotp) { in PCBDDCBenignDetectSaddlePoint()
3128 PetscCall(MatCreate(PetscObjectComm((PetscObject)pc), &pcbddc->divudotp)); in PCBDDCBenignDetectSaddlePoint()
3129 PetscCall(MatSetType(pcbddc->divudotp, MATIS)); in PCBDDCBenignDetectSaddlePoint()
3130 PetscCall(MatSetSizes(pcbddc->divudotp, PETSC_DECIDE, PETSC_DECIDE, M, N)); in PCBDDCBenignDetectSaddlePoint()
3131 PetscCall(MatSetLocalToGlobalMapping(pcbddc->divudotp, rl2g, cl2g)); in PCBDDCBenignDetectSaddlePoint()
3134 PetscCall(MatISSetLocalMat(pcbddc->divudotp, loc_divudotp)); in PCBDDCBenignDetectSaddlePoint()
3136 PetscCall(MatAssemblyBegin(pcbddc->divudotp, MAT_FINAL_ASSEMBLY)); in PCBDDCBenignDetectSaddlePoint()
3137 PetscCall(MatAssemblyEnd(pcbddc->divudotp, MAT_FINAL_ASSEMBLY)); in PCBDDCBenignDetectSaddlePoint()
3147 pcbddc->benign_n = benign_n; in PCBDDCBenignDetectSaddlePoint()
3148 pcbddc->benign_zerodiag_subs = zerodiag_subs; in PCBDDCBenignDetectSaddlePoint()
3151 have_null = (PetscBool)(!!pcbddc->benign_n); in PCBDDCBenignDetectSaddlePoint()
3152 …PetscCallMPI(MPIU_Allreduce(&have_null, &pcbddc->benign_have_null, 1, MPI_C_BOOL, MPI_LOR, PetscOb… in PCBDDCBenignDetectSaddlePoint()
3155 PetscCall(MatGetLocalSize(pcbddc->local_mat, &n, NULL)); in PCBDDCBenignDetectSaddlePoint()
3157 if (pcbddc->benign_n) { in PCBDDCBenignDetectSaddlePoint()
3161 PetscCall(MatDestroy(&pcbddc->benign_change)); in PCBDDCBenignDetectSaddlePoint()
3162 PetscCall(MatCreate(PetscObjectComm((PetscObject)pcbddc->local_mat), &pcbddc->benign_change)); in PCBDDCBenignDetectSaddlePoint()
3163 PetscCall(MatSetType(pcbddc->benign_change, MATAIJ)); in PCBDDCBenignDetectSaddlePoint()
3164 PetscCall(MatSetSizes(pcbddc->benign_change, n, n, PETSC_DECIDE, PETSC_DECIDE)); in PCBDDCBenignDetectSaddlePoint()
3167 for (i = 0; i < pcbddc->benign_n; i++) { in PCBDDCBenignDetectSaddlePoint()
3171 PetscCall(ISGetLocalSize(pcbddc->benign_zerodiag_subs[i], &nzs)); in PCBDDCBenignDetectSaddlePoint()
3172 PetscCall(ISGetIndices(pcbddc->benign_zerodiag_subs[i], &idxs)); in PCBDDCBenignDetectSaddlePoint()
3175 PetscCall(ISRestoreIndices(pcbddc->benign_zerodiag_subs[i], &idxs)); in PCBDDCBenignDetectSaddlePoint()
3177 PetscCall(MatSeqAIJSetPreallocation(pcbddc->benign_change, 0, nnz)); in PCBDDCBenignDetectSaddlePoint()
3178 PetscCall(MatSetOption(pcbddc->benign_change, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE)); in PCBDDCBenignDetectSaddlePoint()
3181 for (i = 0; i < n; i++) PetscCall(MatSetValue(pcbddc->benign_change, i, i, 1., INSERT_VALUES)); in PCBDDCBenignDetectSaddlePoint()
3182 PetscCall(PetscFree3(pcbddc->benign_p0_lidx, pcbddc->benign_p0_gidx, pcbddc->benign_p0)); in PCBDDCBenignDetectSaddlePoint()
3183 …tscCall(PetscMalloc3(pcbddc->benign_n, &pcbddc->benign_p0_lidx, pcbddc->benign_n, &pcbddc->benign_… in PCBDDCBenignDetectSaddlePoint()
3185 for (s = 0; s < pcbddc->benign_n; s++) { in PCBDDCBenignDetectSaddlePoint()
3190 PetscCall(ISGetLocalSize(pcbddc->benign_zerodiag_subs[s], &nzs)); in PCBDDCBenignDetectSaddlePoint()
3191 PetscCall(ISGetIndices(pcbddc->benign_zerodiag_subs[s], &idxs)); in PCBDDCBenignDetectSaddlePoint()
3200 PetscCall(MatSetValues(pcbddc->benign_change, 1, cols, 2, cols, vals, INSERT_VALUES)); in PCBDDCBenignDetectSaddlePoint()
3205 …PetscCall(MatSetValues(pcbddc->benign_change, 1, idxs + nzs - 1, nzs, idxs, array, INSERT_VALUES)); in PCBDDCBenignDetectSaddlePoint()
3207 pcbddc->benign_p0_lidx[s] = idxs[nzs - 1]; in PCBDDCBenignDetectSaddlePoint()
3208 PetscCall(ISRestoreIndices(pcbddc->benign_zerodiag_subs[s], &idxs)); in PCBDDCBenignDetectSaddlePoint()
3211 PetscCall(MatAssemblyBegin(pcbddc->benign_change, MAT_FINAL_ASSEMBLY)); in PCBDDCBenignDetectSaddlePoint()
3212 PetscCall(MatAssemblyEnd(pcbddc->benign_change, MAT_FINAL_ASSEMBLY)); in PCBDDCBenignDetectSaddlePoint()
3215 if (pcbddc->benign_change_explicit) { in PCBDDCBenignDetectSaddlePoint()
3218 PetscCall(MatPtAP(pcbddc->local_mat, pcbddc->benign_change, MAT_INITIAL_MATRIX, 2.0, &M)); in PCBDDCBenignDetectSaddlePoint()
3219 PetscCall(MatDestroy(&pcbddc->local_mat)); in PCBDDCBenignDetectSaddlePoint()
3220 PetscCall(MatSeqAIJCompress(M, &pcbddc->local_mat)); in PCBDDCBenignDetectSaddlePoint()
3224 …scCall(ISLocalToGlobalMappingApply(matis->rmapping, pcbddc->benign_n, pcbddc->benign_p0_lidx, pcbd… in PCBDDCBenignDetectSaddlePoint()
3232 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCBenignGetOrSetP0() local
3236 if (!pcbddc->benign_sf) { in PCBDDCBenignGetOrSetP0()
3237 PetscCall(PetscSFCreate(PetscObjectComm((PetscObject)pc), &pcbddc->benign_sf)); in PCBDDCBenignGetOrSetP0()
3238 …PetscCall(PetscSFSetGraphLayout(pcbddc->benign_sf, pc->pmat->rmap, pcbddc->benign_n, NULL, PETSC_O… in PCBDDCBenignGetOrSetP0()
3242 …PetscCall(PetscSFBcastBegin(pcbddc->benign_sf, MPIU_SCALAR, array, pcbddc->benign_p0, MPI_REPLACE)… in PCBDDCBenignGetOrSetP0()
3243 … PetscCall(PetscSFBcastEnd(pcbddc->benign_sf, MPIU_SCALAR, array, pcbddc->benign_p0, MPI_REPLACE)); in PCBDDCBenignGetOrSetP0()
3247 …PetscCall(PetscSFReduceBegin(pcbddc->benign_sf, MPIU_SCALAR, pcbddc->benign_p0, array, MPI_REPLACE… in PCBDDCBenignGetOrSetP0()
3248 …PetscCall(PetscSFReduceEnd(pcbddc->benign_sf, MPIU_SCALAR, pcbddc->benign_p0, array, MPI_REPLACE)); in PCBDDCBenignGetOrSetP0()
3256 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCBenignPopOrPushB0() local
3264 if (!pcbddc->benign_n) PetscFunctionReturn(PETSC_SUCCESS); in PCBDDCBenignPopOrPushB0()
3266 if (pcbddc->benign_change_explicit) { in PCBDDCBenignPopOrPushB0()
3272 if (pcbddc->benign_B0) reuse = MAT_REUSE_MATRIX; in PCBDDCBenignPopOrPushB0()
3273 …PetscCall(ISCreateGeneral(PETSC_COMM_SELF, pcbddc->benign_n, pcbddc->benign_p0_lidx, PETSC_COPY_VA… in PCBDDCBenignPopOrPushB0()
3274 PetscCall(MatCreateSubMatrix(pcbddc->local_mat, is_p0, NULL, reuse, &pcbddc->benign_B0)); in PCBDDCBenignPopOrPushB0()
3276 PetscCall(MatSetOption(pcbddc->local_mat, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE)); in PCBDDCBenignPopOrPushB0()
3277 PetscCall(MatSetOption(pcbddc->local_mat, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_FALSE)); in PCBDDCBenignPopOrPushB0()
3278 PetscCall(MatZeroRowsColumnsIS(pcbddc->local_mat, is_p0, 1.0, NULL, NULL)); in PCBDDCBenignPopOrPushB0()
3287 if (!pcbddc->benign_B0) { in PCBDDCBenignPopOrPushB0()
3289 PetscCall(MatCreate(PetscObjectComm((PetscObject)pcbddc->local_mat), &pcbddc->benign_B0)); in PCBDDCBenignPopOrPushB0()
3290 PetscCall(MatSetType(pcbddc->benign_B0, MATAIJ)); in PCBDDCBenignPopOrPushB0()
3291 PetscCall(MatSetSizes(pcbddc->benign_B0, pcbddc->benign_n, n, PETSC_DECIDE, PETSC_DECIDE)); in PCBDDCBenignPopOrPushB0()
3292 PetscCall(PetscMalloc1(pcbddc->benign_n, &nnz)); in PCBDDCBenignPopOrPushB0()
3293 for (i = 0; i < pcbddc->benign_n; i++) { in PCBDDCBenignPopOrPushB0()
3294 PetscCall(ISGetLocalSize(pcbddc->benign_zerodiag_subs[i], &nnz[i])); in PCBDDCBenignPopOrPushB0()
3297 PetscCall(MatSeqAIJSetPreallocation(pcbddc->benign_B0, 0, nnz)); in PCBDDCBenignPopOrPushB0()
3298 PetscCall(MatSetOption(pcbddc->benign_B0, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE)); in PCBDDCBenignPopOrPushB0()
3302 for (i = 0; i < pcbddc->benign_n; i++) { in PCBDDCBenignPopOrPushB0()
3307 PetscCall(ISGetLocalSize(pcbddc->benign_zerodiag_subs[i], &nz)); in PCBDDCBenignPopOrPushB0()
3308 PetscCall(ISGetIndices(pcbddc->benign_zerodiag_subs[i], (const PetscInt **)&idxs)); in PCBDDCBenignPopOrPushB0()
3324 PetscCall(MatSetValues(pcbddc->benign_B0, 1, &i, cum, idxs_ins, vals, INSERT_VALUES)); in PCBDDCBenignPopOrPushB0()
3326 PetscCall(ISRestoreIndices(pcbddc->benign_zerodiag_subs[i], (const PetscInt **)&idxs)); in PCBDDCBenignPopOrPushB0()
3328 PetscCall(MatAssemblyBegin(pcbddc->benign_B0, MAT_FINAL_ASSEMBLY)); in PCBDDCBenignPopOrPushB0()
3329 PetscCall(MatAssemblyEnd(pcbddc->benign_B0, MAT_FINAL_ASSEMBLY)); in PCBDDCBenignPopOrPushB0()
3334 PetscCheck(pcbddc->benign_change_explicit, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Cannot push B0!"); in PCBDDCBenignPopOrPushB0()
3335 for (PetscInt i = 0; i < pcbddc->benign_n; i++) { in PCBDDCBenignPopOrPushB0()
3339 …PetscCall(MatGetRow(pcbddc->benign_B0, i, &B0_ncol, (const PetscInt **)&B0_cols, (const PetscScala… in PCBDDCBenignPopOrPushB0()
3340 …PetscCall(MatSetValues(pcbddc->local_mat, 1, pcbddc->benign_p0_lidx + i, B0_ncol, B0_cols, B0_vals… in PCBDDCBenignPopOrPushB0()
3341 …PetscCall(MatSetValues(pcbddc->local_mat, B0_ncol, B0_cols, 1, pcbddc->benign_p0_lidx + i, B0_vals… in PCBDDCBenignPopOrPushB0()
3342 …PetscCall(MatSetValue(pcbddc->local_mat, pcbddc->benign_p0_lidx[i], pcbddc->benign_p0_lidx[i], 0.0… in PCBDDCBenignPopOrPushB0()
3343 …PetscCall(MatRestoreRow(pcbddc->benign_B0, i, &B0_ncol, (const PetscInt **)&B0_cols, (const PetscS… in PCBDDCBenignPopOrPushB0()
3345 PetscCall(MatAssemblyBegin(pcbddc->local_mat, MAT_FINAL_ASSEMBLY)); in PCBDDCBenignPopOrPushB0()
3346 PetscCall(MatAssemblyEnd(pcbddc->local_mat, MAT_FINAL_ASSEMBLY)); in PCBDDCBenignPopOrPushB0()
3353 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCAdaptiveSelection() local
3354 PCBDDCSubSchurs sub_schurs = pcbddc->sub_schurs; in PCBDDCAdaptiveSelection()
3368 if (!pcbddc->adaptive_selection) PetscFunctionReturn(PETSC_SUCCESS); in PCBDDCAdaptiveSelection()
3373 PetscCall(PetscLogEventBegin(PC_BDDC_AdaptiveSetUp[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCAdaptiveSelection()
3375 if (pcbddc->dbg_flag) { in PCBDDCAdaptiveSelection()
3376 …if (!pcbddc->dbg_viewer) pcbddc->dbg_viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)pc… in PCBDDCAdaptiveSelection()
3377 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCAdaptiveSelection()
3378 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "--------------------------------------------… in PCBDDCAdaptiveSelection()
3379 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "Check adaptive selection of constraints\n")); in PCBDDCAdaptiveSelection()
3380 PetscCall(PetscViewerASCIIPushSynchronized(pcbddc->dbg_viewer)); in PCBDDCAdaptiveSelection()
3383 …if (pcbddc->dbg_flag) PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "Subdomain … in PCBDDCAdaptiveSelection()
3395 nmax = pcbddc->adaptive_nmax > 0 ? pcbddc->adaptive_nmax : mss; in PCBDDCAdaptiveSelection()
3396 nmin = pcbddc->adaptive_nmin > 0 ? pcbddc->adaptive_nmin : 0; in PCBDDCAdaptiveSelection()
3448 …if (sub_schurs->is_vertices && pcbddc->use_vertices) { /* complement set of active subsets, each e… in PCBDDCAdaptiveSelection()
3457pcbddc->adaptive_constraints_n, nv + sub_schurs->n_subs + 1, &pcbddc->adaptive_constraints_idxs_pt… in PCBDDCAdaptiveSelection()
3458 &pcbddc->adaptive_constraints_data)); in PCBDDCAdaptiveSelection()
3459 PetscCall(PetscArrayzero(pcbddc->adaptive_constraints_n, nv + sub_schurs->n_subs)); in PCBDDCAdaptiveSelection()
3463 pcbddc->adaptive_constraints_idxs_ptr[0] = 0; in PCBDDCAdaptiveSelection()
3464 pcbddc->adaptive_constraints_data_ptr[0] = 0; in PCBDDCAdaptiveSelection()
3465 if (sub_schurs->is_vertices && pcbddc->use_vertices) { in PCBDDCAdaptiveSelection()
3470 pcbddc->adaptive_constraints_n[cum] = 1; in PCBDDCAdaptiveSelection()
3471 pcbddc->adaptive_constraints_idxs[cum] = idxs[cum]; in PCBDDCAdaptiveSelection()
3472 pcbddc->adaptive_constraints_data[cum] = 1.0; in PCBDDCAdaptiveSelection()
3473pcbddc->adaptive_constraints_idxs_ptr[cum + 1] = pcbddc->adaptive_constraints_idxs_ptr[cum] + 1; in PCBDDCAdaptiveSelection()
3474pcbddc->adaptive_constraints_data_ptr[cum + 1] = pcbddc->adaptive_constraints_data_ptr[cum] + 1; in PCBDDCAdaptiveSelection()
3489 lthresh = pcbddc->adaptive_threshold[0]; in PCBDDCAdaptiveSelection()
3490 uthresh = pcbddc->adaptive_threshold[1]; in PCBDDCAdaptiveSelection()
3491 upart = pcbddc->use_deluxe_scaling; in PCBDDCAdaptiveSelection()
3569 …if (sub_schurs->n_subs == 1 && pcbddc->use_deluxe_scaling) PetscCall(PetscArraycmp(S, St, subset_s… in PCBDDCAdaptiveSelection()
3584 if (pcbddc->dbg_flag) { in PCBDDCAdaptiveSelection()
3585 …PetscInt nc = 0, c = pcbddc->mat_graph->nodes[idxs[0]].count, w = pcbddc->mat_graph->nodes[idxs[0]… in PCBDDCAdaptiveSelection()
3589 …PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "Computing for sub %" PetscInt_FMT "/%" Pet… in PCBDDCAdaptiveSelection()
3798 …if (pcbddc->dbg_flag) PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " found %… in PCBDDCAdaptiveSelection()
3819 if (pcbddc->dbg_flag) { in PCBDDCAdaptiveSelection()
3820 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " found %" PetscBLASInt_FMT " e… in PCBDDCAdaptiveSelection()
3849 if (pcbddc->dbg_flag) { in PCBDDCAdaptiveSelection()
3850 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " -> Got %" PetscBLASInt_FMT " … in PCBDDCAdaptiveSelection()
3854 PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " Inf\n")); in PCBDDCAdaptiveSelection()
3857 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " %1.6e\n", (double)eigs[j + … in PCBDDCAdaptiveSelection()
3859 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " %1.6e\n", (double)(1 / eigs… in PCBDDCAdaptiveSelection()
3865 PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " %1.6e\n", pg)); in PCBDDCAdaptiveSelection()
3874 if (pcbddc->dbg_flag > 2) { in PCBDDCAdaptiveSelection()
3877 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " -> Eigenvector (old basis) %"… in PCBDDCAdaptiveSelection()
3882 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " %1.4e + %1.4e i\n", (doub… in PCBDDCAdaptiveSelection()
3884 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " %1.4e\n", (double)(eigv[(… in PCBDDCAdaptiveSelection()
3897 pcbddc->adaptive_constraints_n[i + nv] = B_neigs; in PCBDDCAdaptiveSelection()
3899 …PetscCall(PetscArraycpy(pcbddc->adaptive_constraints_data + pcbddc->adaptive_constraints_data_ptr[… in PCBDDCAdaptiveSelection()
3901 if (pcbddc->dbg_flag > 1) { in PCBDDCAdaptiveSelection()
3904 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " -> Eigenvector %" PetscInt_FM… in PCBDDCAdaptiveSelection()
3907 …PetscReal r = PetscRealPart(pcbddc->adaptive_constraints_data[ii * subset_size + j + pcbddc->adapt… in PCBDDCAdaptiveSelection()
3908 …PetscReal c = PetscImaginaryPart(pcbddc->adaptive_constraints_data[ii * subset_size + j + pcbddc->… in PCBDDCAdaptiveSelection()
3909 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, " %1.4e + %1.4e i\n", (doub… in PCBDDCAdaptiveSelection()
3911 …hronizedPrintf(pcbddc->dbg_viewer, " %1.4e\n", (double)PetscRealPart(pcbddc->adaptive_constr… in PCBDDCAdaptiveSelection()
3916 …PetscCall(PetscArraycpy(pcbddc->adaptive_constraints_idxs + pcbddc->adaptive_constraints_idxs_ptr[… in PCBDDCAdaptiveSelection()
3917pcbddc->adaptive_constraints_idxs_ptr[cum + 1] = pcbddc->adaptive_constraints_idxs_ptr[cum] + subs… in PCBDDCAdaptiveSelection()
3918pcbddc->adaptive_constraints_data_ptr[cum + 1] = pcbddc->adaptive_constraints_data_ptr[cum] + subs… in PCBDDCAdaptiveSelection()
3925 if (pcbddc->dbg_flag) PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCAdaptiveSelection()
3944 if (pcbddc->dbg_flag) { in PCBDDCAdaptiveSelection()
3947 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "Maximum number of constraints per cc %" Pets… in PCBDDCAdaptiveSelection()
3949 PetscCall(PetscLogEventEnd(PC_BDDC_AdaptiveSetUp[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCAdaptiveSelection()
3980 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCResetCustomization() local
3983 PetscCall(ISDestroy(&pcbddc->user_primal_vertices)); in PCBDDCResetCustomization()
3984 PetscCall(ISDestroy(&pcbddc->user_primal_vertices_local)); in PCBDDCResetCustomization()
3985 PetscCall(ISDestroy(&pcbddc->NeumannBoundaries)); in PCBDDCResetCustomization()
3986 PetscCall(ISDestroy(&pcbddc->NeumannBoundariesLocal)); in PCBDDCResetCustomization()
3987 PetscCall(ISDestroy(&pcbddc->DirichletBoundaries)); in PCBDDCResetCustomization()
3988 PetscCall(MatNullSpaceDestroy(&pcbddc->onearnullspace)); in PCBDDCResetCustomization()
3989 PetscCall(PetscFree(pcbddc->onearnullvecs_state)); in PCBDDCResetCustomization()
3990 PetscCall(ISDestroy(&pcbddc->DirichletBoundariesLocal)); in PCBDDCResetCustomization()
3998 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCResetTopography() local
4002 PetscCall(MatDestroy(&pcbddc->nedcG)); in PCBDDCResetTopography()
4003 PetscCall(ISDestroy(&pcbddc->nedclocal)); in PCBDDCResetTopography()
4004 PetscCall(MatDestroy(&pcbddc->discretegradient)); in PCBDDCResetTopography()
4005 PetscCall(MatDestroy(&pcbddc->user_ChangeOfBasisMatrix)); in PCBDDCResetTopography()
4006 PetscCall(MatDestroy(&pcbddc->ChangeOfBasisMatrix)); in PCBDDCResetTopography()
4007 PetscCall(MatDestroy(&pcbddc->switch_static_change)); in PCBDDCResetTopography()
4008 PetscCall(VecDestroy(&pcbddc->work_change)); in PCBDDCResetTopography()
4009 PetscCall(MatDestroy(&pcbddc->ConstraintMatrix)); in PCBDDCResetTopography()
4010 PetscCall(MatDestroy(&pcbddc->divudotp)); in PCBDDCResetTopography()
4011 PetscCall(ISDestroy(&pcbddc->divudotp_vl2l)); in PCBDDCResetTopography()
4012 PetscCall(PCBDDCGraphDestroy(&pcbddc->mat_graph)); in PCBDDCResetTopography()
4013 for (i = 0; i < pcbddc->n_local_subs; i++) PetscCall(ISDestroy(&pcbddc->local_subs[i])); in PCBDDCResetTopography()
4014 pcbddc->n_local_subs = 0; in PCBDDCResetTopography()
4015 PetscCall(PetscFree(pcbddc->local_subs)); in PCBDDCResetTopography()
4016 PetscCall(PCBDDCSubSchursDestroy(&pcbddc->sub_schurs)); in PCBDDCResetTopography()
4017 pcbddc->graphanalyzed = PETSC_FALSE; in PCBDDCResetTopography()
4018 pcbddc->recompute_topography = PETSC_TRUE; in PCBDDCResetTopography()
4019 pcbddc->corner_selected = PETSC_FALSE; in PCBDDCResetTopography()
4025 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCResetSolvers() local
4028 PetscCall(VecDestroy(&pcbddc->coarse_vec)); in PCBDDCResetSolvers()
4029 PetscCall(MatDestroy(&pcbddc->coarse_phi_B)); in PCBDDCResetSolvers()
4030 PetscCall(MatDestroy(&pcbddc->coarse_phi_D)); in PCBDDCResetSolvers()
4031 PetscCall(MatDestroy(&pcbddc->coarse_psi_B)); in PCBDDCResetSolvers()
4032 PetscCall(MatDestroy(&pcbddc->coarse_psi_D)); in PCBDDCResetSolvers()
4033 PetscCall(VecDestroy(&pcbddc->vec1_P)); in PCBDDCResetSolvers()
4034 PetscCall(VecDestroy(&pcbddc->vec1_C)); in PCBDDCResetSolvers()
4035 PetscCall(MatDestroy(&pcbddc->local_auxmat2)); in PCBDDCResetSolvers()
4036 PetscCall(MatDestroy(&pcbddc->local_auxmat1)); in PCBDDCResetSolvers()
4037 PetscCall(VecDestroy(&pcbddc->vec1_R)); in PCBDDCResetSolvers()
4038 PetscCall(VecDestroy(&pcbddc->vec2_R)); in PCBDDCResetSolvers()
4039 PetscCall(ISDestroy(&pcbddc->is_R_local)); in PCBDDCResetSolvers()
4040 PetscCall(VecScatterDestroy(&pcbddc->R_to_B)); in PCBDDCResetSolvers()
4041 PetscCall(VecScatterDestroy(&pcbddc->R_to_D)); in PCBDDCResetSolvers()
4042 PetscCall(VecScatterDestroy(&pcbddc->coarse_loc_to_glob)); in PCBDDCResetSolvers()
4043 PetscCall(KSPReset(pcbddc->ksp_D)); in PCBDDCResetSolvers()
4044 PetscCall(KSPReset(pcbddc->ksp_R)); in PCBDDCResetSolvers()
4045 PetscCall(KSPReset(pcbddc->coarse_ksp)); in PCBDDCResetSolvers()
4046 PetscCall(MatDestroy(&pcbddc->local_mat)); in PCBDDCResetSolvers()
4047 PetscCall(PetscFree(pcbddc->primal_indices_local_idxs)); in PCBDDCResetSolvers()
4048 PetscCall(PetscFree2(pcbddc->local_primal_ref_node, pcbddc->local_primal_ref_mult)); in PCBDDCResetSolvers()
4049 PetscCall(PetscFree(pcbddc->global_primal_indices)); in PCBDDCResetSolvers()
4050 PetscCall(ISDestroy(&pcbddc->coarse_subassembling)); in PCBDDCResetSolvers()
4051 PetscCall(MatDestroy(&pcbddc->benign_change)); in PCBDDCResetSolvers()
4052 PetscCall(VecDestroy(&pcbddc->benign_vec)); in PCBDDCResetSolvers()
4054 PetscCall(MatDestroy(&pcbddc->benign_B0)); in PCBDDCResetSolvers()
4055 PetscCall(PetscSFDestroy(&pcbddc->benign_sf)); in PCBDDCResetSolvers()
4056 if (pcbddc->benign_zerodiag_subs) { in PCBDDCResetSolvers()
4058 for (i = 0; i < pcbddc->benign_n; i++) PetscCall(ISDestroy(&pcbddc->benign_zerodiag_subs[i])); in PCBDDCResetSolvers()
4059 PetscCall(PetscFree(pcbddc->benign_zerodiag_subs)); in PCBDDCResetSolvers()
4061 PetscCall(PetscFree3(pcbddc->benign_p0_lidx, pcbddc->benign_p0_gidx, pcbddc->benign_p0)); in PCBDDCResetSolvers()
4067 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetUpLocalWorkVectors() local
4073 n_constraints = pcbddc->local_primal_size - pcbddc->benign_n - pcbddc->n_vertices; in PCBDDCSetUpLocalWorkVectors()
4074 n_R = pcis->n - pcbddc->n_vertices; in PCBDDCSetUpLocalWorkVectors()
4079 if (pcbddc->vec1_R) PetscCall(VecGetSize(pcbddc->vec1_R, &old_size)); in PCBDDCSetUpLocalWorkVectors()
4081 PetscCall(VecDestroy(&pcbddc->vec1_R)); in PCBDDCSetUpLocalWorkVectors()
4082 PetscCall(VecDestroy(&pcbddc->vec2_R)); in PCBDDCSetUpLocalWorkVectors()
4083 PetscCall(VecCreate(PetscObjectComm((PetscObject)pcis->vec1_N), &pcbddc->vec1_R)); in PCBDDCSetUpLocalWorkVectors()
4084 PetscCall(VecSetSizes(pcbddc->vec1_R, PETSC_DECIDE, n_R)); in PCBDDCSetUpLocalWorkVectors()
4085 PetscCall(VecSetType(pcbddc->vec1_R, impVecType)); in PCBDDCSetUpLocalWorkVectors()
4086 PetscCall(VecDuplicate(pcbddc->vec1_R, &pcbddc->vec2_R)); in PCBDDCSetUpLocalWorkVectors()
4090 if (pcbddc->vec1_P) PetscCall(VecGetSize(pcbddc->vec1_P, &old_size)); in PCBDDCSetUpLocalWorkVectors()
4091 if (pcbddc->local_primal_size != old_size) { in PCBDDCSetUpLocalWorkVectors()
4092 PetscCall(VecDestroy(&pcbddc->vec1_P)); in PCBDDCSetUpLocalWorkVectors()
4093 PetscCall(VecCreate(PetscObjectComm((PetscObject)pcis->vec1_N), &pcbddc->vec1_P)); in PCBDDCSetUpLocalWorkVectors()
4094 PetscCall(VecSetSizes(pcbddc->vec1_P, PETSC_DECIDE, pcbddc->local_primal_size)); in PCBDDCSetUpLocalWorkVectors()
4095 PetscCall(VecSetType(pcbddc->vec1_P, impVecType)); in PCBDDCSetUpLocalWorkVectors()
4099 if (pcbddc->vec1_C) PetscCall(VecGetSize(pcbddc->vec1_C, &old_size)); in PCBDDCSetUpLocalWorkVectors()
4101 PetscCall(VecDestroy(&pcbddc->vec1_C)); in PCBDDCSetUpLocalWorkVectors()
4102 PetscCall(VecCreate(PetscObjectComm((PetscObject)pcis->vec1_N), &pcbddc->vec1_C)); in PCBDDCSetUpLocalWorkVectors()
4103 PetscCall(VecSetSizes(pcbddc->vec1_C, PETSC_DECIDE, n_constraints)); in PCBDDCSetUpLocalWorkVectors()
4104 PetscCall(VecSetType(pcbddc->vec1_C, impVecType)); in PCBDDCSetUpLocalWorkVectors()
4279 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetUpCorrection() local
4280 PCBDDCGraph graph = pcbddc->mat_graph; in PCBDDCSetUpCorrection()
4281 PCBDDCSubSchurs sub_schurs = pcbddc->sub_schurs; in PCBDDCSetUpCorrection()
4311 …PetscCheck(pcbddc->symmetric_primal || !pcbddc->benign_n, PETSC_COMM_SELF, PETSC_ERR_SUP, "Non-sym… in PCBDDCSetUpCorrection()
4312 PetscCall(PetscLogEventBegin(PC_BDDC_CorrectionSetUp[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpCorrection()
4315 n_vertices = pcbddc->n_vertices; in PCBDDCSetUpCorrection()
4316 n_constraints = pcbddc->local_primal_size - pcbddc->benign_n - n_vertices; in PCBDDCSetUpCorrection()
4323 …PetscCall(ISGlobalToLocalMappingApply(pcis->BtoNmap, IS_GTOLM_DROP, n_vertices, pcbddc->local_prim… in PCBDDCSetUpCorrection()
4327 if (pcbddc->benign_saddle_point || !pcbddc->symmetric_primal) multi_element = PETSC_FALSE; in PCBDDCSetUpCorrection()
4331 PetscCheck(!pcbddc->benign_n, PETSC_COMM_SELF, PETSC_ERR_SUP, "Not yet implemented"); in PCBDDCSetUpCorrection()
4334 …Call(MatSetSizes(*coarse_submat, pcbddc->local_primal_size, pcbddc->local_primal_size, pcbddc->loc… in PCBDDCSetUpCorrection()
4340 const PetscInt *vidxs = pcbddc->primal_indices_local_idxs; in PCBDDCSetUpCorrection()
4341 const PetscInt *cidxs = pcbddc->primal_indices_local_idxs + n_vertices; in PCBDDCSetUpCorrection()
4412 PetscCall(ISGetIndices(pcbddc->is_R_local, &idx)); in PCBDDCSetUpCorrection()
4421 PetscCall(ISRestoreIndices(pcbddc->is_R_local, &idx)); in PCBDDCSetUpCorrection()
4452 …PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, pcbddc->local_primal_size, pcbddc->local_primal_size,… in PCBDDCSetUpCorrection()
4458 PetscCall(KSPGetPC(pcbddc->ksp_R, &pc_R)); in PCBDDCSetUpCorrection()
4460 PetscCall(PetscObjectTypeCompare((PetscObject)pcbddc->ksp_R, KSPPREONLY, &isPreonly)); in PCBDDCSetUpCorrection()
4497 PetscCall(MatDestroy(&pcbddc->local_auxmat1)); in PCBDDCSetUpCorrection()
4498 PetscCall(MatDestroy(&pcbddc->local_auxmat2)); in PCBDDCSetUpCorrection()
4511 …PetscCall(MatCreateSubMatrix(pcbddc->ConstraintMatrix, is_C, pcbddc->is_R_local, MAT_INITIAL_MATRI… in PCBDDCSetUpCorrection()
4512 …PetscCall(MatCreateSubMatrix(pcbddc->ConstraintMatrix, is_C, pcis->is_B_local, MAT_INITIAL_MATRIX,… in PCBDDCSetUpCorrection()
4559 PetscCall(PetscArrayzero(reuse_solver->benign_save_vals, pcbddc->benign_n)); in PCBDDCSetUpCorrection()
4576 PetscCall(VecPlaceArray(pcbddc->vec1_R, marr + i * lda_rhs)); in PCBDDCSetUpCorrection()
4577 …PetscCall(PCBDDCReuseSolversBenignAdapt(reuse_solver, pcbddc->vec1_R, NULL, PETSC_TRUE, PETSC_TRUE… in PCBDDCSetUpCorrection()
4578 PetscCall(VecResetArray(pcbddc->vec1_R)); in PCBDDCSetUpCorrection()
4590 PetscCall(VecPlaceArray(pcbddc->vec1_R, barr + i * lda_rhs)); in PCBDDCSetUpCorrection()
4591 PetscCall(VecPlaceArray(pcbddc->vec2_R, marr + i * lda_rhs)); in PCBDDCSetUpCorrection()
4592 PetscCall(KSPSolve(pcbddc->ksp_R, pcbddc->vec1_R, pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
4593 PetscCall(KSPCheckSolve(pcbddc->ksp_R, pc, pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
4594 PetscCall(VecResetArray(pcbddc->vec1_R)); in PCBDDCSetUpCorrection()
4595 PetscCall(VecResetArray(pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
4603 if (!pcbddc->switch_static) { in PCBDDCSetUpCorrection()
4604 …PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, n_B, n_eff_constraints, NULL, &pcbddc->local_auxmat2)… in PCBDDCSetUpCorrection()
4605 …PetscCall(MatDenseScatter_Private(pcbddc->R_to_B, local_auxmat2_R, pcbddc->local_auxmat2, INSERT_V… in PCBDDCSetUpCorrection()
4612 … PetscCall(MatCreateSeqAIJFromDenseExpand(pcbddc->local_auxmat2, n_constraints, B_eff_C_J, &T)); in PCBDDCSetUpCorrection()
4613 PetscCall(MatDestroy(&pcbddc->local_auxmat2)); in PCBDDCSetUpCorrection()
4614 pcbddc->local_auxmat2 = T; in PCBDDCSetUpCorrection()
4616 PetscCall(MatMatMult(C_B, pcbddc->local_auxmat2, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &S_CC)); in PCBDDCSetUpCorrection()
4626 …PetscCall(MatCreateSubMatrix(local_auxmat2_R, is_R, NULL, MAT_INITIAL_MATRIX, &pcbddc->local_auxma… in PCBDDCSetUpCorrection()
4629 pcbddc->local_auxmat2 = local_auxmat2_R; in PCBDDCSetUpCorrection()
4631 … PetscCall(MatMatMult(C_CR, pcbddc->local_auxmat2, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &S_CC)); in PCBDDCSetUpCorrection()
4657 PetscCall(MatMatMult(S_CC, C_B, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &pcbddc->local_auxmat1)); in PCBDDCSetUpCorrection()
4672 PetscCall(ISDuplicate(pcbddc->is_R_local, &tis)); in PCBDDCSetUpCorrection()
4677 PetscCall(ISComplement(pcbddc->is_R_local, 0, pcis->n, &is_aux)); in PCBDDCSetUpCorrection()
4680 oldpin = pcbddc->local_mat->boundtocpu; in PCBDDCSetUpCorrection()
4682 PetscCall(MatBindToCPU(pcbddc->local_mat, PETSC_TRUE)); in PCBDDCSetUpCorrection()
4683 …PetscCall(MatCreateSubMatrix(pcbddc->local_mat, pcbddc->is_R_local, is_aux, MAT_INITIAL_MATRIX, &A… in PCBDDCSetUpCorrection()
4684 …PetscCall(MatCreateSubMatrix(pcbddc->local_mat, is_aux, pcbddc->is_R_local, MAT_INITIAL_MATRIX, &A… in PCBDDCSetUpCorrection()
4687 PetscCall(MatCreateSubMatrix(pcbddc->local_mat, is_aux, is_aux, MAT_INITIAL_MATRIX, &A_VV)); in PCBDDCSetUpCorrection()
4689 PetscCall(MatBindToCPU(pcbddc->local_mat, oldpin)); in PCBDDCSetUpCorrection()
4697 if (pcbddc->benign_n && (pcbddc->switch_static || pcbddc->dbg_flag)) { in PCBDDCSetUpCorrection()
4701 PetscCall(PetscMalloc1(pcbddc->benign_n, &p0_lidx_I)); in PCBDDCSetUpCorrection()
4702 …for (i = 0; i < pcbddc->benign_n; i++) PetscCall(PetscFindInt(pcbddc->benign_p0_lidx[i], pcis->n -… in PCBDDCSetUpCorrection()
4709 PetscCall(MatDestroy(&pcbddc->coarse_phi_B)); in PCBDDCSetUpCorrection()
4710 PetscCall(MatDestroy(&pcbddc->coarse_psi_B)); in PCBDDCSetUpCorrection()
4711 PetscCall(MatDestroy(&pcbddc->coarse_phi_D)); in PCBDDCSetUpCorrection()
4712 PetscCall(MatDestroy(&pcbddc->coarse_psi_D)); in PCBDDCSetUpCorrection()
4714 …PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, n_B, pcbddc->local_primal_size, NULL, &pcbddc->coarse… in PCBDDCSetUpCorrection()
4715 …if (pcbddc->switch_static || pcbddc->dbg_flag) PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, n_D, p… in PCBDDCSetUpCorrection()
4718 IS is_rows[2] = {pcbddc->is_R_local, NULL}; in PCBDDCSetUpCorrection()
4721 …PetscCall(ISCreateGeneral(PETSC_COMM_SELF, n_vertices, pcbddc->local_primal_ref_node, PETSC_USE_PO… in PCBDDCSetUpCorrection()
4743 PetscCall(PetscMalloc1(pcbddc->benign_n, &idxs_p0)); in PCBDDCSetUpCorrection()
4744 PetscCall(ISLocalToGlobalMappingCreateIS(pcbddc->is_R_local, &RtoN)); in PCBDDCSetUpCorrection()
4745 …PetscCall(ISGlobalToLocalMappingApply(RtoN, IS_GTOLM_DROP, pcbddc->benign_n, pcbddc->benign_p0_lid… in PCBDDCSetUpCorrection()
4746 …eck(n == pcbddc->benign_n, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error in R numbering for benign p0! %… in PCBDDCSetUpCorrection()
4814 if (!pcbddc->symmetric_primal) { in PCBDDCSetUpCorrection()
4857 PetscCall(VecPlaceArray(pcbddc->vec1_R, marr + i * lda_rhs)); in PCBDDCSetUpCorrection()
4858 …PetscCall(PCBDDCReuseSolversBenignAdapt(reuse_solver, pcbddc->vec1_R, NULL, PETSC_FALSE, PETSC_TRU… in PCBDDCSetUpCorrection()
4859 PetscCall(VecResetArray(pcbddc->vec1_R)); in PCBDDCSetUpCorrection()
4880 PetscCall(VecPlaceArray(pcbddc->vec1_R, marr + i * lda_rhs)); in PCBDDCSetUpCorrection()
4881 …PetscCall(PCBDDCReuseSolversBenignAdapt(reuse_solver, pcbddc->vec1_R, NULL, PETSC_TRUE, PETSC_TRUE… in PCBDDCSetUpCorrection()
4882 PetscCall(VecResetArray(pcbddc->vec1_R)); in PCBDDCSetUpCorrection()
4894 PetscCall(VecPlaceArray(pcbddc->vec1_R, barr + i * lda_rhs)); in PCBDDCSetUpCorrection()
4895 PetscCall(VecPlaceArray(pcbddc->vec2_R, marr + i * lda_rhs)); in PCBDDCSetUpCorrection()
4896 PetscCall(KSPSolve(pcbddc->ksp_R, pcbddc->vec1_R, pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
4897 PetscCall(KSPCheckSolve(pcbddc->ksp_R, pc, pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
4898 PetscCall(VecResetArray(pcbddc->vec1_R)); in PCBDDCSetUpCorrection()
4899 PetscCall(VecResetArray(pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
4911 … PetscCall(MatDenseScatter_Private(pcbddc->R_to_B, A_RRmA_RV, B, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSetUpCorrection()
4921 PetscCall(MatProductCreate(pcbddc->local_auxmat1, B, NULL, &S_CV)); in PCBDDCSetUpCorrection()
5014 …PetscCall(MatDenseGetSubMatrix(pcbddc->coarse_phi_B, PETSC_DECIDE, PETSC_DECIDE, 0, n_vertices, &B… in PCBDDCSetUpCorrection()
5015 … PetscCall(MatDenseScatter_Private(pcbddc->R_to_B, A_RRmA_RV, B, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSetUpCorrection()
5016 PetscCall(MatDenseRestoreSubMatrix(pcbddc->coarse_phi_B, &B)); in PCBDDCSetUpCorrection()
5017 if (pcbddc->switch_static || pcbddc->dbg_flag) { in PCBDDCSetUpCorrection()
5018 …PetscCall(MatDenseGetSubMatrix(pcbddc->coarse_phi_D, PETSC_DECIDE, PETSC_DECIDE, 0, n_vertices, &B… in PCBDDCSetUpCorrection()
5019 … PetscCall(MatDenseScatter_Private(pcbddc->R_to_D, A_RRmA_RV, B, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSetUpCorrection()
5020 PetscCall(MatDenseRestoreSubMatrix(pcbddc->coarse_phi_D, &B)); in PCBDDCSetUpCorrection()
5021 if (pcbddc->benign_n) { in PCBDDCSetUpCorrection()
5022 …for (i = 0; i < n_vertices; i++) PetscCall(MatSetValues(pcbddc->coarse_phi_D, pcbddc->benign_n, p0… in PCBDDCSetUpCorrection()
5023 PetscCall(MatAssemblyBegin(pcbddc->coarse_phi_D, MAT_FINAL_ASSEMBLY)); in PCBDDCSetUpCorrection()
5024 PetscCall(MatAssemblyEnd(pcbddc->coarse_phi_D, MAT_FINAL_ASSEMBLY)); in PCBDDCSetUpCorrection()
5028 …for (i = 0; i < n_vertices; i++) PetscCall(MatSetValues(pcbddc->coarse_phi_B, 1, &idx_V_B[i], 1, &… in PCBDDCSetUpCorrection()
5029 PetscCall(MatAssemblyBegin(pcbddc->coarse_phi_B, MAT_FINAL_ASSEMBLY)); in PCBDDCSetUpCorrection()
5030 PetscCall(MatAssemblyEnd(pcbddc->coarse_phi_B, MAT_FINAL_ASSEMBLY)); in PCBDDCSetUpCorrection()
5067 …PetscCall(MatDenseGetSubMatrix(pcbddc->coarse_phi_B, PETSC_DECIDE, PETSC_DECIDE, n_vertices, n_ver… in PCBDDCSetUpCorrection()
5068 PetscCall(MatDenseScatter_Private(pcbddc->R_to_B, B, B2, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSetUpCorrection()
5069 PetscCall(MatDenseRestoreSubMatrix(pcbddc->coarse_phi_B, &B2)); in PCBDDCSetUpCorrection()
5070 if (pcbddc->switch_static || pcbddc->dbg_flag) { in PCBDDCSetUpCorrection()
5071 …PetscCall(MatDenseGetSubMatrix(pcbddc->coarse_phi_D, PETSC_DECIDE, PETSC_DECIDE, n_vertices, n_ver… in PCBDDCSetUpCorrection()
5072 PetscCall(MatDenseScatter_Private(pcbddc->R_to_D, B, B2, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSetUpCorrection()
5073 if (pcbddc->benign_n) { in PCBDDCSetUpCorrection()
5074 …for (i = 0; i < n_constraints; i++) PetscCall(MatSetValues(B2, pcbddc->benign_n, p0_lidx_I, 1, &i,… in PCBDDCSetUpCorrection()
5076 PetscCall(MatDenseRestoreSubMatrix(pcbddc->coarse_phi_D, &B2)); in PCBDDCSetUpCorrection()
5088 …PetscCall(MatCreateSubMatrix(T, pcis->is_B_local, NULL, MAT_INITIAL_MATRIX, &pcbddc->coarse_phi_B)… in PCBDDCSetUpCorrection()
5089 …if (pcbddc->switch_static || pcbddc->dbg_flag) PetscCall(MatCreateSubMatrix(T, pcis->is_I_local, N… in PCBDDCSetUpCorrection()
5096 if (pcbddc->benign_n) { in PCBDDCSetUpCorrection()
5102 PetscCall(ISCreateStride(PETSC_COMM_SELF, pcbddc->benign_n, 0, 1, &is_dummy)); in PCBDDCSetUpCorrection()
5103 …PetscCall(MatCreateSubMatrix(pcbddc->benign_B0, is_dummy, pcis->is_B_local, MAT_INITIAL_MATRIX, &B… in PCBDDCSetUpCorrection()
5105 PetscCall(MatMatMult(B0_B, pcbddc->coarse_phi_B, MAT_INITIAL_MATRIX, 1.0, &B0_BPHI)); in PCBDDCSetUpCorrection()
5108 for (j = 0; j < pcbddc->benign_n; j++) { in PCBDDCSetUpCorrection()
5109 PetscInt primal_idx = pcbddc->local_primal_size - pcbddc->benign_n + j; in PCBDDCSetUpCorrection()
5110 for (i = 0; i < pcbddc->local_primal_size; i++) { in PCBDDCSetUpCorrection()
5111 …PetscCall(MatSetValue(*coarse_submat, primal_idx, i, data[i * pcbddc->benign_n + j], INSERT_VALUES… in PCBDDCSetUpCorrection()
5112 …PetscCall(MatSetValue(*coarse_submat, i, primal_idx, data[i * pcbddc->benign_n + j], INSERT_VALUES… in PCBDDCSetUpCorrection()
5121 if (!pcbddc->symmetric_primal) { in PCBDDCSetUpCorrection()
5168 PetscCall(PetscMalloc1(n_R * pcbddc->local_primal_size, &work)); in PCBDDCSetUpCorrection()
5172 PetscCall(VecPlaceArray(pcbddc->vec1_R, marray + i * n_R)); in PCBDDCSetUpCorrection()
5173 PetscCall(VecPlaceArray(pcbddc->vec2_R, work + i * n_R)); in PCBDDCSetUpCorrection()
5174 PetscCall(KSPSolveTranspose(pcbddc->ksp_R, pcbddc->vec1_R, pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
5175 PetscCall(KSPCheckSolve(pcbddc->ksp_R, pc, pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
5176 PetscCall(VecResetArray(pcbddc->vec1_R)); in PCBDDCSetUpCorrection()
5177 PetscCall(VecResetArray(pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
5184 PetscCall(VecPlaceArray(pcbddc->vec1_R, marray + (i - n_vertices) * n_R)); in PCBDDCSetUpCorrection()
5185 PetscCall(VecPlaceArray(pcbddc->vec2_R, work + i * n_R)); in PCBDDCSetUpCorrection()
5186 PetscCall(KSPSolveTranspose(pcbddc->ksp_R, pcbddc->vec1_R, pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
5187 PetscCall(KSPCheckSolve(pcbddc->ksp_R, pc, pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
5188 PetscCall(VecResetArray(pcbddc->vec1_R)); in PCBDDCSetUpCorrection()
5189 PetscCall(VecResetArray(pcbddc->vec2_R)); in PCBDDCSetUpCorrection()
5194 …PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, n_B, pcbddc->local_primal_size, NULL, &pcbddc->coarse… in PCBDDCSetUpCorrection()
5195 …if (pcbddc->switch_static || pcbddc->dbg_flag) PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, n_D, p… in PCBDDCSetUpCorrection()
5196 for (i = 0; i < pcbddc->local_primal_size; i++) { in PCBDDCSetUpCorrection()
5199 PetscCall(VecPlaceArray(pcbddc->vec1_R, work + i * n_R)); in PCBDDCSetUpCorrection()
5200 PetscCall(MatDenseGetColumnVec(pcbddc->coarse_psi_B, i, &v)); in PCBDDCSetUpCorrection()
5201 PetscCall(VecScatterBegin(pcbddc->R_to_B, pcbddc->vec1_R, v, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSetUpCorrection()
5202 PetscCall(VecScatterEnd(pcbddc->R_to_B, pcbddc->vec1_R, v, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSetUpCorrection()
5209 PetscCall(MatDenseRestoreColumnVec(pcbddc->coarse_psi_B, i, &v)); in PCBDDCSetUpCorrection()
5211 if (pcbddc->switch_static || pcbddc->dbg_flag) { in PCBDDCSetUpCorrection()
5212 PetscCall(MatDenseGetColumnVec(pcbddc->coarse_psi_D, i, &v)); in PCBDDCSetUpCorrection()
5213 … PetscCall(VecScatterBegin(pcbddc->R_to_D, pcbddc->vec1_R, v, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSetUpCorrection()
5214 PetscCall(VecScatterEnd(pcbddc->R_to_D, pcbddc->vec1_R, v, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSetUpCorrection()
5215 PetscCall(MatDenseRestoreColumnVec(pcbddc->coarse_psi_D, i, &v)); in PCBDDCSetUpCorrection()
5217 PetscCall(VecResetArray(pcbddc->vec1_R)); in PCBDDCSetUpCorrection()
5223 PetscCall(PetscObjectReference((PetscObject)pcbddc->coarse_phi_B)); in PCBDDCSetUpCorrection()
5224 pcbddc->coarse_psi_B = pcbddc->coarse_phi_B; in PCBDDCSetUpCorrection()
5225 PetscCall(PetscObjectReference((PetscObject)pcbddc->coarse_phi_D)); in PCBDDCSetUpCorrection()
5226 pcbddc->coarse_psi_D = pcbddc->coarse_phi_D; in PCBDDCSetUpCorrection()
5249 PetscCall(PetscLogEventEnd(PC_BDDC_CorrectionSetUp[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpCorrection()
5254 if (pcbddc->dbg_flag) { in PCBDDCSetUpCorrection()
5265 if (pcbddc->benign_n && !pcbddc->benign_change_explicit) { in PCBDDCSetUpCorrection()
5279 PetscCall(MatConvert(pcbddc->coarse_phi_D, checkmattype, MAT_INITIAL_MATRIX, &coarse_phi_D)); in PCBDDCSetUpCorrection()
5280 PetscCall(MatConvert(pcbddc->coarse_phi_B, checkmattype, MAT_INITIAL_MATRIX, &coarse_phi_B)); in PCBDDCSetUpCorrection()
5281 if (!pcbddc->symmetric_primal) { in PCBDDCSetUpCorrection()
5282 PetscCall(MatConvert(pcbddc->coarse_psi_D, checkmattype, MAT_INITIAL_MATRIX, &coarse_psi_D)); in PCBDDCSetUpCorrection()
5283 PetscCall(MatConvert(pcbddc->coarse_psi_B, checkmattype, MAT_INITIAL_MATRIX, &coarse_psi_B)); in PCBDDCSetUpCorrection()
5285 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "--------------------------------------------… in PCBDDCSetUpCorrection()
5286 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "Check coarse sub mat computation (symmetric … in PCBDDCSetUpCorrection()
5287 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCSetUpCorrection()
5288 if (!pcbddc->symmetric_primal) { in PCBDDCSetUpCorrection()
5315 if (pcbddc->benign_n) { in PCBDDCSetUpCorrection()
5321 PetscCall(ISCreateStride(PETSC_COMM_SELF, pcbddc->benign_n, 0, 1, &is_dummy)); in PCBDDCSetUpCorrection()
5322 …PetscCall(MatCreateSubMatrix(pcbddc->benign_B0, is_dummy, pcis->is_B_local, MAT_INITIAL_MATRIX, &B… in PCBDDCSetUpCorrection()
5327 for (j = 0; j < pcbddc->benign_n; j++) { in PCBDDCSetUpCorrection()
5328 PetscInt primal_idx = pcbddc->local_primal_size - pcbddc->benign_n + j; in PCBDDCSetUpCorrection()
5329 for (i = 0; i < pcbddc->local_primal_size; i++) { in PCBDDCSetUpCorrection()
5330 data[primal_idx * pcbddc->local_primal_size + i] += data2[i * pcbddc->benign_n + j]; in PCBDDCSetUpCorrection()
5331 data[i * pcbddc->local_primal_size + primal_idx] += data2[i * pcbddc->benign_n + j]; in PCBDDCSetUpCorrection()
5342 PetscCall(PetscViewerASCIIPushSynchronized(pcbddc->dbg_viewer)); in PCBDDCSetUpCorrection()
5343 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d matrix e… in PCBDDCSetUpCorrection()
5346 …PetscCall(ISCreateStride(PETSC_COMM_SELF, pcbddc->local_primal_size - pcbddc->benign_n, 0, 1, &is_… in PCBDDCSetUpCorrection()
5347 …PetscCall(MatCreateSubMatrix(pcbddc->ConstraintMatrix, is_dummy, pcis->is_B_local, MAT_INITIAL_MAT… in PCBDDCSetUpCorrection()
5348 if (!pcbddc->benign_n) { /* TODO: add benign case */ in PCBDDCSetUpCorrection()
5353 PetscCall(MatDenseGetArray(pcbddc->coarse_phi_B, &data)); in PCBDDCSetUpCorrection()
5354 …PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, pcis->n_B, pcbddc->local_primal_size - pcbddc->benign… in PCBDDCSetUpCorrection()
5355 PetscCall(MatDenseRestoreArray(pcbddc->coarse_phi_B, &data)); in PCBDDCSetUpCorrection()
5363 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d phi constraints e… in PCBDDCSetUpCorrection()
5364 if (!pcbddc->symmetric_primal) { in PCBDDCSetUpCorrection()
5369 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d psi constraints e… in PCBDDCSetUpCorrection()
5375 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCSetUpCorrection()
5386 if (!pcbddc->symmetric_primal) { in PCBDDCSetUpCorrection()
5397 …Y_LENGTH(filename), "details_local_coarse_mat%d_level%d.m",PetscGlobalRank,pcbddc->current_level)); in PCBDDCSetUpCorrection()
5402 if (pcbddc->coarse_phi_B) { in PCBDDCSetUpCorrection()
5403 PetscCall(PetscObjectSetName((PetscObject)pcbddc->coarse_phi_B,"phi_B")); in PCBDDCSetUpCorrection()
5404 PetscCall(MatView(pcbddc->coarse_phi_B,viewer)); in PCBDDCSetUpCorrection()
5406 if (pcbddc->coarse_phi_D) { in PCBDDCSetUpCorrection()
5407 PetscCall(PetscObjectSetName((PetscObject)pcbddc->coarse_phi_D,"phi_D")); in PCBDDCSetUpCorrection()
5408 PetscCall(MatView(pcbddc->coarse_phi_D,viewer)); in PCBDDCSetUpCorrection()
5410 if (pcbddc->coarse_psi_B) { in PCBDDCSetUpCorrection()
5411 PetscCall(PetscObjectSetName((PetscObject)pcbddc->coarse_psi_B,"psi_B")); in PCBDDCSetUpCorrection()
5412 PetscCall(MatView(pcbddc->coarse_psi_B,viewer)); in PCBDDCSetUpCorrection()
5414 if (pcbddc->coarse_psi_D) { in PCBDDCSetUpCorrection()
5415 PetscCall(PetscObjectSetName((PetscObject)pcbddc->coarse_psi_D,"psi_D")); in PCBDDCSetUpCorrection()
5416 PetscCall(MatView(pcbddc->coarse_psi_D,viewer)); in PCBDDCSetUpCorrection()
5418 PetscCall(PetscObjectSetName((PetscObject)pcbddc->local_mat,"A")); in PCBDDCSetUpCorrection()
5419 PetscCall(MatView(pcbddc->local_mat,viewer)); in PCBDDCSetUpCorrection()
5420 PetscCall(PetscObjectSetName((PetscObject)pcbddc->ConstraintMatrix,"C")); in PCBDDCSetUpCorrection()
5421 PetscCall(MatView(pcbddc->ConstraintMatrix,viewer)); in PCBDDCSetUpCorrection()
5426 PetscCall(PetscObjectSetName((PetscObject)pcbddc->is_R_local,"R")); in PCBDDCSetUpCorrection()
5427 PetscCall(ISView(pcbddc->is_R_local,viewer)); in PCBDDCSetUpCorrection()
5448 …if (pcbddc->local_auxmat1) PetscCall(MatConvert(pcbddc->local_auxmat1, mtype, MAT_INPLACE_MATRIX, … in PCBDDCSetUpCorrection()
5449 …if (pcbddc->local_auxmat2) PetscCall(MatConvert(pcbddc->local_auxmat2, mtype, MAT_INPLACE_MATRIX, … in PCBDDCSetUpCorrection()
5450 …if (pcbddc->coarse_phi_B) PetscCall(MatConvert(pcbddc->coarse_phi_B, mtype, MAT_INPLACE_MATRIX, &p… in PCBDDCSetUpCorrection()
5451 …if (pcbddc->coarse_phi_D) PetscCall(MatConvert(pcbddc->coarse_phi_D, mtype, MAT_INPLACE_MATRIX, &p… in PCBDDCSetUpCorrection()
5452 …if (pcbddc->coarse_psi_B) PetscCall(MatConvert(pcbddc->coarse_psi_B, mtype, MAT_INPLACE_MATRIX, &p… in PCBDDCSetUpCorrection()
5453 …if (pcbddc->coarse_psi_D) PetscCall(MatConvert(pcbddc->coarse_psi_D, mtype, MAT_INPLACE_MATRIX, &p… in PCBDDCSetUpCorrection()
5579 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCComputeLocalMatrix() local
5587 PetscCall(MatDestroy(&pcbddc->local_mat)); in PCBDDCComputeLocalMatrix()
5589 if (pcbddc->mat_graph->multi_element) { in PCBDDCComputeLocalMatrix()
5592 PetscInt nsubs = pcbddc->n_local_subs; in PCBDDCComputeLocalMatrix()
5597 …i < nsubs; i++) PetscCall(ISLocalToGlobalMappingApplyIS(matis->rmapping, pcbddc->local_subs[i], &g… in PCBDDCComputeLocalMatrix()
5609 …PetscCall(MatCreateSubMatrices(tmats[0], nsubs, pcbddc->local_subs, pcbddc->local_subs, MAT_INITIA… in PCBDDCComputeLocalMatrix()
5613 …PetscCall(MatCreateNest(PETSC_COMM_SELF, nsubs, pcbddc->local_subs, nsubs, pcbddc->local_subs, mat… in PCBDDCComputeLocalMatrix()
5624 if (pcbddc->dbg_flag) { in PCBDDCComputeLocalMatrix()
5634 if (!pcbddc->change_interior) { in PCBDDCComputeLocalMatrix()
5649 if (!pcbddc->user_ChangeOfBasisMatrix || pcbddc->current_level) { in PCBDDCComputeLocalMatrix()
5661 if (!pcbddc->user_ChangeOfBasisMatrix || pcbddc->current_level) { in PCBDDCComputeLocalMatrix()
5679 PetscCall(MatDestroy(&pcbddc->local_mat)); in PCBDDCComputeLocalMatrix()
5680 …PetscCall(MatPtAPWithPrefix_Private(matis->A, new_mat, PETSC_DEFAULT, ptapprefix, &pcbddc->local_m… in PCBDDCComputeLocalMatrix()
5690 PetscCall(MatDestroy(&pcbddc->local_mat)); in PCBDDCComputeLocalMatrix()
5692 …PetscCall(MatPtAPWithPrefix_Private(work_mat, new_mat, PETSC_DEFAULT, ptapprefix, &pcbddc->local_m… in PCBDDCComputeLocalMatrix()
5703 if (isset) PetscCall(MatSetOption(pcbddc->local_mat, MAT_SYMMETRIC, issym)); in PCBDDCComputeLocalMatrix()
5711 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetUpLocalScatters() local
5712 PCBDDCSubSchurs sub_schurs = pcbddc->sub_schurs; in PCBDDCSetUpLocalScatters()
5727 …if (!pcbddc->new_primal_space_local && pcbddc->local_primal_size && !pcbddc->dbg_flag) PetscFuncti… in PCBDDCSetUpLocalScatters()
5729 PetscCall(ISDestroy(&pcbddc->is_R_local)); in PCBDDCSetUpLocalScatters()
5730 PetscCall(VecScatterDestroy(&pcbddc->R_to_B)); in PCBDDCSetUpLocalScatters()
5731 PetscCall(VecScatterDestroy(&pcbddc->R_to_D)); in PCBDDCSetUpLocalScatters()
5735 n_vertices = pcbddc->n_vertices; in PCBDDCSetUpLocalScatters()
5743 … for (i = 0; i < n_vertices; i++) PetscCall(PetscBTSet(bitmask, pcbddc->local_primal_ref_node[i])); in PCBDDCSetUpLocalScatters()
5757 PetscCall(MatGetBlockSize(pcbddc->local_mat, &bs)); in PCBDDCSetUpLocalScatters()
5766 for (i = 0; i < n_vertices; i++) vary[pcbddc->local_primal_ref_node[i] / bs]++; in PCBDDCSetUpLocalScatters()
5791 …PetscCall(ISCreateBlock(PETSC_COMM_SELF, vbs, n_R / vbs, idx_R_local, PETSC_COPY_VALUES, &pcbddc->… in PCBDDCSetUpLocalScatters()
5797 PetscCall(PetscObjectReference((PetscObject)pcbddc->is_R_local)); in PCBDDCSetUpLocalScatters()
5798 reuse_solver->is_R = pcbddc->is_R_local; in PCBDDCSetUpLocalScatters()
5804 if (pcbddc->dbg_flag) { in PCBDDCSetUpLocalScatters()
5805 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "--------------------------------------------… in PCBDDCSetUpLocalScatters()
5806 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCSetUpLocalScatters()
5807 PetscCall(PetscViewerASCIIPushSynchronized(pcbddc->dbg_viewer)); in PCBDDCSetUpLocalScatters()
5808 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d local dimensions\… in PCBDDCSetUpLocalScatters()
5809 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "local_size = %" PetscInt_FMT ", … in PCBDDCSetUpLocalScatters()
5810 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "r_size = %" PetscInt_FMT ", v_si… in PCBDDCSetUpLocalScatters()
5811pcbddc->local_primal_size - n_vertices - pcbddc->benign_n, pcbddc->local_primal_size)); in PCBDDCSetUpLocalScatters()
5812 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCSetUpLocalScatters()
5820 PetscCall(ISGetIndices(pcbddc->is_R_local, (const PetscInt **)&idx_R_local)); in PCBDDCSetUpLocalScatters()
5836 PetscCall(VecScatterCreate(pcbddc->vec1_R, is_aux1, pcis->vec1_B, is_aux2, &pcbddc->R_to_B)); in PCBDDCSetUpLocalScatters()
5840 if (pcbddc->switch_static || pcbddc->dbg_flag) { in PCBDDCSetUpLocalScatters()
5846 PetscCall(VecScatterCreate(pcbddc->vec1_R, is_aux1, pcis->vec1_D, (IS)0, &pcbddc->R_to_D)); in PCBDDCSetUpLocalScatters()
5850 PetscCall(ISRestoreIndices(pcbddc->is_R_local, (const PetscInt **)&idx_R_local)); in PCBDDCSetUpLocalScatters()
5858 …PetscCall(VecScatterCreate(pcbddc->vec1_R, tis, pcis->vec1_B, reuse_solver->is_B, &pcbddc->R_to_B)… in PCBDDCSetUpLocalScatters()
5860 if (pcbddc->switch_static || pcbddc->dbg_flag) { in PCBDDCSetUpLocalScatters()
5862 PetscCall(VecScatterCreate(pcbddc->vec1_R, tis, pcis->vec1_D, (IS)0, &pcbddc->R_to_D)); in PCBDDCSetUpLocalScatters()
5935 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetUpLocalSolvers() local
5950 PetscCall(PetscLogEventBegin(PC_BDDC_LocalSolvers[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpLocalSolvers()
5952 if (!pc->setupcalled && (pcbddc->NullSpace_corr[0] || pcbddc->NullSpace_corr[2])) { in PCBDDCSetUpLocalSolvers()
5956 PetscCall(MatGetNearNullSpace(pcbddc->local_mat, &nnsp)); in PCBDDCSetUpLocalSolvers()
5967 if (!pcbddc->current_level) { in PCBDDCSetUpLocalSolvers()
5973 …PetscCall(PetscSNPrintf(str_level, sizeof(str_level), "l%" PetscInt_FMT "_", pcbddc->current_level… in PCBDDCSetUpLocalSolvers()
5976 if (pcbddc->current_level > 1) len -= 3; /* remove "lX_" with X level number */ in PCBDDCSetUpLocalSolvers()
5977 if (pcbddc->current_level > 10) len -= 1; /* remove another char from level number */ in PCBDDCSetUpLocalSolvers()
5989 PCBDDCSubSchurs sub_schurs = pcbddc->sub_schurs; in PCBDDCSetUpLocalSolvers()
5990 if (pcbddc->benign_n && !pcbddc->benign_change_explicit) { in PCBDDCSetUpLocalSolvers()
5992 if (pcbddc->dbg_flag) { in PCBDDCSetUpLocalSolvers()
6000 PetscCall(MatIsSymmetricKnown(pcbddc->local_mat, &isset, &issym)); in PCBDDCSetUpLocalSolvers()
6006 if (!pcbddc->ksp_D) { /* create object if not yet build */ in PCBDDCSetUpLocalSolvers()
6008 PetscCall(KSPCreate(PETSC_COMM_SELF, &pcbddc->ksp_D)); in PCBDDCSetUpLocalSolvers()
6009 PetscCall(KSPSetNestLevel(pcbddc->ksp_D, pc->kspnestlevel)); in PCBDDCSetUpLocalSolvers()
6010 PetscCall(PetscObjectIncrementTabLevel((PetscObject)pcbddc->ksp_D, (PetscObject)pc, 1)); in PCBDDCSetUpLocalSolvers()
6012 PetscCall(KSPSetType(pcbddc->ksp_D, KSPPREONLY)); in PCBDDCSetUpLocalSolvers()
6013 PetscCall(KSPSetOptionsPrefix(pcbddc->ksp_D, dir_prefix)); in PCBDDCSetUpLocalSolvers()
6015 PetscCall(KSPGetPC(pcbddc->ksp_D, &pc_temp)); in PCBDDCSetUpLocalSolvers()
6021 PetscCall(KSPSetErrorIfNotConverged(pcbddc->ksp_D, pc->erroriffailure)); in PCBDDCSetUpLocalSolvers()
6023 PetscCall(MatSetOptionsPrefix(pcis->pA_II, ((PetscObject)pcbddc->ksp_D)->prefix)); in PCBDDCSetUpLocalSolvers()
6025 PetscCall(KSPSetOperators(pcbddc->ksp_D, pcis->A_II, pcis->pA_II)); in PCBDDCSetUpLocalSolvers()
6027 if (opts) PetscCall(KSPSetFromOptions(pcbddc->ksp_D)); in PCBDDCSetUpLocalSolvers()
6029 if (pcbddc->NullSpace_corr[0] && !nnsp) { /* approximate solver, propagate NearNullSpace */ in PCBDDCSetUpLocalSolvers()
6030 PetscCall(MatNullSpacePropagateAny_Private(pcbddc->local_mat, pcis->is_I_local, pcis->pA_II)); in PCBDDCSetUpLocalSolvers()
6033 PetscCall(KSPGetPC(pcbddc->ksp_D, &pc_temp)); in PCBDDCSetUpLocalSolvers()
6035 if (f && pcbddc->mat_graph->cloc && !nnsp) { in PCBDDCSetUpLocalSolvers()
6036 PetscReal *coords = pcbddc->mat_graph->coords, *scoords; in PCBDDCSetUpLocalSolvers()
6038 PetscInt cdim = pcbddc->mat_graph->cdim, nl, i, d; in PCBDDCSetUpLocalSolvers()
6053 PetscCall(KSPSetPC(pcbddc->ksp_D, reuse_solver->interior_solver)); in PCBDDCSetUpLocalSolvers()
6058 PetscCall(KSPGetPC(pcbddc->ksp_D, &pc_temp)); in PCBDDCSetUpLocalSolvers()
6061 PetscCall(KSPSetUp(pcbddc->ksp_D)); in PCBDDCSetUpLocalSolvers()
6063 PetscCall(PetscObjectReference((PetscObject)pcbddc->ksp_D)); in PCBDDCSetUpLocalSolvers()
6065 pcis->ksp_D = pcbddc->ksp_D; in PCBDDCSetUpLocalSolvers()
6071 PCBDDCSubSchurs sub_schurs = pcbddc->sub_schurs; in PCBDDCSetUpLocalSolvers()
6085 PetscCall(ISGetSize(pcbddc->is_R_local, &n_R)); in PCBDDCSetUpLocalSolvers()
6086 if (pcbddc->ksp_R) { /* already created ksp */ in PCBDDCSetUpLocalSolvers()
6088 PetscCall(KSPGetOperators(pcbddc->ksp_R, NULL, &A_RR)); in PCBDDCSetUpLocalSolvers()
6092 PetscCall(KSPReset(pcbddc->ksp_R)); in PCBDDCSetUpLocalSolvers()
6096 …if (pcbddc->new_primal_space_local) { /* we are not sure the matrix will have the same nonzero pat… in PCBDDCSetUpLocalSolvers()
6113 PetscCall(MatGetBlockSize(pcbddc->local_mat, &mbs)); in PCBDDCSetUpLocalSolvers()
6114 PetscCall(ISGetBlockSize(pcbddc->is_R_local, &ibs)); in PCBDDCSetUpLocalSolvers()
6115 PetscCall(PetscObjectTypeCompare((PetscObject)pcbddc->local_mat, MATSEQSBAIJ, &issbaij)); in PCBDDCSetUpLocalSolvers()
6117 if (matis->A == pcbddc->local_mat) { in PCBDDCSetUpLocalSolvers()
6118 PetscCall(MatDestroy(&pcbddc->local_mat)); in PCBDDCSetUpLocalSolvers()
6119 PetscCall(MatConvert(matis->A, MATSEQAIJ, MAT_INITIAL_MATRIX, &pcbddc->local_mat)); in PCBDDCSetUpLocalSolvers()
6121 PetscCall(MatConvert(pcbddc->local_mat, MATSEQAIJ, MAT_INPLACE_MATRIX, &pcbddc->local_mat)); in PCBDDCSetUpLocalSolvers()
6124 if (matis->A == pcbddc->local_mat) { in PCBDDCSetUpLocalSolvers()
6125 PetscCall(MatDestroy(&pcbddc->local_mat)); in PCBDDCSetUpLocalSolvers()
6126 …ll(MatConvert(matis->A, mbs > 1 ? MATSEQBAIJ : MATSEQAIJ, MAT_INITIAL_MATRIX, &pcbddc->local_mat)); in PCBDDCSetUpLocalSolvers()
6128 …PetscCall(MatConvert(pcbddc->local_mat, mbs > 1 ? MATSEQBAIJ : MATSEQAIJ, MAT_INPLACE_MATRIX, &pcb… in PCBDDCSetUpLocalSolvers()
6135 if (pcbddc->dbg_flag) { /* we need A_RR to test the solver later */ in PCBDDCSetUpLocalSolvers()
6138 PetscCall(PCBDDCBenignProject(pc, pcbddc->is_R_local, pcbddc->is_R_local, &A_RR)); in PCBDDCSetUpLocalSolvers()
6140 …PetscCall(MatCreateSubMatrix(pcbddc->local_mat, pcbddc->is_R_local, pcbddc->is_R_local, MAT_INITIA… in PCBDDCSetUpLocalSolvers()
6148 …PetscCall(MatCreateSubMatrix(pcbddc->local_mat, pcbddc->is_R_local, pcbddc->is_R_local, reuse, &A_… in PCBDDCSetUpLocalSolvers()
6150 PetscCall(MatIsSymmetricKnown(pcbddc->local_mat, &isset, &issym)); in PCBDDCSetUpLocalSolvers()
6153 if (!pcbddc->ksp_R) { /* create object if not present */ in PCBDDCSetUpLocalSolvers()
6155 PetscCall(KSPCreate(PETSC_COMM_SELF, &pcbddc->ksp_R)); in PCBDDCSetUpLocalSolvers()
6156 PetscCall(KSPSetNestLevel(pcbddc->ksp_R, pc->kspnestlevel)); in PCBDDCSetUpLocalSolvers()
6157 PetscCall(PetscObjectIncrementTabLevel((PetscObject)pcbddc->ksp_R, (PetscObject)pc, 1)); in PCBDDCSetUpLocalSolvers()
6159 PetscCall(KSPSetType(pcbddc->ksp_R, KSPPREONLY)); in PCBDDCSetUpLocalSolvers()
6160 PetscCall(KSPSetOptionsPrefix(pcbddc->ksp_R, neu_prefix)); in PCBDDCSetUpLocalSolvers()
6161 PetscCall(KSPGetPC(pcbddc->ksp_R, &pc_temp)); in PCBDDCSetUpLocalSolvers()
6168 PetscCall(KSPSetErrorIfNotConverged(pcbddc->ksp_R, pc->erroriffailure)); in PCBDDCSetUpLocalSolvers()
6170 PetscCall(MatSetOptionsPrefix(A_RR, ((PetscObject)pcbddc->ksp_R)->prefix)); in PCBDDCSetUpLocalSolvers()
6172 PetscCall(KSPSetOperators(pcbddc->ksp_R, A_RR, A_RR)); in PCBDDCSetUpLocalSolvers()
6174 PetscCall(KSPSetFromOptions(pcbddc->ksp_R)); in PCBDDCSetUpLocalSolvers()
6177 if (pcbddc->NullSpace_corr[2] && !nnsp) { /* approximate solver, propagate NearNullSpace */ in PCBDDCSetUpLocalSolvers()
6178 PetscCall(MatNullSpacePropagateAny_Private(pcbddc->local_mat, pcbddc->is_R_local, A_RR)); in PCBDDCSetUpLocalSolvers()
6181 PetscCall(KSPGetPC(pcbddc->ksp_R, &pc_temp)); in PCBDDCSetUpLocalSolvers()
6183 if (f && pcbddc->mat_graph->cloc && !nnsp) { in PCBDDCSetUpLocalSolvers()
6184 PetscReal *coords = pcbddc->mat_graph->coords, *scoords; in PCBDDCSetUpLocalSolvers()
6186 PetscInt cdim = pcbddc->mat_graph->cdim, nl, i, d; in PCBDDCSetUpLocalSolvers()
6188 PetscCall(ISGetLocalSize(pcbddc->is_R_local, &nl)); in PCBDDCSetUpLocalSolvers()
6189 PetscCall(ISGetIndices(pcbddc->is_R_local, &idxs)); in PCBDDCSetUpLocalSolvers()
6194 PetscCall(ISRestoreIndices(pcbddc->is_R_local, &idxs)); in PCBDDCSetUpLocalSolvers()
6201 PetscCall(KSPGetPC(pcbddc->ksp_R, &pc_temp)); in PCBDDCSetUpLocalSolvers()
6208 PetscCall(KSPSetPC(pcbddc->ksp_R, reuse_solver->correction_solver)); in PCBDDCSetUpLocalSolvers()
6210 PetscCall(KSPSetUp(pcbddc->ksp_R)); in PCBDDCSetUpLocalSolvers()
6213 if (pcbddc->dbg_flag) { in PCBDDCSetUpLocalSolvers()
6214 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCSetUpLocalSolvers()
6215 PetscCall(PetscViewerASCIIPushSynchronized(pcbddc->dbg_viewer)); in PCBDDCSetUpLocalSolvers()
6216 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "--------------------------------------------… in PCBDDCSetUpLocalSolvers()
6218 PetscCall(PetscLogEventEnd(PC_BDDC_LocalSolvers[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpLocalSolvers()
6221 if (pcbddc->NullSpace_corr[0]) PetscCall(PCBDDCSetUseExactDirichlet(pc, PETSC_FALSE)); in PCBDDCSetUpLocalSolvers()
6222 …if (dirichlet && pcbddc->NullSpace_corr[0] && !pcbddc->switch_static) PetscCall(PCBDDCNullSpaceAss… in PCBDDCSetUpLocalSolvers()
6223 …if (neumann && pcbddc->NullSpace_corr[2]) PetscCall(PCBDDCNullSpaceAssembleCorrection(pc, PETSC_FA… in PCBDDCSetUpLocalSolvers()
6225 if (pcbddc->dbg_flag) { in PCBDDCSetUpLocalSolvers()
6229 PetscCall(KSPSolve(pcbddc->ksp_D, pcis->vec2_D, pcis->vec2_D)); in PCBDDCSetUpLocalSolvers()
6230 PetscCall(KSPCheckSolve(pcbddc->ksp_D, pc, pcis->vec2_D)); in PCBDDCSetUpLocalSolvers()
6233 …nizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d infinity error for Dirichlet solve (%s) = % 1.14e … in PCBDDCSetUpLocalSolvers()
6234 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCSetUpLocalSolvers()
6237 PetscCall(VecSetRandom(pcbddc->vec1_R, NULL)); in PCBDDCSetUpLocalSolvers()
6238 PetscCall(MatMult(A_RR, pcbddc->vec1_R, pcbddc->vec2_R)); in PCBDDCSetUpLocalSolvers()
6239 PetscCall(KSPSolve(pcbddc->ksp_R, pcbddc->vec2_R, pcbddc->vec2_R)); in PCBDDCSetUpLocalSolvers()
6240 PetscCall(KSPCheckSolve(pcbddc->ksp_R, pc, pcbddc->vec2_R)); in PCBDDCSetUpLocalSolvers()
6241 PetscCall(VecAXPY(pcbddc->vec1_R, m_one, pcbddc->vec2_R)); in PCBDDCSetUpLocalSolvers()
6242 PetscCall(VecNorm(pcbddc->vec1_R, NORM_INFINITY, &value)); in PCBDDCSetUpLocalSolvers()
6243 …ronizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d infinity error for Neumann solve (%s) = % 1.14e\… in PCBDDCSetUpLocalSolvers()
6244 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCSetUpLocalSolvers()
6254 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSolveSubstructureCorrection() local
6255 PCBDDCSubSchurs sub_schurs = pcbddc->sub_schurs; in PCBDDCSolveSubstructureCorrection()
6259 if (!reuse_solver) PetscCall(VecSet(pcbddc->vec1_R, 0.)); in PCBDDCSolveSubstructureCorrection()
6260 if (!pcbddc->switch_static) { in PCBDDCSolveSubstructureCorrection()
6261 if (applytranspose && pcbddc->local_auxmat1) { in PCBDDCSolveSubstructureCorrection()
6262 PetscCall(MatMultTranspose(pcbddc->local_auxmat2, inout_B, pcbddc->vec1_C)); in PCBDDCSolveSubstructureCorrection()
6263 PetscCall(MatMultTransposeAdd(pcbddc->local_auxmat1, pcbddc->vec1_C, inout_B, inout_B)); in PCBDDCSolveSubstructureCorrection()
6266 …PetscCall(VecScatterBegin(pcbddc->R_to_B, inout_B, pcbddc->vec1_R, INSERT_VALUES, SCATTER_REVERSE)… in PCBDDCSolveSubstructureCorrection()
6267 … PetscCall(VecScatterEnd(pcbddc->R_to_B, inout_B, pcbddc->vec1_R, INSERT_VALUES, SCATTER_REVERSE)); in PCBDDCSolveSubstructureCorrection()
6275 …PetscCall(VecScatterBegin(pcbddc->R_to_B, inout_B, pcbddc->vec1_R, INSERT_VALUES, SCATTER_REVERSE)… in PCBDDCSolveSubstructureCorrection()
6276 … PetscCall(VecScatterEnd(pcbddc->R_to_B, inout_B, pcbddc->vec1_R, INSERT_VALUES, SCATTER_REVERSE)); in PCBDDCSolveSubstructureCorrection()
6277 …PetscCall(VecScatterBegin(pcbddc->R_to_D, inout_D, pcbddc->vec1_R, INSERT_VALUES, SCATTER_REVERSE)… in PCBDDCSolveSubstructureCorrection()
6278 … PetscCall(VecScatterEnd(pcbddc->R_to_D, inout_D, pcbddc->vec1_R, INSERT_VALUES, SCATTER_REVERSE)); in PCBDDCSolveSubstructureCorrection()
6279 if (applytranspose && pcbddc->local_auxmat1) { in PCBDDCSolveSubstructureCorrection()
6280 PetscCall(MatMultTranspose(pcbddc->local_auxmat2, pcbddc->vec1_R, pcbddc->vec1_C)); in PCBDDCSolveSubstructureCorrection()
6281 PetscCall(MatMultTransposeAdd(pcbddc->local_auxmat1, pcbddc->vec1_C, inout_B, inout_B)); in PCBDDCSolveSubstructureCorrection()
6282 …PetscCall(VecScatterBegin(pcbddc->R_to_B, inout_B, pcbddc->vec1_R, INSERT_VALUES, SCATTER_REVERSE)… in PCBDDCSolveSubstructureCorrection()
6283 … PetscCall(VecScatterEnd(pcbddc->R_to_B, inout_B, pcbddc->vec1_R, INSERT_VALUES, SCATTER_REVERSE)); in PCBDDCSolveSubstructureCorrection()
6286 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][1], pc, 0, 0, 0)); in PCBDDCSolveSubstructureCorrection()
6287 if (!reuse_solver || pcbddc->switch_static) { in PCBDDCSolveSubstructureCorrection()
6289 PetscCall(KSPSolveTranspose(pcbddc->ksp_R, pcbddc->vec1_R, pcbddc->vec1_R)); in PCBDDCSolveSubstructureCorrection()
6291 PetscCall(KSPSolve(pcbddc->ksp_R, pcbddc->vec1_R, pcbddc->vec1_R)); in PCBDDCSolveSubstructureCorrection()
6293 PetscCall(KSPCheckSolve(pcbddc->ksp_R, pc, pcbddc->vec1_R)); in PCBDDCSolveSubstructureCorrection()
6303 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][1], pc, 0, 0, 0)); in PCBDDCSolveSubstructureCorrection()
6305 if (!pcbddc->switch_static) { in PCBDDCSolveSubstructureCorrection()
6307 …PetscCall(VecScatterBegin(pcbddc->R_to_B, pcbddc->vec1_R, inout_B, INSERT_VALUES, SCATTER_FORWARD)… in PCBDDCSolveSubstructureCorrection()
6308 … PetscCall(VecScatterEnd(pcbddc->R_to_B, pcbddc->vec1_R, inout_B, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSolveSubstructureCorrection()
6315 if (!applytranspose && pcbddc->local_auxmat1) { in PCBDDCSolveSubstructureCorrection()
6316 PetscCall(MatMult(pcbddc->local_auxmat1, inout_B, pcbddc->vec1_C)); in PCBDDCSolveSubstructureCorrection()
6317 PetscCall(MatMultAdd(pcbddc->local_auxmat2, pcbddc->vec1_C, inout_B, inout_B)); in PCBDDCSolveSubstructureCorrection()
6320 …PetscCall(VecScatterBegin(pcbddc->R_to_B, pcbddc->vec1_R, inout_B, INSERT_VALUES, SCATTER_FORWARD)… in PCBDDCSolveSubstructureCorrection()
6321 … PetscCall(VecScatterEnd(pcbddc->R_to_B, pcbddc->vec1_R, inout_B, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSolveSubstructureCorrection()
6322 …PetscCall(VecScatterBegin(pcbddc->R_to_D, pcbddc->vec1_R, inout_D, INSERT_VALUES, SCATTER_FORWARD)… in PCBDDCSolveSubstructureCorrection()
6323 … PetscCall(VecScatterEnd(pcbddc->R_to_D, pcbddc->vec1_R, inout_D, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSolveSubstructureCorrection()
6324 if (!applytranspose && pcbddc->local_auxmat1) { in PCBDDCSolveSubstructureCorrection()
6325 PetscCall(MatMult(pcbddc->local_auxmat1, inout_B, pcbddc->vec1_C)); in PCBDDCSolveSubstructureCorrection()
6326 PetscCall(MatMultAdd(pcbddc->local_auxmat2, pcbddc->vec1_C, pcbddc->vec1_R, pcbddc->vec1_R)); in PCBDDCSolveSubstructureCorrection()
6328 …PetscCall(VecScatterBegin(pcbddc->R_to_B, pcbddc->vec1_R, inout_B, INSERT_VALUES, SCATTER_FORWARD)… in PCBDDCSolveSubstructureCorrection()
6329 … PetscCall(VecScatterEnd(pcbddc->R_to_B, pcbddc->vec1_R, inout_B, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSolveSubstructureCorrection()
6330 …PetscCall(VecScatterBegin(pcbddc->R_to_D, pcbddc->vec1_R, inout_D, INSERT_VALUES, SCATTER_FORWARD)… in PCBDDCSolveSubstructureCorrection()
6331 … PetscCall(VecScatterEnd(pcbddc->R_to_D, pcbddc->vec1_R, inout_D, INSERT_VALUES, SCATTER_FORWARD)); in PCBDDCSolveSubstructureCorrection()
6339 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCApplyInterfacePreconditioner() local
6345 if (!pcbddc->benign_apply_coarse_only) { in PCBDDCApplyInterfacePreconditioner()
6347 PetscCall(MatMultTranspose(pcbddc->coarse_phi_B, pcis->vec1_B, pcbddc->vec1_P)); in PCBDDCApplyInterfacePreconditioner()
6348 …if (pcbddc->switch_static) PetscCall(MatMultTransposeAdd(pcbddc->coarse_phi_D, pcis->vec1_D, pcbdd… in PCBDDCApplyInterfacePreconditioner()
6350 PetscCall(MatMultTranspose(pcbddc->coarse_psi_B, pcis->vec1_B, pcbddc->vec1_P)); in PCBDDCApplyInterfacePreconditioner()
6351 …if (pcbddc->switch_static) PetscCall(MatMultTransposeAdd(pcbddc->coarse_psi_D, pcis->vec1_D, pcbdd… in PCBDDCApplyInterfacePreconditioner()
6354 PetscCall(VecSet(pcbddc->vec1_P, zero)); in PCBDDCApplyInterfacePreconditioner()
6358 if (pcbddc->benign_n) { in PCBDDCApplyInterfacePreconditioner()
6362 PetscCall(VecGetArray(pcbddc->vec1_P, &array)); in PCBDDCApplyInterfacePreconditioner()
6363 …for (j = 0; j < pcbddc->benign_n; j++) array[pcbddc->local_primal_size - pcbddc->benign_n + j] += in PCBDDCApplyInterfacePreconditioner()
6364 PetscCall(VecRestoreArray(pcbddc->vec1_P, &array)); in PCBDDCApplyInterfacePreconditioner()
6368 PetscCall(VecSet(pcbddc->coarse_vec, zero)); in PCBDDCApplyInterfacePreconditioner()
6373 PetscCall(PetscLogEventBegin(PC_BDDC_Solves[pcbddc->current_level][2], pc, 0, 0, 0)); in PCBDDCApplyInterfacePreconditioner()
6374 if (pcbddc->coarse_ksp) { in PCBDDCApplyInterfacePreconditioner()
6380 if (pcbddc->benign_have_null) { in PCBDDCApplyInterfacePreconditioner()
6383 PetscCall(KSPGetPC(pcbddc->coarse_ksp, &coarse_pc)); in PCBDDCApplyInterfacePreconditioner()
6386 if (isbddc && pcbddc->benign_apply_coarse_only && !pcbddc->benign_skip_correction) { in PCBDDCApplyInterfacePreconditioner()
6392 PetscCall(KSPGetRhs(pcbddc->coarse_ksp, &rhs)); in PCBDDCApplyInterfacePreconditioner()
6393 PetscCall(KSPGetSolution(pcbddc->coarse_ksp, &sol)); in PCBDDCApplyInterfacePreconditioner()
6394 PetscCall(KSPGetOperators(pcbddc->coarse_ksp, &coarse_mat, NULL)); in PCBDDCApplyInterfacePreconditioner()
6396 …PetscCheck(!pcbddc->benign_apply_coarse_only, PetscObjectComm((PetscObject)pcbddc->coarse_ksp), PE… in PCBDDCApplyInterfacePreconditioner()
6397 PetscCall(KSPSolveTranspose(pcbddc->coarse_ksp, rhs, sol)); in PCBDDCApplyInterfacePreconditioner()
6398 PetscCall(KSPCheckSolve(pcbddc->coarse_ksp, pc, sol)); in PCBDDCApplyInterfacePreconditioner()
6403 …if (pcbddc->benign_apply_coarse_only && isbddc) { /* need just to apply the coarse preconditioner … in PCBDDCApplyInterfacePreconditioner()
6407 PetscCall(KSPGetPC(pcbddc->coarse_ksp, &coarse_pc)); in PCBDDCApplyInterfacePreconditioner()
6408 PetscCall(PCPreSolve(coarse_pc, pcbddc->coarse_ksp)); in PCBDDCApplyInterfacePreconditioner()
6410 PetscCall(PCPostSolve(coarse_pc, pcbddc->coarse_ksp)); in PCBDDCApplyInterfacePreconditioner()
6412 PetscCall(KSPSolve(pcbddc->coarse_ksp, rhs, sol)); in PCBDDCApplyInterfacePreconditioner()
6413 PetscCall(KSPCheckSolve(pcbddc->coarse_ksp, pc, sol)); in PCBDDCApplyInterfacePreconditioner()
6418 if (pcbddc->benign_have_null && isbddc) { in PCBDDCApplyInterfacePreconditioner()
6422 PetscCall(KSPGetPC(pcbddc->coarse_ksp, &coarse_pc)); in PCBDDCApplyInterfacePreconditioner()
6428 PetscCall(PetscLogEventEnd(PC_BDDC_Solves[pcbddc->current_level][2], pc, 0, 0, 0)); in PCBDDCApplyInterfacePreconditioner()
6431 …if (!pcbddc->benign_apply_coarse_only) PetscCall(PCBDDCSolveSubstructureCorrection(pc, pcis->vec1_… in PCBDDCApplyInterfacePreconditioner()
6437 if (!pcbddc->benign_apply_coarse_only) { in PCBDDCApplyInterfacePreconditioner()
6439 PetscCall(MatMultAdd(pcbddc->coarse_psi_B, pcbddc->vec1_P, pcis->vec1_B, pcis->vec1_B)); in PCBDDCApplyInterfacePreconditioner()
6440 …if (pcbddc->switch_static) PetscCall(MatMultAdd(pcbddc->coarse_psi_D, pcbddc->vec1_P, pcis->vec1_D… in PCBDDCApplyInterfacePreconditioner()
6442 PetscCall(MatMultAdd(pcbddc->coarse_phi_B, pcbddc->vec1_P, pcis->vec1_B, pcis->vec1_B)); in PCBDDCApplyInterfacePreconditioner()
6443 …if (pcbddc->switch_static) PetscCall(MatMultAdd(pcbddc->coarse_phi_D, pcbddc->vec1_P, pcis->vec1_D… in PCBDDCApplyInterfacePreconditioner()
6446 if (pcbddc->benign_n) { in PCBDDCApplyInterfacePreconditioner()
6450 PetscCall(VecGetArray(pcbddc->vec1_P, &array)); in PCBDDCApplyInterfacePreconditioner()
6451 …for (j = 0; j < pcbddc->benign_n; j++) pcbddc->benign_p0[j] = array[pcbddc->local_primal_size - pc… in PCBDDCApplyInterfacePreconditioner()
6452 PetscCall(VecRestoreArray(pcbddc->vec1_P, &array)); in PCBDDCApplyInterfacePreconditioner()
6456 PetscCall(MatMult(pcbddc->coarse_psi_B, pcbddc->vec1_P, pcis->vec1_B)); in PCBDDCApplyInterfacePreconditioner()
6458 PetscCall(MatMult(pcbddc->coarse_phi_B, pcbddc->vec1_P, pcis->vec1_B)); in PCBDDCApplyInterfacePreconditioner()
6466 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCScatterCoarseDataBegin() local
6472 from = pcbddc->coarse_vec; in PCBDDCScatterCoarseDataBegin()
6473 to = pcbddc->vec1_P; in PCBDDCScatterCoarseDataBegin()
6474 if (pcbddc->coarse_ksp) { /* get array from coarse processes */ in PCBDDCScatterCoarseDataBegin()
6477 PetscCall(KSPGetRhs(pcbddc->coarse_ksp, &tvec)); in PCBDDCScatterCoarseDataBegin()
6479 PetscCall(KSPGetSolution(pcbddc->coarse_ksp, &tvec)); in PCBDDCScatterCoarseDataBegin()
6485 from = pcbddc->vec1_P; in PCBDDCScatterCoarseDataBegin()
6486 to = pcbddc->coarse_vec; in PCBDDCScatterCoarseDataBegin()
6488 PetscCall(VecScatterBegin(pcbddc->coarse_loc_to_glob, from, to, imode, smode)); in PCBDDCScatterCoarseDataBegin()
6494 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCScatterCoarseDataEnd() local
6500 from = pcbddc->coarse_vec; in PCBDDCScatterCoarseDataEnd()
6501 to = pcbddc->vec1_P; in PCBDDCScatterCoarseDataEnd()
6503 from = pcbddc->vec1_P; in PCBDDCScatterCoarseDataEnd()
6504 to = pcbddc->coarse_vec; in PCBDDCScatterCoarseDataEnd()
6506 PetscCall(VecScatterEnd(pcbddc->coarse_loc_to_glob, from, to, imode, smode)); in PCBDDCScatterCoarseDataEnd()
6508 if (pcbddc->coarse_ksp) { /* get array from coarse processes */ in PCBDDCScatterCoarseDataEnd()
6511 PetscCall(KSPGetRhs(pcbddc->coarse_ksp, &tvec)); in PCBDDCScatterCoarseDataEnd()
6517 if (pcbddc->coarse_ksp) { /* restore array of pcbddc->coarse_vec */ in PCBDDCScatterCoarseDataEnd()
6527 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCConstraintsSetUp() local
6559 PetscCall(MatDestroy(&pcbddc->ChangeOfBasisMatrix)); in PCBDDCConstraintsSetUp()
6560 PetscCall(MatDestroy(&pcbddc->ConstraintMatrix)); in PCBDDCConstraintsSetUp()
6561 PetscCall(MatDestroy(&pcbddc->switch_static_change)); in PCBDDCConstraintsSetUp()
6563 olocal_primal_size = pcbddc->local_primal_size; in PCBDDCConstraintsSetUp()
6564 olocal_primal_size_cc = pcbddc->local_primal_size_cc; in PCBDDCConstraintsSetUp()
6566 …PetscCall(PetscArraycpy(olocal_primal_ref_node, pcbddc->local_primal_ref_node, olocal_primal_size_… in PCBDDCConstraintsSetUp()
6567 …PetscCall(PetscArraycpy(olocal_primal_ref_mult, pcbddc->local_primal_ref_mult, olocal_primal_size_… in PCBDDCConstraintsSetUp()
6568 PetscCall(PetscFree2(pcbddc->local_primal_ref_node, pcbddc->local_primal_ref_mult)); in PCBDDCConstraintsSetUp()
6569 PetscCall(PetscFree(pcbddc->primal_indices_local_idxs)); in PCBDDCConstraintsSetUp()
6571 if (!pcbddc->adaptive_selection) { in PCBDDCConstraintsSetUp()
6592 …PetscCall(PCBDDCGraphGetCandidatesIS(pcbddc->mat_graph, &n_ISForFaces, &ISForFaces, &n_ISForEdges,… in PCBDDCConstraintsSetUp()
6598 if (pcbddc->dbg_flag && (!pcbddc->sub_schurs || pcbddc->sub_schurs_rebuild)) { in PCBDDCConstraintsSetUp()
6599 …if (!pcbddc->dbg_viewer) pcbddc->dbg_viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)pc… in PCBDDCConstraintsSetUp()
6600 PetscCall(PCBDDCGraphASCIIView(pcbddc->mat_graph, pcbddc->dbg_flag, pcbddc->dbg_viewer)); in PCBDDCConstraintsSetUp()
6601 PetscCall(PetscViewerASCIIPushSynchronized(pcbddc->dbg_viewer)); in PCBDDCConstraintsSetUp()
6602 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "--------------------------------… in PCBDDCConstraintsSetUp()
6603 …nizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d got %02" PetscInt_FMT " local candidate vertices (… in PCBDDCConstraintsSetUp()
6604 …izedPrintf(pcbddc->dbg_viewer, "Subdomain %04d got %02" PetscInt_FMT " local candidate edges (%… in PCBDDCConstraintsSetUp()
6605 …izedPrintf(pcbddc->dbg_viewer, "Subdomain %04d got %02" PetscInt_FMT " local candidate faces (%… in PCBDDCConstraintsSetUp()
6606 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCConstraintsSetUp()
6607 PetscCall(PetscViewerASCIIPopSynchronized(pcbddc->dbg_viewer)); in PCBDDCConstraintsSetUp()
6610 if (!pcbddc->use_vertices) n_vertices = 0; in PCBDDCConstraintsSetUp()
6611 if (!pcbddc->use_edges) n_ISForEdges = 0; in PCBDDCConstraintsSetUp()
6612 if (!pcbddc->use_faces) n_ISForFaces = 0; in PCBDDCConstraintsSetUp()
6615 if (pcbddc->use_nnsp) PetscCall(MatGetNearNullSpace(pc->pmat, &nearnullsp)); in PCBDDCConstraintsSetUp()
6621 PetscCall(MatNullSpaceDestroy(&pcbddc->onearnullspace)); in PCBDDCConstraintsSetUp()
6622 PetscCall(PetscFree(pcbddc->onearnullvecs_state)); in PCBDDCConstraintsSetUp()
6625 pcbddc->onearnullspace = nearnullsp; in PCBDDCConstraintsSetUp()
6626 PetscCall(PetscMalloc1(nnsp_size, &pcbddc->onearnullvecs_state)); in PCBDDCConstraintsSetUp()
6627 …_size; i++) PetscCall(PetscObjectStateGet((PetscObject)nearnullvecs[i], &pcbddc->onearnullvecs_sta… in PCBDDCConstraintsSetUp()
6675 …if (n_ISForFaces + n_ISForEdges && max_constraints > 1 && !pcbddc->use_nnsp_true) skip_lapack = PE… in PCBDDCConstraintsSetUp()
6762 boolforchange = pcbddc->use_change_of_basis; /* change or not the basis on the edge */ in PCBDDCConstraintsSetUp()
6765 …boolforchange = (PetscBool)(pcbddc->use_change_of_basis && pcbddc->use_change_on_faces); /* change… in PCBDDCConstraintsSetUp()
6778 if (!pcbddc->use_nnsp_true) { in PCBDDCConstraintsSetUp()
6809 if (!pcbddc->use_nnsp_true && temp_constraints) { in PCBDDCConstraintsSetUp()
6917 …PetscCall(PCBDDCGraphRestoreCandidatesIS(pcbddc->mat_graph, &o_nf, &ISForFaces, &o_ne, &ISForEdges… in PCBDDCConstraintsSetUp()
6919 PCBDDCSubSchurs sub_schurs = pcbddc->sub_schurs; in PCBDDCConstraintsSetUp()
6923 …if (sub_schurs->is_vertices && pcbddc->use_vertices) PetscCall(ISGetLocalSize(sub_schurs->is_verti… in PCBDDCConstraintsSetUp()
6927 total_counts += pcbddc->adaptive_constraints_n[i]; in PCBDDCConstraintsSetUp()
6928 if (pcbddc->adaptive_constraints_n[i]) total_counts_cc++; in PCBDDCConstraintsSetUp()
6929 max_constraints = PetscMax(max_constraints, pcbddc->adaptive_constraints_n[i]); in PCBDDCConstraintsSetUp()
6931 constraints_idxs_ptr = pcbddc->adaptive_constraints_idxs_ptr; in PCBDDCConstraintsSetUp()
6932 constraints_data_ptr = pcbddc->adaptive_constraints_data_ptr; in PCBDDCConstraintsSetUp()
6933 constraints_idxs = pcbddc->adaptive_constraints_idxs; in PCBDDCConstraintsSetUp()
6934 constraints_data = pcbddc->adaptive_constraints_data; in PCBDDCConstraintsSetUp()
6939 …if (pcbddc->adaptive_constraints_n[i]) constraints_n[total_counts_cc++] = pcbddc->adaptive_constra… in PCBDDCConstraintsSetUp()
6947 if (pcbddc->use_change_of_basis) { in PCBDDCConstraintsSetUp()
6949 …if (PetscBTLookup(sub_schurs->is_edge, i) || pcbddc->use_change_on_faces) PetscCall(PetscBTSet(cha… in PCBDDCConstraintsSetUp()
6953 pcbddc->local_primal_size = total_counts; in PCBDDCConstraintsSetUp()
6954 …PetscCall(PetscMalloc1(pcbddc->local_primal_size + pcbddc->benign_n, &pcbddc->primal_indices_local… in PCBDDCConstraintsSetUp()
6957 if (pcbddc->use_change_of_basis) { in PCBDDCConstraintsSetUp()
6963 PetscCall(MatCreate(PETSC_COMM_SELF, &pcbddc->ConstraintMatrix)); in PCBDDCConstraintsSetUp()
6964 PetscCall(MatSetType(pcbddc->ConstraintMatrix, MATAIJ)); in PCBDDCConstraintsSetUp()
6965 …PetscCall(MatSetSizes(pcbddc->ConstraintMatrix, pcbddc->local_primal_size, pcis->n, pcbddc->local_… in PCBDDCConstraintsSetUp()
6969 qr_needed = pcbddc->use_qr_single; in PCBDDCConstraintsSetUp()
6972 pcbddc->local_primal_size_cc = 0; in PCBDDCConstraintsSetUp()
6975 if (size_of_constraint == 1 && pcbddc->mat_graph->custom_minimal_size) { in PCBDDCConstraintsSetUp()
6976pcbddc->primal_indices_local_idxs[total_primal_vertices++] = constraints_idxs[constraints_idxs_ptr… in PCBDDCConstraintsSetUp()
6977 pcbddc->local_primal_size_cc += 1; in PCBDDCConstraintsSetUp()
6979 …for (k = 0; k < constraints_n[i]; k++) pcbddc->primal_indices_local_idxs[total_primal_vertices++] … in PCBDDCConstraintsSetUp()
6980 pcbddc->local_primal_size_cc += constraints_n[i]; in PCBDDCConstraintsSetUp()
6981 if (constraints_n[i] > 1 || pcbddc->use_qr_single) { in PCBDDCConstraintsSetUp()
6986 pcbddc->local_primal_size_cc += 1; in PCBDDCConstraintsSetUp()
6990 pcbddc->n_vertices = total_primal_vertices; in PCBDDCConstraintsSetUp()
6992 PetscCall(PetscSortInt(total_primal_vertices, pcbddc->primal_indices_local_idxs)); in PCBDDCConstraintsSetUp()
6993 …Malloc2(pcbddc->local_primal_size_cc + pcbddc->benign_n, &pcbddc->local_primal_ref_node, pcbddc->l… in PCBDDCConstraintsSetUp()
6994 …PetscCall(PetscArraycpy(pcbddc->local_primal_ref_node, pcbddc->primal_indices_local_idxs, total_pr… in PCBDDCConstraintsSetUp()
6995 for (i = 0; i < total_primal_vertices; i++) pcbddc->local_primal_ref_mult[i] = 1; in PCBDDCConstraintsSetUp()
6999 PetscCall(PetscMalloc1(pcbddc->local_primal_size, &nnz)); in PCBDDCConstraintsSetUp()
7007 pcbddc->local_primal_ref_node[cum] = constraints_idxs[constraints_idxs_ptr[i]]; in PCBDDCConstraintsSetUp()
7008 pcbddc->local_primal_ref_mult[cum] = constraints_n[i]; in PCBDDCConstraintsSetUp()
7012pcbddc->primal_indices_local_idxs[total_counts++] = constraints_idxs[constraints_idxs_ptr[i] + k]; in PCBDDCConstraintsSetUp()
7018 PetscCall(MatSeqAIJSetPreallocation(pcbddc->ConstraintMatrix, 0, nnz)); in PCBDDCConstraintsSetUp()
7019 PetscCall(MatSetOption(pcbddc->ConstraintMatrix, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE)); in PCBDDCConstraintsSetUp()
7020 PetscCall(MatSetOption(pcbddc->ConstraintMatrix, MAT_IGNORE_ZERO_ENTRIES, PETSC_TRUE)); in PCBDDCConstraintsSetUp()
7024 …= 0; i < total_primal_vertices; i++) PetscCall(MatSetValue(pcbddc->ConstraintMatrix, i, pcbddc->lo… in PCBDDCConstraintsSetUp()
7037 …PetscCall(MatSetValues(pcbddc->ConstraintMatrix, 1, &row, size_of_constraint, cols, vals, INSERT_V… in PCBDDCConstraintsSetUp()
7043 PetscCall(MatAssemblyBegin(pcbddc->ConstraintMatrix, MAT_FINAL_ASSEMBLY)); in PCBDDCConstraintsSetUp()
7044 PetscCall(MatAssemblyEnd(pcbddc->ConstraintMatrix, MAT_FINAL_ASSEMBLY)); in PCBDDCConstraintsSetUp()
7045 …PetscCall(MatViewFromOptions(pcbddc->ConstraintMatrix, (PetscObject)pc, "-pc_bddc_constraint_mat_v… in PCBDDCConstraintsSetUp()
7048 if (pcbddc->use_change_of_basis) { in PCBDDCConstraintsSetUp()
7078 if (!pcbddc->benign_change || pcbddc->fake_change) { in PCBDDCConstraintsSetUp()
7084 …PetscCall(MatGetRowIJ(pcbddc->benign_change, 0, PETSC_FALSE, PETSC_FALSE, &n, &ii, NULL, &flg_row)… in PCBDDCConstraintsSetUp()
7086 …PetscCall(MatRestoreRowIJ(pcbddc->benign_change, 0, PETSC_FALSE, PETSC_FALSE, &n, &ii, NULL, &flg_… in PCBDDCConstraintsSetUp()
7103 if (!pcbddc->benign_change || pcbddc->fake_change) { in PCBDDCConstraintsSetUp()
7110 …PetscCall(MatGetRowIJ(pcbddc->benign_change, 0, PETSC_FALSE, PETSC_FALSE, &n, &ii, &jj, &flg_row)); in PCBDDCConstraintsSetUp()
7111 PetscCall(MatSeqAIJGetArray(pcbddc->benign_change, &aa)); in PCBDDCConstraintsSetUp()
7113 PetscCall(MatSeqAIJRestoreArray(pcbddc->benign_change, &aa)); in PCBDDCConstraintsSetUp()
7114 …PetscCall(MatRestoreRowIJ(pcbddc->benign_change, 0, PETSC_FALSE, PETSC_FALSE, &n, &ii, &jj, &flg_r… in PCBDDCConstraintsSetUp()
7117 if (pcbddc->dbg_flag) { in PCBDDCConstraintsSetUp()
7118 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "--------------------------------… in PCBDDCConstraintsSetUp()
7119 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "Checking change of basis computa… in PCBDDCConstraintsSetUp()
7170 …if (pcbddc->dbg_flag) PetscCall(PetscMalloc1(max_size_of_constraint * (max_constraints + max_size_… in PCBDDCConstraintsSetUp()
7175 …ToLocalMappingApply(pcis->BtoNmap, IS_GTOLM_DROP, total_primal_vertices, pcbddc->local_primal_ref_… in PCBDDCConstraintsSetUp()
7188 …if (pcbddc->dbg_flag) PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "Constraint… in PCBDDCConstraintsSetUp()
7193 …if (pcbddc->dbg_flag) PetscCall(PetscArraycpy(dbg_work, &constraints_data[constraints_data_ptr[tot… in PCBDDCConstraintsSetUp()
7261 if (pcbddc->dbg_flag) { in PCBDDCConstraintsSetUp()
7280 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "\t-> wrong change of basis!\n")); in PCBDDCConstraintsSetUp()
7284 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "\tQr basis function %" PetscInt_… in PCBDDCConstraintsSetUp()
7287 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "\tQr basis function %" PetscInt_… in PCBDDCConstraintsSetUp()
7292 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "\t-> right change of basis!\n")); in PCBDDCConstraintsSetUp()
7320 …if (pcbddc->dbg_flag) PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "\t-> using… in PCBDDCConstraintsSetUp()
7323 …if (pcbddc->dbg_flag) PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "Constraint… in PCBDDCConstraintsSetUp()
7329 if (pcbddc->dbg_flag) PetscCall(PetscFree(dbg_work)); in PCBDDCConstraintsSetUp()
7341 if (!pcbddc->fake_change) { in PCBDDCConstraintsSetUp()
7350 PetscCall(MatConvert(tmat, MATAIJ, MAT_INITIAL_MATRIX, &pcbddc->ChangeOfBasisMatrix)); in PCBDDCConstraintsSetUp()
7357 PetscCall(MatDiagonalScale(pcbddc->ChangeOfBasisMatrix, pcis->vec1_global, NULL)); in PCBDDCConstraintsSetUp()
7360 if (pcbddc->dbg_flag) { in PCBDDCConstraintsSetUp()
7373 PetscCall(MatMult(pcbddc->ChangeOfBasisMatrix, pcis->vec1_global, x_change)); in PCBDDCConstraintsSetUp()
7381 if (pcbddc->use_deluxe_scaling) { in PCBDDCConstraintsSetUp()
7382 PCBDDCSubSchurs sub_schurs = pcbddc->sub_schurs; in PCBDDCConstraintsSetUp()
7384 …PetscCheck(!pcbddc->use_change_of_basis || !pcbddc->adaptive_userdefined, PetscObjectComm((PetscOb… in PCBDDCConstraintsSetUp()
7391 if (pcbddc->deluxe_zerorows) { in PCBDDCConstraintsSetUp()
7394 …PetscCall(ISCreateGeneral(PETSC_COMM_SELF, pcbddc->n_vertices, pcbddc->local_primal_ref_node, PETS… in PCBDDCConstraintsSetUp()
7404 if (pcbddc->deluxe_zerorows) { in PCBDDCConstraintsSetUp()
7434 … if (pcbddc->deluxe_zerorows) PetscCall(MatZeroRowsColumnsIS(S_new, is_V_Sall, 1., NULL, NULL)); in PCBDDCConstraintsSetUp()
7449 if (pcbddc->switch_static) { /* need to save the local change */ in PCBDDCConstraintsSetUp()
7450 pcbddc->switch_static_change = localChangeOfBasisMatrix; in PCBDDCConstraintsSetUp()
7455 pcbddc->change_interior = pcbddc->benign_have_null; in PCBDDCConstraintsSetUp()
7457 PetscCall(MatDestroy(&pcbddc->ConstraintMatrix)); in PCBDDCConstraintsSetUp()
7458 pcbddc->ConstraintMatrix = localChangeOfBasisMatrix; in PCBDDCConstraintsSetUp()
7459 pcbddc->use_qr_single = qr_needed; in PCBDDCConstraintsSetUp()
7461 } else if (pcbddc->user_ChangeOfBasisMatrix || pcbddc->benign_saddle_point) { in PCBDDCConstraintsSetUp()
7462 if (!pcbddc->benign_have_null && pcbddc->user_ChangeOfBasisMatrix) { in PCBDDCConstraintsSetUp()
7463 PetscCall(PetscObjectReference((PetscObject)pcbddc->user_ChangeOfBasisMatrix)); in PCBDDCConstraintsSetUp()
7464 pcbddc->ChangeOfBasisMatrix = pcbddc->user_ChangeOfBasisMatrix; in PCBDDCConstraintsSetUp()
7467 if (pcbddc->benign_have_null) { in PCBDDCConstraintsSetUp()
7470 pcbddc->change_interior = PETSC_TRUE; in PCBDDCConstraintsSetUp()
7474 if (pcbddc->benign_change) { in PCBDDCConstraintsSetUp()
7475 PetscCall(MatDuplicate(pcbddc->benign_change, MAT_COPY_VALUES, &M)); in PCBDDCConstraintsSetUp()
7486 if (pcbddc->user_ChangeOfBasisMatrix) { in PCBDDCConstraintsSetUp()
7487 …PetscCall(MatMatMult(pcbddc->user_ChangeOfBasisMatrix, benign_global, MAT_INITIAL_MATRIX, PETSC_DE… in PCBDDCConstraintsSetUp()
7489 } else if (pcbddc->benign_have_null) { in PCBDDCConstraintsSetUp()
7490 pcbddc->ChangeOfBasisMatrix = benign_global; in PCBDDCConstraintsSetUp()
7493 if (pcbddc->switch_static && pcbddc->ChangeOfBasisMatrix) { /* need to save the local change */ in PCBDDCConstraintsSetUp()
7500 …PetscCall(MatCreateSubMatrixUnsorted(pcbddc->ChangeOfBasisMatrix, is_global, is_global, &pcbddc->s… in PCBDDCConstraintsSetUp()
7504 …if (!pcbddc->fake_change && pcbddc->ChangeOfBasisMatrix && !pcbddc->work_change) PetscCall(VecDupl… in PCBDDCConstraintsSetUp()
7506 if (!pcbddc->fake_change) { in PCBDDCConstraintsSetUp()
7508 for (i = 0; i < pcbddc->benign_n; i++) { in PCBDDCConstraintsSetUp()
7509 pcbddc->local_primal_ref_node[pcbddc->local_primal_size_cc] = pcbddc->benign_p0_lidx[i]; in PCBDDCConstraintsSetUp()
7510 pcbddc->primal_indices_local_idxs[pcbddc->local_primal_size] = pcbddc->benign_p0_lidx[i]; in PCBDDCConstraintsSetUp()
7511 pcbddc->local_primal_ref_mult[pcbddc->local_primal_size_cc] = 1; in PCBDDCConstraintsSetUp()
7512 pcbddc->local_primal_size_cc++; in PCBDDCConstraintsSetUp()
7513 pcbddc->local_primal_size++; in PCBDDCConstraintsSetUp()
7517 pcbddc->new_primal_space_local = PETSC_TRUE; in PCBDDCConstraintsSetUp()
7518 if (olocal_primal_size == pcbddc->local_primal_size) { in PCBDDCConstraintsSetUp()
7519 …PetscCall(PetscArraycmp(pcbddc->local_primal_ref_node, olocal_primal_ref_node, olocal_primal_size_… in PCBDDCConstraintsSetUp()
7520 pcbddc->new_primal_space_local = (PetscBool)(!pcbddc->new_primal_space_local); in PCBDDCConstraintsSetUp()
7521 if (!pcbddc->new_primal_space_local) { in PCBDDCConstraintsSetUp()
7522 …PetscCall(PetscArraycmp(pcbddc->local_primal_ref_mult, olocal_primal_ref_mult, olocal_primal_size_… in PCBDDCConstraintsSetUp()
7523 pcbddc->new_primal_space_local = (PetscBool)(!pcbddc->new_primal_space_local); in PCBDDCConstraintsSetUp()
7527 …PetscCallMPI(MPIU_Allreduce(&pcbddc->new_primal_space_local, &pcbddc->new_primal_space, 1, MPI_C_B… in PCBDDCConstraintsSetUp()
7532 if (pcbddc->dbg_flag) PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCConstraintsSetUp()
7537 if (!pcbddc->adaptive_selection) { in PCBDDCConstraintsSetUp()
7541 …(pcbddc->adaptive_constraints_n, pcbddc->adaptive_constraints_idxs_ptr, pcbddc->adaptive_constrain… in PCBDDCConstraintsSetUp()
7551 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCAnalyzeInterface() local
7557 if (pcbddc->recompute_topography) { in PCBDDCAnalyzeInterface()
7558 pcbddc->graphanalyzed = PETSC_FALSE; in PCBDDCAnalyzeInterface()
7560 PetscCall(PCBDDCGraphReset(pcbddc->mat_graph)); in PCBDDCAnalyzeInterface()
7564 PetscCall(PCBDDCGraphInit(pcbddc->mat_graph, map, N, pcbddc->graphmaxcount)); in PCBDDCAnalyzeInterface()
7566 …if (pcbddc->user_primal_vertices_local && !pcbddc->user_primal_vertices) PetscCall(PCBDDCConsisten… in PCBDDCAnalyzeInterface()
7568pcbddc->mat_graph->nvtxs_csr || pcbddc->mat_graph->nvtxs_csr == pcbddc->mat_graph->nvtxs, PETSC_CO… in PCBDDCAnalyzeInterface()
7569 pcbddc->mat_graph->nvtxs); in PCBDDCAnalyzeInterface()
7572 if (!pcbddc->mat_graph->xadj && pcbddc->use_local_adj) { in PCBDDCAnalyzeInterface()
7580 for (PetscInt i = 0; i < pcbddc->local_adj_square; i++) { in PCBDDCAnalyzeInterface()
7597 pcbddc->computed_rowadj = PETSC_TRUE; in PCBDDCAnalyzeInterface()
7603 if (pcbddc->dbg_flag) PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCAnalyzeInterface()
7605 if (pcbddc->mat_graph->cdim && !pcbddc->mat_graph->cloc) { in PCBDDCAnalyzeInterface()
7612pcbddc->mat_graph->cnloc == pc->pmat->rmap->n, PETSC_COMM_SELF, PETSC_ERR_USER, "Invalid number of… in PCBDDCAnalyzeInterface()
7614 PetscCall(PetscMalloc1(pcbddc->mat_graph->cdim * n, &lcoords)); in PCBDDCAnalyzeInterface()
7615 PetscCall(PetscMPIIntCast(pcbddc->mat_graph->cdim, &cdimi)); in PCBDDCAnalyzeInterface()
7618 …PetscCall(PetscSFBcastBegin(matis->sf, dimrealtype, pcbddc->mat_graph->coords, lcoords, MPI_REPLAC… in PCBDDCAnalyzeInterface()
7619 …PetscCall(PetscSFBcastEnd(matis->sf, dimrealtype, pcbddc->mat_graph->coords, lcoords, MPI_REPLACE)… in PCBDDCAnalyzeInterface()
7621 PetscCall(PetscFree(pcbddc->mat_graph->coords)); in PCBDDCAnalyzeInterface()
7623 pcbddc->mat_graph->coords = lcoords; in PCBDDCAnalyzeInterface()
7624 pcbddc->mat_graph->cloc = PETSC_TRUE; in PCBDDCAnalyzeInterface()
7625 pcbddc->mat_graph->cnloc = n; in PCBDDCAnalyzeInterface()
7627pcbddc->mat_graph->cnloc || pcbddc->mat_graph->cnloc == pcbddc->mat_graph->nvtxs, PETSC_COMM_SELF,… in PCBDDCAnalyzeInterface()
7628 pcbddc->mat_graph->nvtxs); in PCBDDCAnalyzeInterface()
7629pcbddc->mat_graph->active_coords = (PetscBool)(pcbddc->corner_selection && pcbddc->mat_graph->cdim… in PCBDDCAnalyzeInterface()
7632 if (pcbddc->n_local_subs) { in PCBDDCAnalyzeInterface()
7637 for (i = 0; i < n; i++) local_subs[i] = pcbddc->n_local_subs; in PCBDDCAnalyzeInterface()
7638 for (i = 0; i < pcbddc->n_local_subs; i++) { in PCBDDCAnalyzeInterface()
7642 PetscCall(ISGetLocalSize(pcbddc->local_subs[i], &nl)); in PCBDDCAnalyzeInterface()
7643 PetscCall(ISGetIndices(pcbddc->local_subs[i], &idxs)); in PCBDDCAnalyzeInterface()
7645 PetscCall(ISRestoreIndices(pcbddc->local_subs[i], &idxs)); in PCBDDCAnalyzeInterface()
7648 pcbddc->mat_graph->n_local_subs = totn + 1; in PCBDDCAnalyzeInterface()
7649 pcbddc->mat_graph->local_subs = local_subs; in PCBDDCAnalyzeInterface()
7653pcbddc->mat_graph, pcbddc->vertex_size, pcbddc->NeumannBoundariesLocal, pcbddc->DirichletBoundarie… in PCBDDCAnalyzeInterface()
7656 if (!pcbddc->graphanalyzed) { in PCBDDCAnalyzeInterface()
7658 PetscCall(PCBDDCGraphComputeConnectedComponents(pcbddc->mat_graph)); in PCBDDCAnalyzeInterface()
7659 pcbddc->graphanalyzed = PETSC_TRUE; in PCBDDCAnalyzeInterface()
7660 pcbddc->corner_selected = pcbddc->corner_selection; in PCBDDCAnalyzeInterface()
7662 if (rcsr) pcbddc->mat_graph->nvtxs_csr = 0; in PCBDDCAnalyzeInterface()
8514 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetUpCoarseSolver() local
8516 PCBDDCGraph graph = pcbddc->mat_graph; in PCBDDCSetUpCoarseSolver()
8539 PetscCall(PetscLogEventBegin(PC_BDDC_CoarseSetUp[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpCoarseSolver()
8541 …if (pcbddc->new_primal_space || pcbddc->coarse_size == -1) { /* a new primal space is present or i… in PCBDDCSetUpCoarseSolver()
8545 pcbddc->new_primal_space = PETSC_TRUE; in PCBDDCSetUpCoarseSolver()
8546 ocoarse_size = pcbddc->coarse_size; in PCBDDCSetUpCoarseSolver()
8547 PetscCall(PetscFree(pcbddc->global_primal_indices)); in PCBDDCSetUpCoarseSolver()
8548 … PetscCall(PCBDDCComputePrimalNumbering(pc, &pcbddc->coarse_size, &pcbddc->global_primal_indices)); in PCBDDCSetUpCoarseSolver()
8550 if (pcbddc->coarse_ksp) { /* coarse ksp has already been created */ in PCBDDCSetUpCoarseSolver()
8552 if (ocoarse_size != pcbddc->coarse_size || pcbddc->adaptive_selection) { in PCBDDCSetUpCoarseSolver()
8553 PetscCall(KSPReset(pcbddc->coarse_ksp)); in PCBDDCSetUpCoarseSolver()
8562 …if (!coarse_reuse || pcbddc->recompute_topography) PetscCall(ISDestroy(&pcbddc->coarse_subassembli… in PCBDDCSetUpCoarseSolver()
8566 if (coarse_reuse && pcbddc->coarse_ksp) { in PCBDDCSetUpCoarseSolver()
8567 PetscCall(KSPGetOperators(pcbddc->coarse_ksp, &coarse_mat, NULL)); in PCBDDCSetUpCoarseSolver()
8576 …PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)pc), pcbddc->local_primal_size, pcbddc->glo… in PCBDDCSetUpCoarseSolver()
8582 …PetscCall(MatSetSizes(t_coarse_mat_is, PETSC_DECIDE, PETSC_DECIDE, pcbddc->coarse_size, pcbddc->co… in PCBDDCSetUpCoarseSolver()
8601 coarse_eqs_per_proc = PetscMin(PetscMax(pcbddc->coarse_size, 1), pcbddc->coarse_eqs_per_proc); in PCBDDCSetUpCoarseSolver()
8602 if (coarse_eqs_per_proc < 0 || size == 1) coarse_eqs_per_proc = PetscMax(pcbddc->coarse_size, 1); in PCBDDCSetUpCoarseSolver()
8603 if (pcbddc->current_level < pcbddc->max_levels) multilevel_requested = PETSC_TRUE; in PCBDDCSetUpCoarseSolver()
8604 if (pcbddc->coarse_size <= pcbddc->coarse_eqs_limit) multilevel_requested = PETSC_FALSE; in PCBDDCSetUpCoarseSolver()
8605 coarsening_ratio = multi_element ? 1 : pcbddc->coarsening_ratio; in PCBDDCSetUpCoarseSolver()
8611 …ncoarse = pcbddc->coarse_size / coarse_eqs_per_proc + !!(pcbddc->coarse_size % coarse_eqs_per_p… in PCBDDCSetUpCoarseSolver()
8615 …if (!pcbddc->coarse_size || (size == 1 && !multi_element)) multilevel_allowed = multilevel_request… in PCBDDCSetUpCoarseSolver()
8617 if (!pcbddc->coarse_subassembling) { in PCBDDCSetUpCoarseSolver()
8620 …cCall(PCBDDCMatISGetSubassemblingPattern(pc->pmat, &ncoarse, pcbddc->coarse_adj_red, &pcbddc->coar… in PCBDDCSetUpCoarseSolver()
8622 …CBDDCMatISGetSubassemblingPattern(t_coarse_mat_is, &ncoarse, pcbddc->coarse_adj_red, &pcbddc->coar… in PCBDDCSetUpCoarseSolver()
8629 …PetscCall(ISCreateStride(PetscObjectComm((PetscObject)pc), 1, rank, 1, &pcbddc->coarse_subassembli… in PCBDDCSetUpCoarseSolver()
8630 … PetscCall(PetscObjectSetName((PetscObject)pcbddc->coarse_subassembling, "default subassembling")); in PCBDDCSetUpCoarseSolver()
8634 if (pcbddc->coarse_ksp) psum = 1; in PCBDDCSetUpCoarseSolver()
8647 …if (pcbddc->dbg_flag && multilevel_allowed) PetscCall(ISView(pcbddc->coarse_subassembling, pcbddc-… in PCBDDCSetUpCoarseSolver()
8651 …el_allowed && !coarse_reuse && (pcbddc->n_ISForDofsLocal || pcbddc->NeumannBoundariesLocal || pcbd… in PCBDDCSetUpCoarseSolver()
8657 …PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_SELF, 1, pcbddc->local_primal_size, pcbddc->prim… in PCBDDCSetUpCoarseSolver()
8659 PetscCall(PetscMalloc1(pcbddc->local_primal_size, &tidxs)); in PCBDDCSetUpCoarseSolver()
8660 PetscCall(PetscMalloc1(pcbddc->local_primal_size, &tidxs2)); in PCBDDCSetUpCoarseSolver()
8662 nisdofs = pcbddc->n_ISForDofsLocal; in PCBDDCSetUpCoarseSolver()
8663 if (pcbddc->nedclocal) { in PCBDDCSetUpCoarseSolver()
8664 if (pcbddc->nedfield > -1) { in PCBDDCSetUpCoarseSolver()
8665 nedcfield = pcbddc->nedfield; in PCBDDCSetUpCoarseSolver()
8672 nisneu = !!pcbddc->NeumannBoundariesLocal; in PCBDDCSetUpCoarseSolver()
8680 PetscCall(ISGetLocalSize(pcbddc->ISForDofsLocal[i], &tsize)); in PCBDDCSetUpCoarseSolver()
8681 PetscCall(ISGetIndices(pcbddc->ISForDofsLocal[i], &idxs)); in PCBDDCSetUpCoarseSolver()
8683 PetscCall(ISRestoreIndices(pcbddc->ISForDofsLocal[i], &idxs)); in PCBDDCSetUpCoarseSolver()
8685 PetscCall(ISGetLocalSize(pcbddc->nedclocal, &tsize)); in PCBDDCSetUpCoarseSolver()
8686 PetscCall(ISGetIndices(pcbddc->nedclocal, &idxs)); in PCBDDCSetUpCoarseSolver()
8689 PetscCall(ISRestoreIndices(pcbddc->nedclocal, &idxs)); in PCBDDCSetUpCoarseSolver()
8696 if (pcbddc->NeumannBoundariesLocal) { in PCBDDCSetUpCoarseSolver()
8698 PetscCall(ISGetLocalSize(pcbddc->NeumannBoundariesLocal, &tsize)); in PCBDDCSetUpCoarseSolver()
8699 PetscCall(ISGetIndices(pcbddc->NeumannBoundariesLocal, &idxs)); in PCBDDCSetUpCoarseSolver()
8701 PetscCall(ISRestoreIndices(pcbddc->NeumannBoundariesLocal, &idxs)); in PCBDDCSetUpCoarseSolver()
8707 if (pcbddc->corner_selected) { in PCBDDCSetUpCoarseSolver()
8708 PetscCall(PCBDDCGraphGetCandidatesIS(pcbddc->mat_graph, NULL, NULL, NULL, NULL, &corners)); in PCBDDCSetUpCoarseSolver()
8714 … PetscCall(PCBDDCGraphRestoreCandidatesIS(pcbddc->mat_graph, NULL, NULL, NULL, NULL, &corners)); in PCBDDCSetUpCoarseSolver()
8739 if (pcbddc->benign_have_null) { /* propagate no-net-flux quadrature to coarser level */ in PCBDDCSetUpCoarseSolver()
8741 PetscCall(VecSetSizes(vp[0], pcbddc->local_primal_size, PETSC_DECIDE)); in PCBDDCSetUpCoarseSolver()
8745 if (pcbddc->divudotp) { in PCBDDCSetUpCoarseSolver()
8751 PetscCall(MatISGetLocalMat(pcbddc->divudotp, &loc_divudotp)); in PCBDDCSetUpCoarseSolver()
8761 PetscCall(VecPlaceArray(pcbddc->vec1_P, array)); in PCBDDCSetUpCoarseSolver()
8762 PetscCall(MatMultTranspose(pcbddc->coarse_phi_B, v, pcbddc->vec1_P)); in PCBDDCSetUpCoarseSolver()
8763 PetscCall(VecResetArray(pcbddc->vec1_P)); in PCBDDCSetUpCoarseSolver()
8777 …PetscCall(PCBDDCMatISSubassemble(t_coarse_mat_is, pcbddc->coarse_subassembling, 0, restr, full_res… in PCBDDCSetUpCoarseSolver()
8779 …PetscCall(PCBDDCMatISSubassemble(t_coarse_mat_is, pcbddc->coarse_subassembling, 0, restr, full_res… in PCBDDCSetUpCoarseSolver()
8800 …PetscCall(PetscStrcmp(((PetscObject)pcbddc->coarse_subassembling)->name, "default subassembling", … in PCBDDCSetUpCoarseSolver()
8801 …if (!default_sub) PetscCall(PCBDDCMatISSubassemble(t_coarse_mat_is, pcbddc->coarse_subassembling, … in PCBDDCSetUpCoarseSolver()
8825 PetscCall(VecDestroy(&pcbddc->coarse_vec)); in PCBDDCSetUpCoarseSolver()
8831 PetscCall(VecCreate(PetscObjectComm((PetscObject)pc), &pcbddc->coarse_vec)); in PCBDDCSetUpCoarseSolver()
8832 PetscCall(VecSetSizes(pcbddc->coarse_vec, lrows, PETSC_DECIDE)); in PCBDDCSetUpCoarseSolver()
8833 … PetscCall(VecSetType(pcbddc->coarse_vec, coarse_mat ? coarse_mat->defaultvectype : VECSTANDARD)); in PCBDDCSetUpCoarseSolver()
8834 PetscCall(VecScatterDestroy(&pcbddc->coarse_loc_to_glob)); in PCBDDCSetUpCoarseSolver()
8835 …PetscCall(VecScatterCreate(pcbddc->vec1_P, NULL, pcbddc->coarse_vec, coarse_is, &pcbddc->coarse_lo… in PCBDDCSetUpCoarseSolver()
8849 if (pcbddc->dbg_flag) { in PCBDDCSetUpCoarseSolver()
8851 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "--------------------------------------------… in PCBDDCSetUpCoarseSolver()
8853pcbddc->dbg_viewer, "Not enough active processes on level %" PetscInt_FMT " (active processes %" P… in PCBDDCSetUpCoarseSolver()
8854 } else if (pcbddc->max_levels) { in PCBDDCSetUpCoarseSolver()
8855 …cCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "Maximum number of requested levels reached (%" P… in PCBDDCSetUpCoarseSolver()
8857 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCSetUpCoarseSolver()
8863 if (pcbddc->nedcG && multilevel_allowed) { in PCBDDCSetUpCoarseSolver()
8870 PetscCall(MatMPIAIJRestrict(pcbddc->nedcG, ccomm, &coarseG)); in PCBDDCSetUpCoarseSolver()
8879 if (pcbddc->dbg_flag) { in PCBDDCSetUpCoarseSolver()
8881 PetscCall(PetscViewerASCIIAddTab(dbg_viewer, 2 * pcbddc->current_level)); in PCBDDCSetUpCoarseSolver()
8883 if (!pcbddc->coarse_ksp) { in PCBDDCSetUpCoarseSolver()
8887 PetscCall(KSPCreate(PetscObjectComm((PetscObject)coarse_mat), &pcbddc->coarse_ksp)); in PCBDDCSetUpCoarseSolver()
8888 PetscCall(KSPSetNestLevel(pcbddc->coarse_ksp, pc->kspnestlevel)); in PCBDDCSetUpCoarseSolver()
8889 PetscCall(KSPSetErrorIfNotConverged(pcbddc->coarse_ksp, pc->erroriffailure)); in PCBDDCSetUpCoarseSolver()
8890 PetscCall(PetscObjectIncrementTabLevel((PetscObject)pcbddc->coarse_ksp, (PetscObject)pc, 1)); in PCBDDCSetUpCoarseSolver()
8891 … PetscCall(KSPSetTolerances(pcbddc->coarse_ksp, PETSC_CURRENT, PETSC_CURRENT, PETSC_CURRENT, 1)); in PCBDDCSetUpCoarseSolver()
8892 PetscCall(KSPSetOperators(pcbddc->coarse_ksp, coarse_mat, coarse_mat)); in PCBDDCSetUpCoarseSolver()
8893 PetscCall(KSPSetType(pcbddc->coarse_ksp, coarse_ksp_type)); in PCBDDCSetUpCoarseSolver()
8894 PetscCall(KSPSetNormType(pcbddc->coarse_ksp, KSP_NORM_NONE)); in PCBDDCSetUpCoarseSolver()
8895 PetscCall(KSPGetPC(pcbddc->coarse_ksp, &pc_temp)); in PCBDDCSetUpCoarseSolver()
8901 if (!pcbddc->current_level) { in PCBDDCSetUpCoarseSolver()
8906 if (pcbddc->current_level > 1) len -= 3; /* remove "lX_" with X level number */ in PCBDDCSetUpCoarseSolver()
8907 if (pcbddc->current_level > 10) len -= 1; /* remove another char from level number */ in PCBDDCSetUpCoarseSolver()
8910 …PetscCall(PetscSNPrintf(str_level, sizeof(str_level), "l%" PetscInt_FMT "_", pcbddc->current_level… in PCBDDCSetUpCoarseSolver()
8913 PetscCall(KSPSetOptionsPrefix(pcbddc->coarse_ksp, prefix)); in PCBDDCSetUpCoarseSolver()
8915 PetscCall(PCBDDCSetLevel(pc_temp, pcbddc->current_level + 1)); in PCBDDCSetUpCoarseSolver()
8916 PetscCall(PCBDDCSetCoarseningRatio(pc_temp, pcbddc->coarsening_ratio)); in PCBDDCSetUpCoarseSolver()
8917 PetscCall(PCBDDCSetLevels(pc_temp, pcbddc->max_levels)); in PCBDDCSetUpCoarseSolver()
8919 PetscCall(KSPSetFromOptions(pcbddc->coarse_ksp)); in PCBDDCSetUpCoarseSolver()
8921 PetscCall(KSPGetPC(pcbddc->coarse_ksp, &pc_temp)); in PCBDDCSetUpCoarseSolver()
8930 PetscCall(PCBDDCSetLevel(pc_temp, pcbddc->current_level + 1)); in PCBDDCSetUpCoarseSolver()
8931 PetscCall(PCBDDCSetCoarseningRatio(pc_temp, pcbddc->coarsening_ratio)); in PCBDDCSetUpCoarseSolver()
8932 PetscCall(PCBDDCSetLevels(pc_temp, pcbddc->max_levels)); in PCBDDCSetUpCoarseSolver()
8943 PetscCall(KSPGetPC(pcbddc->coarse_ksp, &pc_temp)); in PCBDDCSetUpCoarseSolver()
8983 pcbddc_coarse->coarse_eqs_per_proc = pcbddc->coarse_eqs_per_proc; in PCBDDCSetUpCoarseSolver()
8984 pcbddc_coarse->coarse_eqs_limit = pcbddc->coarse_eqs_limit; in PCBDDCSetUpCoarseSolver()
8985 pcbddc_coarse->benign_saddle_point = pcbddc->benign_have_null; in PCBDDCSetUpCoarseSolver()
9019 if (pcbddc->adaptive_threshold[0] == 0.0) pcbddc_coarse->deluxe_zerorows = PETSC_TRUE; in PCBDDCSetUpCoarseSolver()
9032 …if (pcbddc->benign_saddle_point && !pcbddc->benign_have_null) PetscCall(MatSetOption(coarse_mat, M… in PCBDDCSetUpCoarseSolver()
9035 PetscCall(MatSetOptionsPrefix(coarse_mat, ((PetscObject)pcbddc->coarse_ksp)->prefix)); in PCBDDCSetUpCoarseSolver()
9036 PetscCall(KSPSetOperators(pcbddc->coarse_ksp, coarse_mat, coarse_mat)); in PCBDDCSetUpCoarseSolver()
9037 …if (pcbddc->dbg_flag) PetscCall(PetscViewerASCIISubtractTab(dbg_viewer, 2 * pcbddc->current_level)… in PCBDDCSetUpCoarseSolver()
9045 …intf(filename, PETSC_STATIC_ARRAY_LENGTH(filename), "coarse_mat_level%d.m",pcbddc->current_level)); in PCBDDCSetUpCoarseSolver()
9058 PetscInt i, d, N, n, cdim = pcbddc->mat_graph->cdim; in PCBDDCSetUpCoarseSolver()
9061 … PetscCheck(pcbddc->mat_graph->cloc, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Missing local coordinates"); in PCBDDCSetUpCoarseSolver()
9062 PetscCall(VecGetSize(pcbddc->coarse_vec, &N)); in PCBDDCSetUpCoarseSolver()
9063 PetscCall(VecGetLocalSize(pcbddc->coarse_vec, &n)); in PCBDDCSetUpCoarseSolver()
9064 PetscCall(VecCreate(PetscObjectComm((PetscObject)pcbddc->coarse_vec), &gv)); in PCBDDCSetUpCoarseSolver()
9071 PetscCall(PCBDDCGraphGetCandidatesIS(pcbddc->mat_graph, NULL, NULL, NULL, NULL, &is)); in PCBDDCSetUpCoarseSolver()
9076 … for (d = 0; d < cdim; d++) coords[cdim * i + d] = pcbddc->mat_graph->coords[cdim * idxs[i] + d]; in PCBDDCSetUpCoarseSolver()
9079 PetscCall(PCBDDCGraphRestoreCandidatesIS(pcbddc->mat_graph, NULL, NULL, NULL, NULL, &is)); in PCBDDCSetUpCoarseSolver()
9089 if (pcbddc->coarse_ksp) { in PCBDDCSetUpCoarseSolver()
9093 PetscCall(KSPGetPC(pcbddc->coarse_ksp, &coarse_pc)); in PCBDDCSetUpCoarseSolver()
9116 if (pcbddc->coarse_ksp) { in PCBDDCSetUpCoarseSolver()
9119 PetscCall(KSPGetSolution(pcbddc->coarse_ksp, &csol)); in PCBDDCSetUpCoarseSolver()
9120 PetscCall(KSPGetRhs(pcbddc->coarse_ksp, &crhs)); in PCBDDCSetUpCoarseSolver()
9121 if (!csol) PetscCall(MatCreateVecs(coarse_mat, &pcbddc->coarse_ksp->vec_sol, NULL)); in PCBDDCSetUpCoarseSolver()
9122 if (!crhs) PetscCall(MatCreateVecs(coarse_mat, NULL, &pcbddc->coarse_ksp->vec_rhs)); in PCBDDCSetUpCoarseSolver()
9127 if (pcbddc->benign_null) { in PCBDDCSetUpCoarseSolver()
9128 PetscCall(VecSet(pcbddc->vec1_P, 0.)); in PCBDDCSetUpCoarseSolver()
9129 …for (i = 0; i < pcbddc->benign_n; i++) PetscCall(VecSetValue(pcbddc->vec1_P, pcbddc->local_primal_… in PCBDDCSetUpCoarseSolver()
9130 PetscCall(VecAssemblyBegin(pcbddc->vec1_P)); in PCBDDCSetUpCoarseSolver()
9131 PetscCall(VecAssemblyEnd(pcbddc->vec1_P)); in PCBDDCSetUpCoarseSolver()
9132 …PetscCall(VecScatterBegin(pcbddc->coarse_loc_to_glob, pcbddc->vec1_P, pcbddc->coarse_vec, INSERT_V… in PCBDDCSetUpCoarseSolver()
9133 …PetscCall(VecScatterEnd(pcbddc->coarse_loc_to_glob, pcbddc->vec1_P, pcbddc->coarse_vec, INSERT_VAL… in PCBDDCSetUpCoarseSolver()
9141 PetscCall(VecGetArrayRead(pcbddc->coarse_vec, (const PetscScalar **)&array)); in PCBDDCSetUpCoarseSolver()
9145 PetscCall(VecRestoreArrayRead(pcbddc->coarse_vec, (const PetscScalar **)&array)); in PCBDDCSetUpCoarseSolver()
9151 PetscCall(PetscLogEventEnd(PC_BDDC_CoarseSetUp[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpCoarseSolver()
9153 PetscCall(PetscLogEventBegin(PC_BDDC_CoarseSolver[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpCoarseSolver()
9154 if (pcbddc->coarse_ksp) { in PCBDDCSetUpCoarseSolver()
9165 PetscCall(KSPSetUp(pcbddc->coarse_ksp)); in PCBDDCSetUpCoarseSolver()
9167 PetscCall(PetscObjectTypeCompare((PetscObject)pcbddc->coarse_ksp, KSPPREONLY, &ispreonly)); in PCBDDCSetUpCoarseSolver()
9168 if (pcbddc->dbg_flag || (!ispreonly && pcbddc->use_coarse_estimates)) { in PCBDDCSetUpCoarseSolver()
9181 PetscCall(KSPCreate(PetscObjectComm((PetscObject)pcbddc->coarse_ksp), &check_ksp)); in PCBDDCSetUpCoarseSolver()
9183 …PetscCall(PetscObjectIncrementTabLevel((PetscObject)check_ksp, (PetscObject)pcbddc->coarse_ksp, 0)… in PCBDDCSetUpCoarseSolver()
9184 PetscCall(KSPSetErrorIfNotConverged(pcbddc->coarse_ksp, PETSC_FALSE)); in PCBDDCSetUpCoarseSolver()
9186 PetscCall(KSPSetTolerances(check_ksp, 1.e-12, 1.e-12, PETSC_CURRENT, pcbddc->coarse_size)); in PCBDDCSetUpCoarseSolver()
9200 PetscCall(KSPGMRESSetRestart(check_ksp, pcbddc->coarse_size + 1)); in PCBDDCSetUpCoarseSolver()
9201 PetscCall(KSPGetOptionsPrefix(pcbddc->coarse_ksp, &prefix)); in PCBDDCSetUpCoarseSolver()
9206 PetscCall(KSPGetPC(pcbddc->coarse_ksp, &check_pc)); in PCBDDCSetUpCoarseSolver()
9217 PetscCall(PetscMalloc1(pcbddc->coarse_size + 1, &eigs_r)); in PCBDDCSetUpCoarseSolver()
9218 PetscCall(PetscMalloc1(pcbddc->coarse_size + 1, &eigs_c)); in PCBDDCSetUpCoarseSolver()
9219 … PetscCall(KSPComputeEigenvalues(check_ksp, pcbddc->coarse_size + 1, eigs_r, eigs_c, &neigs)); in PCBDDCSetUpCoarseSolver()
9223 if (pcbddc->use_coarse_estimates) { in PCBDDCSetUpCoarseSolver()
9225 … PetscCall(KSPChebyshevSetEigenvalues(pcbddc->coarse_ksp, lambda_max + PETSC_SMALL, lambda_min)); in PCBDDCSetUpCoarseSolver()
9226 PetscCall(KSPRichardsonSetScale(pcbddc->coarse_ksp, 2.0 / (lambda_max + lambda_min))); in PCBDDCSetUpCoarseSolver()
9233 if (pcbddc->dbg_flag) { in PCBDDCSetUpCoarseSolver()
9234 … PetscViewer dbg_viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)pcbddc->coarse_ksp)); in PCBDDCSetUpCoarseSolver()
9235 PetscCall(PetscViewerASCIIAddTab(dbg_viewer, 2 * (pcbddc->current_level + 1))); in PCBDDCSetUpCoarseSolver()
9240 …erASCIIPrintf(dbg_viewer, "Coarse problem details (use estimates %d)\n", pcbddc->use_coarse_estima… in PCBDDCSetUpCoarseSolver()
9241 PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)pcbddc->coarse_ksp, dbg_viewer)); in PCBDDCSetUpCoarseSolver()
9257 PetscCall(PetscViewerASCIISubtractTab(dbg_viewer, 2 * (pcbddc->current_level + 1))); in PCBDDCSetUpCoarseSolver()
9270 if (pcbddc->dbg_flag) { in PCBDDCSetUpCoarseSolver()
9273 …etscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "Coarse solver setup completed at level %" Pet… in PCBDDCSetUpCoarseSolver()
9274 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCSetUpCoarseSolver()
9279 PetscCall(PetscLogEventEnd(PC_BDDC_CoarseSolver[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpCoarseSolver()
9285 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCComputePrimalNumbering() local
9294 …PetscCheck(!pcbddc->local_primal_size || pcbddc->local_primal_ref_node, PETSC_COMM_SELF, PETSC_ERR… in PCBDDCComputePrimalNumbering()
9295 …l(ISCreateGeneral(PetscObjectComm((PetscObject)pc->pmat), pcbddc->local_primal_size_cc, pcbddc->lo… in PCBDDCComputePrimalNumbering()
9298 …l(ISCreateGeneral(PetscObjectComm((PetscObject)pc->pmat), pcbddc->local_primal_size_cc, pcbddc->lo… in PCBDDCComputePrimalNumbering()
9303pcbddc->local_primal_size, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of local primal indice… in PCBDDCComputePrimalNumbering()
9310 if (pcbddc->dbg_flag) { in PCBDDCComputePrimalNumbering()
9311 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCComputePrimalNumbering()
9312 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "--------------------------------------------… in PCBDDCComputePrimalNumbering()
9313 …PetscCall(PetscViewerASCIIPrintf(pcbddc->dbg_viewer, "Size of coarse problem is %" PetscInt_FMT "\… in PCBDDCComputePrimalNumbering()
9314 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCComputePrimalNumbering()
9366 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCComputeFakeChange() local
9387 pcbddcf->mat_graph = graph ? graph : pcbddc->mat_graph; in PCBDDCComputeFakeChange()
9390 pcbddcf->adaptive_threshold[0] = pcbddc->adaptive_threshold[0]; in PCBDDCComputeFakeChange()
9391 pcbddcf->adaptive_threshold[1] = pcbddc->adaptive_threshold[1]; in PCBDDCComputeFakeChange()
9392 pcbddcf->adaptive_nmin = pcbddc->adaptive_nmin; in PCBDDCComputeFakeChange()
9393 pcbddcf->adaptive_nmax = pcbddc->adaptive_nmax; in PCBDDCComputeFakeChange()
9399 pcbddcf->dbg_flag = pcbddc->dbg_flag; in PCBDDCComputeFakeChange()
9422 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCSetUpSubSchurs() local
9423 PCBDDCSubSchurs sub_schurs = pcbddc->sub_schurs; in PCBDDCSetUpSubSchurs()
9429 PetscCall(PetscLogEventBegin(PC_BDDC_Schurs[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpSubSchurs()
9432 if (pcbddc->sub_schurs_layers == -1) { in PCBDDCSetUpSubSchurs()
9436 if (pcbddc->sub_schurs_use_useradj && pcbddc->mat_graph->xadj) { in PCBDDCSetUpSubSchurs()
9437 used_xadj = pcbddc->mat_graph->xadj; in PCBDDCSetUpSubSchurs()
9438 used_adjncy = pcbddc->mat_graph->adjncy; in PCBDDCSetUpSubSchurs()
9439 } else if (pcbddc->computed_rowadj) { in PCBDDCSetUpSubSchurs()
9440 used_xadj = pcbddc->mat_graph->xadj; in PCBDDCSetUpSubSchurs()
9441 used_adjncy = pcbddc->mat_graph->adjncy; in PCBDDCSetUpSubSchurs()
9447 …PetscCall(MatGetRowIJ(pcbddc->local_mat, 0, PETSC_TRUE, PETSC_FALSE, &nvtxs, &xadj, &adjncy, &flg_… in PCBDDCSetUpSubSchurs()
9454 pcbddc->sub_schurs_layers = -1; in PCBDDCSetUpSubSchurs()
9458 …PetscCall(MatRestoreRowIJ(pcbddc->local_mat, 0, PETSC_TRUE, PETSC_FALSE, &nvtxs, &xadj, &adjncy, &… in PCBDDCSetUpSubSchurs()
9466 PetscCall(MatSchurComplementSetKSP(S_j, pcbddc->ksp_D)); in PCBDDCSetUpSubSchurs()
9467 …_schurs, NULL, S_j, PETSC_FALSE, used_xadj, used_adjncy, pcbddc->sub_schurs_layers, NULL, pcbddc->… in PCBDDCSetUpSubSchurs()
9473 PetscBool reuse_solvers = (PetscBool)!pcbddc->use_change_of_basis; in PCBDDCSetUpSubSchurs()
9477 if (!pcbddc->use_vertices && reuse_solvers) { in PCBDDCSetUpSubSchurs()
9483 if (!pcbddc->benign_change_explicit) { in PCBDDCSetUpSubSchurs()
9484 benign_n = pcbddc->benign_n; in PCBDDCSetUpSubSchurs()
9491 if (pcbddc->adaptive_userdefined || (pcbddc->deluxe_zerorows && !pcbddc->use_change_of_basis)) { in PCBDDCSetUpSubSchurs()
9498 …PetscCheck(!pcbddc->sub_schurs_rebuild, PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot compute change of … in PCBDDCSetUpSubSchurs()
9501 if (!pcbddc->use_deluxe_scaling) scaling = pcis->D; in PCBDDCSetUpSubSchurs()
9511 PetscCall(MatDuplicate(pcbddc->local_mat, MAT_COPY_VALUES, &A)); in PCBDDCSetUpSubSchurs()
9514pcbddc->sub_schurs_exact_schur, used_xadj, used_adjncy, pcbddc->sub_schurs_layers, scaling, pcbddc in PCBDDCSetUpSubSchurs()
9515 pcbddc->benign_zerodiag_subs, change, change_primal)); in PCBDDCSetUpSubSchurs()
9518pcbddc->local_mat, S_j, pcbddc->sub_schurs_exact_schur, used_xadj, used_adjncy, pcbddc->sub_schurs… in PCBDDCSetUpSubSchurs()
9519pcbddc->benign_p0_lidx, pcbddc->benign_zerodiag_subs, change, change_primal)); in PCBDDCSetUpSubSchurs()
9528 PetscCall(PetscLogEventEnd(PC_BDDC_Schurs[pcbddc->current_level], pc, 0, 0, 0)); in PCBDDCSetUpSubSchurs()
9535 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCInitSubSchurs() local
9540 …if (pcbddc->sub_schurs_rebuild) { /* in case rebuild has been requested, it uses a graph generated… in PCBDDCInitSubSchurs()
9544 PetscCall(PCBDDCGraphGetCandidatesIS(pcbddc->mat_graph, NULL, NULL, NULL, NULL, &verticesIS)); in PCBDDCInitSubSchurs()
9549 … PetscCall(PCBDDCGraphRestoreCandidatesIS(pcbddc->mat_graph, NULL, NULL, NULL, NULL, &verticesIS)); in PCBDDCInitSubSchurs()
9551 …PetscCall(PCBDDCGraphInit(graph, pcbddc->mat_graph->l2gmap, pcbddc->mat_graph->nvtxs_global, pcbdd… in PCBDDCInitSubSchurs()
9552 …PetscCall(PCBDDCGraphSetUp(graph, pcbddc->mat_graph->custom_minimal_size, NULL, pcbddc->DirichletB… in PCBDDCInitSubSchurs()
9556 graph = pcbddc->mat_graph; in PCBDDCInitSubSchurs()
9559 if (pcbddc->dbg_flag && !pcbddc->sub_schurs_rebuild) { in PCBDDCInitSubSchurs()
9562 PetscCall(PCBDDCGraphASCIIView(graph, pcbddc->dbg_flag, pcbddc->dbg_viewer)); in PCBDDCInitSubSchurs()
9565 PetscCall(PetscViewerASCIIPushSynchronized(pcbddc->dbg_viewer)); in PCBDDCInitSubSchurs()
9566 …PetscCall(PetscViewerASCIISynchronizedPrintf(pcbddc->dbg_viewer, "--------------------------------… in PCBDDCInitSubSchurs()
9567 …chronizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d got %02" PetscInt_FMT " local candidate vertic… in PCBDDCInitSubSchurs()
9568 …ronizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d got %02" PetscInt_FMT " local candidate edges … in PCBDDCInitSubSchurs()
9569 …ronizedPrintf(pcbddc->dbg_viewer, "Subdomain %04d got %02" PetscInt_FMT " local candidate faces … in PCBDDCInitSubSchurs()
9570 PetscCall(PetscViewerFlush(pcbddc->dbg_viewer)); in PCBDDCInitSubSchurs()
9571 PetscCall(PetscViewerASCIIPopSynchronized(pcbddc->dbg_viewer)); in PCBDDCInitSubSchurs()
9576 if (!pcbddc->sub_schurs) PetscCall(PCBDDCSubSchursCreate(&pcbddc->sub_schurs)); in PCBDDCInitSubSchurs()
9577 …(PCBDDCSubSchursInit(pcbddc->sub_schurs, ((PetscObject)pc)->prefix, pcis->is_I_local, pcis->is_B_l… in PCBDDCInitSubSchurs()
9580 if (pcbddc->sub_schurs_rebuild) PetscCall(PCBDDCGraphDestroy(&graph)); in PCBDDCInitSubSchurs()
9619 PC_BDDC *pcbddc = (PC_BDDC *)pc->data; in PCBDDCLoadOrViewCustomization() local
9685 header[0] = (PetscInt)!!pcbddc->DirichletBoundariesLocal; in PCBDDCLoadOrViewCustomization()
9686 header[1] = (PetscInt)!!pcbddc->NeumannBoundariesLocal; in PCBDDCLoadOrViewCustomization()
9687 header[2] = pcbddc->n_ISForDofsLocal; in PCBDDCLoadOrViewCustomization()
9688 header[3] = (PetscInt)!!pcbddc->user_primal_vertices_local; in PCBDDCLoadOrViewCustomization()
9689 header[4] = (PetscInt)!!pcbddc->discretegradient; in PCBDDCLoadOrViewCustomization()
9690 header[5] = pcbddc->nedorder; in PCBDDCLoadOrViewCustomization()
9691 header[6] = pcbddc->nedfield; in PCBDDCLoadOrViewCustomization()
9692 header[7] = (PetscInt)pcbddc->nedglobal; in PCBDDCLoadOrViewCustomization()
9693 header[8] = (PetscInt)pcbddc->conforming; in PCBDDCLoadOrViewCustomization()
9694 header[9] = (PetscInt)!!pcbddc->divudotp; in PCBDDCLoadOrViewCustomization()
9695 header[10] = (PetscInt)pcbddc->divudotp_trans; in PCBDDCLoadOrViewCustomization()
9699 PetscCall(PCBDDCViewGlobalIS(pc, pcbddc->DirichletBoundariesLocal, viewer)); in PCBDDCLoadOrViewCustomization()
9700 PetscCall(PCBDDCViewGlobalIS(pc, pcbddc->NeumannBoundariesLocal, viewer)); in PCBDDCLoadOrViewCustomization()
9701 …for (PetscInt i = 0; i < header[2]; i++) PetscCall(PCBDDCViewGlobalIS(pc, pcbddc->ISForDofsLocal[i… in PCBDDCLoadOrViewCustomization()
9702 if (header[3]) PetscCall(PCBDDCViewGlobalIS(pc, pcbddc->user_primal_vertices_local, viewer)); in PCBDDCLoadOrViewCustomization()
9703 if (header[4]) PetscCall(MatView(pcbddc->discretegradient, viewer)); in PCBDDCLoadOrViewCustomization()
9704 if (header[9]) PetscCall(MatView(pcbddc->divudotp, viewer)); in PCBDDCLoadOrViewCustomization()