Lines Matching +full:- +full:std
9 static PetscErrorCode (*loadedSym)(HPDDM::Schwarz<PetscScalar> *const, IS, Mat, Mat, Mat, std::vect…
25 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCReset_HPDDM()
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()
70 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetAuxiliaryMat_Private()
71 PCHPDDMCoarseCorrectionType type = data->correction; in PCHPDDMSetAuxiliaryMat_Private()
84 if (data->is) { /* new overlap definition resets the PC */ in PCHPDDMSetAuxiliaryMat_Private()
86 pc->setfromoptionscalled = 0; in PCHPDDMSetAuxiliaryMat_Private()
87 pc->setupcalled = PETSC_FALSE; 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()
133 PetscCall(ISCreateStride(PETSC_COMM_SELF, A->cmap->n, A->cmap->rstart, 1, is)); in PCHPDDMSetAuxiliaryMatNormal_Private()
135 PetscCall(ISCreateStride(PETSC_COMM_SELF, A->cmap->n, A->cmap->rstart, 1, is + 2)); in PCHPDDMSetAuxiliaryMatNormal_Private()
138 PetscCall(ISCreateStride(PETSC_COMM_SELF, A->rmap->N, 0, 1, is + 2)); in PCHPDDMSetAuxiliaryMatNormal_Private()
146 …PetscCall(PetscOptionsGetString(((PetscObject)pc)->options, pcpre, "-pc_hpddm_levels_1_sub_pc_type… in PCHPDDMSetAuxiliaryMatNormal_Private()
163 PetscCall(VecScale(*diagonal, -1.0)); in PCHPDDMSetAuxiliaryMatNormal_Private()
196 data->Neumann = PETSC_BOOL3_TRUE; in PCHPDDMSetAuxiliaryMatNormal_Private()
204 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetAuxiliaryMat_HPDDM()
209 data->setup = setup; in PCHPDDMSetAuxiliaryMat_HPDDM()
210 data->setup_ctx = setup_ctx; in PCHPDDMSetAuxiliaryMat_HPDDM()
216 …PCHPDDMSetAuxiliaryMat - Sets the auxiliary matrix used by `PCHPDDM` for the concurrent GenEO prob…
219 + pc - preconditioner context
220 . is - index set of the local auxiliary, e.g., Neumann, matrix
221 . A - auxiliary sequential matrix
222 . setup - function for generating the auxiliary matrix entries, may be `NULL`
223 - ctx - context for `setup`, may be `NULL`
226 + J - matrix whose values are to be set
227 . t - time
228 . X - linearization point
229 . X_t - time-derivative of the linearization point
230 . s - step
231 . ovl - index set of the local auxiliary, e.g., Neumann, matrix
232 - ctx - context for `setup`, may be `NULL`
258 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMHasNeumannMat_HPDDM()
261 data->Neumann = PetscBoolToBool3(has); in PCHPDDMHasNeumannMat_HPDDM()
266 …PCHPDDMHasNeumannMat - Informs `PCHPDDM` that the `Mat` passed to `PCHPDDMSetAuxiliaryMat()` is th…
269 + pc - preconditioner context
270 - has - Boolean value
291 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetRHSMat_HPDDM()
295 PetscCall(MatDestroy(&data->B)); in PCHPDDMSetRHSMat_HPDDM()
296 data->B = B; in PCHPDDMSetRHSMat_HPDDM()
301 …PCHPDDMSetRHSMat - Sets the right-hand side matrix used by `PCHPDDM` for the concurrent GenEO prob…
304 + pc - preconditioner context
305 - B - right-hand side sequential matrix
311 …the same numbering. This provides a means to try more advanced methods such as GenEO-II or H-GenEO.
328 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCSetFromOptions_HPDDM()
329 PC_HPDDM_Level **levels = data->levels; in PCSetFromOptions_HPDDM()
338 if (!data->levels) { in PCSetFromOptions_HPDDM()
340 data->levels = levels; in PCSetFromOptions_HPDDM()
343 …PetscCall(PetscOptionsBoundedInt("-pc_hpddm_harmonic_overlap", "Overlap prior to computing local h… in PCSetFromOptions_HPDDM()
344 if (!set) overlap = -1; 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()
356 PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_eps_nev", i)); in PCSetFromOptions_HPDDM()
357 …on vectors computed by SLEPc", "EPSSetDimensions", data->levels[i - 1]->nu, &data->levels[i - 1]->… in PCSetFromOptions_HPDDM()
358 … PetscCall(PetscSNPrintf(deprecated, sizeof(deprecated), "-pc_hpddm_levels_%d_eps_threshold", i)); in PCSetFromOptions_HPDDM()
359 … PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_eps_threshold_absolute", i)); in PCSetFromOptions_HPDDM()
361 …eflation vectors returned by SLEPc", "PCHPDDM", data->levels[i - 1]->threshold, &data->levels[i - … in PCSetFromOptions_HPDDM()
363 …-1 || PetscAbsReal(data->levels[i - 1]->threshold + static_cast<PetscReal>(1.0)) < PETSC_MACHINE_E… in PCSetFromOptions_HPDDM()
364 PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_svd_nsv", i)); in PCSetFromOptions_HPDDM()
365 if (overlap != -1) { in PCSetFromOptions_HPDDM()
370 …etscCheck(data->levels[0]->nu == 0 || nsv == 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot supp… 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()
373 …PetscCall(PetscSNPrintf(deprecated, sizeof(deprecated), "-pc_hpddm_levels_%d_svd_relative_threshol… in PCSetFromOptions_HPDDM()
374 … PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_svd_threshold_relative", i)); in PCSetFromOptions_HPDDM()
376 …ng deflation vectors returned by SLEPc", "PCHPDDM", data->levels[0]->threshold, &data->levels[0]->… 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()
379 …PetscCall(PetscSNPrintf(deprecated, sizeof(deprecated), "-pc_hpddm_levels_%d_eps_relative_threshol… in PCSetFromOptions_HPDDM()
380 … PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_eps_threshold_relative", i)); in PCSetFromOptions_HPDDM()
382 …ng deflation vectors returned by SLEPc", "PCHPDDM", data->levels[0]->threshold, &data->levels[0]->… in PCSetFromOptions_HPDDM()
383 …_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot supply both -pc_hpddm_levels_1_eps_threshold_relative and… in PCSetFromOptions_HPDDM()
385 …->levels[0]->nu || PetscAbsReal(data->levels[i - 1]->threshold + static_cast<PetscReal>(1.0)) > PE… in PCSetFromOptions_HPDDM()
387 …PetscCall(PetscOptionsHasName(PetscOptionsObject->options, PetscOptionsObject->prefix, prefix, &fl… in PCSetFromOptions_HPDDM()
388 …G, "Cannot supply -%spc_hpddm_levels_%d_svd_nsv without -%spc_hpddm_harmonic_overlap", PetscOption… in PCSetFromOptions_HPDDM()
389 PetscOptionsObject->prefix ? PetscOptionsObject->prefix : ""); in PCSetFromOptions_HPDDM()
390 … PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_svd_threshold_relative", i)); in PCSetFromOptions_HPDDM()
391 …PetscCall(PetscOptionsHasName(PetscOptionsObject->options, PetscOptionsObject->prefix, prefix, &fl… in PCSetFromOptions_HPDDM()
392 …ot supply -%spc_hpddm_levels_%d_svd_threshold_relative without -%spc_hpddm_harmonic_overlap", Pets… in PCSetFromOptions_HPDDM()
393 PetscOptionsObject->prefix ? PetscOptionsObject->prefix : ""); in PCSetFromOptions_HPDDM()
394 … PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_eps_threshold_relative", i)); in PCSetFromOptions_HPDDM()
395 …PetscCall(PetscOptionsHasName(PetscOptionsObject->options, PetscOptionsObject->prefix, prefix, &fl… in PCSetFromOptions_HPDDM()
396 …_WRONG, "Cannot supply -%spc_hpddm_levels_%d_eps_threshold_relative without -%spc_hpddm_harmonic_o… in PCSetFromOptions_HPDDM()
397 …->prefix ? PetscOptionsObject->prefix : "", i, PetscOptionsObject->prefix ? PetscOptionsObject->pr… in PCSetFromOptions_HPDDM()
399 PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_1_st_share_sub_ksp")); in PCSetFromOptions_HPDDM()
400 …Shared KSP between SLEPc ST and the fine-level subdomain solver", "PCHPDDMSetSTShareSubKSP", PETSC… in PCSetFromOptions_HPDDM()
403 …if (data->levels[i - 1]->threshold <= PetscReal() && data->levels[i - 1]->nu <= 0 && !(data->defla… in PCSetFromOptions_HPDDM()
406 PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_eps_nev", i)); in PCSetFromOptions_HPDDM()
407 …PetscCall(PetscOptionsHasName(PetscOptionsObject->options, PetscOptionsObject->prefix, prefix, &fl… in PCSetFromOptions_HPDDM()
409 … PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_eps_threshold_absolute", i)); in PCSetFromOptions_HPDDM()
410 …PetscCall(PetscOptionsHasName(PetscOptionsObject->options, PetscOptionsObject->prefix, prefix, &fl… in PCSetFromOptions_HPDDM()
415 PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_levels_%d_p", i)); in PCSetFromOptions_HPDDM()
421 data->N = i; in PCSetFromOptions_HPDDM()
424 PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_coarse_p")); in PCSetFromOptions_HPDDM()
428 …PetscCall(PetscOptionsHasName(PetscOptionsObject->options, prefix, "-mat_mumps_use_omp_threads", &… in PCSetFromOptions_HPDDM()
433 …PetscCall(PetscOptionsGetString(PetscOptionsObject->options, prefix, "-pc_factor_mat_solver_type",… in PCSetFromOptions_HPDDM()
435 …PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "-%smat_mumps_use_omp_threads and -%spc_fact… in PCSetFromOptions_HPDDM()
437 n = -1; in PCSetFromOptions_HPDDM()
438 …PetscCall(PetscOptionsGetInt(PetscOptionsObject->options, prefix, "-mat_mumps_use_omp_threads", &n… in PCSetFromOptions_HPDDM()
439 …TSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Need to specify a positive integer for -%smat_mumps_use_omp_t… in PCSetFromOptions_HPDDM()
443 …-pc_hpddm_coarse_correction", "Type of coarse correction applied each iteration", "PCHPDDMSetCoars… in PCSetFromOptions_HPDDM()
445 PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_has_neumann")); in PCSetFromOptions_HPDDM()
446 …at the local Neumann matrix?", "PCHPDDMHasNeumannMat", PetscBool3ToBool(data->Neumann), &flg, &set… in PCSetFromOptions_HPDDM()
447 if (set) data->Neumann = PetscBoolToBool3(flg); in PCSetFromOptions_HPDDM()
448 data->log_separate = PETSC_FALSE; in PCSetFromOptions_HPDDM()
450 PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-pc_hpddm_log_separate")); in PCSetFromOptions_HPDDM()
451 …l by level instead of inside PCSetUp()/KSPSolve()", nullptr, data->log_separate, &data->log_separa… 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()
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()
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()
488 PCHPDDMGetComplexities - Computes the grid and operator complexities.
493 . pc - preconditioner context
496 + gc - grid complexity $ \sum_i m_i / m_1 $
497 - oc - operator complexity $ \sum_i nnz_i / nnz_1 $
505 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMGetComplexities()
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()
538 else if (P->ops->getinfo) { in PCHPDDMGetComplexities()
545 else if (P->ops->getinfo) nnz1 = info.nz_used; in PCHPDDMGetComplexities()
559 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCView_HPDDM()
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()
578 } else PetscCall(PetscViewerASCIIPrintf(viewer, "user-supplied deflation matrix\n")); in PCView_HPDDM()
579 …werASCIIPrintf(viewer, "coarse correction: %s\n", PCHPDDMCoarseCorrectionTypes[data->correction])); in PCView_HPDDM()
580 …hreshold%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()
621 …PetscInt m, n, sizes[5] = {pc->mat->rmap->n, pc->mat->cmap->n, pc->mat->rmap->N, pc->mat->c… in PCView_HPDDM()
623 std::string prefix, suffix; in PCView_HPDDM()
628 pos = std::distance(const_cast<char *>(name), tmp); in PCView_HPDDM()
629 prefix = std::string(name, pos); in PCView_HPDDM()
630 suffix = std::string(name + pos + 1); 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()
652 …ll(PetscViewerBinaryOpen(PetscObjectComm((PetscObject)pc), std::string(prefix + "_aux_" + std::to_… 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()
661 …all(PetscViewerBinaryOpen(PetscObjectComm((PetscObject)pc), std::string(prefix + "_is_" + std::to_… in PCView_HPDDM()
665 PetscCall(ISRestoreIndices(data->is, &indices)); in PCView_HPDDM()
668 …l(PetscViewerBinaryOpen(PetscObjectComm((PetscObject)pc), std::string(prefix + "_sizes_" + std::to… in PCView_HPDDM()
680 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCPreSolve_HPDDM()
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()
704 …PetscCall(PetscOptionsHasName(((PetscObject)pc)->options, ((PetscObject)pc)->prefix, "-pc_hpddm_co… in PCPreSolve_HPDDM()
705 …ic PC, if you insist on using this configuration, use the additional option -%spc_hpddm_coarse_cor… in PCPreSolve_HPDDM()
706 …s[data->correction], ((PetscObject)ksp)->type_name, ((PetscObject)pc)->prefix ? ((PetscObject)pc)-… 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 …l(PetscOptionsHasName(((PetscObject)data->levels[n]->pc)->options, ((PetscObject)data->levels[n]->… in PCPreSolve_HPDDM()
717 …->levels[n]->pc), PETSC_ERR_ARG_INCOMP, "PCASMType %s is known to be not symmetric, but KSPType %s… in PCPreSolve_HPDDM()
718 …((PetscObject)ksp)->type_name, ((PetscObject)data->levels[n]->pc)->prefix, PCASMTypes[type], PCASM… in PCPreSolve_HPDDM()
737 PetscCall(KSPGetOptionsPrefix(ctx->ksp, &pcpre)); in PCSetUp_HPDDMShell()
738 PetscCall(KSPGetOperators(ctx->ksp, &A, &P)); in PCSetUp_HPDDMShell()
740 PetscCall(PCSetOptionsPrefix(ctx->pc, pcpre)); in PCSetUp_HPDDMShell()
741 PetscCall(PCSetOperators(ctx->pc, A, P)); in PCSetUp_HPDDMShell()
742 if (!ctx->v[0]) { in PCSetUp_HPDDMShell()
743 PetscCall(VecDuplicateVecs(ctx->D, 1, &ctx->v[0])); in PCSetUp_HPDDMShell()
744 if (!std::is_same<PetscScalar, PetscReal>::value) PetscCall(VecDestroy(&ctx->D)); in PCSetUp_HPDDMShell()
746 PetscCall(VecDuplicateVecs(x, 2, &ctx->v[1])); in PCSetUp_HPDDMShell()
749 std::fill_n(ctx->V, 3, nullptr); in PCSetUp_HPDDMShell()
753 template <bool transpose = false, class Type = Vec, typename std::enable_if<std::is_same<Type, Vec>…
762 PetscCall(VecScatterBegin(ctx->scatter, x, ctx->v[0][0], INSERT_VALUES, SCATTER_FORWARD)); in PCHPDDMDeflate_Private()
763 PetscCall(VecScatterEnd(ctx->scatter, x, ctx->v[0][0], INSERT_VALUES, SCATTER_FORWARD)); in PCHPDDMDeflate_Private()
764 PetscCall(VecGetArrayWrite(ctx->v[0][0], &out)); in PCHPDDMDeflate_Private()
765 PetscCallCXX(ctx->P->deflation<false, transpose>(nullptr, out, 1)); /* y = Q x */ in PCHPDDMDeflate_Private()
766 PetscCall(VecRestoreArrayWrite(ctx->v[0][0], &out)); in PCHPDDMDeflate_Private()
768 PetscCall(VecScatterBegin(ctx->scatter, ctx->v[0][0], y, INSERT_VALUES, SCATTER_REVERSE)); in PCHPDDMDeflate_Private()
769 PetscCall(VecScatterEnd(ctx->scatter, ctx->v[0][0], y, INSERT_VALUES, SCATTER_REVERSE)); in PCHPDDMDeflate_Private()
773 template <bool transpose = false, class Type = Mat, typename std::enable_if<std::is_same<Type, Mat>…
788 PetscCall(MatDenseScatter_Private(ctx->scatter, X, ctx->V[0], INSERT_VALUES, SCATTER_FORWARD)); in PCHPDDMDeflate_Private()
789 PetscCall(MatDenseGetArrayAndMemType(ctx->V[0], &out, &type)); in PCHPDDMDeflate_Private()
790 PetscCallCXX(ctx->P->deflation<false, transpose>(nullptr, out, N)); /* Y = Q X */ in PCHPDDMDeflate_Private()
791 PetscCall(MatDenseRestoreArrayAndMemType(ctx->V[0], &out)); in PCHPDDMDeflate_Private()
793 PetscCall(MatDenseScatter_Private(ctx->scatter, ctx->V[0], Y, INSERT_VALUES, SCATTER_REVERSE)); in PCHPDDMDeflate_Private()
798 …HPDDMShell - Applies a (2) deflated, (1) additive, (3) balanced, or (4) no coarse correction. In w…
801 (1) y = Pmat^-1 x + Q x,
802 (2) y = Pmat^-1 (I - Amat Q) x + Q x (default),
803 (3) y = (I - Q^T Amat^T) Pmat^-1 (I - Amat Q) x + Q x,
804 (4) y = Pmat^-1 x .
808 + pc - preconditioner context
809 - x - input vector
812 . y - output vector
815 … by -pc_hpddm_levels_1_pc_. Z is a tall-and-skiny matrix assembled by HPDDM. The number of process…
816 …The options of (Z Pmat Z^T)^-1 = ksp(Z Pmat Z^T) are prefixed by -pc_hpddm_coarse_ (`KSPPREONLY` a…
834 …PetscCheck(ctx->P, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCSHELL from PCHPDDM called with no HPDDM obj… in PCApply_HPDDMShell()
835 PetscCall(KSPGetOperators(ctx->ksp, &A, nullptr)); in PCApply_HPDDMShell()
836 …if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_NONE) PetscCall(PCApply(ctx->pc, x, y));… in PCApply_HPDDMShell()
839 …if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_DEFLATED || ctx->parent->correction == P… in PCApply_HPDDMShell()
840 …if (!ctx->parent->normal || ctx != ctx->parent->levels[0]) PetscCall(MatMult(A, y, ctx->v[1][0]));… in PCApply_HPDDMShell()
843 …PetscCall(MatMult(A, y, ctx->parent->normal)); /* y = A Q x … in PCApply_HPDDMShell()
844 …PetscCall(MatMultHermitianTranspose(A, ctx->parent->normal, ctx->v[1][0])); /* y = A^T A Q x … in PCApply_HPDDMShell()
846 …PetscCall(VecWAXPY(ctx->v[1][1], -1.0, ctx->v[1][0], x)); /* y = (I - A Q) x … in PCApply_HPDDMShell()
847 …PetscCall(PCApply(ctx->pc, ctx->v[1][1], ctx->v[1][0])); /* y = M^-1 (I - A Q) x … in PCApply_HPDDMShell()
848 if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_BALANCED) { in PCApply_HPDDMShell()
849 …if (!ctx->parent->normal || ctx != ctx->parent->levels[0]) PetscCall(MatMultHermitianTranspose(A, … in PCApply_HPDDMShell()
851 PetscCall(MatMult(A, ctx->v[1][0], ctx->parent->normal)); in PCApply_HPDDMShell()
852 …PetscCall(MatMultHermitianTranspose(A, ctx->parent->normal, ctx->v[1][1])); /* z = A^T A y … in PCApply_HPDDMShell()
854 …PetscCall(PCHPDDMDeflate_Private<true>(pc, ctx->v[1][1], ctx->v[1][1])); /* z = Q^T z … in PCApply_HPDDMShell()
855 …PetscCall(VecAXPBYPCZ(y, -1.0, 1.0, 1.0, ctx->v[1][1], ctx->v[1][0])); /* y = (I - Q^T A^T) y + … in PCApply_HPDDMShell()
856 …} else PetscCall(VecAXPY(y, 1.0, ctx->v[1][0])); /* y = Q M^-1 (I - A Q)… in PCApply_HPDDMShell()
858 …->parent->correction == PC_HPDDM_COARSE_CORRECTION_ADDITIVE, PetscObjectComm((PetscObject)pc), PET… in PCApply_HPDDMShell()
859 PetscCall(PCApply(ctx->pc, x, ctx->v[1][0])); in PCApply_HPDDMShell()
860 PetscCall(VecAXPY(y, 1.0, ctx->v[1][0])); /* y = M^-1 x + Q x */ in PCApply_HPDDMShell()
875 PetscCall(KSPGetOperators(ctx->ksp, &A, nullptr)); in PCHPDDMMatApply_Private()
880 if (ptr[1] != ctx->V[2]) /* Mat has changed or may have been set first in KSPHPDDM */ in PCHPDDMMatApply_Private()
882 PetscCall(MatDestroy(ctx->V + m + 1)); in PCHPDDMMatApply_Private()
883 ctx->V[m + 1] = ptr[m]; in PCHPDDMMatApply_Private()
884 PetscCall(PetscObjectReference((PetscObject)ctx->V[m + 1])); in PCHPDDMMatApply_Private()
887 if (ctx->V[1]) PetscCall(MatGetSize(ctx->V[1], nullptr, &prev)); in PCHPDDMMatApply_Private()
888 if (N != prev || !ctx->V[0]) { in PCHPDDMMatApply_Private()
889 PetscCall(MatDestroy(ctx->V)); in PCHPDDMMatApply_Private()
890 PetscCall(VecGetLocalSize(ctx->v[0][0], &m)); in PCHPDDMMatApply_Private()
891 …atCreateDense(PetscObjectComm((PetscObject)Y), m, PETSC_DECIDE, PETSC_DECIDE, N, nullptr, ctx->V)); in PCHPDDMMatApply_Private()
893 PetscCall(MatDestroy(ctx->V + 1)); in PCHPDDMMatApply_Private()
894 PetscCall(MatDestroy(ctx->V + 2)); in PCHPDDMMatApply_Private()
897 …if (ctx->parent->correction != PC_HPDDM_COARSE_CORRECTION_BALANCED) PetscCall(MatDenseGetArrayWrit… in PCHPDDMMatApply_Private()
899 …PetscCall(MatCreateDense(PetscObjectComm((PetscObject)Y), m, PETSC_DECIDE, M, N, array, ctx->V + 1… in PCHPDDMMatApply_Private()
900 …if (ctx->parent->correction != PC_HPDDM_COARSE_CORRECTION_BALANCED) PetscCall(MatDenseRestoreArray… in PCHPDDMMatApply_Private()
901 …cCall(MatCreateDense(PetscObjectComm((PetscObject)Y), m, PETSC_DECIDE, M, N, nullptr, ctx->V + 2)); in PCHPDDMMatApply_Private()
902 PetscCall(MatProductCreateWithMat(A, !transpose ? Y : ctx->V[2], nullptr, ctx->V[1])); in PCHPDDMMatApply_Private()
903 PetscCall(MatProductSetType(ctx->V[1], !transpose ? MATPRODUCT_AB : MATPRODUCT_AtB)); in PCHPDDMMatApply_Private()
904 PetscCall(MatProductSetFromOptions(ctx->V[1])); in PCHPDDMMatApply_Private()
905 PetscCall(MatProductSymbolic(ctx->V[1])); in PCHPDDMMatApply_Private()
906 …tscCall(PetscObjectContainerCompose((PetscObject)A, "_HPDDM_MatProduct", ctx->V + 1, nullptr)); /*… in PCHPDDMMatApply_Private()
907 …->V + 1)); /* need to compose B and D from MatPro… in PCHPDDMMatApply_Private()
909 if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_BALANCED) { in PCHPDDMMatApply_Private()
910 PetscCall(MatProductCreateWithMat(A, !transpose ? ctx->V[1] : Y, nullptr, ctx->V[2])); in PCHPDDMMatApply_Private()
911 PetscCall(MatProductSetType(ctx->V[2], !transpose ? MATPRODUCT_AtB : MATPRODUCT_AB)); in PCHPDDMMatApply_Private()
912 PetscCall(MatProductSetFromOptions(ctx->V[2])); in PCHPDDMMatApply_Private()
913 PetscCall(MatProductSymbolic(ctx->V[2])); in PCHPDDMMatApply_Private()
915 PetscCallCXX(ctx->P->start(N)); in PCHPDDMMatApply_Private()
918 PetscCall(MatProductReplaceMats(nullptr, !transpose ? Y : ctx->V[2], nullptr, ctx->V[1])); in PCHPDDMMatApply_Private()
919 if (container && ctx->parent->correction != PC_HPDDM_COARSE_CORRECTION_BALANCED) { in PCHPDDMMatApply_Private()
920 PetscCall(MatDenseGetArrayWrite(ctx->V[0], &array)); in PCHPDDMMatApply_Private()
921 PetscCall(MatDensePlaceArray(ctx->V[1], array)); in PCHPDDMMatApply_Private()
922 PetscCall(MatDenseRestoreArrayWrite(ctx->V[0], &array)); in PCHPDDMMatApply_Private()
930 PCMatApply_HPDDMShell - Variant of PCApply_HPDDMShell() for blocks of vectors.
933 + pc - preconditioner context
934 - X - block of input vectors
937 . Y - block of output vectors
950 …PetscCheck(ctx->P, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCSHELL from PCHPDDM called with no HPDDM obj… in PCMatApply_HPDDMShell()
951 …if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_NONE) PetscCall(PCMatApply(ctx->pc, X, Y… in PCMatApply_HPDDMShell()
955 …if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_DEFLATED || ctx->parent->correction == P… in PCMatApply_HPDDMShell()
956 PetscCall(MatProductNumeric(ctx->V[1])); in PCMatApply_HPDDMShell()
957 PetscCall(MatCopy(ctx->V[1], ctx->V[2], SAME_NONZERO_PATTERN)); in PCMatApply_HPDDMShell()
958 PetscCall(MatAXPY(ctx->V[2], -1.0, X, SAME_NONZERO_PATTERN)); in PCMatApply_HPDDMShell()
959 PetscCall(PCMatApply(ctx->pc, ctx->V[2], ctx->V[1])); in PCMatApply_HPDDMShell()
960 if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_BALANCED) { in PCMatApply_HPDDMShell()
961 PetscCall(MatProductNumeric(ctx->V[2])); in PCMatApply_HPDDMShell()
962 PetscCall(PCHPDDMDeflate_Private<true>(pc, ctx->V[2], ctx->V[2])); in PCMatApply_HPDDMShell()
963 PetscCall(MatAXPY(ctx->V[1], -1.0, ctx->V[2], SAME_NONZERO_PATTERN)); in PCMatApply_HPDDMShell()
965 PetscCall(MatAXPY(Y, -1.0, ctx->V[1], SAME_NONZERO_PATTERN)); in PCMatApply_HPDDMShell()
967 …->parent->correction == PC_HPDDM_COARSE_CORRECTION_ADDITIVE, PetscObjectComm((PetscObject)pc), PET… in PCMatApply_HPDDMShell()
968 PetscCall(PCMatApply(ctx->pc, X, ctx->V[1])); in PCMatApply_HPDDMShell()
969 PetscCall(MatAXPY(Y, 1.0, ctx->V[1], SAME_NONZERO_PATTERN)); in PCMatApply_HPDDMShell()
971 if (reset) PetscCall(MatDenseResetArray(ctx->V[1])); in PCMatApply_HPDDMShell()
977 …ll - Applies the transpose of a (2) deflated, (1) additive, (3) balanced, or (4) no coarse correct…
980 (1) y = Pmat^-T x + Q^T x,
981 (2) y = (I - Q^T Amat^T) Pmat^-T x + Q^T x (default),
982 (3) y = (I - Q^T Amat^T) Pmat^-T (I - Amat Q) x + Q^T x,
983 (4) y = Pmat^-T x .
987 + pc - preconditioner context
988 - x - input vector
991 . y - output vector
1008 …PetscCheck(ctx->P, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCSHELL from PCHPDDM called with no HPDDM obj… in PCApplyTranspose_HPDDMShell()
1009 …PetscCheck(!ctx->parent->normal, PetscObjectComm((PetscObject)pc), PETSC_ERR_SUP, "Not implemented… in PCApplyTranspose_HPDDMShell()
1010 PetscCall(KSPGetOperators(ctx->ksp, &A, nullptr)); in PCApplyTranspose_HPDDMShell()
1011 …if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_NONE) PetscCall(PCApplyTranspose(ctx->pc… in PCApplyTranspose_HPDDMShell()
1014 …if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_DEFLATED || ctx->parent->correction == P… in PCApplyTranspose_HPDDMShell()
1015 if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_BALANCED) { in PCApplyTranspose_HPDDMShell()
1017 …PetscCall(PCHPDDMDeflate_Private(pc, x, ctx->v[1][1])); /* y = Q x … in PCApplyTranspose_HPDDMShell()
1018 …PetscCall(MatMult(A, ctx->v[1][1], ctx->v[1][0])); /* y = A Q x … in PCApplyTranspose_HPDDMShell()
1019 …PetscCall(VecWAXPY(ctx->v[1][1], -1.0, ctx->v[1][0], x)); /* y = (I - A Q) x … in PCApplyTranspose_HPDDMShell()
1020 …PetscCall(PCApplyTranspose(ctx->pc, ctx->v[1][1], ctx->v[1][0])); /* y = M^-T (I - A Q) x … in PCApplyTranspose_HPDDMShell()
1021 …} else PetscCall(PCApplyTranspose(ctx->pc, x, ctx->v[1][0])); /* y = M^-T x … in PCApplyTranspose_HPDDMShell()
1022 …PetscCall(MatMultHermitianTranspose(A, ctx->v[1][0], ctx->v[1][1])); /* z = A^T y … in PCApplyTranspose_HPDDMShell()
1023 …PetscCall(PCHPDDMDeflate_Private<true>(pc, ctx->v[1][1], ctx->v[1][1])); /* z = Q^T z … in PCApplyTranspose_HPDDMShell()
1024 …PetscCall(VecAXPBYPCZ(y, -1.0, 1.0, 1.0, ctx->v[1][1], ctx->v[1][0])); /* y = (I - Q^T A^T) y + … in PCApplyTranspose_HPDDMShell()
1026 …->parent->correction == PC_HPDDM_COARSE_CORRECTION_ADDITIVE, PetscObjectComm((PetscObject)pc), PET… in PCApplyTranspose_HPDDMShell()
1027 PetscCall(PCApplyTranspose(ctx->pc, x, ctx->v[1][0])); in PCApplyTranspose_HPDDMShell()
1028 PetscCall(VecAXPY(y, 1.0, ctx->v[1][0])); /* y = M^-T x + Q^T x */ in PCApplyTranspose_HPDDMShell()
1035 … PCMatApplyTranspose_HPDDMShell - Variant of PCApplyTranspose_HPDDMShell() for blocks of vectors.
1038 + pc - preconditioner context
1039 - X - block of input vectors
1042 . Y - block of output vectors
1056 …PetscCheck(ctx->P, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCSHELL from PCHPDDM called with no HPDDM obj… in PCMatApplyTranspose_HPDDMShell()
1057 …if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_NONE) PetscCall(PCMatApplyTranspose(ctx-… in PCMatApplyTranspose_HPDDMShell()
1058 else if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_BALANCED) { in PCMatApplyTranspose_HPDDMShell()
1062 PetscCall(MatProductNumeric(ctx->V[1])); in PCMatApplyTranspose_HPDDMShell()
1063 PetscCall(MatCopy(ctx->V[1], ctx->V[2], SAME_NONZERO_PATTERN)); in PCMatApplyTranspose_HPDDMShell()
1064 PetscCall(MatAXPY(ctx->V[2], -1.0, X, SAME_NONZERO_PATTERN)); in PCMatApplyTranspose_HPDDMShell()
1065 PetscCall(PCMatApplyTranspose(ctx->pc, ctx->V[2], ctx->V[1])); in PCMatApplyTranspose_HPDDMShell()
1066 PetscCall(MatProductNumeric(ctx->V[2])); in PCMatApplyTranspose_HPDDMShell()
1067 PetscCall(PCHPDDMDeflate_Private<true>(pc, ctx->V[2], ctx->V[2])); in PCMatApplyTranspose_HPDDMShell()
1068 PetscCall(MatAXPY(ctx->V[1], -1.0, ctx->V[2], SAME_NONZERO_PATTERN)); in PCMatApplyTranspose_HPDDMShell()
1070 PetscCall(MatAXPY(Y, -1.0, ctx->V[1], SAME_NONZERO_PATTERN)); in PCMatApplyTranspose_HPDDMShell()
1074 if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_DEFLATED) { in PCMatApplyTranspose_HPDDMShell()
1075 PetscCall(PCMatApplyTranspose(ctx->pc, X, ctx->V[2])); in PCMatApplyTranspose_HPDDMShell()
1076 PetscCall(MatAXPY(Y, 1.0, ctx->V[2], SAME_NONZERO_PATTERN)); in PCMatApplyTranspose_HPDDMShell()
1077 PetscCall(MatProductNumeric(ctx->V[1])); in PCMatApplyTranspose_HPDDMShell()
1078 …/* ctx->V[0] and ctx->V[1] memory regions overlap, so need to copy to ctx->V[2] and switch array */ in PCMatApplyTranspose_HPDDMShell()
1079 PetscCall(MatCopy(ctx->V[1], ctx->V[2], SAME_NONZERO_PATTERN)); in PCMatApplyTranspose_HPDDMShell()
1080 if (reset) PetscCall(MatDenseResetArray(ctx->V[1])); in PCMatApplyTranspose_HPDDMShell()
1081 PetscCall(MatDenseGetArrayWrite(ctx->V[2], &array)); in PCMatApplyTranspose_HPDDMShell()
1082 PetscCall(MatDensePlaceArray(ctx->V[1], array)); in PCMatApplyTranspose_HPDDMShell()
1083 PetscCall(MatDenseRestoreArrayWrite(ctx->V[2], &array)); in PCMatApplyTranspose_HPDDMShell()
1085 PetscCall(PCHPDDMDeflate_Private<true>(pc, ctx->V[1], ctx->V[1])); in PCMatApplyTranspose_HPDDMShell()
1086 PetscCall(MatAXPY(Y, -1.0, ctx->V[1], SAME_NONZERO_PATTERN)); in PCMatApplyTranspose_HPDDMShell()
1088 …->parent->correction == PC_HPDDM_COARSE_CORRECTION_ADDITIVE, PetscObjectComm((PetscObject)pc), PET… in PCMatApplyTranspose_HPDDMShell()
1089 PetscCall(PCMatApplyTranspose(ctx->pc, X, ctx->V[1])); in PCMatApplyTranspose_HPDDMShell()
1090 PetscCall(MatAXPY(Y, 1.0, ctx->V[1], SAME_NONZERO_PATTERN)); in PCMatApplyTranspose_HPDDMShell()
1092 if (reset) PetscCall(MatDenseResetArray(ctx->V[1])); in PCMatApplyTranspose_HPDDMShell()
1104 PetscCall(VecDestroyVecs(1, &ctx->v[0])); in PCDestroy_HPDDMShell()
1105 PetscCall(VecDestroyVecs(2, &ctx->v[1])); in PCDestroy_HPDDMShell()
1106 PetscCall(PetscObjectCompose((PetscObject)ctx->pc->mat, "_HPDDM_MatProduct", nullptr)); in PCDestroy_HPDDMShell()
1107 PetscCall(MatDestroy(ctx->V)); in PCDestroy_HPDDMShell()
1108 PetscCall(MatDestroy(ctx->V + 1)); in PCDestroy_HPDDMShell()
1109 PetscCall(MatDestroy(ctx->V + 2)); in PCDestroy_HPDDMShell()
1110 PetscCall(VecDestroy(&ctx->D)); in PCDestroy_HPDDMShell()
1111 PetscCall(PetscSFDestroy(&ctx->scatter)); in PCDestroy_HPDDMShell()
1112 PetscCall(PCDestroy(&ctx->pc)); in PCDestroy_HPDDMShell()
1116 template <class Type, bool T = false, typename std::enable_if<std::is_same<Type, Vec>::value>::type…
1117 static inline PetscErrorCode PCApply_Schur_Private(std::tuple<KSP, IS, Vec[2]> *p, PC factor, Type … in PCApply_Schur_Private()
1120 PetscCall(VecISCopy(std::get<2>(*p)[0], std::get<1>(*p), SCATTER_FORWARD, x)); in PCApply_Schur_Private()
1121 if (!T) PetscCall(PCApply(factor, std::get<2>(*p)[0], std::get<2>(*p)[1])); in PCApply_Schur_Private()
1122 else PetscCall(PCApplyTranspose(factor, std::get<2>(*p)[0], std::get<2>(*p)[1])); in PCApply_Schur_Private()
1123 PetscCall(VecISCopy(std::get<2>(*p)[1], std::get<1>(*p), SCATTER_REVERSE, y)); in PCApply_Schur_Private()
1127 template <class Type, bool = false, typename std::enable_if<std::is_same<Type, Mat>::value>::type *…
1128 static inline PetscErrorCode PCApply_Schur_Private(std::tuple<KSP, IS, Vec[2]> *p, PC factor, Type … in PCApply_Schur_Private()
1134 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, factor->mat->rmap->n, X->cmap->n, nullptr, B)); in PCApply_Schur_Private()
1135 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, factor->mat->rmap->n, X->cmap->n, nullptr, B + 1)); in PCApply_Schur_Private()
1136 for (PetscInt i = 0; i < X->cmap->n; ++i) { in PCApply_Schur_Private()
1139 PetscCall(VecISCopy(y, std::get<1>(*p), SCATTER_FORWARD, x)); in PCApply_Schur_Private()
1145 for (PetscInt i = 0; i < X->cmap->n; ++i) { in PCApply_Schur_Private()
1148 PetscCall(VecISCopy(x, std::get<1>(*p), SCATTER_REVERSE, y)); in PCApply_Schur_Private()
1163 std::tuple<KSP, IS, Vec[2]> *p; in PCApply_Schur()
1167 PetscCall(KSPGetPC(std::get<0>(*p), &factor)); in PCApply_Schur()
1184 PetscCall(MatMumpsSetIcntl(A, 26, -1)); in PCApply_Schur()
1195 std::tuple<KSP, IS, Vec[2]> *p; in PCDestroy_Schur()
1199 PetscCall(ISDestroy(&std::get<1>(*p))); in PCDestroy_Schur()
1200 PetscCall(VecDestroy(std::get<2>(*p))); in PCDestroy_Schur()
1201 PetscCall(VecDestroy(std::get<2>(*p) + 1)); in PCDestroy_Schur()
1213 PetscCall(KSPGetOperators(ctx->ksp, &B, nullptr)); in PCHPDDMSolve_Private()
1216 if (ctx->parent->log_separate) { in PCHPDDMSolve_Private()
1217 …j = std::distance(ctx->parent->levels, std::find(ctx->parent->levels, ctx->parent->levels + ctx->p… in PCHPDDMSolve_Private()
1218 PetscCall(PetscLogEventBegin(PC_HPDDM_Solve[j], ctx->ksp, nullptr, nullptr, nullptr)); in PCHPDDMSolve_Private()
1221 if (!ctx->ksp->vec_rhs) { in PCHPDDMSolve_Private()
1222 …all(VecCreateMPIWithArray(PetscObjectComm((PetscObject)ctx->ksp), 1, n, N, nullptr, &ctx->ksp->vec… in PCHPDDMSolve_Private()
1223 PetscCall(VecCreateMPI(PetscObjectComm((PetscObject)ctx->ksp), n, N, &ctx->ksp->vec_sol)); in PCHPDDMSolve_Private()
1225 PetscCall(VecPlaceArray(ctx->ksp->vec_rhs, rhs)); in PCHPDDMSolve_Private()
1226 if (!transpose) PetscCall(KSPSolve(ctx->ksp, nullptr, nullptr)); in PCHPDDMSolve_Private()
1228 PetscCall(VecConjugate(ctx->ksp->vec_rhs)); in PCHPDDMSolve_Private()
1229 …PetscCall(KSPSolveTranspose(ctx->ksp, nullptr, nullptr)); /* TODO: missing KSPSolveHermitianTransp… in PCHPDDMSolve_Private()
1230 PetscCall(VecConjugate(ctx->ksp->vec_sol)); in PCHPDDMSolve_Private()
1232 PetscCall(VecCopy(ctx->ksp->vec_sol, ctx->ksp->vec_rhs)); in PCHPDDMSolve_Private()
1233 PetscCall(VecResetArray(ctx->ksp->vec_rhs)); in PCHPDDMSolve_Private()
1235 …PetscCall(MatCreateDense(PetscObjectComm((PetscObject)ctx->ksp), n, PETSC_DECIDE, N, mu, rhs, &B)); in PCHPDDMSolve_Private()
1236 …PetscCall(MatCreateDense(PetscObjectComm((PetscObject)ctx->ksp), n, PETSC_DECIDE, N, mu, nullptr, … in PCHPDDMSolve_Private()
1237 if (!transpose) PetscCall(KSPMatSolve(ctx->ksp, B, X)); in PCHPDDMSolve_Private()
1240 …PetscCall(KSPMatSolveTranspose(ctx->ksp, B, X)); /* TODO: missing KSPMatSolveHermitianTranspose() … in PCHPDDMSolve_Private()
1247 …if (ctx->parent->log_separate) PetscCall(PetscLogEventEnd(PC_HPDDM_Solve[j], ctx->ksp, nullptr, nu… in PCHPDDMSolve_Private()
1253 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetUpNeumannOverlap_Private()
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()
1296 /* previously-composed Mat */ in PCHPDDMCommunicationAvoidingPCASM_Private()
1297 PetscCall(PetscObjectCompose((PetscObject)pc->pmat, "_PCHPDDM_SubMatrices", (PetscObject)C)); in PCHPDDMCommunicationAvoidingPCASM_Private()
1298 PetscCall(MatGetOperation(pc->pmat, MATOP_CREATE_SUBMATRICES, &op)); in PCHPDDMCommunicationAvoidingPCASM_Private()
1299 …/* trick suggested by Barry https://lists.mcs.anl.gov/pipermail/petsc-dev/2020-January/025491.html… in PCHPDDMCommunicationAvoidingPCASM_Private()
1300 …PetscCall(MatSetOperation(pc->pmat, MATOP_CREATE_SUBMATRICES, (PetscErrorCodeFn *)PCHPDDMCreateSub… in PCHPDDMCommunicationAvoidingPCASM_Private()
1302 …PetscCall(PCSetFromOptions(pc)); /* otherwise -pc_hpddm_levels_1_pc_as… in PCHPDDMCommunicationAvoidingPCASM_Private()
1305 PetscCall(MatSetOperation(pc->pmat, MATOP_CREATE_SUBMATRICES, op)); in PCHPDDMCommunicationAvoidingPCASM_Private()
1306 PetscCall(PetscObjectCompose((PetscObject)pc->pmat, "_PCHPDDM_SubMatrices", nullptr)); in PCHPDDMCommunicationAvoidingPCASM_Private()
1315 std::map<PetscInt, PetscInt> order; in PCHPDDMPermute_Private()
1327 for (PetscInt n = 0; n < size; n += bs) order.insert(std::make_pair(ptr[n] / bs, n / bs)); in PCHPDDMPermute_Private()
1332 for (const std::pair<const PetscInt, PetscInt> &i : order) *concatenate++ = i.second; in PCHPDDMPermute_Private()
1333 concatenate -= size; in PCHPDDMPermute_Private()
1336 /* permute user-provided Mat so that it matches with MatCreateSubMatrices() numbering */ in PCHPDDMPermute_Private()
1343 for (const std::pair<const PetscInt, PetscInt> &i : order) *concatenate++ = i.first; in PCHPDDMPermute_Private()
1344 concatenate -= size; in PCHPDDMPermute_Private()
1345 /* permute user-provided IS so that it matches with MatCreateSubMatrices() numbering */ in PCHPDDMPermute_Private()
1392 PetscCall(PetscLayoutCompare(T->rmap, A01->rmap, &flg)); in PCHPDDMCheckSymmetry_Private()
1394 PetscCall(PetscLayoutCompare(T->cmap, A01->cmap, &flg)); in PCHPDDMCheckSymmetry_Private()
1415 …if (!flg) PetscCall(PetscInfo(pc, "A01 and A10^T have non-congruent layouts, cannot test for equal… in PCHPDDMCheckSymmetry_Private()
1448 for (PetscInt row = 0; (row < X->rmap->n) && flg; ++row) { in PCHPDDMCheckMatStructure_Private()
1449 const PetscInt n = i[0][row + 1] - i[0][row]; in PCHPDDMCheckMatStructure_Private()
1488 PetscInt *idx, p = 0, bs = P->cmap->bs; in PCHPDDMAlgebraicAuxiliaryMat_Private()
1492 PetscCall(ISCreateStride(PETSC_COMM_SELF, P->cmap->N, 0, 1, icol + 2)); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1499 std::swap(P, Q); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1503 std::swap(P, Q); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1507 PetscCall(ISCreateStride(PETSC_COMM_SELF, M[0]->rmap->N, 0, 1, irow)); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1511 PetscCall(PetscMalloc2(P->cmap->N, &ptr, P->cmap->N / bs, &idx)); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1514 for (PetscInt n = 0; n < P->cmap->N; n += bs) { in PCHPDDMAlgebraicAuxiliaryMat_Private()
1515 …if (std::find_if(ptr + n, ptr + n + bs, [](PetscReal v) { return v > PETSC_MACHINE_EPSILON; }) != … in PCHPDDMAlgebraicAuxiliaryMat_Private()
1521 …/* first Mat will be used in PCASM (if it is used as a PC on this level) and as the left-hand side… in PCHPDDMAlgebraicAuxiliaryMat_Private()
1544 /* off-diagonal block row sum (full rows - diagonal block rows) */ in PCHPDDMAlgebraicAuxiliaryMat_Private()
1545 PetscCall(VecAXPY(sum[0], -1.0, sum[1])); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1546 /* subdomain matrix plus off-diagonal block row sum */ in PCHPDDMAlgebraicAuxiliaryMat_Private()
1557 PetscCall(PetscCalloc1(M[0]->cmap->n * bs, &ptr)); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1558 PetscCall(MatCreateDense(PETSC_COMM_SELF, M[0]->cmap->n, bs, M[0]->cmap->n, bs, ptr, &ones)); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1559 for (PetscInt n = 0; n < M[0]->cmap->n; n += bs) { in PCHPDDMAlgebraicAuxiliaryMat_Private()
1560 for (p = 0; p < bs; ++p) ptr[n + p * (M[0]->cmap->n + 1)] = 1.0; in PCHPDDMAlgebraicAuxiliaryMat_Private()
1564 PetscCall(MatCreateDense(PETSC_COMM_SELF, aux->cmap->n, bs, aux->cmap->n, bs, ptr, &ones)); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1565 PetscCall(MatDenseSetLDA(ones, M[0]->cmap->n)); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1569 /* off-diagonal block row sum (full rows - diagonal block rows) */ in PCHPDDMAlgebraicAuxiliaryMat_Private()
1570 PetscCall(MatAXPY(sum[0], -1.0, sum[1], SAME_NONZERO_PATTERN)); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1572 /* re-order values to be consistent with MatSetValuesBlocked() */ in PCHPDDMAlgebraicAuxiliaryMat_Private()
1576 HPDDM::Wrapper<PetscScalar>::imatcopy<'T'>(bs, sum[0]->rmap->n, ptr, sum[0]->rmap->n, bs); in PCHPDDMAlgebraicAuxiliaryMat_Private()
1577 /* subdomain matrix plus off-diagonal block row sum */ in PCHPDDMAlgebraicAuxiliaryMat_Private()
1578 …for (PetscInt n = 0; n < aux->cmap->n / bs; ++n) PetscCall(MatSetValuesBlocked(aux, 1, &n, 1, &n, … in PCHPDDMAlgebraicAuxiliaryMat_Private()
1585 /* left-hand side of GenEO, with the same sparsity pattern as PCASM subdomain solvers */ in PCHPDDMAlgebraicAuxiliaryMat_Private()
1599 std::pair<PC, Vec[2]> *p; in PCApply_Nest()
1603 …if (p->second[0]) { /* in case of a centralized Schur complement, some processes may have no local… in PCApply_Nest()
1604 PetscCall(PCGetOperators(p->first, &A, nullptr)); in PCApply_Nest()
1606 PetscCall(PetscObjectTypeCompareAny((PetscObject)p->first, &flg, PCLU, PCCHOLESKY, "")); in PCApply_Nest()
1608 PetscCall(PCFactorGetMatSolverType(p->first, &type)); in PCApply_Nest()
1609 PetscCall(PCFactorGetMatrix(p->first, &A)); in PCApply_Nest()
1610 if (A->schur) { in PCApply_Nest()
1615 …PetscCall(VecISCopy(p->second[0], is[1], SCATTER_FORWARD, x)); /* assign the RHS associated to the… in PCApply_Nest()
1616 PetscCall(PCApply(p->first, p->second[0], p->second[1])); in PCApply_Nest()
1617 …PetscCall(VecISCopy(p->second[1], is[1], SCATTER_REVERSE, y)); /* retrieve the partial solution as… in PCApply_Nest()
1618 …if (flg) PetscCall(MatMumpsSetIcntl(A, 26, -1)); /* default ICNTL(26) value in PETSc… in PCApply_Nest()
1625 std::pair<PC, Vec[2]> *p; in PCView_Nest()
1629 PetscCall(PCView(p->first, viewer)); in PCView_Nest()
1635 std::pair<PC, Vec[2]> *p; in PCDestroy_Nest()
1639 PetscCall(VecDestroy(p->second)); in PCDestroy_Nest()
1640 PetscCall(VecDestroy(p->second + 1)); in PCDestroy_Nest()
1641 PetscCall(PCDestroy(&p->first)); in PCDestroy_Nest()
1649 std::tuple<Mat, PetscSF, Vec[2]> *ctx; in MatMult_Schur()
1653 …PetscCall(VecScatterBegin(std::get<1>(*ctx), x, std::get<2>(*ctx)[0], INSERT_VALUES, SCATTER_FORWA… in MatMult_Schur()
1654 …PetscCall(VecScatterEnd(std::get<1>(*ctx), x, std::get<2>(*ctx)[0], INSERT_VALUES, SCATTER_FORWARD… in MatMult_Schur()
1655 …if (!T) PetscCall(MatMult(std::get<0>(*ctx), std::get<2>(*ctx)[0], std::get<2>(*ctx)[1])); /* loca… in MatMult_Schur()
1656 else PetscCall(MatMultTranspose(std::get<0>(*ctx), std::get<2>(*ctx)[0], std::get<2>(*ctx)[1])); in MatMult_Schur()
1658 …PetscCall(VecScatterBegin(std::get<1>(*ctx), std::get<2>(*ctx)[1], y, ADD_VALUES, SCATTER_REVERSE)… in MatMult_Schur()
1659 PetscCall(VecScatterEnd(std::get<1>(*ctx), std::get<2>(*ctx)[1], y, ADD_VALUES, SCATTER_REVERSE)); in MatMult_Schur()
1665 std::tuple<Mat, PetscSF, Vec[2]> *ctx; in MatDestroy_Schur()
1669 PetscCall(VecDestroy(std::get<2>(*ctx))); in MatDestroy_Schur()
1670 PetscCall(VecDestroy(std::get<2>(*ctx) + 1)); in MatDestroy_Schur()
1678 std::tuple<PC[2], Mat[2], PCSide, Vec[3]> *ctx; in MatMult_SchurCorrection()
1682 pc = ((PC_HPDDM *)std::get<0>(*ctx)[0]->data)->levels[0]->ksp->pc; in MatMult_SchurCorrection()
1683 …if (std::get<2>(*ctx) == PC_LEFT || std::get<2>(*ctx) == PC_SIDE_DEFAULT) { /* Q_0 is … in MatMult_SchurCorrection()
1684 …PetscCall(MatMult(std::get<1>(*ctx)[0], x, std::get<3>(*ctx)[1])); /* A_01 … in MatMult_SchurCorrection()
1685 …PetscCall(PCHPDDMDeflate_Private(pc, std::get<3>(*ctx)[1], std::get<3>(*ctx)[1])); /* Q_0 A… in MatMult_SchurCorrection()
1686 …PetscCall(MatMult(std::get<1>(*ctx)[1], std::get<3>(*ctx)[1], std::get<3>(*ctx)[0])); /* A_10 … in MatMult_SchurCorrection()
1687 …PetscCall(PCApply(std::get<0>(*ctx)[1], std::get<3>(*ctx)[0], y)); /* y = M_S^-… in MatMult_SchurCorrection()
1689 …PetscCall(PCApply(std::get<0>(*ctx)[1], x, std::get<3>(*ctx)[0])); /* M_S^-… in MatMult_SchurCorrection()
1690 …PetscCall(MatMult(std::get<1>(*ctx)[0], std::get<3>(*ctx)[0], std::get<3>(*ctx)[1])); /* A_01 … in MatMult_SchurCorrection()
1691 …PetscCall(PCHPDDMDeflate_Private(pc, std::get<3>(*ctx)[1], std::get<3>(*ctx)[1])); /* Q_0 A… in MatMult_SchurCorrection()
1692 …PetscCall(MatMult(std::get<1>(*ctx)[1], std::get<3>(*ctx)[1], y)); /* y = A_10 … in MatMult_SchurCorrection()
1694 …PetscCall(VecAXPY(y, -1.0, x)); /* y -= x, preconditioned eq. (24) of https://hal.science/hal-0234… in MatMult_SchurCorrection()
1701 std::tuple<PC[2], Mat[2], PCSide, Vec[3]> *ctx; in MatView_SchurCorrection()
1707 …on of %s\n", std::get<2>(*ctx) == PC_LEFT || std::get<2>(*ctx) == PC_SIDE_DEFAULT ? "(I - M_S^-1 A… in MatView_SchurCorrection()
1708 …PetscCall(PCView(std::get<0>(*ctx)[1], viewer)); /* no need to PCView(Q_0) since it will be done b… in MatView_SchurCorrection()
1715 std::tuple<PC[2], Mat[2], PCSide, Vec[3]> *ctx; in MatDestroy_SchurCorrection()
1719 PetscCall(VecDestroy(std::get<3>(*ctx))); in MatDestroy_SchurCorrection()
1720 PetscCall(VecDestroy(std::get<3>(*ctx) + 1)); in MatDestroy_SchurCorrection()
1721 PetscCall(VecDestroy(std::get<3>(*ctx) + 2)); in MatDestroy_SchurCorrection()
1722 PetscCall(PCDestroy(std::get<0>(*ctx) + 1)); in MatDestroy_SchurCorrection()
1730 PetscCall(VecScale(x, -1.0)); in PCPostSolve_SchurPreLeastSquares()
1736 …std::tuple<PC[2], Mat[2], PCSide, Vec[3]> *ctx = reinterpret_cast<std::tuple<PC[2], Mat[2], PCSide… in KSPPreSolve_SchurCorrection()
1739 if (std::get<2>(*ctx) == PC_LEFT || std::get<2>(*ctx) == PC_SIDE_DEFAULT) { in KSPPreSolve_SchurCorrection()
1740 PetscCall(PCApply(std::get<0>(*ctx)[1], b, std::get<3>(*ctx)[2])); in KSPPreSolve_SchurCorrection()
1741 …std::swap(*b, *std::get<3>(*ctx)[2]); /* replace b by M^-1 b, but need to keep a copy of the origi… in KSPPreSolve_SchurCorrection()
1748 …std::tuple<PC[2], Mat[2], PCSide, Vec[3]> *ctx = reinterpret_cast<std::tuple<PC[2], Mat[2], PCSide… in KSPPostSolve_SchurCorrection()
1751 …if (std::get<2>(*ctx) == PC_LEFT || std::get<2>(*ctx) == PC_SIDE_DEFAULT) std::swap(*b, *std::get<… in KSPPostSolve_SchurCorrection()
1753 PetscCall(PCApply(std::get<0>(*ctx)[1], x, std::get<3>(*ctx)[2])); in KSPPostSolve_SchurCorrection()
1754 PetscCall(VecCopy(std::get<3>(*ctx)[2], x)); /* replace x by M^-1 x */ in KSPPostSolve_SchurCorrection()
1767 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCSetUp_HPDDM()
1772 std::vector<Vec> initial; in PCSetUp_HPDDM()
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()
1782 std::tuple<PC[2], Mat[2], PCSide, Vec[3]> *ctx = nullptr; 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()
1799 /* if the fine-level PCSHELL exists, its setup has succeeded, and one wants to reuse it, */ 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 …ata->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()
1885 …PetscCall(PetscOptionsGetBool(((PetscObject)pc)->options, pcpre, "-pc_hpddm_block_splitting", &blo… in PCSetUp_HPDDM()
1886 …PetscCall(PetscOptionsGetInt(((PetscObject)pc)->options, pcpre, "-pc_hpddm_harmonic_overlap", &ove… in PCSetUp_HPDDM()
1888 if (data->is || flg) { in PCSetUp_HPDDM()
1889 if (block || overlap != -1) { in PCSetUp_HPDDM()
1890 PetscCall(ISDestroy(&data->is)); in PCSetUp_HPDDM()
1891 PetscCall(MatDestroy(&data->aux)); in PCSetUp_HPDDM()
1895 …PetscCall(PetscOptionsGetEnum(((PetscObject)pc)->options, pcpre, "-pc_hpddm_schur_precondition", P… 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()
1917 …-%spc_hpddm_schur_precondition %s and -%spc_type %s (!= %s)", pcpre ? pcpre : "", PCHPDDMSchurPreT… in PCSetUp_HPDDM()
1918 ((PetscObject)pc_00)->type_name, PCHPDDM); in PCSetUp_HPDDM()
1919 data_00 = (PC_HPDDM *)pc_00->data; in PCSetUp_HPDDM()
1920 …->N == 2, PetscObjectComm((PetscObject)P), PETSC_ERR_ARG_INCOMP, "-%spc_hpddm_schur_precondition %… in PCSetUp_HPDDM()
1921 data_00->N, data_00->N > 1 ? "s" : "", ((PetscObject)pc_00)->prefix); in PCSetUp_HPDDM()
1922 …->levels[0]->pc, PetscObjectComm((PetscObject)P), PETSC_ERR_ORDER, "PC of the first block%s not se… in PCSetUp_HPDDM()
1923 PetscCall(PetscObjectTypeCompare((PetscObject)data_00->levels[0]->pc, PCASM, &flg)); in PCSetUp_HPDDM()
1924 … "-%spc_hpddm_schur_precondition %s and -%spc_type %s (!= %s)", pcpre ? pcpre : "", PCHPDDMSchurPr… in PCSetUp_HPDDM()
1925 ((PetscObject)data_00->levels[0]->pc)->type_name, PCASM); in PCSetUp_HPDDM()
1926 …PetscCall(PetscNew(&ctx)); /* context to pass data around for the inner-most PC, which will be a p… in PCSetUp_HPDDM()
1930 …flg = PetscBool(std::find_if(ranges, ranges + size + 1, [&](PetscInt v) { return v != ranges[0] &&… in PCSetUp_HPDDM()
1932 if (PetscDefined(USE_DEBUG) || !data->is) { in PCSetUp_HPDDM()
1952 } else if (!data->is) { in PCSetUp_HPDDM()
1958 PetscCall(ISCreateStride(PETSC_COMM_SELF, B->rmap->N, 0, 1, &uis)); in PCSetUp_HPDDM()
1960 if (!data->is) { in PCSetUp_HPDDM()
1963 PetscCall(ISDuplicate(data_00->is, 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()
1984 …PetscCall(MatCreateSubMatrices(B, 1, &uis, &data_00->is, MAT_INITIAL_MATRIX, &sub)); /* expensive … in PCSetUp_HPDDM()
1986 PetscCall(ISDuplicate(data->is, &uis)); in PCSetUp_HPDDM()
1988 PetscCall(ISComplement(uis, 0, B->rmap->N, is)); in PCSetUp_HPDDM()
1993 … R_i^d (R_i^d)^T A_10 (R_i^p)^T"); /* cf. eq. (9) of https://hal.science/hal-02343808v6/document */ 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()
2017 …t)P), PETSC_ERR_ARG_INCOMP, "-%spc_hpddm_schur_precondition geneo and -%spc_hpddm_has_neumann != t… in PCSetUp_HPDDM()
2018 … 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()
2046 PetscCallCXX(std::copy_n(read, n, diagonal)); in PCSetUp_HPDDM()
2053 …for (PetscInt i = 0; i < n; ++i) write[i] = (!diagonal || std::abs(diagonal[i]) < PETSC_MACHINE_EP… 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()
2071 PetscCall(KSPSetOperators(inner_ksp, pc->mat, pc->pmat)); in PCSetUp_HPDDM()
2072 … PetscCall(KSPSetOptionsPrefix(inner_ksp, std::string(std::string(prefix) + "pc_hpddm_").c_str())); in PCSetUp_HPDDM()
2077 …PCSetType(inner, PCNONE)); /* no preconditioner since the action of M^-1 A or A M^-1 will be compu… in PCSetUp_HPDDM()
2079 … std::get<0>(*ctx)[0] = pc_00; /* for coarse correction on the primal (e.g., velocity) space */ in PCSetUp_HPDDM()
2080 PetscCall(PCCreate(PetscObjectComm((PetscObject)pc), &std::get<0>(*ctx)[1])); in PCSetUp_HPDDM()
2082 PetscCall(PCSetOptionsPrefix(std::get<0>(*ctx)[1], prefix)); in PCSetUp_HPDDM()
2084 PetscCall(PCSetOperators(std::get<0>(*ctx)[1], pc->mat, pc->pmat)); in PCSetUp_HPDDM()
2085 PetscCall(PCSetType(std::get<0>(*ctx)[1], PCHPDDM)); in PCSetUp_HPDDM()
2086 …liaryMat(std::get<0>(*ctx)[1], uis, uaux, nullptr, nullptr)); /* transfer ownership of the auxilia… in PCSetUp_HPDDM()
2087 … if (flg) static_cast<PC_HPDDM *>(std::get<0>(*ctx)[1]->data)->Neumann = PETSC_BOOL3_TRUE; in PCSetUp_HPDDM()
2094 PetscCall(PCSetFromOptions(std::get<0>(*ctx)[1])); in PCSetUp_HPDDM()
2097 … inner->mat->rmap->n, inner->mat->cmap->n, inner->mat->rmap->N, inner->mat->cmap->N, ctx, &S)); /*… in PCSetUp_HPDDM()
2101 PetscCall(KSPGetPCSide(inner_ksp, &(std::get<2>(*ctx)))); in PCSetUp_HPDDM()
2102 if (std::get<2>(*ctx) == PC_LEFT || std::get<2>(*ctx) == PC_SIDE_DEFAULT) { in PCSetUp_HPDDM()
2105 …PetscCheck(std::get<2>(*ctx) == PC_RIGHT, PetscObjectComm((PetscObject)pc), PETSC_ERR_SUP, "PCSide… in PCSetUp_HPDDM()
2108 …PetscCall(PetscObjectContainerCompose((PetscObject)std::get<0>(*ctx)[1], "_PCHPDDM_Schur", ctx, nu… in PCSetUp_HPDDM()
2109 PetscCall(PCSetUp(std::get<0>(*ctx)[1])); in PCSetUp_HPDDM()
2111 … PetscCall(MatCreateVecs(std::get<1>(*ctx)[0], std::get<3>(*ctx), std::get<3>(*ctx) + 1)); in PCSetUp_HPDDM()
2112 PetscCall(VecDuplicate(std::get<3>(*ctx)[0], std::get<3>(*ctx) + 2)); in PCSetUp_HPDDM()
2116 std::get<0>(*ctx)[0] = pc_00; in PCSetUp_HPDDM()
2118 …(ISCreateStride(PetscObjectComm((PetscObject)data_00->is), A11->rmap->n, A11->rmap->rstart, 1, &da… in PCSetUp_HPDDM()
2119 PetscCall(MatGetDiagonalBlock(A11, &data->aux)); in PCSetUp_HPDDM()
2120 PetscCall(PetscObjectReference((PetscObject)data->aux)); in PCSetUp_HPDDM()
2123 …for (std::vector<Vec>::iterator it = initial.begin(); it != initial.end(); ++it) PetscCall(VecDest… in PCSetUp_HPDDM()
2131 if (!data->is && data->N > 1) { in PCSetUp_HPDDM()
2135 … if (flg || (A->rmap->N != A->cmap->N && P->rmap->N == P->cmap->N && P->rmap->N == A->cmap->N)) { in PCSetUp_HPDDM()
2139 …if (data->correction == PC_HPDDM_COARSE_CORRECTION_DEFLATED) data->correction = PC_HPDDM_COARSE_CO… in PCSetUp_HPDDM()
2148 …PetscCall(PetscOptionsGetEnum(((PetscObject)pc)->options, pcpre, "-pc_hpddm_schur_precondition", P… in PCSetUp_HPDDM()
2162 …OMPLEMENT_AINV_BLOCK_DIAG, PetscObjectComm((PetscObject)P), PETSC_ERR_SUP, "-%smat_schur_complemen… in PCSetUp_HPDDM()
2163 … ((PetscObject)P)->prefix ? ((PetscObject)P)->prefix : "", MatSchurComplementAinvTypes[type]); in PCSetUp_HPDDM()
2170 …(MatCreateAIJ(PetscObjectComm((PetscObject)A00), A00->rmap->n, A00->cmap->n, A00->rmap->N, A00->cm… in PCSetUp_HPDDM()
2172 …for (n = A00->rmap->rstart; n < A00->rmap->rend; ++n) PetscCall(MatSetValue(P00, n, n, array[n - A… in PCSetUp_HPDDM()
2190 PetscCall(MatSetOptionsPrefix(D00, ((PetscObject)A00)->prefix)); in PCSetUp_HPDDM()
2192 …PetscCall(MatSetFromOptions(D00)); /* for setting -mat_block_size dynamic… in PCSetUp_HPDDM()
2212 PetscCall(PetscObjectTypeCompare((PetscObject)data->aux, MATSEQAIJ, &flg)); in PCSetUp_HPDDM()
2221 … PetscCall(PCSetOperators(pc, P, P)); /* replace P by A01^T inv(diag(P00)) A01 - diag(P11) */ in PCSetUp_HPDDM()
2224 …pc->ops->postsolve = PCPostSolve_SchurPreLeastSquares; /* PCFIELDSPLIT expect a KSP for (P11 - A1… in PCSetUp_HPDDM()
2225 …(&N)); /* but a PC for (A10 inv(diag(P00)) A10 - P11) is setup instea… in PCSetUp_HPDDM()
2229 …-%spc_hpddm_schur_precondition %s without a prior call to PCHPDDMSetAuxiliaryMat() on the A11 bloc… in PCSetUp_HPDDM()
2230 …for (std::vector<Vec>::iterator it = initial.begin(); it != initial.end(); ++it) PetscCall(VecDest… in PCSetUp_HPDDM()
2233 …PetscCall(PetscOptionsGetString(((PetscObject)pc)->options, pcpre, "-pc_hpddm_levels_1_st_pc_type"… in PCSetUp_HPDDM()
2235 …PetscObjectComm((PetscObject)P), PETSC_ERR_ARG_INCOMP, "-%spc_hpddm_levels_1_st_pc_type mat and -%… in PCSetUp_HPDDM()
2236 if (overlap != -1) { in PCSetUp_HPDDM()
2237 …lgebraic, PetscObjectComm((PetscObject)P), PETSC_ERR_ARG_INCOMP, "-%spc_hpddm_%s and -%spc_hpddm_h… in PCSetUp_HPDDM()
2238 …PetscCheck(overlap >= 1, PetscObjectComm((PetscObject)P), PETSC_ERR_ARG_WRONG, "-%spc_hpddm_harmon… in PCSetUp_HPDDM()
2240 if (block || overlap != -1) algebraic = PETSC_TRUE; 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()
2246 …a fully-algebraic coarse operator with an assembled Pmat and -%spc_hpddm_levels_1_st_pc_type != ma… 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()
2257 std::initializer_list<std::string> list = {MATSEQBAIJ, MATSEQSBAIJ}; in PCSetUp_HPDDM()
2259 …std::initializer_list<std::string>::const_iterator it = std::find(list.begin(), list.end(), ((Pets… in PCSetUp_HPDDM()
2261 switch (std::distance(list.begin(), it)) { in PCSetUp_HPDDM()
2274 PetscCall(KSPSetOperators(data->levels[0]->ksp, A, C)); in PCSetUp_HPDDM()
2275 std::swap(C, P); in PCSetUp_HPDDM()
2282 data->Neumann = PETSC_BOOL3_FALSE; in PCSetUp_HPDDM()
2285 is[0] = data->is; in PCSetUp_HPDDM()
2287 …PetscCall(PetscOptionsGetBool(((PetscObject)pc)->options, pcpre, "-pc_hpddm_define_subdomains", &s… in PCSetUp_HPDDM()
2288 …etscObjectComm((PetscObject)P), PETSC_ERR_ARG_INCOMP, "-%spc_hpddm_schur_precondition geneo and -%… in PCSetUp_HPDDM()
2289 if (PetscBool3ToBool(data->Neumann)) { in PCSetUp_HPDDM()
2290 …ck, PetscObjectComm((PetscObject)P), PETSC_ERR_ARG_INCOMP, "-%spc_hpddm_block_splitting and -%spc_… in PCSetUp_HPDDM()
2291 …tscCheck(overlap == -1, PetscObjectComm((PetscObject)P), PETSC_ERR_ARG_INCOMP, "-%spc_hpddm_harmon… in PCSetUp_HPDDM()
2292 …PetscObjectComm((PetscObject)P), PETSC_ERR_ARG_INCOMP, "-%spc_hpddm_levels_1_st_pc_type mat and -%… 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()
2298 …GetEnum(((PetscObject)pc)->options, prefix, "-st_matstructure", MatStructures, (PetscEnum *)&struc… in PCSetUp_HPDDM()
2300 …PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-%spc_hpddm_levels_1_st_matstructure", pcpre ? pc… in PCSetUp_HPDDM()
2301 PetscCall(PetscOptionsSetValue(((PetscObject)pc)->options, prefix, MatStructures[structure])); 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()
2306 …all(PetscInfo(pc, "Cannot share subdomain KSP between SLEPc and PETSc since -%spc_hpddm_define_sub… in PCSetUp_HPDDM()
2307 …else if (data->deflation) PetscCall(PetscInfo(pc, "Nothing to share since PCHPDDMSetDeflationMat()… in PCSetUp_HPDDM()
2310 …PetscCall(PetscInfo(pc, "Cannot share subdomain KSP between SLEPc and PETSc since -%spc_hpddm_leve… in PCSetUp_HPDDM()
2311 else data->share = PETSC_TRUE; in PCSetUp_HPDDM()
2312 if (!data->share) { in PCSetUp_HPDDM()
2313 …PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "-%spc_hpddm_levels_1_st_share_sub_ksp", pcpre ? p… in PCSetUp_HPDDM()
2314 PetscCall(PetscOptionsClearValue(((PetscObject)pc)->options, prefix)); 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()
2331 …if (!ctx && overlap == -1) PetscCall(PetscObjectComposeFunction((PetscObject)pc->pmat, "PCHPDDMAlg… in PCSetUp_HPDDM()
2332 if (!PetscBool3ToBool(data->Neumann) && (!algebraic || overlap != -1)) { in PCSetUp_HPDDM()
2342 if (algebraic && overlap == -1) { in PCSetUp_HPDDM()
2343 …PetscUseMethod(pc->pmat, "PCHPDDMAlgebraicAuxiliaryMat_Private_C", (Mat, IS *, Mat *[], PetscBool)… in PCSetUp_HPDDM()
2345 …etscCall(PetscObjectQuery((PetscObject)sub[0], "_PCHPDDM_Neumann_Mat", (PetscObject *)&data->aux)); in PCSetUp_HPDDM()
2348 } else if (!uaux || overlap != -1) { in PCSetUp_HPDDM()
2350 if (PetscBool3ToBool(data->Neumann)) sub = &data->aux; in PCSetUp_HPDDM()
2353 if (overlap != -1) { in PCSetUp_HPDDM()
2357 … const PetscInt *i[2], bs = P->cmap->bs; /* with a GEVP: [ A_00 A_01 ] */ in PCSetUp_HPDDM()
2359 … std::vector<PetscInt> v[2]; /* [ A_21 A_22 ] */ in PCSetUp_HPDDM()
2362 PetscCall(ISDuplicate(data->is, ov)); in PCSetUp_HPDDM()
2363 if (overlap > 1) PetscCall(MatIncreaseOverlap(P, 1, ov, overlap - 1)); in PCSetUp_HPDDM()
2368 flg = PetscBool(n[0] == n[1] && n[0] != P->rmap->n); in PCSetUp_HPDDM()
2373 …PetscCheck(--overlap, PetscObjectComm((PetscObject)pc), PETSC_ERR_SUP, "No oversampling possible"); in PCSetUp_HPDDM()
2374 …PetscCall(PetscInfo(pc, "Supplied -%spc_hpddm_harmonic_overlap parameter is too large, it has been… in PCSetUp_HPDDM()
2378 h->ksp = nullptr; in PCSetUp_HPDDM()
2379 PetscCall(PetscCalloc1(2, &h->A)); in PCSetUp_HPDDM()
2380 PetscCall(PetscOptionsHasName(((PetscObject)pc)->options, prefix, "-eps_nev", &flg)); in PCSetUp_HPDDM()
2382 … PetscCall(PetscOptionsHasName(((PetscObject)pc)->options, prefix, "-svd_nsv", &flg)); in PCSetUp_HPDDM()
2383 …if (!flg) PetscCall(PetscOptionsHasName(((PetscObject)pc)->options, prefix, "-svd_threshold_relati… in PCSetUp_HPDDM()
2387 PetscCall(PetscCalloc1(5, &h->is)); in PCSetUp_HPDDM()
2390 v[1].reserve((n[1] - n[0]) / bs); in PCSetUp_HPDDM()
2396 h->A[1] = a[0]; in PCSetUp_HPDDM()
2397 PetscCall(PetscObjectReference((PetscObject)h->A[1])); in PCSetUp_HPDDM()
2398 v[0].reserve((n[0] - P->rmap->n) / bs); in PCSetUp_HPDDM()
2407 …scCall(ISCreateBlock(PETSC_COMM_SELF, bs, v[1].size(), v[1].data(), PETSC_COPY_VALUES, h->is + 4)); in PCSetUp_HPDDM()
2408 …PetscCall(MatCreateSubMatrix(a[0], rows, h->is[4], MAT_INITIAL_MATRIX, h->A)); /* A_12 submatrix f… in PCSetUp_HPDDM()
2415 PetscCall(ISEmbed(loc, ov[1], PETSC_TRUE, h->is + 3)); in PCSetUp_HPDDM()
2416 PetscCall(ISEmbed(data->is, ov[1], PETSC_TRUE, h->is + 2)); in PCSetUp_HPDDM()
2418 v[0].reserve((n[0] - P->rmap->n) / bs); in PCSetUp_HPDDM()
2426 PetscCall(ISCreateStride(PETSC_COMM_SELF, a[0]->rmap->n, 0, 1, &stride)); in PCSetUp_HPDDM()
2435 PetscCall(ISEmbed(loc, data->is, PETSC_TRUE, h->is + 2)); in PCSetUp_HPDDM()
2437 …PetscCall(MatCreateSubMatrix(a[0], rows, cols, MAT_INITIAL_MATRIX, h->A)); /* A_12 submatrix from … in PCSetUp_HPDDM()
2440 PetscCall(ISCreateStride(PETSC_COMM_SELF, A0->rmap->n, 0, 1, &stride)); in PCSetUp_HPDDM()
2441 PetscCall(ISEmbed(rows, stride, PETSC_TRUE, h->is)); in PCSetUp_HPDDM()
2444 PetscCall(ISEmbed(loc, ov[0], PETSC_TRUE, h->is + 1)); 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()
2458 PetscInt n = -1; in PCSetUp_HPDDM()
2459 …PetscTryMethod(data->levels[0]->pc, "PCASMGetSubKSP_C", (PC, PetscInt *, PetscInt *, KSP **), (dat… in PCSetUp_HPDDM()
2462 h->ksp = ksp[0]; in PCSetUp_HPDDM()
2463 PetscCall(PetscObjectReference((PetscObject)h->ksp)); in PCSetUp_HPDDM()
2467 if (!h->ksp) { in PCSetUp_HPDDM()
2468 PetscBool share = data->share; in PCSetUp_HPDDM()
2470 PetscCall(KSPCreate(PETSC_COMM_SELF, &h->ksp)); in PCSetUp_HPDDM()
2471 PetscCall(KSPSetType(h->ksp, KSPPREONLY)); in PCSetUp_HPDDM()
2472 PetscCall(KSPSetOperators(h->ksp, A0, A0)); in PCSetUp_HPDDM()
2474 if (!data->share) { in PCSetUp_HPDDM()
2477 PetscCall(KSPSetOptionsPrefix(h->ksp, prefix)); in PCSetUp_HPDDM()
2478 PetscCall(KSPSetFromOptions(h->ksp)); in PCSetUp_HPDDM()
2482 … PetscCall(PetscObjectTypeCompareAny((PetscObject)ksp[0]->pc, &data->share, PCLU, PCCHOLESKY, "")); in PCSetUp_HPDDM()
2483 if (data->share) { in PCSetUp_HPDDM()
2484 PetscCall(PCFactorGetMatSolverType(ksp[0]->pc, &type)); in PCSetUp_HPDDM()
2486 … if (PetscDefined(HAVE_MUMPS)) PetscCall(PCFactorSetMatSolverType(ksp[0]->pc, MATSOLVERMUMPS)); in PCSetUp_HPDDM()
2487 …f (PetscDefined(HAVE_MKL_PARDISO)) PetscCall(PCFactorSetMatSolverType(ksp[0]->pc, MATSOLVERMKL_PAR… 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()
2495 std::tuple<KSP, IS, Vec[2]> *p; in PCSetUp_HPDDM()
2497 PetscCall(PCFactorGetMatrix(ksp[0]->pc, &A)); in PCSetUp_HPDDM()
2498 PetscCall(MatFactorSetSchurIS(A, h->is[4])); in PCSetUp_HPDDM()
2501 PetscCall(KSPSetOptionsPrefix(h->ksp, prefix)); in PCSetUp_HPDDM()
2502 PetscCall(KSPSetFromOptions(h->ksp)); in PCSetUp_HPDDM()
2503 PetscCall(PCSetType(h->ksp->pc, PCSHELL)); in PCSetUp_HPDDM()
2505 std::get<0>(*p) = ksp[0]; in PCSetUp_HPDDM()
2506 PetscCall(ISEmbed(ov[0], ov[1], PETSC_TRUE, &std::get<1>(*p))); in PCSetUp_HPDDM()
2507 PetscCall(MatCreateVecs(A, std::get<2>(*p), std::get<2>(*p) + 1)); in PCSetUp_HPDDM()
2508 PetscCall(PCShellSetContext(h->ksp->pc, p)); in PCSetUp_HPDDM()
2509 PetscCall(PCShellSetApply(h->ksp->pc, PCApply_Schur)); in PCSetUp_HPDDM()
2510 PetscCall(PCShellSetApplyTranspose(h->ksp->pc, PCApply_Schur<Vec, true>)); in PCSetUp_HPDDM()
2511 PetscCall(PCShellSetMatApply(h->ksp->pc, PCApply_Schur<Mat>)); in PCSetUp_HPDDM()
2512 PetscCall(PCShellSetDestroy(h->ksp->pc, PCDestroy_Schur)); 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 …PetscCall(MatCreateShell(PETSC_COMM_SELF, P->rmap->n, n[1] - n[0], P->rmap->n, n[1] - n[0], h, &da… in PCSetUp_HPDDM()
2527 …PetscCall(KSPSetErrorIfNotConverged(h->ksp, PETSC_TRUE)); /* bail out as early as possible to avoi… in PCSetUp_HPDDM()
2528 PetscCall(MatCreateVecs(h->ksp->pc->pmat, &h->v, nullptr)); 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()
2565 PetscInt size = -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()
2590 …PetscCheck(size == -1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Number of subdomain solver %" PetscInt_FM… in PCSetUp_HPDDM()
2591 …share subdomain KSP between SLEPc and PETSc since PCASMGetSubKSP() not found in fine-level PC\n")); in PCSetUp_HPDDM()
2598 …etscCall(PCHPDDMPermute_Private(unsorted, data->is, &uis, PetscBool3ToBool(data->Neumann) ? sub[0]… 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()
2621 …OMP, "-%spc_hpddm_levels_1_pc_asm_sub_mat_type %s and auxiliary Mat of type %s", pcpre ? pcpre : "… 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()
2659 std::pair<PC, Vec[2]> *p; in PCSetUp_HPDDM()
2661 n = -1; in PCSetUp_HPDDM()
2662 …PetscTryMethod(data_00->levels[0]->pc, "PCASMGetSubKSP_C", (PC, PetscInt *, PetscInt *, KSP **), (… in PCSetUp_HPDDM()
2665 PetscCall(ISGetLocalSize(data_00->is, &n)); in PCSetUp_HPDDM()
2666 if (n != subA[0]->rmap->n || n != subA[0]->cmap->n) { in PCSetUp_HPDDM()
2667 PetscCall(PCASMGetLocalSubdomains(data_00->levels[0]->pc, &n, &is_00, nullptr)); in PCSetUp_HPDDM()
2669 …->rmap->n && n == subA[0]->cmap->n, PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "-%spc_hpddm_schur_prec… in PCSetUp_HPDDM()
2670 } else is_00 = &data_00->is; 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()
2675 PetscCall(MatSchurComplementGetSubMatrices(P, &A00, &P00, std::get<1>(*ctx), &A10, &A11)); in PCSetUp_HPDDM()
2676 std::get<1>(*ctx)[1] = A10; in PCSetUp_HPDDM()
2689 PetscCall(MatCreateSubMatrices(A10, 1, &data->is, &sorted, MAT_INITIAL_MATRIX, &sub)); in PCSetUp_HPDDM()
2693 … PetscCall(PetscObjectTypeCompare((PetscObject)std::get<1>(*ctx)[0], MATTRANSPOSEVIRTUAL, &flg)); in PCSetUp_HPDDM()
2695 if (flg) PetscCall(MatTransposeGetMat(std::get<1>(*ctx)[0], &A10)); in PCSetUp_HPDDM()
2699 …PetscCall(PetscObjectTypeCompare((PetscObject)std::get<1>(*ctx)[0], MATHERMITIANTRANSPOSEVIRTUAL, … in PCSetUp_HPDDM()
2700 if (flg) PetscCall(MatHermitianTransposeGetMat(std::get<1>(*ctx)[0], &A10)); 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()
2745 …COMM_SELF, 2, nullptr, 2, nullptr, b, &N)); /* instead of computing inv(A11 - A10 inv(A00) A01), c… in PCSetUp_HPDDM()
2750 PetscCall(PCSetOptionsPrefix(s, ((PetscObject)inner)->prefix)); in PCSetUp_HPDDM()
2763 PetscCall(MatSetOptionsPrefix(*b, ((PetscObject)s)->prefix)); in PCSetUp_HPDDM()
2764 n = -1; in PCSetUp_HPDDM()
2765 …PetscCall(PetscOptionsGetInt(((PetscObject)pc)->options, ((PetscObject)s)->prefix, "-mat_mumps_icn… in PCSetUp_HPDDM()
2766 …1) { /* allocates a square MatDense of size is[1]->map->n, so one */ in PCSetUp_HPDDM()
2779 p->first = s; in PCSetUp_HPDDM()
2780 if (n != 0) PetscCall(MatCreateVecs(*b, p->second, p->second + 1)); in PCSetUp_HPDDM()
2781 else p->second[0] = p->second[1] = nullptr; 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()
2827 …/* only useful for -mat_type baij -pc_hpddm_levels_1_st_pc_type cholesky (no problem with MATAIJ o… 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()
2844 PetscCall(MatAXPY(A[1], -1.0, A[2], UNKNOWN_NONZERO_PATTERN)); in PCSetUp_HPDDM()
2848 …n Mat for the interior unknowns, so it cannot be the Neumann matrix, remove -%spc_hpddm_has_neuman… in PCSetUp_HPDDM()
2853 } else weighted = data->B; in PCSetUp_HPDDM()
2856 …ata->levels[0]->P, data->is, ismatis ? C : (algebraic && !block && overlap == -1 ? sub[0] : (!ctx … 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 …od(data->levels[0]->ksp, "PCHPDDMSetUp_Private_C", (Mat *, Mat *, PetscInt, PetscInt *const, PC_HP… 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()
2879 …if (!ismatis) PetscCall(PetscObjectComposeFunction((PetscObject)pc->pmat, "PCHPDDMAlgebraicAuxilia… 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 …DestroySubMatrices_Private(PetscBool3ToBool(data->Neumann), PetscBool(algebraic && !block && overl… 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()
2906 std::tuple<Mat, PetscSF, Vec[2]> *ctx; in PCSetUp_HPDDM()
2908 PetscCall(KSPGetOperators(data->levels[n]->ksp, nullptr, &Pmat)); in PCSetUp_HPDDM()
2912 std::get<0>(*ctx) = S; 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()
2918 PetscCall(MatCreateVecs(S, std::get<2>(*ctx), std::get<2>(*ctx) + 1)); 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()
2932 …if (overlap == -1) PetscCall(PetscObjectComposeFunction((PetscObject)pc->pmat, "PCHPDDMAlgebraicAu… 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()
2938 if (!inner->setupcalled) PetscCall(PCSetType(inner, PCASM)); in PCSetUp_HPDDM()
2940 PetscCall(PCSetModifySubMatrices(inner, pc->modifysubmatrices, pc->modifysubmatricesP)); in PCSetUp_HPDDM()
2941 PetscCall(PetscStrcmp(((PetscObject)inner)->type_name, PCASM, &flg)); in PCSetUp_HPDDM()
2943 if (!inner->setupcalled) { /* evaluates to PETSC_FALSE when -pc_hpddm_block_splitting */ in PCSetUp_HPDDM()
2950 …scBool3ToBool(data->Neumann) && data->N > 1) { /* subdomain matrices are already created for the e… in PCSetUp_HPDDM()
2957 if (data->N > 1) { in PCSetUp_HPDDM()
2958 …DestroySubMatrices_Private(PetscBool3ToBool(data->Neumann), PetscBool(algebraic && !block && overl… 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 … level(s) > %" PetscInt_FMT ", including -%spc_hpddm_coarse_ will not be taken into account\n", re… in PCSetUp_HPDDM()
2966 data->N, pcpre ? pcpre : "")); in PCSetUp_HPDDM()
2967 …rameters, e.g., a higher value for -%spc_hpddm_levels_%" PetscInt_FMT "_eps_threshold_absolute or … 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()
2988 …-%spc_hpddm_coarse_ will not be taken into account. It is best to tune parameters, e.g., a higher … in PCSetUp_HPDDM()
2989 …data->N, reused, data->N, pcpre ? pcpre : "", pcpre ? pcpre : "", data->N, pcpre ? pcpre : "", dat… in PCSetUp_HPDDM()
2992 if (pc->setfromoptionscalled) { 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()
2997 pc->setfromoptionscalled = 0; in PCSetUp_HPDDM()
2999 data->N += reused; in PCSetUp_HPDDM()
3000 if (data->share && swap) { in PCSetUp_HPDDM()
3001 /* swap back pointers so that variables follow the user-provided numbering */ 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 …->is && dis) || (!data->is && !dis), PETSC_COMM_SELF, PETSC_ERR_PLIB, "An IS pointer is NULL but n… in PCSetUp_HPDDM()
3014 if (data->is) { in PCSetUp_HPDDM()
3015 PetscCall(ISEqualUnsorted(data->is, dis, &flg)); in PCSetUp_HPDDM()
3019 …->aux && daux) || (!data->aux && !daux), PETSC_COMM_SELF, PETSC_ERR_PLIB, "A Mat pointer is NULL b… in PCSetUp_HPDDM()
3020 if (data->aux) { in PCSetUp_HPDDM()
3021 PetscCall(MatMultEqual(data->aux, daux, 20, &flg)); in PCSetUp_HPDDM()
3030 PCHPDDMSetCoarseCorrectionType - Sets the coarse correction type.
3035 + pc - preconditioner context
3036 - type - `PC_HPDDM_COARSE_CORRECTION_DEFLATED`, `PC_HPDDM_COARSE_CORRECTION_ADDITIVE`, `PC_HPDDM_CO…
3039 . -pc_hpddm_coarse_correction <deflated, additive, balanced, none> - type of coarse correction to a…
3055 PCHPDDMGetCoarseCorrectionType - Gets the coarse correction type.
3058 . pc - preconditioner context
3061 . type - `PC_HPDDM_COARSE_CORRECTION_DEFLATED`, `PC_HPDDM_COARSE_CORRECTION_ADDITIVE`, `PC_HPDDM_CO…
3080 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetCoarseCorrectionType_HPDDM()
3083 data->correction = type; in PCHPDDMSetCoarseCorrectionType_HPDDM()
3089 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMGetCoarseCorrectionType_HPDDM()
3092 *type = data->correction; in PCHPDDMGetCoarseCorrectionType_HPDDM()
3097 …PCHPDDMSetSTShareSubKSP - Sets whether the `KSP` in SLEPc `ST` and the fine-level subdomain solver…
3100 + pc - preconditioner context
3101 - share - whether the `KSP` should be shared or not
3104 …This is not the same as `PCSetReusePreconditioner()`. Given certain conditions (visible using -inf…
3120 …PCHPDDMGetSTShareSubKSP - Gets whether the `KSP` in SLEPc `ST` and the fine-level subdomain solver…
3123 . pc - preconditioner context
3126 . share - whether the `KSP` is shared or not
3149 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMSetSTShareSubKSP_HPDDM()
3152 data->share = share; in PCHPDDMSetSTShareSubKSP_HPDDM()
3158 PC_HPDDM *data = (PC_HPDDM *)pc->data; in PCHPDDMGetSTShareSubKSP_HPDDM()
3161 *share = data->share; in PCHPDDMGetSTShareSubKSP_HPDDM()
3166 PCHPDDMSetDeflationMat - Sets the deflation space used to assemble a coarser operator.
3169 + pc - preconditioner context
3170 . is - index set of the local deflation matrix
3171 - U - deflation sequential matrix stored as a `MATSEQDENSE`
3202 PetscCall(PetscOptionsGetString(nullptr, nullptr, "-hpddm_dir", dir, sizeof(dir), nullptr)); in HPDDMLoadDL_Private()
3206 …if (!*found) { /* with --download-hpddm since slepcconf.h is not yet built (and thus can… in HPDDMLoadDL_Private()
3212 …ystem inconsistency (libhpddm_petsc moved by user?) or PETSc configured without --download-slepc */ in HPDDMLoadDL_Private()
3214 …f both PETSc and SLEPc are configured with --download-hpddm but PETSc has been configured without … in HPDDMLoadDL_Private()
3229 PCHPDDM - Interface with the HPDDM library.
3241 + -pc_hpddm_define_subdomains <true, default=false> - on the finest level, calls `PCASMSetLoca…
3243 . -pc_hpddm_has_neumann <true, default=false> - on the finest level, informs the `PC` th…
3244 - -pc_hpddm_coarse_correction <type, default=deflated> - determines the `PCHPDDMCoarseCorrectionT…
3248 -pc_hpddm_levels_%d_pc_
3249 -pc_hpddm_levels_%d_ksp_
3250 -pc_hpddm_levels_%d_eps_
3251 -pc_hpddm_levels_%d_p
3252 -pc_hpddm_levels_%d_mat_type
3253 -pc_hpddm_coarse_
3254 -pc_hpddm_coarse_p
3255 -pc_hpddm_coarse_mat_type
3256 -pc_hpddm_coarse_mat_filter
3259 …E.g., -pc_hpddm_levels_1_sub_pc_type lu -pc_hpddm_levels_1_eps_nev 10 -pc_hpddm_levels_2_p 4 -pc_h…
3260 …-pc_hpddm_coarse_p 2 -pc_hpddm_coarse_mat_type baij will use 10 deflation vectors per subdomain on…
3264 …on, it is mandatory to call -pc_hpddm_levels_N_eps_nev <nu> or -pc_hpddm_levels_N_eps_threshold_ab…
3269 This preconditioner requires that PETSc is built with SLEPc (``--download-slepc``).
3272 …are solved using SLEPc shift-and-invert spectral transformation. This is usually what gives the be…
3274 … above, SLEPc options are available through -pc_hpddm_levels_%d_, e.g., -pc_hpddm_levels_1_eps_typ…
3275 …-pc_hpddm_levels_1_st_type sinvert. There are furthermore three options related to the (subdomain-…
3278 -pc_hpddm_levels_1_st_share_sub_ksp
3279 -pc_hpddm_levels_%d_eps_threshold_absolute
3280 -pc_hpddm_levels_1_eps_use_inertia
3283 …The first option from the list only applies to the fine-level eigensolver, see `PCHPDDMSetSTShareS…
3285 …correction are associated to eigenvalues whose magnitude are lower or equal than -pc_hpddm_levels_…
3286 …determine a priori the proper -pc_hpddm_levels_N_eps_nev such that all wanted eigenmodes are retri…
3287 …correct value using the third option from the list, -pc_hpddm_levels_1_eps_use_inertia, see `MatGe…
3288 …to supply -pc_hpddm_levels_1_eps_nev. This last option also only applies to the fine-level (N = 1)…
3308 pc->data = data; in PCCreate_HPDDM()
3309 data->Neumann = PETSC_BOOL3_UNKNOWN; in PCCreate_HPDDM()
3310 pc->ops->reset = PCReset_HPDDM; in PCCreate_HPDDM()
3311 pc->ops->destroy = PCDestroy_HPDDM; in PCCreate_HPDDM()
3312 pc->ops->setfromoptions = PCSetFromOptions_HPDDM; in PCCreate_HPDDM()
3313 pc->ops->setup = PCSetUp_HPDDM; in PCCreate_HPDDM()
3314 pc->ops->apply = PCApply_HPDDM<false>; in PCCreate_HPDDM()
3315 pc->ops->matapply = PCMatApply_HPDDM<false>; in PCCreate_HPDDM()
3316 pc->ops->applytranspose = PCApply_HPDDM<true>; in PCCreate_HPDDM()
3317 pc->ops->matapplytranspose = PCMatApply_HPDDM<true>; in PCCreate_HPDDM()
3318 pc->ops->view = PCView_HPDDM; in PCCreate_HPDDM()
3319 pc->ops->presolve = PCPreSolve_HPDDM; in PCCreate_HPDDM()
3333 …PCHPDDMInitializePackage - This function initializes everything in the `PCHPDDM` package. It is ca…
3365 PetscCall(PetscLogEventRegister(ename, PC_CLASSID, &PC_HPDDM_SetUp[i - 1])); in PCHPDDMInitializePackage()
3369 PetscCall(PetscLogEventRegister(ename, PC_CLASSID, &PC_HPDDM_Solve[i - 1])); in PCHPDDMInitializePackage()
3375 …PCHPDDMFinalizePackage - This function frees everything from the `PCHPDDM` package. It is called f…
3392 …Vec sub; /* y = A x = R_loc R_0 [ A_00 A_01 ]^-1 R_loc = [ … in MatMult_Harmonic()
3396 PetscCall(VecSet(h->v, 0.0)); in MatMult_Harmonic()
3397 PetscCall(VecGetSubVector(h->v, h->is[0], &sub)); in MatMult_Harmonic()
3398 PetscCall(MatMult(h->A[0], x, sub)); in MatMult_Harmonic()
3399 PetscCall(VecRestoreSubVector(h->v, h->is[0], &sub)); in MatMult_Harmonic()
3400 PetscCall(KSPSolve(h->ksp, h->v, h->v)); in MatMult_Harmonic()
3401 PetscCall(VecISCopy(h->v, h->is[1], SCATTER_REVERSE, y)); in MatMult_Harmonic()
3407 Harmonic h; /* x = A^T y = [ A_00 A_01 ]^-T R_0^T R_loc^T y */ in MatMultTranspose_Harmonic()
3412 PetscCall(VecSet(h->v, 0.0)); in MatMultTranspose_Harmonic()
3413 PetscCall(VecISCopy(h->v, h->is[1], SCATTER_FORWARD, y)); in MatMultTranspose_Harmonic()
3414 PetscCall(KSPSolveTranspose(h->ksp, h->v, h->v)); in MatMultTranspose_Harmonic()
3415 PetscCall(VecGetSubVector(h->v, h->is[0], &sub)); in MatMultTranspose_Harmonic()
3416 PetscCall(MatMultTranspose(h->A[0], sub, x)); in MatMultTranspose_Harmonic()
3417 PetscCall(VecRestoreSubVector(h->v, h->is[0], &sub)); in MatMultTranspose_Harmonic()
3429 PetscCall(MatMatMult(h->A[0], X, MAT_INITIAL_MATRIX, PETSC_CURRENT, &A)); in MatProduct_AB_Harmonic()
3430 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, h->ksp->pc->mat->rmap->n, A->cmap->n, nullptr, &B)); in MatProduct_AB_Harmonic()
3431 for (PetscInt i = 0; i < A->cmap->n; ++i) { in MatProduct_AB_Harmonic()
3434 PetscCall(VecISCopy(b, h->is[0], SCATTER_FORWARD, a)); in MatProduct_AB_Harmonic()
3439 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, h->ksp->pc->mat->rmap->n, B->cmap->n, nullptr, &A)); in MatProduct_AB_Harmonic()
3440 PetscCall(KSPMatSolve(h->ksp, B, A)); in MatProduct_AB_Harmonic()
3442 for (PetscInt i = 0; i < A->cmap->n; ++i) { in MatProduct_AB_Harmonic()
3445 PetscCall(VecISCopy(a, h->is[1], SCATTER_REVERSE, b)); in MatProduct_AB_Harmonic()
3461 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, h->ksp->pc->mat->rmap->n, Y->cmap->n, nullptr, &A)); in MatProduct_AtB_Harmonic()
3462 for (PetscInt i = 0; i < A->cmap->n; ++i) { in MatProduct_AtB_Harmonic()
3465 PetscCall(VecISCopy(a, h->is[1], SCATTER_FORWARD, b)); in MatProduct_AtB_Harmonic()
3469 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, h->ksp->pc->mat->rmap->n, A->cmap->n, nullptr, &B)); in MatProduct_AtB_Harmonic()
3470 PetscCall(KSPMatSolveTranspose(h->ksp, A, B)); in MatProduct_AtB_Harmonic()
3472 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, h->A[0]->rmap->n, B->cmap->n, nullptr, &A)); in MatProduct_AtB_Harmonic()
3473 for (PetscInt i = 0; i < A->cmap->n; ++i) { in MatProduct_AtB_Harmonic()
3476 PetscCall(VecISCopy(b, h->is[0], SCATTER_REVERSE, a)); in MatProduct_AtB_Harmonic()
3481 PetscCall(MatTransposeMatMult(h->A[0], A, MAT_REUSE_MATRIX, PETSC_CURRENT, &X)); in MatProduct_AtB_Harmonic()
3492 for (PetscInt i = 0; i < 5; ++i) PetscCall(ISDestroy(h->is + i)); in MatDestroy_Harmonic()
3493 PetscCall(PetscFree(h->is)); in MatDestroy_Harmonic()
3494 PetscCall(VecDestroy(&h->v)); in MatDestroy_Harmonic()
3495 for (PetscInt i = 0; i < 2; ++i) PetscCall(MatDestroy(h->A + i)); in MatDestroy_Harmonic()
3496 PetscCall(PetscFree(h->A)); in MatDestroy_Harmonic()
3497 PetscCall(KSPDestroy(&h->ksp)); in MatDestroy_Harmonic()