Lines Matching refs:data
25 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCReset_HPDDM() local
28 if (data->levels) { in PCReset_HPDDM()
29 for (PetscInt i = 0; i < PETSC_PCHPDDM_MAXLEVELS && data->levels[i]; ++i) { in PCReset_HPDDM()
30 PetscCall(KSPDestroy(&data->levels[i]->ksp)); in PCReset_HPDDM()
31 PetscCall(PCDestroy(&data->levels[i]->pc)); in PCReset_HPDDM()
32 PetscCall(PetscFree(data->levels[i])); in PCReset_HPDDM()
34 PetscCall(PetscFree(data->levels)); in PCReset_HPDDM()
36 PetscCall(ISDestroy(&data->is)); in PCReset_HPDDM()
37 PetscCall(MatDestroy(&data->aux)); in PCReset_HPDDM()
38 PetscCall(MatDestroy(&data->B)); in PCReset_HPDDM()
39 PetscCall(VecDestroy(&data->normal)); in PCReset_HPDDM()
40 data->correction = PC_HPDDM_COARSE_CORRECTION_DEFLATED; in PCReset_HPDDM()
41 data->Neumann = PETSC_BOOL3_UNKNOWN; in PCReset_HPDDM()
42 data->deflation = PETSC_FALSE; in PCReset_HPDDM()
43 data->setup = nullptr; in PCReset_HPDDM()
44 data->setup_ctx = nullptr; in PCReset_HPDDM()
50 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCDestroy_HPDDM() local
54 PetscCall(PetscFree(data)); in PCDestroy_HPDDM()
70 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetAuxiliaryMat_Private() local
71 PCHPDDMCoarseCorrectionType type = data->correction; in PCHPDDMSetAuxiliaryMat_Private()
84 if (data->is) { /* new overlap definition resets the PC */ in PCHPDDMSetAuxiliaryMat_Private()
88 data->correction = type; in PCHPDDMSetAuxiliaryMat_Private()
90 PetscCall(ISDestroy(&data->is)); in PCHPDDMSetAuxiliaryMat_Private()
91 data->is = is; in PCHPDDMSetAuxiliaryMat_Private()
95 PetscCall(MatDestroy(&data->aux)); in PCHPDDMSetAuxiliaryMat_Private()
96 data->aux = A; in PCHPDDMSetAuxiliaryMat_Private()
98 data->deflation = deflation; in PCHPDDMSetAuxiliaryMat_Private()
121 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetAuxiliaryMatNormal_Private() local
196 data->Neumann = PETSC_BOOL3_TRUE; in PCHPDDMSetAuxiliaryMatNormal_Private()
204 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetAuxiliaryMat_HPDDM() local
209 data->setup = setup; in PCHPDDMSetAuxiliaryMat_HPDDM()
210 data->setup_ctx = setup_ctx; in PCHPDDMSetAuxiliaryMat_HPDDM()
258 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMHasNeumannMat_HPDDM() local
261 data->Neumann = PetscBoolToBool3(has); in PCHPDDMHasNeumannMat_HPDDM()
291 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetRHSMat_HPDDM() local
295 PetscCall(MatDestroy(&data->B)); in PCHPDDMSetRHSMat_HPDDM()
296 data->B = B; in PCHPDDMSetRHSMat_HPDDM()
328 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCSetFromOptions_HPDDM() local
329 PC_HPDDM_Level **levels = data->levels; in PCSetFromOptions_HPDDM()
338 if (!data->levels) { in PCSetFromOptions_HPDDM()
340 data->levels = levels; in PCSetFromOptions_HPDDM()
350 if (!data->levels[i - 1]) PetscCall(PetscNew(data->levels + i - 1)); in PCSetFromOptions_HPDDM()
351 data->levels[i - 1]->parent = data; in PCSetFromOptions_HPDDM()
354 data->levels[i - 1]->nu = 0; in PCSetFromOptions_HPDDM()
355 data->levels[i - 1]->threshold = -1.0; in PCSetFromOptions_HPDDM()
357 …of deflation vectors computed by SLEPc", "EPSSetDimensions", data->levels[i - 1]->nu, &data->level… in PCSetFromOptions_HPDDM()
361 …electing deflation vectors returned by SLEPc", "PCHPDDM", data->levels[i - 1]->threshold, &data->l… in PCSetFromOptions_HPDDM()
363 …PetscCheck(overlap == -1 || PetscAbsReal(data->levels[i - 1]->threshold + static_cast<PetscReal>(1… in PCSetFromOptions_HPDDM()
370 …PetscCheck(data->levels[0]->nu == 0 || nsv == 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot sup… in PCSetFromOptions_HPDDM()
371 if (data->levels[0]->nu == 0) { /* -eps_nev has not been used, so nu is 0 */ in PCSetFromOptions_HPDDM()
372 data->levels[0]->nu = nsv; /* nu may still be 0 if -svd_nsv has not been used */ in PCSetFromOptions_HPDDM()
376 … selecting deflation vectors returned by SLEPc", "PCHPDDM", data->levels[0]->threshold, &data->lev… in PCSetFromOptions_HPDDM()
378 … if (data->levels[0]->nu == 0 || nsv == 0) { /* if neither -eps_nev nor -svd_nsv has been used */ in PCSetFromOptions_HPDDM()
382 … selecting deflation vectors returned by SLEPc", "PCHPDDM", data->levels[0]->threshold, &data->lev… in PCSetFromOptions_HPDDM()
385 …PetscCheck(data->levels[0]->nu || PetscAbsReal(data->levels[i - 1]->threshold + static_cast<PetscR… in PCSetFromOptions_HPDDM()
400 … the fine-level subdomain solver", "PCHPDDMSetSTShareSubKSP", PETSC_FALSE, &data->share, nullptr)); in PCSetFromOptions_HPDDM()
403 …if (data->levels[i - 1]->threshold <= PetscReal() && data->levels[i - 1]->nu <= 0 && !(data->defla… in PCSetFromOptions_HPDDM()
421 data->N = i; in PCSetFromOptions_HPDDM()
443 …PCHPDDMSetCoarseCorrectionType", PCHPDDMCoarseCorrectionTypes, (PetscEnum)data->correction, (Petsc… in PCSetFromOptions_HPDDM()
446 … Mat the local Neumann matrix?", "PCHPDDMHasNeumannMat", PetscBool3ToBool(data->Neumann), &flg, &s… in PCSetFromOptions_HPDDM()
447 if (set) data->Neumann = PetscBoolToBool3(flg); in PCSetFromOptions_HPDDM()
448 data->log_separate = PETSC_FALSE; in PCSetFromOptions_HPDDM()
451 …evel by level instead of inside PCSetUp()/KSPSolve()", nullptr, data->log_separate, &data->log_sep… in PCSetFromOptions_HPDDM()
455 while (i < PETSC_PCHPDDM_MAXLEVELS && data->levels[i]) PetscCall(PetscFree(data->levels[i++])); in PCSetFromOptions_HPDDM()
462 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCApply_HPDDM() local
466 PetscCheck(data->levels[0]->ksp, PETSC_COMM_SELF, PETSC_ERR_PLIB, "No KSP attached to PCHPDDM"); in PCApply_HPDDM()
467 …if (data->log_separate) PetscCall(PetscLogEventBegin(PC_HPDDM_Solve[0], data->levels[0]->ksp, null… in PCApply_HPDDM()
468 if (!transpose) PetscCall(KSPSolve(data->levels[0]->ksp, x, y)); in PCApply_HPDDM()
469 else PetscCall(KSPSolveTranspose(data->levels[0]->ksp, x, y)); in PCApply_HPDDM()
470 …if (data->log_separate) PetscCall(PetscLogEventEnd(PC_HPDDM_Solve[0], data->levels[0]->ksp, nullpt… in PCApply_HPDDM()
477 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCMatApply_HPDDM() local
481 PetscCheck(data->levels[0]->ksp, PETSC_COMM_SELF, PETSC_ERR_PLIB, "No KSP attached to PCHPDDM"); in PCMatApply_HPDDM()
482 if (!transpose) PetscCall(KSPMatSolve(data->levels[0]->ksp, X, Y)); in PCMatApply_HPDDM()
483 else PetscCall(KSPMatSolveTranspose(data->levels[0]->ksp, X, Y)); in PCMatApply_HPDDM()
505 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMGetComplexities() local
518 for (PetscInt n = 0; n < data->N; ++n) { in PCHPDDMGetComplexities()
519 if (data->levels[n]->ksp) { in PCHPDDMGetComplexities()
524 PetscCall(KSPGetOperators(data->levels[n]->ksp, nullptr, &P)); in PCHPDDMGetComplexities()
559 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCView_HPDDM() local
572 …l(PetscViewerASCIIPrintf(viewer, "level%s: %" PetscInt_FMT "\n", data->N > 1 ? "s" : "", data->N)); in PCView_HPDDM()
574 if (data->N > 1) { in PCView_HPDDM()
575 if (!data->deflation) { in PCView_HPDDM()
576 …ASCIIPrintf(viewer, "Neumann matrix attached? %s\n", PetscBools[PetscBool3ToBool(data->Neumann)])); in PCView_HPDDM()
577 …SCIIPrintf(viewer, "shared subdomain KSP between SLEPc and PETSc? %s\n", PetscBools[data->share])); in PCView_HPDDM()
579 …werASCIIPrintf(viewer, "coarse correction: %s\n", PCHPDDMCoarseCorrectionTypes[data->correction])); in PCView_HPDDM()
580 … threshold%s if available) for selecting deflation vectors:", data->N > 2 ? "s" : "", data->N > 2 … in PCView_HPDDM()
583 for (PetscInt i = 1; i < data->N; ++i) { in PCView_HPDDM()
584 PetscCall(PetscViewerASCIIPrintf(viewer, " %" PetscInt_FMT, data->levels[i - 1]->nu)); in PCView_HPDDM()
585 …if (data->levels[i - 1]->threshold > static_cast<PetscReal>(-0.1)) PetscCall(PetscViewerASCIIPrint… in PCView_HPDDM()
592 if (data->levels[0]->ksp) { in PCView_HPDDM()
593 PetscCall(KSPView(data->levels[0]->ksp, viewer)); in PCView_HPDDM()
594 if (data->levels[0]->pc) PetscCall(PCView(data->levels[0]->pc, viewer)); in PCView_HPDDM()
596 for (PetscInt i = 1; i < data->N; ++i) { in PCView_HPDDM()
597 if (data->levels[i]->ksp) color = 1; in PCView_HPDDM()
605 PetscCall(KSPView(data->levels[i]->ksp, subviewer)); in PCView_HPDDM()
606 if (data->levels[i]->pc) PetscCall(PCView(data->levels[i]->pc, subviewer)); in PCView_HPDDM()
632 if (data->aux) { in PCView_HPDDM()
633 PetscCall(MatGetSize(data->aux, &m, &n)); in PCView_HPDDM()
636 PetscCall(PetscObjectBaseTypeCompare((PetscObject)data->aux, MATSEQAIJ, &flg)); in PCView_HPDDM()
639 PetscCall(PetscObjectBaseTypeCompare((PetscObject)data->aux, MATSEQBAIJ, &flg)); in PCView_HPDDM()
642 PetscCall(PetscObjectBaseTypeCompare((PetscObject)data->aux, MATSEQSBAIJ, &flg)); in PCView_HPDDM()
643 …any of the following: MATSEQAIJ, MATSEQBAIJ, or MATSEQSBAIJ", ((PetscObject)data->aux)->type_name); in PCView_HPDDM()
647 PetscCall(MatSetBlockSizesFromMats(aux[0], data->aux, data->aux)); in PCView_HPDDM()
651 PetscCall(MatCopy(data->aux, aux[1], DIFFERENT_NONZERO_PATTERN)); in PCView_HPDDM()
657 if (data->is) { in PCView_HPDDM()
658 PetscCall(ISGetIndices(data->is, &indices)); in PCView_HPDDM()
659 PetscCall(ISGetSize(data->is, sizes + 4)); in PCView_HPDDM()
665 PetscCall(ISRestoreIndices(data->is, &indices)); in PCView_HPDDM()
680 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCPreSolve_HPDDM() local
687 if (flg && !data->normal) { in PCPreSolve_HPDDM()
689 …PetscCall(MatCreateVecs(A, nullptr, &data->normal)); /* temporary Vec used in PCApply_HPDDMShell()… in PCPreSolve_HPDDM()
703 if (data->correction == PC_HPDDM_COARSE_CORRECTION_DEFLATED) { in PCPreSolve_HPDDM()
706 …ypes[data->correction], ((PetscObject)ksp)->type_name, ((PetscObject)pc)->prefix ? ((PetscObject)p… in PCPreSolve_HPDDM()
708 for (PetscInt n = 0; n < data->N; ++n) { in PCPreSolve_HPDDM()
709 if (data->levels[n]->pc) { in PCPreSolve_HPDDM()
710 PetscCall(PetscObjectTypeCompare((PetscObject)data->levels[n]->pc, PCASM, &flg)); in PCPreSolve_HPDDM()
714 PetscCall(PCASMGetType(data->levels[n]->pc, &type)); in PCPreSolve_HPDDM()
716 …PetscCall(PetscOptionsHasName(((PetscObject)data->levels[n]->pc)->options, ((PetscObject)data->lev… in PCPreSolve_HPDDM()
717 …PetscCheck(flg, PetscObjectComm((PetscObject)data->levels[n]->pc), PETSC_ERR_ARG_INCOMP, "PCASMTyp… in PCPreSolve_HPDDM()
718 …((PetscObject)ksp)->type_name, ((PetscObject)data->levels[n]->pc)->prefix, PCASMTypes[type], PCASM… in PCPreSolve_HPDDM()
1253 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetUpNeumannOverlap_Private() local
1256 if (data->setup) { in PCHPDDMSetUpNeumannOverlap_Private()
1263 …PetscCallBack("PCHPDDM Neumann callback", (*data->setup)(data->aux, t, x, xt, s, data->is, data->s… in PCHPDDMSetUpNeumannOverlap_Private()
1682 pc = ((PC_HPDDM *)std::get<0>(*ctx)[0]->data)->levels[0]->ksp->pc; in MatMult_SchurCorrection()
1767 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCSetUp_HPDDM() local
1773 IS is[1], loc, uis = data->is, unsorted = nullptr; in PCSetUp_HPDDM()
1778 PetscInt n, requested = data->N, reused = 0, overlap = -1; in PCSetUp_HPDDM()
1789 …PetscCheck(data->levels && data->levels[0], PETSC_COMM_SELF, PETSC_ERR_PLIB, "Not a single level a… in PCSetUp_HPDDM()
1792 if (!data->levels[0]->ksp) { in PCSetUp_HPDDM()
1793 PetscCall(KSPCreate(PetscObjectComm((PetscObject)pc), &data->levels[0]->ksp)); in PCSetUp_HPDDM()
1794 PetscCall(KSPSetNestLevel(data->levels[0]->ksp, pc->kspnestlevel)); in PCSetUp_HPDDM()
1795 …PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "%spc_hpddm_%s_", pcpre ? pcpre : "", data->N > 1 … in PCSetUp_HPDDM()
1796 PetscCall(KSPSetOptionsPrefix(data->levels[0]->ksp, prefix)); in PCSetUp_HPDDM()
1797 PetscCall(KSPSetType(data->levels[0]->ksp, KSPPREONLY)); in PCSetUp_HPDDM()
1798 …} else if (data->levels[0]->ksp->pc && data->levels[0]->ksp->pc->setupcalled && data->levels[0]->k… in PCSetUp_HPDDM()
1801 for (n = 0; n < PETSC_PCHPDDM_MAXLEVELS && data->levels[n]; ++n) { in PCSetUp_HPDDM()
1803 … if (data->levels[n]->ksp) PetscCall(KSPSetReusePreconditioner(data->levels[n]->ksp, PETSC_TRUE)); in PCSetUp_HPDDM()
1804 if (data->levels[n]->pc) PetscCall(PCSetReusePreconditioner(data->levels[n]->pc, PETSC_TRUE)); in PCSetUp_HPDDM()
1810 for (n = 1; n < PETSC_PCHPDDM_MAXLEVELS && data->levels[n]; ++n) { in PCSetUp_HPDDM()
1811 …(data->levels[n]->ksp && data->levels[n]->ksp->pc && data->levels[n]->ksp->pc->setupcalled && data… in PCSetUp_HPDDM()
1812 reused = data->N - n; in PCSetUp_HPDDM()
1815 PetscCall(KSPDestroy(&data->levels[n]->ksp)); in PCSetUp_HPDDM()
1816 PetscCall(PCDestroy(&data->levels[n]->pc)); in PCSetUp_HPDDM()
1820 const int *addr = data->levels[0]->P ? data->levels[0]->P->getAddrLocal() : &HPDDM::i__0; in PCSetUp_HPDDM()
1822 if (addr != &HPDDM::i__0 && reused != data->N - 1) { in PCSetUp_HPDDM()
1824 ev = data->levels[0]->P->getVectors(); in PCSetUp_HPDDM()
1827 … PetscCall(VecCreateSeqWithArray(PETSC_COMM_SELF, 1, data->levels[0]->P->getDof(), ev[0], &xin)); in PCSetUp_HPDDM()
1839 data->N -= reused; in PCSetUp_HPDDM()
1840 PetscCall(KSPSetOperators(data->levels[0]->ksp, A, P)); in PCSetUp_HPDDM()
1843 if (!data->is && !ismatis) { in PCSetUp_HPDDM()
1856 …if (data->Neumann == PETSC_BOOL3_UNKNOWN) data->Neumann = PETSC_BOOL3_TRUE; /* set the value only … in PCSetUp_HPDDM()
1888 if (data->is || flg) { in PCSetUp_HPDDM()
1890 PetscCall(ISDestroy(&data->is)); in PCSetUp_HPDDM()
1891 PetscCall(MatDestroy(&data->aux)); in PCSetUp_HPDDM()
1897 …PetscCall(ISDestroy(&data->is)); /* destroy any previously user-set objects since they will be set… in PCSetUp_HPDDM()
1898 PetscCall(MatDestroy(&data->aux)); in PCSetUp_HPDDM()
1919 data_00 = (PC_HPDDM *)pc_00->data; in PCSetUp_HPDDM()
1932 if (PetscDefined(USE_DEBUG) || !data->is) { in PCSetUp_HPDDM()
1952 } else if (!data->is) { in PCSetUp_HPDDM()
1960 if (!data->is) { in PCSetUp_HPDDM()
1970 PetscCall(MatFindNonzeroRows(C, &data->is)); in PCSetUp_HPDDM()
1971 …PetscCheck(data->is, PetscObjectComm((PetscObject)C), PETSC_ERR_SUP, "No empty row, which likely m… in PCSetUp_HPDDM()
1974 …PetscCall(ISCreateStride(PetscObjectComm((PetscObject)data->is), A11->rmap->n, A11->rmap->rstart, … in PCSetUp_HPDDM()
1975 …if (PetscDefined(USE_DEBUG)) PetscCall(PCHPDDMCheckInclusion_Private(pc, data->is, loc, PETSC_FALS… in PCSetUp_HPDDM()
1976 PetscCall(ISExpand(data->is, loc, is)); in PCSetUp_HPDDM()
1978 PetscCall(ISDestroy(&data->is)); in PCSetUp_HPDDM()
1979 data->is = is[0]; in PCSetUp_HPDDM()
1986 PetscCall(ISDuplicate(data->is, &uis)); in PCSetUp_HPDDM()
2001 if (!data->aux) { in PCSetUp_HPDDM()
2014 if ((PetscDefined(USE_DEBUG) || (data->Neumann != PETSC_BOOL3_TRUE && !flg)) && A11) { in PCSetUp_HPDDM()
2016 if (data->Neumann != PETSC_BOOL3_TRUE && !flg) { in PCSetUp_HPDDM()
2018 …l build an auxiliary Mat (which was%s initially provided by the user)\n", data->aux ? "" : " not")… in PCSetUp_HPDDM()
2019 PetscCall(MatDestroy(&data->aux)); in PCSetUp_HPDDM()
2023 …if (!data->aux) { /* if A11 is near zero, e.g., Stokes equation, or diagonal, build an auxiliary (… in PCSetUp_HPDDM()
2028 PetscCall(MatDestroy(&data->aux)); in PCSetUp_HPDDM()
2029 PetscCall(ISGetLocalSize(data->is, &n)); in PCSetUp_HPDDM()
2032 PetscCall(VecScatterCreate(xin, data->is, v, nullptr, &scatter)); in PCSetUp_HPDDM()
2039 PetscCall(VecScatterCreate(d, data->is, v, nullptr, &scatter)); in PCSetUp_HPDDM()
2058 PetscCall(MatCreateDiagonal(v, &data->aux)); in PCSetUp_HPDDM()
2061 uis = data->is; in PCSetUp_HPDDM()
2062 uaux = data->aux; in PCSetUp_HPDDM()
2087 … if (flg) static_cast<PC_HPDDM *>(std::get<0>(*ctx)[1]->data)->Neumann = PETSC_BOOL3_TRUE; in PCSetUp_HPDDM()
2118 …bjectComm((PetscObject)data_00->is), A11->rmap->n, A11->rmap->rstart, 1, &data->is)); /* dummy var… in PCSetUp_HPDDM()
2119 PetscCall(MatGetDiagonalBlock(A11, &data->aux)); in PCSetUp_HPDDM()
2120 PetscCall(PetscObjectReference((PetscObject)data->aux)); in PCSetUp_HPDDM()
2131 if (!data->is && data->N > 1) { in PCSetUp_HPDDM()
2139 …if (data->correction == PC_HPDDM_COARSE_CORRECTION_DEFLATED) data->correction = PC_HPDDM_COARSE_CO… in PCSetUp_HPDDM()
2212 PetscCall(PetscObjectTypeCompare((PetscObject)data->aux, MATSEQAIJ, &flg)); in PCSetUp_HPDDM()
2242 PetscCall(ISCreateStride(PETSC_COMM_SELF, P->rmap->n, P->rmap->rstart, 1, &data->is)); in PCSetUp_HPDDM()
2243 PetscCall(MatIncreaseOverlap(P, 1, &data->is, 1)); in PCSetUp_HPDDM()
2244 PetscCall(ISSort(data->is)); in PCSetUp_HPDDM()
2252 if (data->is) PetscCall(ISDuplicate(data->is, &dis)); in PCSetUp_HPDDM()
2253 if (data->aux) PetscCall(MatDuplicate(data->aux, MAT_COPY_VALUES, &daux)); in PCSetUp_HPDDM()
2255 if (data->is || (ismatis && data->N > 1)) { in PCSetUp_HPDDM()
2274 PetscCall(KSPSetOperators(data->levels[0]->ksp, A, C)); in PCSetUp_HPDDM()
2282 data->Neumann = PETSC_BOOL3_FALSE; in PCSetUp_HPDDM()
2285 is[0] = data->is; in PCSetUp_HPDDM()
2289 if (PetscBool3ToBool(data->Neumann)) { in PCSetUp_HPDDM()
2294 if (PetscBool3ToBool(data->Neumann) || block) structure = SAME_NONZERO_PATTERN; in PCSetUp_HPDDM()
2295 …PetscCall(ISCreateStride(PetscObjectComm((PetscObject)data->is), P->rmap->n, P->rmap->rstart, 1, &… in PCSetUp_HPDDM()
2304 if (data->share) { in PCSetUp_HPDDM()
2305 …data->share = PETSC_FALSE; /* will be reset to PETSC_TRUE if none of the conditions below are true… in PCSetUp_HPDDM()
2307 …else if (data->deflation) PetscCall(PetscInfo(pc, "Nothing to share since PCHPDDMSetDeflationMat()… in PCSetUp_HPDDM()
2311 else data->share = PETSC_TRUE; in PCSetUp_HPDDM()
2312 if (!data->share) { in PCSetUp_HPDDM()
2318 …if (data->share || (!PetscBool3ToBool(data->Neumann) && subdomains)) PetscCall(ISDuplicate(is[0], … in PCSetUp_HPDDM()
2321 if ((ctx || data->N > 1) && (data->aux || ismatis || algebraic)) { in PCSetUp_HPDDM()
2327 PetscCall(ISDestroy(&data->is)); in PCSetUp_HPDDM()
2328 data->is = is[0]; in PCSetUp_HPDDM()
2330 …if (PetscDefined(USE_DEBUG)) PetscCall(PCHPDDMCheckInclusion_Private(pc, data->is, loc, PETSC_TRUE… in PCSetUp_HPDDM()
2332 if (!PetscBool3ToBool(data->Neumann) && (!algebraic || overlap != -1)) { in PCSetUp_HPDDM()
2345 …etscCall(PetscObjectQuery((PetscObject)sub[0], "_PCHPDDM_Neumann_Mat", (PetscObject *)&data->aux)); in PCSetUp_HPDDM()
2350 if (PetscBool3ToBool(data->Neumann)) sub = &data->aux; in PCSetUp_HPDDM()
2362 PetscCall(ISDuplicate(data->is, ov)); in PCSetUp_HPDDM()
2406 … PetscCall(ISCreateBlock(PETSC_COMM_SELF, bs, v[0].size(), v[0].data(), PETSC_USE_POINTER, &rows)); in PCSetUp_HPDDM()
2407 …PetscCall(ISCreateBlock(PETSC_COMM_SELF, bs, v[1].size(), v[1].data(), PETSC_COPY_VALUES, h->is + … in PCSetUp_HPDDM()
2416 PetscCall(ISEmbed(data->is, ov[1], PETSC_TRUE, h->is + 2)); in PCSetUp_HPDDM()
2423 … PetscCall(ISCreateBlock(PETSC_COMM_SELF, bs, v[0].size(), v[0].data(), PETSC_USE_POINTER, &rows)); in PCSetUp_HPDDM()
2435 PetscCall(ISEmbed(loc, data->is, PETSC_TRUE, h->is + 2)); in PCSetUp_HPDDM()
2436 … PetscCall(ISCreateBlock(PETSC_COMM_SELF, bs, v[1].size(), v[1].data(), PETSC_USE_POINTER, &cols)); in PCSetUp_HPDDM()
2446 if (!data->levels[0]->pc) { in PCSetUp_HPDDM()
2447 PetscCall(PCCreate(PetscObjectComm((PetscObject)pc), &data->levels[0]->pc)); in PCSetUp_HPDDM()
2449 PetscCall(PCSetOptionsPrefix(data->levels[0]->pc, prefix)); in PCSetUp_HPDDM()
2450 PetscCall(PCSetOperators(data->levels[0]->pc, A, P)); in PCSetUp_HPDDM()
2452 PetscCall(PCSetType(data->levels[0]->pc, PCASM)); in PCSetUp_HPDDM()
2453 …if (!data->levels[0]->pc->setupcalled) PetscCall(PCASMSetLocalSubdomains(data->levels[0]->pc, 1, o… in PCSetUp_HPDDM()
2454 …PetscCall(PCSetModifySubMatrices(data->levels[0]->pc, pc->modifysubmatrices, pc->modifysubmatrices… in PCSetUp_HPDDM()
2455 …PetscCall(PCHPDDMCommunicationAvoidingPCASM_Private(data->levels[0]->pc, flg ? A0 : a[0], PETSC_TR… in PCSetUp_HPDDM()
2457 if (data->share) { in PCSetUp_HPDDM()
2459 …PetscTryMethod(data->levels[0]->pc, "PCASMGetSubKSP_C", (PC, PetscInt *, PetscInt *, KSP **), (dat… in PCSetUp_HPDDM()
2468 PetscBool share = data->share; in PCSetUp_HPDDM()
2474 if (!data->share) { in PCSetUp_HPDDM()
2482 … PetscCall(PetscObjectTypeCompareAny((PetscObject)ksp[0]->pc, &data->share, PCLU, PCCHOLESKY, "")); in PCSetUp_HPDDM()
2483 if (data->share) { in PCSetUp_HPDDM()
2488 else data->share = PETSC_FALSE; in PCSetUp_HPDDM()
2489 if (data->share) PetscCall(PCSetFromOptions(ksp[0]->pc)); in PCSetUp_HPDDM()
2491 PetscCall(PetscStrcmp(type, MATSOLVERMUMPS, &data->share)); in PCSetUp_HPDDM()
2492 … if (!data->share) PetscCall(PetscStrcmp(type, MATSOLVERMKL_PARDISO, &data->share)); in PCSetUp_HPDDM()
2494 if (data->share) { in PCSetUp_HPDDM()
2515 …if (!data->share) PetscCall(PetscInfo(pc, "Cannot share subdomain KSP between SLEPc and PETSc sinc… in PCSetUp_HPDDM()
2517 …} while (!share != !data->share); /* if data->share is initially PETSC_TRUE, but then reset to PET… in PCSetUp_HPDDM()
2526 …(MatCreateShell(PETSC_COMM_SELF, P->rmap->n, n[1] - n[0], P->rmap->n, n[1] - n[0], h, &data->aux)); in PCSetUp_HPDDM()
2529 … PetscCall(MatShellSetOperation(data->aux, MATOP_MULT, (PetscErrorCodeFn *)MatMult_Harmonic)); in PCSetUp_HPDDM()
2530 …PetscCall(MatShellSetOperation(data->aux, MATOP_MULT_TRANSPOSE, (PetscErrorCodeFn *)MatMultTranspo… in PCSetUp_HPDDM()
2531 …PetscCall(MatShellSetMatProductOperation(data->aux, MATPRODUCT_AB, nullptr, MatProduct_AB_Harmonic… in PCSetUp_HPDDM()
2532 …PetscCall(MatShellSetMatProductOperation(data->aux, MATPRODUCT_AtB, nullptr, MatProduct_AtB_Harmon… in PCSetUp_HPDDM()
2533 …PetscCall(MatShellSetOperation(data->aux, MATOP_DESTROY, (PetscErrorCodeFn *)MatDestroy_Harmonic)); in PCSetUp_HPDDM()
2556 if (data->N > 1) { in PCSetUp_HPDDM()
2558 if (!data->levels[0]->D) { in PCSetUp_HPDDM()
2559 PetscCall(ISGetLocalSize(data->is, &n)); in PCSetUp_HPDDM()
2560 PetscCall(VecCreateMPI(PETSC_COMM_SELF, n, PETSC_DETERMINE, &data->levels[0]->D)); in PCSetUp_HPDDM()
2562 if (data->share && overlap == -1) { in PCSetUp_HPDDM()
2567 if (!data->levels[0]->pc) { in PCSetUp_HPDDM()
2569 PetscCall(PCCreate(PetscObjectComm((PetscObject)pc), &data->levels[0]->pc)); in PCSetUp_HPDDM()
2570 PetscCall(PCSetOptionsPrefix(data->levels[0]->pc, prefix)); in PCSetUp_HPDDM()
2571 PetscCall(PCSetOperators(data->levels[0]->pc, A, P)); in PCSetUp_HPDDM()
2573 PetscCall(PCSetType(data->levels[0]->pc, PCASM)); in PCSetUp_HPDDM()
2575 if (!data->levels[0]->pc->setupcalled) { in PCSetUp_HPDDM()
2578 PetscCall(PCASMSetLocalSubdomains(data->levels[0]->pc, 1, &sorted, &loc)); in PCSetUp_HPDDM()
2581 PetscCall(PCSetFromOptions(data->levels[0]->pc)); in PCSetUp_HPDDM()
2582 …PetscCall(PCSetModifySubMatrices(data->levels[0]->pc, pc->modifysubmatrices, pc->modifysubmatrices… in PCSetUp_HPDDM()
2584 PetscCall(PCHPDDMPermute_Private(unsorted, data->is, &uis, sub[0], &C, &perm)); in PCSetUp_HPDDM()
2585 … PetscCall(PCHPDDMCommunicationAvoidingPCASM_Private(data->levels[0]->pc, C, algebraic)); in PCSetUp_HPDDM()
2586 } else PetscCall(PCSetUp(data->levels[0]->pc)); in PCSetUp_HPDDM()
2587 …PetscTryMethod(data->levels[0]->pc, "PCASMGetSubKSP_C", (PC, PetscInt *, PetscInt *, KSP **), (dat… in PCSetUp_HPDDM()
2589 data->share = PETSC_FALSE; in PCSetUp_HPDDM()
2598 …) PetscCall(PCHPDDMPermute_Private(unsorted, data->is, &uis, PetscBool3ToBool(data->Neumann) ? sub… in PCSetUp_HPDDM()
2600 if (!PetscBool3ToBool(data->Neumann) && !block) { in PCSetUp_HPDDM()
2604 if (data->B) { /* see PCHPDDMSetRHSMat() */ in PCSetUp_HPDDM()
2605 PetscCall(MatPermute(data->B, perm, perm, &D)); in PCSetUp_HPDDM()
2606 PetscCall(MatHeaderReplace(data->B, &D)); in PCSetUp_HPDDM()
2628 PetscCall(MatAXPY(D, 1.0, data->aux, structure)); in PCSetUp_HPDDM()
2646 std::swap(C, data->aux); in PCSetUp_HPDDM()
2647 std::swap(uis, data->is); in PCSetUp_HPDDM()
2654 PC_HPDDM *data_00 = (PC_HPDDM *)std::get<0>(*ctx)[0]->data; in PCSetUp_HPDDM()
2671 …PetscCall(PCHPDDMPermute_Private(unsorted, data->is, &uis, data->aux, &C, nullptr)); /* permute si… in PCSetUp_HPDDM()
2672 std::swap(C, data->aux); in PCSetUp_HPDDM()
2673 std::swap(uis, data->is); in PCSetUp_HPDDM()
2689 PetscCall(MatCreateSubMatrices(A10, 1, &data->is, &sorted, MAT_INITIAL_MATRIX, &sub)); in PCSetUp_HPDDM()
2702 …if (!A10) PetscCall(MatCreateSubMatrices(std::get<1>(*ctx)[0], 1, &sorted, &data->is, MAT_INITIAL_… in PCSetUp_HPDDM()
2709 PetscCall(MatCreateSubMatrices(A01, 1, &sorted, &data->is, MAT_INITIAL_MATRIX, &sub)); in PCSetUp_HPDDM()
2719 b[3] = data->aux; in PCSetUp_HPDDM()
2722 if (data->N != 1) { in PCSetUp_HPDDM()
2723 …PetscCall(PCASMSetType(data->levels[0]->pc, PC_ASM_NONE)); /* "Neumann--Neumann" preconditioning w… in PCSetUp_HPDDM()
2724 PetscCall(PCASMSetLocalSubdomains(data->levels[0]->pc, 1, &data->is, &loc)); in PCSetUp_HPDDM()
2725 …PetscCall(PCSetFromOptions(data->levels[0]->pc)); /* action of eq. (15) of https://hal.science/hal… in PCSetUp_HPDDM()
2726 s = data->levels[0]->pc; in PCSetUp_HPDDM()
2728 is[0] = data->is; in PCSetUp_HPDDM()
2732 …data = nullptr; /* destroyed in the previous PCSetType()… in PCSetUp_HPDDM()
2746 if (!data) PetscCall(PetscObjectDereference((PetscObject)b[3])); in PCSetUp_HPDDM()
2787 if (!data) { in PCSetUp_HPDDM()
2800 if (!data->levels[0]->scatter) { in PCSetUp_HPDDM()
2803 …PetscCall(VecScatterCreate(xin, data->is, data->levels[0]->D, nullptr, &data->levels[0]->scatter)); in PCSetUp_HPDDM()
2806 if (data->levels[0]->P) { in PCSetUp_HPDDM()
2808 …PetscCall(HPDDM::Schwarz<PetscScalar>::destroy(data->levels[0], !pc->setupcalled || pc->flag == DI… in PCSetUp_HPDDM()
2810 if (!data->levels[0]->P) data->levels[0]->P = new HPDDM::Schwarz<PetscScalar>(); in PCSetUp_HPDDM()
2811 …if (data->log_separate) PetscCall(PetscLogEventBegin(PC_HPDDM_SetUp[0], data->levels[0]->ksp, null… in PCSetUp_HPDDM()
2812 …else PetscCall(PetscLogEventBegin(PC_HPDDM_Strc, data->levels[0]->ksp, nullptr, nullptr, nullptr)); in PCSetUp_HPDDM()
2814 …PetscCall(data->levels[0]->P->structure(loc, data->is, !ctx ? sub[0] : nullptr, ismatis ? C : data… in PCSetUp_HPDDM()
2815 …if (!data->log_separate) PetscCall(PetscLogEventEnd(PC_HPDDM_Strc, data->levels[0]->ksp, nullptr, … in PCSetUp_HPDDM()
2818 if (data->deflation || overlap != -1) weighted = data->aux; in PCSetUp_HPDDM()
2819 else if (!data->B) { in PCSetUp_HPDDM()
2825 PetscCall(MatDiagonalScale(weighted, data->levels[0]->D, data->levels[0]->D)); in PCSetUp_HPDDM()
2829 if (PetscDefined(USE_DEBUG) && PetscBool3ToBool(data->Neumann)) { in PCSetUp_HPDDM()
2840 … PetscCall(MatCreateSubMatrices(A[0], 1, &data->is, &data->is, MAT_INITIAL_MATRIX, &sub)); in PCSetUp_HPDDM()
2841 PetscCall(MatDiagonalScale(sub[0], data->levels[0]->D, data->levels[0]->D)); in PCSetUp_HPDDM()
2853 } else weighted = data->B; in PCSetUp_HPDDM()
2856 …(data->levels[0]->P, data->is, ismatis ? C : (algebraic && !block && overlap == -1 ? sub[0] : (!ct… in PCSetUp_HPDDM()
2857 if (!ctx && data->share && overlap == -1) { in PCSetUp_HPDDM()
2865 …if (data->log_separate) PetscCall(PetscLogEventEnd(PC_HPDDM_SetUp[0], data->levels[0]->ksp, nullpt… in PCSetUp_HPDDM()
2867 else N = data->aux; in PCSetUp_HPDDM()
2871 for (n = 1; n < data->N; ++n) { in PCSetUp_HPDDM()
2872 …if (data->log_separate) PetscCall(PetscLogEventBegin(PC_HPDDM_SetUp[n], data->levels[n]->ksp, null… in PCSetUp_HPDDM()
2874 …ethod(data->levels[0]->ksp, "PCHPDDMSetUp_Private_C", (Mat *, Mat *, PetscInt, PetscInt *const, PC… in PCSetUp_HPDDM()
2875 …if (data->log_separate) PetscCall(PetscLogEventEnd(PC_HPDDM_SetUp[n], data->levels[n]->ksp, nullpt… in PCSetUp_HPDDM()
2878 …PetscCall(PetscObjectComposeFunction((PetscObject)data->levels[0]->ksp, "PCHPDDMSetUp_Private_C", … in PCSetUp_HPDDM()
2881 for (n = 0; n < data->N - 1; ++n) in PCSetUp_HPDDM()
2882 if (data->levels[n]->P) { in PCSetUp_HPDDM()
2884 data->levels[n]->P->setBuffer(); in PCSetUp_HPDDM()
2885 data->levels[n]->P->super::start(); in PCSetUp_HPDDM()
2887 …if (ismatis || !subdomains) PetscCall(PCHPDDMDestroySubMatrices_Private(PetscBool3ToBool(data->Neu… in PCSetUp_HPDDM()
2888 if (ismatis) data->is = nullptr; in PCSetUp_HPDDM()
2889 for (n = 0; n < data->N - 1 + (reused > 0); ++n) { in PCSetUp_HPDDM()
2890 if (data->levels[n]->P) { in PCSetUp_HPDDM()
2894 PetscCall(KSPSetSkipPCSetFromOptions(data->levels[n]->ksp, PETSC_TRUE)); in PCSetUp_HPDDM()
2895 PetscCall(KSPGetPC(data->levels[n]->ksp, &spc)); in PCSetUp_HPDDM()
2897 PetscCall(PCShellSetContext(spc, data->levels[n])); in PCSetUp_HPDDM()
2908 PetscCall(KSPGetOperators(data->levels[n]->ksp, nullptr, &Pmat)); in PCSetUp_HPDDM()
2913 std::get<1>(*ctx) = data->levels[n]->scatter; in PCSetUp_HPDDM()
2914 …PetscCall(MatCreateShell(PetscObjectComm((PetscObject)data->levels[n]->ksp), m, m, M, M, ctx, &Ama… in PCSetUp_HPDDM()
2919 PetscCall(KSPSetOperators(data->levels[n]->ksp, Amat, Pmat)); in PCSetUp_HPDDM()
2923 …if (!data->levels[n]->pc) PetscCall(PCCreate(PetscObjectComm((PetscObject)data->levels[n]->ksp), &… in PCSetUp_HPDDM()
2926 PetscCall(PCSetReusePreconditioner(data->levels[n]->pc, PETSC_TRUE)); in PCSetUp_HPDDM()
2935 if (flg) PetscCall(KSPGetPC(data->levels[0]->ksp, &inner)); in PCSetUp_HPDDM()
2936 else inner = data->levels[0]->pc; in PCSetUp_HPDDM()
2950 …if (!PetscBool3ToBool(data->Neumann) && data->N > 1) { /* subdomain matrices are already created f… in PCSetUp_HPDDM()
2957 if (data->N > 1) { in PCSetUp_HPDDM()
2958 …if (overlap != 1) PetscCall(PCHPDDMDestroySubMatrices_Private(PetscBool3ToBool(data->Neumann), Pet… in PCSetUp_HPDDM()
2963 …} else data->N = 1 + reused; /* enforce this value to 1 + reused if there is no way to build anoth… in PCSetUp_HPDDM()
2964 if (requested != data->N + reused) { in PCSetUp_HPDDM()
2965 …FMT ", including -%spc_hpddm_coarse_ will not be taken into account\n", requested, data->N, reused, in PCSetUp_HPDDM()
2966 data->N, pcpre ? pcpre : "")); in PCSetUp_HPDDM()
2968 data->N, pcpre ? pcpre : "", data->N)); in PCSetUp_HPDDM()
2970 for (n = data->N - 1; n < requested - 1; ++n) { in PCSetUp_HPDDM()
2971 if (data->levels[n]->P) { in PCSetUp_HPDDM()
2972 PetscCall(HPDDM::Schwarz<PetscScalar>::destroy(data->levels[n], PETSC_TRUE)); in PCSetUp_HPDDM()
2973 PetscCall(VecDestroyVecs(1, &data->levels[n]->v[0])); in PCSetUp_HPDDM()
2974 PetscCall(VecDestroyVecs(2, &data->levels[n]->v[1])); in PCSetUp_HPDDM()
2975 PetscCall(MatDestroy(data->levels[n]->V)); in PCSetUp_HPDDM()
2976 PetscCall(MatDestroy(data->levels[n]->V + 1)); in PCSetUp_HPDDM()
2977 PetscCall(MatDestroy(data->levels[n]->V + 2)); in PCSetUp_HPDDM()
2978 PetscCall(VecDestroy(&data->levels[n]->D)); in PCSetUp_HPDDM()
2979 PetscCall(PetscSFDestroy(&data->levels[n]->scatter)); in PCSetUp_HPDDM()
2983 for (n = reused; n < PETSC_PCHPDDM_MAXLEVELS && data->levels[n]; ++n) { in PCSetUp_HPDDM()
2984 PetscCall(KSPDestroy(&data->levels[n]->ksp)); in PCSetUp_HPDDM()
2985 PetscCall(PCDestroy(&data->levels[n]->pc)); in PCSetUp_HPDDM()
2989 …data->N, reused, data->N, pcpre ? pcpre : "", pcpre ? pcpre : "", data->N, pcpre ? pcpre : "", dat… in PCSetUp_HPDDM()
2993 for (n = 0; n < data->N; ++n) { in PCSetUp_HPDDM()
2994 if (data->levels[n]->ksp) PetscCall(KSPSetFromOptions(data->levels[n]->ksp)); in PCSetUp_HPDDM()
2995 if (data->levels[n]->pc) PetscCall(PCSetFromOptions(data->levels[n]->pc)); in PCSetUp_HPDDM()
2999 data->N += reused; in PCSetUp_HPDDM()
3000 if (data->share && swap) { in PCSetUp_HPDDM()
3002 std::swap(C, data->aux); in PCSetUp_HPDDM()
3003 std::swap(uis, data->is); in PCSetUp_HPDDM()
3007 if (algebraic) PetscCall(MatDestroy(&data->aux)); in PCSetUp_HPDDM()
3009 PetscCall(ISCopy(unsorted, data->is)); in PCSetUp_HPDDM()
3013 …data->is && dis) || (!data->is && !dis), PETSC_COMM_SELF, PETSC_ERR_PLIB, "An IS pointer is NULL b… in PCSetUp_HPDDM()
3014 if (data->is) { in PCSetUp_HPDDM()
3015 PetscCall(ISEqualUnsorted(data->is, dis, &flg)); in PCSetUp_HPDDM()
3019 …data->aux && daux) || (!data->aux && !daux), PETSC_COMM_SELF, PETSC_ERR_PLIB, "A Mat pointer is NU… in PCSetUp_HPDDM()
3020 if (data->aux) { in PCSetUp_HPDDM()
3021 PetscCall(MatMultEqual(data->aux, daux, 20, &flg)); in PCSetUp_HPDDM()
3080 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetCoarseCorrectionType_HPDDM() local
3083 data->correction = type; in PCHPDDMSetCoarseCorrectionType_HPDDM()
3089 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMGetCoarseCorrectionType_HPDDM() local
3092 *type = data->correction; in PCHPDDMGetCoarseCorrectionType_HPDDM()
3149 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetSTShareSubKSP_HPDDM() local
3152 data->share = share; in PCHPDDMSetSTShareSubKSP_HPDDM()
3158 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMGetSTShareSubKSP_HPDDM() local
3161 *share = data->share; in PCHPDDMGetSTShareSubKSP_HPDDM()
3298 PC_HPDDM *data; in PCCreate_HPDDM() local
3307 PetscCall(PetscNew(&data)); in PCCreate_HPDDM()
3308 pc->data = data; in PCCreate_HPDDM()
3309 data->Neumann = PETSC_BOOL3_UNKNOWN; in PCCreate_HPDDM()