Lines Matching refs:jac
91 static Mat FieldSplitSchurPre(PC_FieldSplit *jac) in FieldSplitSchurPre() argument
93 switch (jac->schurpre) { in FieldSplitSchurPre()
95 return jac->schur; in FieldSplitSchurPre()
97 return jac->schurp; in FieldSplitSchurPre()
99 return jac->pmat[1]; in FieldSplitSchurPre()
103 return jac->schur_user ? jac->schur_user : jac->pmat[1]; in FieldSplitSchurPre()
110 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCView_FieldSplit() local
113 PC_FieldSplitLink ilink = jac->head; in PCView_FieldSplit()
119 if (jac->bs > 0) { in PCView_FieldSplit()
120 …cInt_FMT ", blocksize = %" PetscInt_FMT "\n", PCCompositeTypes[jac->type], jac->nsplits, jac->bs)); in PCView_FieldSplit()
122 …h %s composition: total splits = %" PetscInt_FMT "\n", PCCompositeTypes[jac->type], jac->nsplits)); in PCView_FieldSplit()
125 …if (jac->diag_use_amat) PetscCall(PetscViewerASCIIPrintf(viewer, " using Amat (not Pmat) as opera… in PCView_FieldSplit()
126 …if (jac->offdiag_use_amat) PetscCall(PetscViewerASCIIPrintf(viewer, " using Amat (not Pmat) as op… in PCView_FieldSplit()
128 for (i = 0; i < jac->nsplits; i++) { in PCView_FieldSplit()
153 wd = w / (jac->nsplits + 1); in PCView_FieldSplit()
154 x = x - wd * (jac->nsplits - 1) / 2.0; in PCView_FieldSplit()
155 for (i = 0; i < jac->nsplits; i++) { in PCView_FieldSplit()
168 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCView_FieldSplit_Schur() local
171 PC_FieldSplitLink ilink = jac->head; in PCView_FieldSplit_Schur()
178 if (jac->bs > 0) { in PCView_FieldSplit_Schur()
179 …ner, blocksize = %" PetscInt_FMT ", factorization %s\n", jac->bs, PCFieldSplitSchurFactTypes[jac->… in PCView_FieldSplit_Schur()
181 …with Schur preconditioner, factorization %s\n", PCFieldSplitSchurFactTypes[jac->schurfactorization… in PCView_FieldSplit_Schur()
184 switch (jac->schurpre) { in PCView_FieldSplit_Schur()
189 if (jac->schur) { in PCView_FieldSplit_Schur()
190 PetscCall(MatSchurComplementGetAinvType(jac->schur, &atype)); in PCView_FieldSplit_Schur()
201 if (jac->schur_user) { in PCView_FieldSplit_Schur()
208 …etscObject)pc), PETSC_ERR_ARG_OUTOFRANGE, "Invalid Schur preconditioning type: %d", jac->schurpre); in PCView_FieldSplit_Schur()
212 for (i = 0; i < jac->nsplits; i++) { in PCView_FieldSplit_Schur()
229 if (jac->head) PetscCall(KSPView(jac->head->ksp, viewer)); in PCView_FieldSplit_Schur()
232 if (jac->head && jac->kspupper != jac->head->ksp) { in PCView_FieldSplit_Schur()
235 if (jac->kspupper) PetscCall(KSPView(jac->kspupper, viewer)); in PCView_FieldSplit_Schur()
241 if (jac->kspschur) { in PCView_FieldSplit_Schur()
242 PetscCall(KSPView(jac->kspschur, viewer)); in PCView_FieldSplit_Schur()
248 } else if (isdraw && jac->head) { in PCView_FieldSplit_Schur()
256 if (jac->kspupper != jac->head->ksp) cnt++; in PCView_FieldSplit_Schur()
260 …PetscCall(PetscSNPrintf(str, 32, "Schur fact. %s", PCFieldSplitSchurFactTypes[jac->schurfactorizat… in PCView_FieldSplit_Schur()
263 if (jac->schurpre == PC_FIELDSPLIT_SCHUR_PRE_USER && !jac->schur_user) { in PCView_FieldSplit_Schur()
266 …PetscCall(PetscSNPrintf(str, 32, "Prec. for Schur from %s", PCFieldSplitSchurPreTypes[jac->schurpr… in PCView_FieldSplit_Schur()
273 PetscCall(KSPView(jac->head->ksp, viewer)); in PCView_FieldSplit_Schur()
275 if (jac->kspupper != jac->head->ksp) { in PCView_FieldSplit_Schur()
278 PetscCall(KSPView(jac->kspupper, viewer)); in PCView_FieldSplit_Schur()
283 PetscCall(KSPView(jac->kspschur, viewer)); in PCView_FieldSplit_Schur()
291 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCView_FieldSplit_GKB() local
294 PC_FieldSplitLink ilink = jac->head; in PCView_FieldSplit_GKB()
300 if (jac->bs > 0) { in PCView_FieldSplit_GKB()
301 …cInt_FMT ", blocksize = %" PetscInt_FMT "\n", PCCompositeTypes[jac->type], jac->nsplits, jac->bs)); in PCView_FieldSplit_GKB()
303 …h %s composition: total splits = %" PetscInt_FMT "\n", PCCompositeTypes[jac->type], jac->nsplits)); in PCView_FieldSplit_GKB()
306 …if (jac->diag_use_amat) PetscCall(PetscViewerASCIIPrintf(viewer, " using Amat (not Pmat) as opera… in PCView_FieldSplit_GKB()
307 …if (jac->offdiag_use_amat) PetscCall(PetscViewerASCIIPrintf(viewer, " using Amat (not Pmat) as op… in PCView_FieldSplit_GKB()
309 …cInt_FMT ", maximum iterations=%" PetscInt_FMT "\n", (double)jac->gkbtol, jac->gkbdelay, jac->gkbm… in PCView_FieldSplit_GKB()
337 wd = w / (jac->nsplits + 1); in PCView_FieldSplit_GKB()
338 x = x - wd * (jac->nsplits - 1) / 2.0; in PCView_FieldSplit_GKB()
339 for (i = 0; i < jac->nsplits; i++) { in PCView_FieldSplit_GKB()
353 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetRuntimeSplits_Private() local
363 bs = jac->bs; in PCFieldSplitSetRuntimeSplits_Private()
388 jac->splitdefined = PETSC_TRUE; in PCFieldSplitSetRuntimeSplits_Private()
396 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetDefaults() local
397 PC_FieldSplitLink ilink = jac->head; in PCFieldSplitSetDefaults()
408 if (pc->dm && jac->dm_splits && !jac->detect && !coupling) { in PCFieldSplitSetDefaults()
458 for (ilink = jac->head, i = 0; ilink; ilink = ilink->next, ++i) { in PCFieldSplitSetDefaults()
470 if (jac->bs <= 0) { in PCFieldSplitSetDefaults()
471 if (pc->pmat) PetscCall(MatGetBlockSize(pc->pmat, &jac->bs)); in PCFieldSplitSetDefaults()
472 else jac->bs = 1; in PCFieldSplitSetDefaults()
475 if (jac->detect) { in PCFieldSplitSetDefaults()
480 if (jac->diag_use_amat) { in PCFieldSplitSetDefaults()
495 if (jac->offdiag_use_amat) { in PCFieldSplitSetDefaults()
512 … if (jac->splitdefined) PetscCall(PetscInfo(pc, "Splits defined using the options database\n")); in PCFieldSplitSetDefaults()
514 if ((fieldsplit_default || !jac->splitdefined) && !jac->isrestrict) { in PCFieldSplitSetDefaults()
525 if (!isnest) nf = jac->bs; in PCFieldSplitSetDefaults()
533 jac->defaultsplit = PETSC_TRUE; in PCFieldSplitSetDefaults()
537 } else if (jac->nsplits == 1) { in PCFieldSplitSetDefaults()
548 …Check(jac->nsplits >= 2, PetscObjectComm((PetscObject)pc), PETSC_ERR_PLIB, "Unhandled case, must h… in PCFieldSplitSetDefaults()
579 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCSetUp_FieldSplit() local
587 nsplit = jac->nsplits; in PCSetUp_FieldSplit()
588 ilink = jac->head; in PCSetUp_FieldSplit()
592 if (!jac->issetup) { in PCSetUp_FieldSplit()
595 jac->issetup = PETSC_TRUE; in PCSetUp_FieldSplit()
598 if (jac->defaultsplit || !ilink->is) { in PCSetUp_FieldSplit()
599 if (jac->bs <= 0) jac->bs = nsplit; in PCSetUp_FieldSplit()
604 if (bs > 1 && (jac->bs <= bs || jac->bs % bs)) { in PCSetUp_FieldSplit()
612 bs = jac->bs; in PCSetUp_FieldSplit()
616 if (jac->defaultsplit) { in PCSetUp_FieldSplit()
664 if (!jac->defaultsplit) PetscCall(PetscMalloc1(mis, &ises)); in PCSetUp_FieldSplit()
667 if (jac->defaultsplit) { in PCSetUp_FieldSplit()
688 ilink = jac->head; in PCSetUp_FieldSplit()
689 if (!jac->pmat) { in PCSetUp_FieldSplit()
693 PetscCall(PetscMalloc1(nsplit, &jac->pmat)); in PCSetUp_FieldSplit()
694 PetscCall(PetscMalloc2(nsplit, &jac->x, nsplit, &jac->y)); in PCSetUp_FieldSplit()
699 PetscCall(PetscObjectQuery((PetscObject)ilink->is, "pmat", (PetscObject *)&jac->pmat[i])); in PCSetUp_FieldSplit()
700 if (jac->pmat[i]) { in PCSetUp_FieldSplit()
701 PetscCall(PetscObjectReference((PetscObject)jac->pmat[i])); in PCSetUp_FieldSplit()
702 if (jac->type == PC_COMPOSITE_SCHUR) { in PCSetUp_FieldSplit()
703 jac->schur_user = jac->pmat[i]; in PCSetUp_FieldSplit()
705 PetscCall(PetscObjectReference((PetscObject)jac->schur_user)); in PCSetUp_FieldSplit()
709 …PetscCall(MatCreateSubMatrix(pc->pmat, ilink->is, ilink->is_col, MAT_INITIAL_MATRIX, &jac->pmat[i]… in PCSetUp_FieldSplit()
710 PetscCall(MatGetOptionsPrefix(jac->pmat[i], &prefix)); in PCSetUp_FieldSplit()
713 PetscCall(MatSetOptionsPrefix(jac->pmat[i], prefix)); in PCSetUp_FieldSplit()
715 PetscCall(MatSetFromOptions(jac->pmat[i])); in PCSetUp_FieldSplit()
716 PetscCall(MatViewFromOptions(jac->pmat[i], NULL, "-mat_view")); in PCSetUp_FieldSplit()
719 PetscCall(MatCreateVecs(jac->pmat[i], &jac->x[i], &jac->y[i])); in PCSetUp_FieldSplit()
720 ilink->x = jac->x[i]; in PCSetUp_FieldSplit()
721 ilink->y = jac->y[i]; in PCSetUp_FieldSplit()
724 PetscCall(VecScatterCreate(xtmp, ilink->is, jac->x[i], NULL, &ilink->sctx)); in PCSetUp_FieldSplit()
726 if (sp) PetscCall(MatSetNearNullSpace(jac->pmat[i], sp)); in PCSetUp_FieldSplit()
735 PetscCall(MatGetNullSpaces(nsplit, jac->pmat, &nullsp)); in PCSetUp_FieldSplit()
736 for (i = 0; i < nsplit; i++) PetscCall(MatDestroy(&jac->pmat[i])); in PCSetUp_FieldSplit()
745 …if (!pmat) PetscCall(MatCreateSubMatrix(pc->pmat, ilink->is, ilink->is_col, scall, &jac->pmat[i])); in PCSetUp_FieldSplit()
748 if (nullsp) PetscCall(MatRestoreNullSpaces(nsplit, jac->pmat, &nullsp)); in PCSetUp_FieldSplit()
750 if (jac->diag_use_amat) { in PCSetUp_FieldSplit()
751 ilink = jac->head; in PCSetUp_FieldSplit()
752 if (!jac->mat) { in PCSetUp_FieldSplit()
753 PetscCall(PetscMalloc1(nsplit, &jac->mat)); in PCSetUp_FieldSplit()
755 …PetscCall(MatCreateSubMatrix(pc->mat, ilink->is, ilink->is_col, MAT_INITIAL_MATRIX, &jac->mat[i])); in PCSetUp_FieldSplit()
763 PetscCall(MatGetNullSpaces(nsplit, jac->mat, &nullsp)); in PCSetUp_FieldSplit()
764 for (i = 0; i < nsplit; i++) PetscCall(MatDestroy(&jac->mat[i])); in PCSetUp_FieldSplit()
769 PetscCall(MatCreateSubMatrix(pc->mat, ilink->is, ilink->is_col, scall, &jac->mat[i])); in PCSetUp_FieldSplit()
772 if (nullsp) PetscCall(MatRestoreNullSpaces(nsplit, jac->mat, &nullsp)); in PCSetUp_FieldSplit()
775 jac->mat = jac->pmat; in PCSetUp_FieldSplit()
779 ilink = jac->head; in PCSetUp_FieldSplit()
784 if (sp) PetscCall(MatSetNullSpace(jac->mat[i], sp)); in PCSetUp_FieldSplit()
788 …if (jac->type != PC_COMPOSITE_ADDITIVE && jac->type != PC_COMPOSITE_SCHUR && jac->type != PC_COMPO… in PCSetUp_FieldSplit()
791 ilink = jac->head; in PCSetUp_FieldSplit()
792 if (nsplit == 2 && jac->type == PC_COMPOSITE_MULTIPLICATIVE) { in PCSetUp_FieldSplit()
794 if (!jac->Afield) { in PCSetUp_FieldSplit()
795 PetscCall(PetscCalloc1(nsplit, &jac->Afield)); in PCSetUp_FieldSplit()
796 if (jac->offdiag_use_amat) { in PCSetUp_FieldSplit()
797 …Call(MatCreateSubMatrix(pc->mat, ilink->next->is, ilink->is, MAT_INITIAL_MATRIX, &jac->Afield[1])); in PCSetUp_FieldSplit()
799 …all(MatCreateSubMatrix(pc->pmat, ilink->next->is, ilink->is, MAT_INITIAL_MATRIX, &jac->Afield[1])); in PCSetUp_FieldSplit()
805 PetscCall(MatDestroy(&jac->Afield[1])); in PCSetUp_FieldSplit()
809 if (jac->offdiag_use_amat) { in PCSetUp_FieldSplit()
810 … PetscCall(MatCreateSubMatrix(pc->mat, ilink->next->is, ilink->is, scall, &jac->Afield[1])); in PCSetUp_FieldSplit()
812 … PetscCall(MatCreateSubMatrix(pc->pmat, ilink->next->is, ilink->is, scall, &jac->Afield[1])); in PCSetUp_FieldSplit()
816 if (!jac->Afield) { in PCSetUp_FieldSplit()
817 PetscCall(PetscMalloc1(nsplit, &jac->Afield)); in PCSetUp_FieldSplit()
819 if (jac->offdiag_use_amat) { in PCSetUp_FieldSplit()
820 … PetscCall(MatCreateSubMatrix(pc->mat, ilink->is, NULL, MAT_INITIAL_MATRIX, &jac->Afield[i])); in PCSetUp_FieldSplit()
822 … PetscCall(MatCreateSubMatrix(pc->pmat, ilink->is, NULL, MAT_INITIAL_MATRIX, &jac->Afield[i])); in PCSetUp_FieldSplit()
829 for (i = 0; i < nsplit; i++) PetscCall(MatDestroy(&jac->Afield[i])); in PCSetUp_FieldSplit()
834 if (jac->offdiag_use_amat) { in PCSetUp_FieldSplit()
835 PetscCall(MatCreateSubMatrix(pc->mat, ilink->is, NULL, scall, &jac->Afield[i])); in PCSetUp_FieldSplit()
837 PetscCall(MatCreateSubMatrix(pc->pmat, ilink->is, NULL, scall, &jac->Afield[i])); in PCSetUp_FieldSplit()
845 if (jac->type == PC_COMPOSITE_SCHUR) { in PCSetUp_FieldSplit()
854 if (jac->schurscale == (PetscScalar)-1.0) jac->schurscale = (isset && isspd) ? 1.0 : -1.0; in PCSetUp_FieldSplit()
857 …PetscCall(PetscObjectTypeCompareAny(jac->offdiag_use_amat ? (PetscObject)pc->mat : (PetscObject)pc… in PCSetUp_FieldSplit()
859 if (jac->schur) { in PCSetUp_FieldSplit()
860 KSP kspA = jac->head->ksp, kspInner = NULL, kspUpper = jac->kspupper; in PCSetUp_FieldSplit()
865 PetscCall(MatDestroy(&jac->B)); in PCSetUp_FieldSplit()
866 PetscCall(MatDestroy(&jac->C)); in PCSetUp_FieldSplit()
869 PetscCall(MatSchurComplementGetKSP(jac->schur, &kspInner)); in PCSetUp_FieldSplit()
870 ilink = jac->head; in PCSetUp_FieldSplit()
871 …PetscCall(MatCreateSubMatrix(jac->offdiag_use_amat ? pc->mat : pc->pmat, ilink->is, ilink->next->i… in PCSetUp_FieldSplit()
872 …!flg) PetscCall(MatCreateSubMatrix(jac->offdiag_use_amat ? pc->mat : pc->pmat, ilink->next->is, il… in PCSetUp_FieldSplit()
874 PetscCall(MatIsHermitianKnown(jac->offdiag_use_amat ? pc->mat : pc->pmat, &isset, &flg)); in PCSetUp_FieldSplit()
875 if (isset && flg) PetscCall(MatCreateHermitianTranspose(jac->B, &jac->C)); in PCSetUp_FieldSplit()
876 else PetscCall(MatCreateTranspose(jac->B, &jac->C)); in PCSetUp_FieldSplit()
879 …PetscCall(MatSchurComplementUpdateSubMatrices(jac->schur, jac->mat[0], jac->pmat[0], jac->B, jac->… in PCSetUp_FieldSplit()
880 if (jac->schurpre == PC_FIELDSPLIT_SCHUR_PRE_SELFP) { in PCSetUp_FieldSplit()
881 PetscCall(MatDestroy(&jac->schurp)); in PCSetUp_FieldSplit()
882 PetscCall(MatSchurComplementGetPmat(jac->schur, MAT_INITIAL_MATRIX, &jac->schurp)); in PCSetUp_FieldSplit()
883 } else if (jac->schurpre == PC_FIELDSPLIT_SCHUR_PRE_FULL && jac->kspupper != jac->head->ksp) { in PCSetUp_FieldSplit()
884 PetscCall(MatDestroy(&jac->schur_user)); in PCSetUp_FieldSplit()
885 PetscCall(MatSchurComplementComputeExplicitOperator(jac->schur, &jac->schur_user)); in PCSetUp_FieldSplit()
887 if (kspA != kspInner) PetscCall(KSPSetOperators(kspA, jac->mat[0], jac->pmat[0])); in PCSetUp_FieldSplit()
888 if (kspUpper != kspA) PetscCall(KSPSetOperators(kspUpper, jac->mat[0], jac->pmat[0])); in PCSetUp_FieldSplit()
889 PetscCall(KSPSetOperators(jac->kspschur, jac->schur, FieldSplitSchurPre(jac))); in PCSetUp_FieldSplit()
898 ilink = jac->head; in PCSetUp_FieldSplit()
899 …etscCall(MatCreateSubMatrix(jac->offdiag_use_amat ? pc->mat : pc->pmat, ilink->is, ilink->next->is… in PCSetUp_FieldSplit()
900 …etscCall(MatCreateSubMatrix(jac->offdiag_use_amat ? pc->mat : pc->pmat, ilink->next->is, ilink->is… in PCSetUp_FieldSplit()
902 PetscCall(MatIsHermitianKnown(jac->offdiag_use_amat ? pc->mat : pc->pmat, &isset, &flg)); in PCSetUp_FieldSplit()
903 if (isset && flg) PetscCall(MatCreateHermitianTranspose(jac->B, &jac->C)); in PCSetUp_FieldSplit()
904 else PetscCall(MatCreateTranspose(jac->B, &jac->C)); in PCSetUp_FieldSplit()
908 PetscCall(MatCreate(((PetscObject)jac->mat[0])->comm, &jac->schur)); in PCSetUp_FieldSplit()
909 PetscCall(MatSetType(jac->schur, MATSCHURCOMPLEMENT)); in PCSetUp_FieldSplit()
910 …PetscCall(MatSchurComplementSetSubMatrices(jac->schur, jac->mat[0], jac->pmat[0], jac->B, jac->C, … in PCSetUp_FieldSplit()
912 PetscCall(MatSetOptionsPrefix(jac->schur, schurmatprefix)); in PCSetUp_FieldSplit()
913 PetscCall(MatSchurComplementGetKSP(jac->schur, &kspt)); in PCSetUp_FieldSplit()
917 PetscCall(MatGetNullSpace(jac->mat[1], &sp)); in PCSetUp_FieldSplit()
918 if (sp) PetscCall(MatSetNullSpace(jac->schur, sp)); in PCSetUp_FieldSplit()
927 PetscCall(MatSchurComplementGetKSP(jac->schur, &kspInner)); in PCSetUp_FieldSplit()
929 PetscCall(KSPSetOperators(kspInner, jac->mat[0], jac->pmat[0])); in PCSetUp_FieldSplit()
937 PetscCall(KSPGetDM(jac->head->ksp, &dmInner)); in PCSetUp_FieldSplit()
944 PetscCall(PCKSPSetKSP(pcInner, jac->head->ksp)); in PCSetUp_FieldSplit()
952 PetscCall(KSPSetType(jac->head->ksp, KSPGMRES)); in PCSetUp_FieldSplit()
953 PetscCall(MatSchurComplementSetKSP(jac->schur, jac->head->ksp)); in PCSetUp_FieldSplit()
955 PetscCall(KSPSetOperators(jac->head->ksp, jac->mat[0], jac->pmat[0])); in PCSetUp_FieldSplit()
956 PetscCall(KSPSetFromOptions(jac->head->ksp)); in PCSetUp_FieldSplit()
957 PetscCall(MatSetFromOptions(jac->schur)); in PCSetUp_FieldSplit()
959 PetscCall(PetscObjectTypeCompare((PetscObject)jac->schur, MATSCHURCOMPLEMENT, &flg)); in PCSetUp_FieldSplit()
964 PetscCall(MatSchurComplementGetKSP(jac->schur, &kspInner)); in PCSetUp_FieldSplit()
971 if (ksp == jac->head->ksp) PetscCall(PCSetUseAmat(pcInner, PETSC_TRUE)); in PCSetUp_FieldSplit()
980 PetscCall(KSPCreate(PetscObjectComm((PetscObject)pc), &jac->kspupper)); in PCSetUp_FieldSplit()
981 PetscCall(KSPSetNestLevel(jac->kspupper, pc->kspnestlevel)); in PCSetUp_FieldSplit()
982 PetscCall(KSPSetErrorIfNotConverged(jac->kspupper, pc->erroriffailure)); in PCSetUp_FieldSplit()
983 PetscCall(KSPSetOptionsPrefix(jac->kspupper, schurprefix)); in PCSetUp_FieldSplit()
984 PetscCall(PetscObjectIncrementTabLevel((PetscObject)jac->kspupper, (PetscObject)pc, 1)); in PCSetUp_FieldSplit()
985 PetscCall(PetscObjectIncrementTabLevel((PetscObject)jac->kspupper->pc, (PetscObject)pc, 1)); in PCSetUp_FieldSplit()
986 PetscCall(KSPGetDM(jac->head->ksp, &dmInner)); in PCSetUp_FieldSplit()
987 PetscCall(KSPSetDM(jac->kspupper, dmInner)); in PCSetUp_FieldSplit()
988 PetscCall(KSPSetDMActive(jac->kspupper, KSP_DMACTIVE_ALL, PETSC_FALSE)); in PCSetUp_FieldSplit()
989 PetscCall(KSPSetFromOptions(jac->kspupper)); in PCSetUp_FieldSplit()
990 PetscCall(KSPSetOperators(jac->kspupper, jac->mat[0], jac->pmat[0])); in PCSetUp_FieldSplit()
991 PetscCall(VecDuplicate(jac->head->x, &jac->head->z)); in PCSetUp_FieldSplit()
993 jac->kspupper = jac->head->ksp; in PCSetUp_FieldSplit()
994 PetscCall(PetscObjectReference((PetscObject)jac->head->ksp)); in PCSetUp_FieldSplit()
997 …if (jac->schurpre == PC_FIELDSPLIT_SCHUR_PRE_SELFP) PetscCall(MatSchurComplementGetPmat(jac->schur… in PCSetUp_FieldSplit()
998 PetscCall(KSPCreate(PetscObjectComm((PetscObject)pc), &jac->kspschur)); in PCSetUp_FieldSplit()
999 PetscCall(KSPSetNestLevel(jac->kspschur, pc->kspnestlevel)); in PCSetUp_FieldSplit()
1000 PetscCall(KSPSetErrorIfNotConverged(jac->kspschur, pc->erroriffailure)); in PCSetUp_FieldSplit()
1001 PetscCall(PetscObjectIncrementTabLevel((PetscObject)jac->kspschur, (PetscObject)pc, 1)); in PCSetUp_FieldSplit()
1002 if (jac->schurpre == PC_FIELDSPLIT_SCHUR_PRE_SELF) { in PCSetUp_FieldSplit()
1004 PetscCall(KSPGetPC(jac->kspschur, &pcschur)); in PCSetUp_FieldSplit()
1007 } else if (jac->schurpre == PC_FIELDSPLIT_SCHUR_PRE_FULL) { in PCSetUp_FieldSplit()
1008 …jac->schurfactorization != PC_FIELDSPLIT_SCHUR_FACT_FULL || jac->kspupper != jac->head->ksp) Petsc… in PCSetUp_FieldSplit()
1010 PetscCall(KSPSetOperators(jac->kspschur, jac->schur, FieldSplitSchurPre(jac))); in PCSetUp_FieldSplit()
1011 PetscCall(KSPGetOptionsPrefix(jac->head->next->ksp, &Dprefix)); in PCSetUp_FieldSplit()
1012 PetscCall(KSPSetOptionsPrefix(jac->kspschur, Dprefix)); in PCSetUp_FieldSplit()
1016 PetscCall(KSPGetDM(jac->head->next->ksp, &sdm)); in PCSetUp_FieldSplit()
1018 PetscCall(KSPSetDM(jac->kspschur, sdm)); in PCSetUp_FieldSplit()
1019 PetscCall(KSPSetDMActive(jac->kspschur, KSP_DMACTIVE_ALL, PETSC_FALSE)); in PCSetUp_FieldSplit()
1024 PetscCall(KSPSetFromOptions(jac->kspschur)); in PCSetUp_FieldSplit()
1026 PetscCall(MatAssemblyBegin(jac->schur, MAT_FINAL_ASSEMBLY)); in PCSetUp_FieldSplit()
1027 PetscCall(MatAssemblyEnd(jac->schur, MAT_FINAL_ASSEMBLY)); in PCSetUp_FieldSplit()
1028 if (issym) PetscCall(MatSetOption(jac->schur, MAT_SYMMETRIC, PETSC_TRUE)); in PCSetUp_FieldSplit()
1029 if (isspd) PetscCall(MatSetOption(jac->schur, MAT_SPD, PETSC_TRUE)); in PCSetUp_FieldSplit()
1035 if (LSC_L) PetscCall(PetscObjectCompose((PetscObject)jac->schur, "LSC_L", LSC_L)); in PCSetUp_FieldSplit()
1039 if (LSC_L) PetscCall(PetscObjectCompose((PetscObject)jac->schur, "LSC_Lp", LSC_L)); in PCSetUp_FieldSplit()
1040 } else if (jac->type == PC_COMPOSITE_GKB) { in PCSetUp_FieldSplit()
1042 ilink = jac->head; in PCSetUp_FieldSplit()
1043 …etscCall(MatCreateSubMatrix(jac->offdiag_use_amat ? pc->mat : pc->pmat, ilink->is, ilink->next->is… in PCSetUp_FieldSplit()
1045 PetscCall(VecDuplicate(ilink->x, &jac->u)); in PCSetUp_FieldSplit()
1046 PetscCall(VecDuplicate(ilink->x, &jac->Hu)); in PCSetUp_FieldSplit()
1047 PetscCall(VecDuplicate(ilink->x, &jac->w2)); in PCSetUp_FieldSplit()
1048 …etscCall(MatCreateSubMatrix(jac->offdiag_use_amat ? pc->mat : pc->pmat, ilink->next->is, ilink->is… in PCSetUp_FieldSplit()
1051 PetscCall(VecDuplicate(ilink->x, &jac->v)); in PCSetUp_FieldSplit()
1052 PetscCall(VecDuplicate(ilink->x, &jac->d)); in PCSetUp_FieldSplit()
1053 PetscCall(VecDuplicate(ilink->x, &jac->w1)); in PCSetUp_FieldSplit()
1054 … PetscCall(MatGolubKahanComputeExplicitOperator(jac->mat[0], jac->B, jac->C, &jac->H, jac->gkbnu)); in PCSetUp_FieldSplit()
1055 PetscCall(PetscCalloc1(jac->gkbdelay, &jac->vecz)); in PCSetUp_FieldSplit()
1057 ilink = jac->head; in PCSetUp_FieldSplit()
1058 PetscCall(KSPSetOperators(ilink->ksp, jac->H, jac->H)); in PCSetUp_FieldSplit()
1059 if (!jac->suboptionsset) PetscCall(KSPSetFromOptions(ilink->ksp)); in PCSetUp_FieldSplit()
1061 if (jac->gkbmonitor) { in PCSetUp_FieldSplit()
1063 PetscCall(PetscViewerCreate(PETSC_COMM_WORLD, &jac->gkbviewer)); in PCSetUp_FieldSplit()
1064 PetscCall(PetscViewerSetType(jac->gkbviewer, PETSCVIEWERASCII)); in PCSetUp_FieldSplit()
1066 PetscCall(PetscViewerASCIISetTab(jac->gkbviewer, tablevel)); in PCSetUp_FieldSplit()
1072 ilink = jac->head; in PCSetUp_FieldSplit()
1074 PetscCall(KSPSetOperators(ilink->ksp, jac->mat[i], jac->pmat[i])); in PCSetUp_FieldSplit()
1076 if (!jac->suboptionsset) PetscCall(KSPSetFromOptions(ilink->ksp)); in PCSetUp_FieldSplit()
1083 if (jac->coordinates_set) { in PCSetUp_FieldSplit()
1085 if (jac->type == PC_COMPOSITE_SCHUR) { in PCSetUp_FieldSplit()
1087 PetscCall(KSPGetPC(jac->head->ksp, &pc_coords)); in PCSetUp_FieldSplit()
1088 PetscCall(PCSetCoordinates(pc_coords, jac->head->dim, jac->head->ndofs, jac->head->coords)); in PCSetUp_FieldSplit()
1090 PetscCall(KSPGetPC(jac->kspschur, &pc_coords)); in PCSetUp_FieldSplit()
1091 …PetscCall(PCSetCoordinates(pc_coords, jac->head->next->dim, jac->head->next->ndofs, jac->head->nex… in PCSetUp_FieldSplit()
1092 } else if (jac->type == PC_COMPOSITE_GKB) { in PCSetUp_FieldSplit()
1095 ilink = jac->head; in PCSetUp_FieldSplit()
1104 jac->suboptionsset = PETSC_TRUE; in PCSetUp_FieldSplit()
1110 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCSetUpOnBlocks_FieldSplit_Schur() local
1111 PC_FieldSplitLink ilinkA = jac->head; in PCSetUpOnBlocks_FieldSplit_Schur()
1112 KSP kspA = ilinkA->ksp, kspUpper = jac->kspupper; in PCSetUpOnBlocks_FieldSplit_Schur()
1115 if (jac->schurfactorization == PC_FIELDSPLIT_SCHUR_FACT_FULL && kspUpper != kspA) { in PCSetUpOnBlocks_FieldSplit_Schur()
1121 if (jac->schurpre != PC_FIELDSPLIT_SCHUR_PRE_FULL) { in PCSetUpOnBlocks_FieldSplit_Schur()
1122 PetscCall(KSPSetUp(jac->kspschur)); in PCSetUpOnBlocks_FieldSplit_Schur()
1123 PetscCall(KSPSetUpOnBlocks(jac->kspschur)); in PCSetUpOnBlocks_FieldSplit_Schur()
1124 } else if (kspUpper == kspA && jac->schurfactorization == PC_FIELDSPLIT_SCHUR_FACT_FULL) { in PCSetUpOnBlocks_FieldSplit_Schur()
1131 PetscCall(MatGetSize(jac->B, &M, &N)); in PCSetUpOnBlocks_FieldSplit_Schur()
1132 PetscCall(MatGetLocalSize(jac->B, &m, NULL)); in PCSetUpOnBlocks_FieldSplit_Schur()
1133 PetscCall(MatGetVecType(jac->B, &vtype)); in PCSetUpOnBlocks_FieldSplit_Schur()
1136 PetscCall(PetscObjectQuery((PetscObject)jac->schur, "AinvB", (PetscObject *)&A)); in PCSetUpOnBlocks_FieldSplit_Schur()
1142 PetscCall(PetscObjectCompose((PetscObject)jac->schur, "AinvB", NULL)); in PCSetUpOnBlocks_FieldSplit_Schur()
1154 …PetscCall(MatCreateDenseFromVecType(PetscObjectComm((PetscObject)jac->schur), vtype, m, PETSC_DECI… in PCSetUpOnBlocks_FieldSplit_Schur()
1155 PetscCall(PetscObjectCompose((PetscObject)jac->schur, "AinvB", (PetscObject)A)); in PCSetUpOnBlocks_FieldSplit_Schur()
1164 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCSetUpOnBlocks_FieldSplit() local
1165 PC_FieldSplitLink ilink = jac->head; in PCSetUpOnBlocks_FieldSplit()
1178 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCSetUpOnBlocks_FieldSplit_GKB() local
1179 PC_FieldSplitLink ilinkA = jac->head; in PCSetUpOnBlocks_FieldSplit_GKB()
1190 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCApply_FieldSplit_Schur() local
1191 PC_FieldSplitLink ilinkA = jac->head, ilinkD = ilinkA->next; in PCApply_FieldSplit_Schur()
1192 KSP kspA = ilinkA->ksp, kspLower = kspA, kspUpper = jac->kspupper; in PCApply_FieldSplit_Schur()
1197 switch (jac->schurfactorization) { in PCApply_FieldSplit_Schur()
1209 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApply_FieldSplit_Schur()
1211 PetscCall(KSPSolve(jac->kspschur, ilinkD->x, ilinkD->y)); in PCApply_FieldSplit_Schur()
1212 PetscCall(KSPCheckSolve(jac->kspschur, pc, ilinkD->y)); in PCApply_FieldSplit_Schur()
1214 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApply_FieldSplit_Schur()
1215 PetscCall(VecScale(ilinkD->y, jac->schurscale)); in PCApply_FieldSplit_Schur()
1228 PetscCall(MatMult(jac->C, ilinkA->y, ilinkD->x)); in PCApply_FieldSplit_Schur()
1233 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApply_FieldSplit_Schur()
1235 PetscCall(KSPSolve(jac->kspschur, ilinkD->x, ilinkD->y)); in PCApply_FieldSplit_Schur()
1237 PetscCall(KSPCheckSolve(jac->kspschur, pc, ilinkD->y)); in PCApply_FieldSplit_Schur()
1238 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApply_FieldSplit_Schur()
1247 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApply_FieldSplit_Schur()
1249 PetscCall(KSPSolve(jac->kspschur, ilinkD->x, ilinkD->y)); in PCApply_FieldSplit_Schur()
1251 PetscCall(KSPCheckSolve(jac->kspschur, pc, ilinkD->y)); in PCApply_FieldSplit_Schur()
1252 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApply_FieldSplit_Schur()
1253 PetscCall(MatMult(jac->B, ilinkD->y, ilinkA->x)); in PCApply_FieldSplit_Schur()
1268 PetscCall(MatGetSize(jac->B, NULL, &P)); in PCApply_FieldSplit_Schur()
1274 PetscCall(PetscObjectQuery((PetscObject)jac->schur, "AinvB", (PetscObject *)&AinvB)); in PCApply_FieldSplit_Schur()
1283 PetscCall(MatGetSize(jac->B, &M, NULL)); in PCApply_FieldSplit_Schur()
1284 PetscCall(MatGetLocalSize(jac->B, &m, NULL)); in PCApply_FieldSplit_Schur()
1286 …d(HAVE_HIP))) PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)jac->schur), 1, m, M, a… in PCApply_FieldSplit_Schur()
1288 …A(mtype)) PetscCall(VecCreateMPICUDAWithArray(PetscObjectComm((PetscObject)jac->schur), 1, m, M, a… in PCApply_FieldSplit_Schur()
1291 …IP(mtype)) PetscCall(VecCreateMPIHIPWithArray(PetscObjectComm((PetscObject)jac->schur), 1, m, M, a… in PCApply_FieldSplit_Schur()
1295 PetscCall(MatSchurComplementComputeExplicitOperator(jac->schur, &jac->schur_user)); in PCApply_FieldSplit_Schur()
1296 PetscCall(KSPSetOperators(jac->kspschur, jac->schur, jac->schur_user)); in PCApply_FieldSplit_Schur()
1305 PetscCall(MatMult(jac->C, ilinkA->y, ilinkD->x)); in PCApply_FieldSplit_Schur()
1310 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApply_FieldSplit_Schur()
1312 PetscCall(KSPSolve(jac->kspschur, ilinkD->x, ilinkD->y)); in PCApply_FieldSplit_Schur()
1314 PetscCall(KSPCheckSolve(jac->kspschur, pc, ilinkD->y)); in PCApply_FieldSplit_Schur()
1315 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApply_FieldSplit_Schur()
1320 PetscCall(MatMult(jac->B, ilinkD->y, ilinkA->y)); in PCApply_FieldSplit_Schur()
1331 PetscCall(MatMult(jac->B, ilinkD->y, ilinkA->x)); in PCApply_FieldSplit_Schur()
1358 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitCreateWorkMats_Private() local
1359 PC_FieldSplitLink ilink = jac->head; in PCFieldSplitCreateWorkMats_Private()
1394 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCMatApply_FieldSplit_Schur() local
1395 PC_FieldSplitLink ilinkA = jac->head, ilinkD = ilinkA->next; in PCMatApply_FieldSplit_Schur()
1396 KSP kspA = ilinkA->ksp, kspLower = kspA, kspUpper = jac->kspupper; in PCMatApply_FieldSplit_Schur()
1403 switch (jac->schurfactorization) { in PCMatApply_FieldSplit_Schur()
1412 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->X, ilinkD->Y, NULL)); in PCMatApply_FieldSplit_Schur()
1414 PetscCall(KSPMatSolve(jac->kspschur, ilinkD->X, ilinkD->Y)); in PCMatApply_FieldSplit_Schur()
1416 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->X, ilinkD->Y, NULL)); in PCMatApply_FieldSplit_Schur()
1417 PetscCall(MatScale(ilinkD->Y, jac->schurscale)); in PCMatApply_FieldSplit_Schur()
1426 PetscCall(MatMatMult(jac->C, ilinkA->Y, MAT_REUSE_MATRIX, PETSC_DETERMINE, &ilinkD->X)); in PCMatApply_FieldSplit_Schur()
1430 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->X, ilinkD->Y, NULL)); in PCMatApply_FieldSplit_Schur()
1432 PetscCall(KSPMatSolve(jac->kspschur, ilinkD->X, ilinkD->Y)); in PCMatApply_FieldSplit_Schur()
1434 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->X, ilinkD->Y, NULL)); in PCMatApply_FieldSplit_Schur()
1440 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->X, ilinkD->Y, NULL)); in PCMatApply_FieldSplit_Schur()
1442 PetscCall(KSPMatSolve(jac->kspschur, ilinkD->X, ilinkD->Y)); in PCMatApply_FieldSplit_Schur()
1444 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->X, ilinkD->Y, NULL)); in PCMatApply_FieldSplit_Schur()
1445 PetscCall(MatMatMult(jac->B, ilinkD->Y, MAT_REUSE_MATRIX, PETSC_DETERMINE, &ilinkA->X)); in PCMatApply_FieldSplit_Schur()
1456 PetscCall(MatGetSize(jac->B, NULL, &P)); in PCMatApply_FieldSplit_Schur()
1461 PetscCall(PetscObjectQuery((PetscObject)jac->schur, "AinvB", (PetscObject *)&AinvB)); in PCMatApply_FieldSplit_Schur()
1470 PetscCall(MatGetSize(jac->B, &M, NULL)); in PCMatApply_FieldSplit_Schur()
1471 PetscCall(MatGetLocalSize(jac->B, &m, NULL)); in PCMatApply_FieldSplit_Schur()
1478 PetscCall(MatGetLocalSize(jac->B, NULL, &p)); in PCMatApply_FieldSplit_Schur()
1482 …PetscCall(MatCreateDense(PetscObjectComm((PetscObject)jac->schur), m, PETSC_DECIDE, M, P + Q, arra… in PCMatApply_FieldSplit_Schur()
1488 …PetscCall(MatCreateDenseCUDA(PetscObjectComm((PetscObject)jac->schur), m, PETSC_DECIDE, M, P + Q, … in PCMatApply_FieldSplit_Schur()
1495 …PetscCall(MatCreateDenseHIP(PetscObjectComm((PetscObject)jac->schur), m, PETSC_DECIDE, M, P + Q, a… in PCMatApply_FieldSplit_Schur()
1500 …cDefined(HAVE_HIP))) PetscCall(MatCreateDense(PetscObjectComm((PetscObject)jac->schur), m, q, M, Q… in PCMatApply_FieldSplit_Schur()
1502 …TypeCUDA(mtype)) PetscCall(MatCreateDenseCUDA(PetscObjectComm((PetscObject)jac->schur), m, q, M, Q… in PCMatApply_FieldSplit_Schur()
1505 …emTypeHIP(mtype)) PetscCall(MatCreateDenseHIP(PetscObjectComm((PetscObject)jac->schur), m, q, M, Q… in PCMatApply_FieldSplit_Schur()
1509 PetscCall(MatSchurComplementComputeExplicitOperator(jac->schur, &jac->schur_user)); in PCMatApply_FieldSplit_Schur()
1510 PetscCall(KSPSetOperators(jac->kspschur, jac->schur, jac->schur_user)); in PCMatApply_FieldSplit_Schur()
1518 PetscCall(MatMatMult(jac->C, ilinkA->Y, MAT_REUSE_MATRIX, PETSC_DETERMINE, &ilinkD->X)); in PCMatApply_FieldSplit_Schur()
1522 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->X, ilinkD->Y, NULL)); in PCMatApply_FieldSplit_Schur()
1524 PetscCall(KSPMatSolve(jac->kspschur, ilinkD->X, ilinkD->Y)); in PCMatApply_FieldSplit_Schur()
1526 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->X, ilinkD->Y, NULL)); in PCMatApply_FieldSplit_Schur()
1531 PetscCall(MatMatMult(jac->B, ilinkD->Y, MAT_REUSE_MATRIX, PETSC_DETERMINE, &ilinkA->Y)); in PCMatApply_FieldSplit_Schur()
1543 PetscCall(MatMatMult(jac->B, ilinkD->Y, MAT_REUSE_MATRIX, PETSC_DETERMINE, &ilinkA->X)); in PCMatApply_FieldSplit_Schur()
1557 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCApplyTranspose_FieldSplit_Schur() local
1558 PC_FieldSplitLink ilinkA = jac->head, ilinkD = ilinkA->next; in PCApplyTranspose_FieldSplit_Schur()
1559 KSP kspA = ilinkA->ksp, kspLower = kspA, kspUpper = jac->kspupper; in PCApplyTranspose_FieldSplit_Schur()
1562 switch (jac->schurfactorization) { in PCApplyTranspose_FieldSplit_Schur()
1574 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApplyTranspose_FieldSplit_Schur()
1576 PetscCall(KSPSolveTranspose(jac->kspschur, ilinkD->x, ilinkD->y)); in PCApplyTranspose_FieldSplit_Schur()
1578 PetscCall(KSPCheckSolve(jac->kspschur, pc, ilinkD->y)); in PCApplyTranspose_FieldSplit_Schur()
1579 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApplyTranspose_FieldSplit_Schur()
1580 PetscCall(VecScale(ilinkD->y, jac->schurscale)); in PCApplyTranspose_FieldSplit_Schur()
1592 PetscCall(MatMultTranspose(jac->B, ilinkA->y, ilinkD->x)); in PCApplyTranspose_FieldSplit_Schur()
1597 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApplyTranspose_FieldSplit_Schur()
1599 PetscCall(KSPSolveTranspose(jac->kspschur, ilinkD->x, ilinkD->y)); in PCApplyTranspose_FieldSplit_Schur()
1601 PetscCall(KSPCheckSolve(jac->kspschur, pc, ilinkD->y)); in PCApplyTranspose_FieldSplit_Schur()
1602 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApplyTranspose_FieldSplit_Schur()
1610 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApplyTranspose_FieldSplit_Schur()
1612 PetscCall(KSPSolveTranspose(jac->kspschur, ilinkD->x, ilinkD->y)); in PCApplyTranspose_FieldSplit_Schur()
1614 PetscCall(KSPCheckSolve(jac->kspschur, pc, ilinkD->y)); in PCApplyTranspose_FieldSplit_Schur()
1615 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApplyTranspose_FieldSplit_Schur()
1616 PetscCall(MatMultTranspose(jac->C, ilinkD->y, ilinkA->x)); in PCApplyTranspose_FieldSplit_Schur()
1636 PetscCall(MatMultTranspose(jac->B, ilinkA->y, ilinkD->x)); in PCApplyTranspose_FieldSplit_Schur()
1641 PetscCall(PetscLogEventBegin(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApplyTranspose_FieldSplit_Schur()
1643 PetscCall(KSPSolveTranspose(jac->kspschur, ilinkD->x, ilinkD->y)); in PCApplyTranspose_FieldSplit_Schur()
1645 PetscCall(KSPCheckSolve(jac->kspschur, pc, ilinkD->y)); in PCApplyTranspose_FieldSplit_Schur()
1646 PetscCall(PetscLogEventEnd(KSP_Solve_FS_S, jac->kspschur, ilinkD->x, ilinkD->y, NULL)); in PCApplyTranspose_FieldSplit_Schur()
1650 PetscCall(MatMultTranspose(jac->C, ilinkD->y, ilinkA->y)); in PCApplyTranspose_FieldSplit_Schur()
1660 PetscCall(MatMultTranspose(jac->C, ilinkD->y, ilinkA->x)); in PCApplyTranspose_FieldSplit_Schur()
1681 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCApply_FieldSplit() local
1682 PC_FieldSplitLink ilink = jac->head; in PCApply_FieldSplit()
1686 if (jac->type == PC_COMPOSITE_ADDITIVE) { in PCApply_FieldSplit()
1690 if (jac->defaultsplit && !matnest) { in PCApply_FieldSplit()
1692 …jac->bs <= 0 || bs == jac->bs, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Blocks… in PCApply_FieldSplit()
1694 …jac->bs <= 0 || bs == jac->bs, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Blocks… in PCApply_FieldSplit()
1695 PetscCall(VecStrideGatherAll(x, jac->x, INSERT_VALUES)); in PCApply_FieldSplit()
1703 PetscCall(VecStrideScatterAll(jac->y, y, INSERT_VALUES)); in PCApply_FieldSplit()
1711 } else if (jac->type == PC_COMPOSITE_MULTIPLICATIVE && jac->nsplits == 2) { in PCApply_FieldSplit()
1724 PetscCall(MatMult(jac->Afield[1], ilink->y, ilink->next->x)); in PCApply_FieldSplit()
1737 …} else if (jac->type == PC_COMPOSITE_MULTIPLICATIVE || jac->type == PC_COMPOSITE_SYMMETRIC_MULTIPL… in PCApply_FieldSplit()
1738 if (!jac->w1) { in PCApply_FieldSplit()
1739 PetscCall(VecDuplicate(x, &jac->w1)); in PCApply_FieldSplit()
1740 PetscCall(VecDuplicate(x, &jac->w2)); in PCApply_FieldSplit()
1748 PetscCall(MatMult(jac->Afield[cnt++], y, ilink->x)); in PCApply_FieldSplit()
1759 if (jac->type == PC_COMPOSITE_SYMMETRIC_MULTIPLICATIVE) { in PCApply_FieldSplit()
1764 PetscCall(MatMult(jac->Afield[cnt--], y, ilink->x)); in PCApply_FieldSplit()
1776 …jectComm((PetscObject)pc), PETSC_ERR_SUP, "Unsupported or unknown composition %d", (int)jac->type); in PCApply_FieldSplit()
1782 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCMatApply_FieldSplit() local
1783 PC_FieldSplitLink ilink = jac->head; in PCMatApply_FieldSplit()
1789 if (jac->type == PC_COMPOSITE_ADDITIVE) { in PCMatApply_FieldSplit()
1799 } else if (jac->type == PC_COMPOSITE_MULTIPLICATIVE && jac->nsplits == 2) { in PCMatApply_FieldSplit()
1808 …PetscCall(MatMatMult(jac->Afield[1], ilink->Y, MAT_REUSE_MATRIX, PETSC_DETERMINE, &ilink->next->X)… in PCMatApply_FieldSplit()
1818 …} else if (jac->type == PC_COMPOSITE_MULTIPLICATIVE || jac->type == PC_COMPOSITE_SYMMETRIC_MULTIPL… in PCMatApply_FieldSplit()
1832 PetscCall(MatMatMult(jac->Afield[cnt++], Y, MAT_REUSE_MATRIX, PETSC_DETERMINE, &ilink->X)); in PCMatApply_FieldSplit()
1841 if (jac->type == PC_COMPOSITE_SYMMETRIC_MULTIPLICATIVE) { in PCMatApply_FieldSplit()
1846 PetscCall(MatMatMult(jac->Afield[cnt--], Y, MAT_REUSE_MATRIX, PETSC_DETERMINE, &ilink->X)); in PCMatApply_FieldSplit()
1861 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCApply_FieldSplit_GKB() local
1862 PC_FieldSplitLink ilinkA = jac->head, ilinkD = ilinkA->next; in PCApply_FieldSplit_GKB()
1875 u = jac->u; in PCApply_FieldSplit_GKB()
1876 v = jac->v; in PCApply_FieldSplit_GKB()
1877 Hu = jac->Hu; in PCApply_FieldSplit_GKB()
1878 d = jac->d; in PCApply_FieldSplit_GKB()
1879 work1 = jac->w1; in PCApply_FieldSplit_GKB()
1880 work2 = jac->w2; in PCApply_FieldSplit_GKB()
1881 vecz = jac->vecz; in PCApply_FieldSplit_GKB()
1885 if (jac->gkbnu) { in PCApply_FieldSplit_GKB()
1886 nu = jac->gkbnu; in PCApply_FieldSplit_GKB()
1887 PetscCall(VecScale(ilinkD->x, jac->gkbnu)); in PCApply_FieldSplit_GKB()
1888 PetscCall(MatMultAdd(jac->B, ilinkD->x, ilinkA->x, ilinkA->x)); /* q = q + nu*B*b */ in PCApply_FieldSplit_GKB()
1900 PetscCall(MatMultHermitianTranspose(jac->B, ilinkA->y, work1)); in PCApply_FieldSplit_GKB()
1908 PetscCall(MatMult(jac->B, v, work2)); /* u = H^{-1}*B*v */ in PCApply_FieldSplit_GKB()
1913 PetscCall(MatMult(jac->H, u, Hu)); /* alpha = u'*H*u */ in PCApply_FieldSplit_GKB()
1930 lowbnd = 2 * jac->gkbtol; in PCApply_FieldSplit_GKB()
1931 …if (jac->gkbmonitor) PetscCall(PetscViewerASCIIPrintf(jac->gkbviewer, "%3" PetscInt_FMT " GKB Lowe… in PCApply_FieldSplit_GKB()
1933 while (iterGKB < jac->gkbmaxit && lowbnd > jac->gkbtol) { in PCApply_FieldSplit_GKB()
1935 PetscCall(MatMultHermitianTranspose(jac->B, u, work1)); /* v <- nu*(B'*u-alpha/nu*v) */ in PCApply_FieldSplit_GKB()
1940 PetscCall(MatMult(jac->B, v, work2)); /* u <- H^{-1}*(B*v-beta*H*u) */ in PCApply_FieldSplit_GKB()
1941 PetscCall(MatMult(jac->H, u, Hu)); in PCApply_FieldSplit_GKB()
1947 PetscCall(MatMult(jac->H, u, Hu)); /* alpha = u'*H*u */ in PCApply_FieldSplit_GKB()
1961 PetscCall(MatMult(jac->H, ilinkA->y, Hu)); /* ||u||_H = u'*H*u */ in PCApply_FieldSplit_GKB()
1965 if (iterGKB > jac->gkbdelay) { in PCApply_FieldSplit_GKB()
1967 for (j = 0; j < jac->gkbdelay; j++) lowbnd += PetscAbsScalar(vecz[j] * vecz[j]); in PCApply_FieldSplit_GKB()
1971 … for (j = 0; j < jac->gkbdelay - 1; j++) vecz[jac->gkbdelay - j - 1] = vecz[jac->gkbdelay - j - 2]; in PCApply_FieldSplit_GKB()
1972 …if (jac->gkbmonitor) PetscCall(PetscViewerASCIIPrintf(jac->gkbviewer, "%3" PetscInt_FMT " GKB Lowe… in PCApply_FieldSplit_GKB()
1989 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCApplyTranspose_FieldSplit() local
1990 PC_FieldSplitLink ilink = jac->head; in PCApplyTranspose_FieldSplit()
1994 if (jac->type == PC_COMPOSITE_ADDITIVE) { in PCApplyTranspose_FieldSplit()
1998 if (jac->defaultsplit && !matnest) { in PCApplyTranspose_FieldSplit()
2000 …jac->bs <= 0 || bs == jac->bs, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Blocks… in PCApplyTranspose_FieldSplit()
2002 …jac->bs <= 0 || bs == jac->bs, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Blocks… in PCApplyTranspose_FieldSplit()
2003 PetscCall(VecStrideGatherAll(x, jac->x, INSERT_VALUES)); in PCApplyTranspose_FieldSplit()
2011 PetscCall(VecStrideScatterAll(jac->y, y, INSERT_VALUES)); in PCApplyTranspose_FieldSplit()
2020 if (!jac->w1) { in PCApplyTranspose_FieldSplit()
2021 PetscCall(VecDuplicate(x, &jac->w1)); in PCApplyTranspose_FieldSplit()
2022 PetscCall(VecDuplicate(x, &jac->w2)); in PCApplyTranspose_FieldSplit()
2025 if (jac->type == PC_COMPOSITE_SYMMETRIC_MULTIPLICATIVE) { in PCApplyTranspose_FieldSplit()
2029 PetscCall(MatMultTranspose(pc->mat, y, jac->w1)); in PCApplyTranspose_FieldSplit()
2030 PetscCall(VecWAXPY(jac->w2, -1.0, jac->w1, x)); in PCApplyTranspose_FieldSplit()
2031 PetscCall(FieldSplitSplitSolveAddTranspose(ilink, jac->w2, y)); in PCApplyTranspose_FieldSplit()
2035 PetscCall(MatMultTranspose(pc->mat, y, jac->w1)); in PCApplyTranspose_FieldSplit()
2036 PetscCall(VecWAXPY(jac->w2, -1.0, jac->w1, x)); in PCApplyTranspose_FieldSplit()
2037 PetscCall(FieldSplitSplitSolveAddTranspose(ilink, jac->w2, y)); in PCApplyTranspose_FieldSplit()
2046 PetscCall(MatMultTranspose(pc->mat, y, jac->w1)); in PCApplyTranspose_FieldSplit()
2047 PetscCall(VecWAXPY(jac->w2, -1.0, jac->w1, x)); in PCApplyTranspose_FieldSplit()
2048 PetscCall(FieldSplitSplitSolveAddTranspose(ilink, jac->w2, y)); in PCApplyTranspose_FieldSplit()
2057 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCReset_FieldSplit() local
2058 PC_FieldSplitLink ilink = jac->head, next; in PCReset_FieldSplit()
2079 jac->head = NULL; in PCReset_FieldSplit()
2080 PetscCall(PetscFree2(jac->x, jac->y)); in PCReset_FieldSplit()
2081 if (jac->mat && jac->mat != jac->pmat) { in PCReset_FieldSplit()
2082 PetscCall(MatDestroyMatrices(jac->nsplits, &jac->mat)); in PCReset_FieldSplit()
2083 } else if (jac->mat) { in PCReset_FieldSplit()
2084 jac->mat = NULL; in PCReset_FieldSplit()
2086 if (jac->pmat) PetscCall(MatDestroyMatrices(jac->nsplits, &jac->pmat)); in PCReset_FieldSplit()
2087 if (jac->Afield) PetscCall(MatDestroyMatrices(jac->nsplits, &jac->Afield)); in PCReset_FieldSplit()
2088 jac->nsplits = 0; in PCReset_FieldSplit()
2089 PetscCall(VecDestroy(&jac->w1)); in PCReset_FieldSplit()
2090 PetscCall(VecDestroy(&jac->w2)); in PCReset_FieldSplit()
2091 if (jac->schur) PetscCall(PetscObjectCompose((PetscObject)jac->schur, "AinvB", NULL)); in PCReset_FieldSplit()
2092 PetscCall(MatDestroy(&jac->schur)); in PCReset_FieldSplit()
2093 PetscCall(MatDestroy(&jac->schurp)); in PCReset_FieldSplit()
2094 PetscCall(MatDestroy(&jac->schur_user)); in PCReset_FieldSplit()
2095 PetscCall(KSPDestroy(&jac->kspschur)); in PCReset_FieldSplit()
2096 PetscCall(KSPDestroy(&jac->kspupper)); in PCReset_FieldSplit()
2097 PetscCall(MatDestroy(&jac->B)); in PCReset_FieldSplit()
2098 PetscCall(MatDestroy(&jac->C)); in PCReset_FieldSplit()
2099 PetscCall(MatDestroy(&jac->H)); in PCReset_FieldSplit()
2100 PetscCall(VecDestroy(&jac->u)); in PCReset_FieldSplit()
2101 PetscCall(VecDestroy(&jac->v)); in PCReset_FieldSplit()
2102 PetscCall(VecDestroy(&jac->Hu)); in PCReset_FieldSplit()
2103 PetscCall(VecDestroy(&jac->d)); in PCReset_FieldSplit()
2104 PetscCall(PetscFree(jac->vecz)); in PCReset_FieldSplit()
2105 PetscCall(PetscViewerDestroy(&jac->gkbviewer)); in PCReset_FieldSplit()
2106 jac->isrestrict = PETSC_FALSE; in PCReset_FieldSplit()
2138 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCSetFromOptions_FieldSplit() local
2143 …reateFieldDecomposition() for splits", "PCFieldSplitSetDMSplits", jac->dm_splits, &jac->dm_splits,… in PCSetFromOptions_FieldSplit()
2144 …size", "Blocksize that defines number of fields", "PCFieldSplitSetBlockSize", jac->bs, &bs, &flg)); in PCSetFromOptions_FieldSplit()
2146 jac->diag_use_amat = pc->useAmat; in PCSetFromOptions_FieldSplit()
2147 …ract diagonal fieldsplit blocks", "PCFieldSplitSetDiagUseAmat", jac->diag_use_amat, &jac->diag_use… in PCSetFromOptions_FieldSplit()
2148 jac->offdiag_use_amat = pc->useAmat; in PCSetFromOptions_FieldSplit()
2149 …-diagonal fieldsplit blocks", "PCFieldSplitSetOffDiagUseAmat", jac->offdiag_use_amat, &jac->offdia… in PCSetFromOptions_FieldSplit()
2150 …tecting zero diagonal entries", "PCFieldSplitSetDetectSaddlePoint", jac->detect, &jac->detect, NUL… in PCSetFromOptions_FieldSplit()
2151 …PetscCall(PCFieldSplitSetDetectSaddlePoint(pc, jac->detect)); /* Sets split type and Schur PC type… in PCSetFromOptions_FieldSplit()
2152 …"Type of composition", "PCFieldSplitSetType", PCCompositeTypes, (PetscEnum)jac->type, (PetscEnum *… in PCSetFromOptions_FieldSplit()
2155 if (jac->bs > 0 && jac->nsplits == 0) { in PCSetFromOptions_FieldSplit()
2159 if (jac->splitdefined) PetscCall(PetscInfo(pc, "Splits defined using the options database\n")); in PCSetFromOptions_FieldSplit()
2161 if (jac->type == PC_COMPOSITE_SCHUR) { in PCSetFromOptions_FieldSplit()
2162 …split_schur_factorization_type", PCFieldSplitSchurFactTypes, (PetscEnum *)&jac->schurfactorization… in PCSetFromOptions_FieldSplit()
2164 …SchurFactType", PCFieldSplitSchurFactTypes, (PetscEnum)jac->schurfactorization, (PetscEnum *)&jac-… in PCSetFromOptions_FieldSplit()
2165 …eldSplitSetSchurPre", PCFieldSplitSchurPreTypes, (PetscEnum)jac->schurpre, (PetscEnum *)&jac->schu… in PCSetFromOptions_FieldSplit()
2166 …ur_scale", "Scale Schur complement", "PCFieldSplitSetSchurScale", jac->schurscale, &jac->schurscal… in PCSetFromOptions_FieldSplit()
2167 } else if (jac->type == PC_COMPOSITE_GKB) { in PCSetFromOptions_FieldSplit()
2168 …e for the lower bound stopping criterion", "PCFieldSplitSetGKBTol", jac->gkbtol, &jac->gkbtol, NUL… in PCSetFromOptions_FieldSplit()
2169 …delay value for lower bound criterion", "PCFieldSplitSetGKBDelay", jac->gkbdelay, &jac->gkbdelay, … in PCSetFromOptions_FieldSplit()
2170 …arameter in augmented Lagrangian approach", "PCFieldSplitSetGKBNu", jac->gkbnu, &jac->gkbnu, NULL,… in PCSetFromOptions_FieldSplit()
2171 …"Maximum allowed number of iterations", "PCFieldSplitSetGKBMaxit", jac->gkbmaxit, &jac->gkbmaxit, … in PCSetFromOptions_FieldSplit()
2172 …, "Prints number of GKB iterations and error", "PCFieldSplitGKB", jac->gkbmonitor, &jac->gkbmonito… in PCSetFromOptions_FieldSplit()
2187 if (jac->issetup) { in PCSetFromOptions_FieldSplit()
2188 PC_FieldSplitLink ilink = jac->head; in PCSetFromOptions_FieldSplit()
2189 if (jac->type == PC_COMPOSITE_SCHUR) { in PCSetFromOptions_FieldSplit()
2190 if (jac->kspupper && jac->kspupper->totalits > 0) PetscCall(KSPSetFromOptions(jac->kspupper)); in PCSetFromOptions_FieldSplit()
2191 if (jac->kspschur && jac->kspschur->totalits > 0) PetscCall(KSPSetFromOptions(jac->kspschur)); in PCSetFromOptions_FieldSplit()
2204 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetFields_FieldSplit() local
2205 PC_FieldSplitLink ilink, next = jac->head; in PCFieldSplitSetFields_FieldSplit()
2211 if (jac->splitdefined) { in PCFieldSplitSetFields_FieldSplit()
2221 PetscCall(PetscSNPrintf(ilink->splitname, 2, "%" PetscInt_FMT, jac->nsplits)); in PCFieldSplitSetFields_FieldSplit()
2223 PetscCall(PetscMPIIntCast(jac->nsplits, &nse)); in PCFieldSplitSetFields_FieldSplit()
2224 …ilink->event = jac->nsplits < 5 ? KSP_Solve_FS_0 + nse : KSP_Solve_FS_0 + 4; /* Splits greater tha… in PCFieldSplitSetFields_FieldSplit()
2242 jac->head = ilink; in PCFieldSplitSetFields_FieldSplit()
2249 jac->nsplits++; in PCFieldSplitSetFields_FieldSplit()
2255 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSchurGetSubKSP_FieldSplit() local
2260 if (jac->type == PC_COMPOSITE_SCHUR) { in PCFieldSplitSchurGetSubKSP_FieldSplit()
2263 …PetscCheck(jac->schur, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Must call KSPS… in PCFieldSplitSchurGetSubKSP_FieldSplit()
2264 …PetscCheck(jac->nsplits == 2, PetscObjectComm((PetscObject)pc), PETSC_ERR_PLIB, "Unexpected number… in PCFieldSplitSchurGetSubKSP_FieldSplit()
2265 nn = jac->nsplits + (jac->kspupper != jac->head->ksp ? 1 : 0); in PCFieldSplitSchurGetSubKSP_FieldSplit()
2267 (*subksp)[0] = jac->head->ksp; in PCFieldSplitSchurGetSubKSP_FieldSplit()
2268 (*subksp)[1] = jac->kspschur; in PCFieldSplitSchurGetSubKSP_FieldSplit()
2269 if (jac->kspupper != jac->head->ksp) (*subksp)[2] = jac->kspupper; in PCFieldSplitSchurGetSubKSP_FieldSplit()
2277 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetSubKSP_FieldSplit_Schur() local
2280 …PetscCheck(jac->schur, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Must call KSPS… in PCFieldSplitGetSubKSP_FieldSplit_Schur()
2281 PetscCall(PetscMalloc1(jac->nsplits, subksp)); in PCFieldSplitGetSubKSP_FieldSplit_Schur()
2282 PetscCall(MatSchurComplementGetKSP(jac->schur, *subksp)); in PCFieldSplitGetSubKSP_FieldSplit_Schur()
2284 (*subksp)[1] = jac->kspschur; in PCFieldSplitGetSubKSP_FieldSplit_Schur()
2285 if (n) *n = jac->nsplits; in PCFieldSplitGetSubKSP_FieldSplit_Schur()
2291 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetSubKSP_FieldSplit() local
2293 PC_FieldSplitLink ilink = jac->head; in PCFieldSplitGetSubKSP_FieldSplit()
2296 PetscCall(PetscMalloc1(jac->nsplits, subksp)); in PCFieldSplitGetSubKSP_FieldSplit()
2301 …jac->nsplits, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Corrupt PCFIELDSPLIT object: number of splits in l… in PCFieldSplitGetSubKSP_FieldSplit()
2302 if (n) *n = jac->nsplits; in PCFieldSplitGetSubKSP_FieldSplit()
2332 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitRestrictIS_FieldSplit() local
2333 PC_FieldSplitLink ilink = jac->head, next; in PCFieldSplitRestrictIS_FieldSplit()
2386 jac->isrestrict = PETSC_TRUE; in PCFieldSplitRestrictIS_FieldSplit()
2392 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetIS_FieldSplit() local
2393 PC_FieldSplitLink ilink, next = jac->head; in PCFieldSplitSetIS_FieldSplit()
2398 if (jac->splitdefined) { in PCFieldSplitSetIS_FieldSplit()
2407 PetscCall(PetscSNPrintf(ilink->splitname, 7, "%" PetscInt_FMT, jac->nsplits)); in PCFieldSplitSetIS_FieldSplit()
2409 PetscCall(PetscMPIIntCast(jac->nsplits, &nse)); in PCFieldSplitSetIS_FieldSplit()
2410 …ilink->event = jac->nsplits < 5 ? KSP_Solve_FS_0 + nse : KSP_Solve_FS_0 + 4; /* Splits greater tha… in PCFieldSplitSetIS_FieldSplit()
2428 jac->head = ilink; in PCFieldSplitSetIS_FieldSplit()
2435 jac->nsplits++; in PCFieldSplitSetIS_FieldSplit()
2512 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetDiagUseAmat() local
2519 jac->diag_use_amat = flg; in PCFieldSplitSetDiagUseAmat()
2541 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetDiagUseAmat() local
2549 *flg = jac->diag_use_amat; in PCFieldSplitGetDiagUseAmat()
2572 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetOffDiagUseAmat() local
2579 jac->offdiag_use_amat = flg; in PCFieldSplitSetOffDiagUseAmat()
2601 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetOffDiagUseAmat() local
2609 *flg = jac->offdiag_use_amat; in PCFieldSplitGetOffDiagUseAmat()
2666 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetIS() local
2667 PC_FieldSplitLink ilink = jac->head; in PCFieldSplitGetIS()
2707 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetISByIndex() local
2708 PC_FieldSplitLink ilink = jac->head; in PCFieldSplitGetISByIndex()
2710 …index < jac->nsplits, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Field %" PetscInt_FMT " requeste… in PCFieldSplitGetISByIndex()
2942 PC_FieldSplit *jac; in PCFieldSplitSchurGetS() local
2949 jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSchurGetS()
2950 …PetscCheck(jac->type == PC_COMPOSITE_SCHUR, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Expected PCFIEL… in PCFieldSplitSchurGetS()
2951 if (S) *S = jac->schur; in PCFieldSplitSchurGetS()
2972 PC_FieldSplit *jac; in PCFieldSplitSchurRestoreS() local
2979 jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSchurRestoreS()
2980 …PetscCheck(jac->type == PC_COMPOSITE_SCHUR, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Expected PCFIEL… in PCFieldSplitSchurRestoreS()
2981 …PetscCheck(S && (*S == jac->schur), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "MatSchurComplement rest… in PCFieldSplitSchurRestoreS()
2987 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetSchurPre_FieldSplit() local
2990 jac->schurpre = ptype; in PCFieldSplitSetSchurPre_FieldSplit()
2992 PetscCall(MatDestroy(&jac->schur_user)); in PCFieldSplitSetSchurPre_FieldSplit()
2993 jac->schur_user = pre; in PCFieldSplitSetSchurPre_FieldSplit()
2994 PetscCall(PetscObjectReference((PetscObject)jac->schur_user)); in PCFieldSplitSetSchurPre_FieldSplit()
3001 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetSchurPre_FieldSplit() local
3004 if (ptype) *ptype = jac->schurpre; in PCFieldSplitGetSchurPre_FieldSplit()
3005 if (pre) *pre = jac->schur_user; in PCFieldSplitGetSchurPre_FieldSplit()
3070 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetSchurFactType_FieldSplit() local
3073 jac->schurfactorization = ftype; in PCFieldSplitSetSchurFactType_FieldSplit()
3104 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetSchurScale_FieldSplit() local
3107 jac->schurscale = scale; in PCFieldSplitSetSchurScale_FieldSplit()
3134 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetSchurBlocks() local
3138 …PetscCheck(jac->type == PC_COMPOSITE_SCHUR, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONG,… in PCFieldSplitGetSchurBlocks()
3139 if (A00) *A00 = jac->pmat[0]; in PCFieldSplitGetSchurBlocks()
3140 if (A01) *A01 = jac->B; in PCFieldSplitGetSchurBlocks()
3141 if (A10) *A10 = jac->C; in PCFieldSplitGetSchurBlocks()
3142 if (A11) *A11 = jac->pmat[1]; in PCFieldSplitGetSchurBlocks()
3178 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetGKBTol_FieldSplit() local
3181 jac->gkbtol = tolerance; in PCFieldSplitSetGKBTol_FieldSplit()
3212 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetGKBMaxit_FieldSplit() local
3215 jac->gkbmaxit = maxit; in PCFieldSplitSetGKBMaxit_FieldSplit()
3254 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetGKBDelay_FieldSplit() local
3257 jac->gkbdelay = delay; in PCFieldSplitSetGKBDelay_FieldSplit()
3296 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetGKBNu_FieldSplit() local
3299 jac->gkbnu = nu; in PCFieldSplitSetGKBNu_FieldSplit()
3305 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetType_FieldSplit() local
3308 jac->type = type; in PCFieldSplitSetType_FieldSplit()
3357 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetBlockSize_FieldSplit() local
3361 …jac->bs <= 0 || jac->bs == bs, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_WRONGSTATE, "Cannot… in PCFieldSplitSetBlockSize_FieldSplit()
3362 jac->bs = bs; in PCFieldSplitSetBlockSize_FieldSplit()
3368 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCSetCoordinates_FieldSplit() local
3369 PC_FieldSplitLink ilink_current = jac->head; in PCSetCoordinates_FieldSplit()
3373 jac->coordinates_set = PETSC_TRUE; // Internal flag in PCSetCoordinates_FieldSplit()
3446 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetType() local
3451 *type = jac->type; in PCFieldSplitGetType()
3476 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetDMSplits() local
3483 if (isfs) jac->dm_splits = flg; in PCFieldSplitSetDMSplits()
3507 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetDMSplits() local
3515 if (flg) *flg = jac->dm_splits; in PCFieldSplitGetDMSplits()
3537 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitGetDetectSaddlePoint() local
3540 *flg = jac->detect; in PCFieldSplitGetDetectSaddlePoint()
3567 PC_FieldSplit *jac = (PC_FieldSplit *)pc->data; in PCFieldSplitSetDetectSaddlePoint() local
3570 jac->detect = flg; in PCFieldSplitSetDetectSaddlePoint()
3571 if (jac->detect) { in PCFieldSplitSetDetectSaddlePoint()
3691 PC_FieldSplit *jac; in PCCreate_FieldSplit() local
3694 PetscCall(PetscNew(&jac)); in PCCreate_FieldSplit()
3696 jac->bs = -1; in PCCreate_FieldSplit()
3697 jac->type = PC_COMPOSITE_MULTIPLICATIVE; in PCCreate_FieldSplit()
3698 …jac->schurpre = PC_FIELDSPLIT_SCHUR_PRE_USER; /* Try user preconditioner first, fall bac… in PCCreate_FieldSplit()
3699 jac->schurfactorization = PC_FIELDSPLIT_SCHUR_FACT_FULL; in PCCreate_FieldSplit()
3700 jac->schurscale = -1.0; in PCCreate_FieldSplit()
3701 jac->dm_splits = PETSC_TRUE; in PCCreate_FieldSplit()
3702 jac->gkbtol = 1e-5; in PCCreate_FieldSplit()
3703 jac->gkbdelay = 5; in PCCreate_FieldSplit()
3704 jac->gkbnu = 1; in PCCreate_FieldSplit()
3705 jac->gkbmaxit = 100; in PCCreate_FieldSplit()
3707 pc->data = (void *)jac; in PCCreate_FieldSplit()
3724 PetscCall(PCFieldSplitSetType(pc, jac->type)); in PCCreate_FieldSplit()