Lines Matching refs:snes
11 SNES snes; /* Solver for this block */ member
26 static PetscErrorCode SNESReset_Multiblock(SNES snes) in SNESReset_Multiblock() argument
28 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESReset_Multiblock()
33 PetscCall(SNESReset(blocks->snes)); in SNESReset_Multiblock()
53 static PetscErrorCode SNESDestroy_Multiblock(SNES snes) in SNESDestroy_Multiblock() argument
55 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESDestroy_Multiblock()
59 PetscCall(SNESReset_Multiblock(snes)); in SNESDestroy_Multiblock()
62 PetscCall(SNESDestroy(&blocks->snes)); in SNESDestroy_Multiblock()
68 PetscCall(PetscFree(snes->data)); in SNESDestroy_Multiblock()
73 static PetscErrorCode SNESMultiblockSetFieldsRuntime_Private(SNES snes) in SNESMultiblockSetFieldsRuntime_Private() argument
75 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESMultiblockSetFieldsRuntime_Private()
87 …PetscCall(PetscOptionsGetIntArray(NULL, ((PetscObject)snes)->prefix, optionname, ifields, &nfields… in SNESMultiblockSetFieldsRuntime_Private()
90 PetscCall(SNESMultiblockSetFields(snes, name, nfields, ifields)); in SNESMultiblockSetFieldsRuntime_Private()
102 static PetscErrorCode SNESMultiblockSetDefaults(SNES snes) in SNESMultiblockSetDefaults() argument
104 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESMultiblockSetDefaults()
110 if (snes->dm) { in SNESMultiblockSetDefaults()
113 PetscCall(PetscObjectTypeCompare((PetscObject)snes->dm, DMCOMPOSITE, &dmcomposite)); in SNESMultiblockSetDefaults()
118 … PetscCall(PetscInfo(snes, "Setting up physics based multiblock solver using the embedded DM\n")); in SNESMultiblockSetDefaults()
119 PetscCall(DMCompositeGetNumberDM(snes->dm, &nDM)); in SNESMultiblockSetDefaults()
120 PetscCall(DMCompositeGetGlobalISs(snes->dm, &fields)); in SNESMultiblockSetDefaults()
125 PetscCall(SNESMultiblockSetIS(snes, name, fields[i])); in SNESMultiblockSetDefaults()
135 if (snes->jacobian_pre) PetscCall(MatGetBlockSize(snes->jacobian_pre, &mb->bs)); in SNESMultiblockSetDefaults()
139 …PetscCall(PetscOptionsGetBool(NULL, ((PetscObject)snes)->prefix, "-snes_multiblock_default", &flg,… in SNESMultiblockSetDefaults()
140 …PetscCall(PetscOptionsGetBool(NULL, ((PetscObject)snes)->prefix, "-snes_multiblock_detect_saddle_p… in SNESMultiblockSetDefaults()
145 PetscCall(MatGetOwnershipRange(snes->jacobian_pre, &nmin, &nmax)); in SNESMultiblockSetDefaults()
146 PetscCall(MatFindZeroDiagonals(snes->jacobian_pre, &zerodiags)); in SNESMultiblockSetDefaults()
148 PetscCall(SNESMultiblockSetIS(snes, "0", rest)); in SNESMultiblockSetDefaults()
149 PetscCall(SNESMultiblockSetIS(snes, "1", zerodiags)); in SNESMultiblockSetDefaults()
156 PetscCall(SNESMultiblockSetFieldsRuntime_Private(snes)); in SNESMultiblockSetDefaults()
157 … if (mb->defined) PetscCall(PetscInfo(snes, "Blocks defined using the options database\n")); in SNESMultiblockSetDefaults()
160 PetscCall(PetscInfo(snes, "Using default splitting of fields\n")); in SNESMultiblockSetDefaults()
165 PetscCall(SNESMultiblockSetFields(snes, name, 1, &i)); in SNESMultiblockSetDefaults()
176 PetscCall(MatGetOwnershipRange(snes->jacobian_pre, &nmin, &nmax)); in SNESMultiblockSetDefaults()
178 PetscCall(SNESMultiblockSetIS(snes, "1", is2)); in SNESMultiblockSetDefaults()
185 static PetscErrorCode SNESSetUp_Multiblock(SNES snes) in SNESSetUp_Multiblock() argument
187 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESSetUp_Multiblock()
192 PetscCall(SNESMultiblockSetDefaults(snes)); in SNESSetUp_Multiblock()
203 PetscCall(MatGetOwnershipRange(snes->jacobian_pre, &rstart, &rend)); in SNESSetUp_Multiblock()
204 PetscCall(MatGetLocalSize(snes->jacobian_pre, NULL, &ccsize)); in SNESSetUp_Multiblock()
208 …PetscCall(ISCreateStride(PetscObjectComm((PetscObject)snes), nslots, rstart + i, numBlocks, &block… in SNESSetUp_Multiblock()
217 …PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)snes), nslots * nfields, ii, PETSC_OWN_POIN… in SNESSetUp_Multiblock()
219 …PetscCall(ISCreateStride(PetscObjectComm((PetscObject)snes), nslots, rstart + blocks->fields[0], b… in SNESSetUp_Multiblock()
354 PetscCall(VecDuplicate(blocks->snes->vec_sol, &blocks->x)); in SNESSetUp_Multiblock()
356 PetscCall(SNESSetFromOptions(blocks->snes)); in SNESSetUp_Multiblock()
357 PetscCall(SNESSetUp(blocks->snes)); in SNESSetUp_Multiblock()
368 PetscCall(MatCreateVecs(snes->jacobian_pre, &xtmp, NULL)); in SNESSetUp_Multiblock()
386 static PetscErrorCode SNESSetFromOptions_Multiblock(SNES snes, PetscOptionItems PetscOptionsObject) in SNESSetFromOptions_Multiblock() argument
388 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESSetFromOptions_Multiblock()
396 if (flg) PetscCall(SNESMultiblockSetBlockSize(snes, bs)); in SNESSetFromOptions_Multiblock()
398 if (flg) PetscCall(SNESMultiblockSetType(snes, ctype)); in SNESSetFromOptions_Multiblock()
402 PetscCall(SNESMultiblockSetFieldsRuntime_Private(snes)); in SNESSetFromOptions_Multiblock()
403 if (mb->defined) PetscCall(PetscInfo(snes, "Blocks defined using the options database\n")); in SNESSetFromOptions_Multiblock()
409 static PetscErrorCode SNESView_Multiblock(SNES snes, PetscViewer viewer) in SNESView_Multiblock() argument
411 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESView_Multiblock()
436 PetscCall(SNESView(blocks->snes, viewer)); in SNESView_Multiblock()
444 static PetscErrorCode SNESSolve_Multiblock(SNES snes) in SNESSolve_Multiblock() argument
446 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESSolve_Multiblock()
452 …snes->xl && !snes->xu && !snes->ops->computevariablebounds, PetscObjectComm((PetscObject)snes), PE… in SNESSolve_Multiblock()
454 snes->reason = SNES_CONVERGED_ITERATING; in SNESSolve_Multiblock()
456 maxits = snes->max_its; /* maximum number of iterations */ in SNESSolve_Multiblock()
457 X = snes->vec_sol; /* X^n */ in SNESSolve_Multiblock()
458 Y = snes->vec_sol_update; /* \tilde X */ in SNESSolve_Multiblock()
459 F = snes->vec_func; /* residual vector */ in SNESSolve_Multiblock()
464 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_Multiblock()
465 snes->iter = 0; in SNESSolve_Multiblock()
466 snes->norm = 0.; in SNESSolve_Multiblock()
467 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_Multiblock()
469 if (!snes->vec_func_init_set) PetscCall(SNESComputeFunction(snes, X, F)); in SNESSolve_Multiblock()
470 else snes->vec_func_init_set = PETSC_FALSE; in SNESSolve_Multiblock()
473 SNESCheckFunctionDomainError(snes, fnorm); in SNESSolve_Multiblock()
474 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_Multiblock()
475 snes->norm = fnorm; in SNESSolve_Multiblock()
476 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_Multiblock()
477 PetscCall(SNESLogConvergenceHistory(snes, fnorm, 0)); in SNESSolve_Multiblock()
480 PetscCall(SNESConverged(snes, 0, 0.0, 0.0, fnorm)); in SNESSolve_Multiblock()
481 PetscCall(SNESMonitor(snes, 0, fnorm)); in SNESSolve_Multiblock()
482 if (snes->reason) PetscFunctionReturn(PETSC_SUCCESS); in SNESSolve_Multiblock()
486 PetscTryTypeMethod(snes, update, snes->iter); in SNESSolve_Multiblock()
495 PetscCall(SNESSolve(blocks->snes, NULL, blocks->x)); in SNESSolve_Multiblock()
503 PetscCall(SNESSolve(blocks->snes, NULL, blocks->x)); in SNESSolve_Multiblock()
509 …} else SETERRQ(PetscObjectComm((PetscObject)snes), PETSC_ERR_SUP, "Unsupported or unknown composit… in SNESSolve_Multiblock()
511 PetscCall(SNESComputeFunction(snes, X, F)); in SNESSolve_Multiblock()
513 SNESCheckFunctionDomainError(snes, fnorm); in SNESSolve_Multiblock()
515 if (snes->nfuncs >= snes->max_funcs && snes->max_funcs >= 0) { in SNESSolve_Multiblock()
516 snes->reason = SNES_DIVERGED_FUNCTION_COUNT; in SNESSolve_Multiblock()
521 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_Multiblock()
522 snes->iter = i + 1; in SNESSolve_Multiblock()
523 snes->norm = fnorm; in SNESSolve_Multiblock()
524 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_Multiblock()
525 PetscCall(SNESLogConvergenceHistory(snes, snes->norm, 0)); in SNESSolve_Multiblock()
527 PetscCall(SNESConverged(snes, snes->iter, 0.0, 0.0, fnorm)); in SNESSolve_Multiblock()
528 PetscCall(SNESMonitor(snes, snes->iter, snes->norm)); in SNESSolve_Multiblock()
529 if (snes->reason) break; in SNESSolve_Multiblock()
534 static PetscErrorCode SNESMultiblockSetFields_Default(SNES snes, const char name[], PetscInt n, con… in SNESMultiblockSetFields_Default() argument
536 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESMultiblockSetFields_Default()
543 …PetscCall(PetscInfo(snes, "Ignoring new block \"%s\" because the blocks have already been defined\… in SNESMultiblockSetFields_Default()
566 PetscCall(SNESCreate(PetscObjectComm((PetscObject)snes), &newblock->snes)); in SNESMultiblockSetFields_Default()
567 PetscCall(PetscObjectIncrementTabLevel((PetscObject)newblock->snes, (PetscObject)snes, 1)); in SNESMultiblockSetFields_Default()
568 PetscCall(SNESSetType(newblock->snes, SNESNRICHARDSON)); in SNESMultiblockSetFields_Default()
569 …(prefix, sizeof(prefix), "%smultiblock_%s_", ((PetscObject)snes)->prefix ? ((PetscObject)snes)->pr… in SNESMultiblockSetFields_Default()
570 PetscCall(SNESSetOptionsPrefix(newblock->snes, prefix)); in SNESMultiblockSetFields_Default()
584 static PetscErrorCode SNESMultiblockSetIS_Default(SNES snes, const char name[], IS is) in SNESMultiblockSetIS_Default() argument
586 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESMultiblockSetIS_Default()
592 …PetscCall(PetscInfo(snes, "Ignoring new block \"%s\" because the blocks have already been defined\… in SNESMultiblockSetIS_Default()
610 PetscCall(SNESCreate(PetscObjectComm((PetscObject)snes), &newblock->snes)); in SNESMultiblockSetIS_Default()
611 PetscCall(PetscObjectIncrementTabLevel((PetscObject)newblock->snes, (PetscObject)snes, 1)); in SNESMultiblockSetIS_Default()
612 PetscCall(SNESSetType(newblock->snes, SNESNRICHARDSON)); in SNESMultiblockSetIS_Default()
613 …(prefix, sizeof(prefix), "%smultiblock_%s_", ((PetscObject)snes)->prefix ? ((PetscObject)snes)->pr… in SNESMultiblockSetIS_Default()
614 PetscCall(SNESSetOptionsPrefix(newblock->snes, prefix)); in SNESMultiblockSetIS_Default()
628 static PetscErrorCode SNESMultiblockSetBlockSize_Default(SNES snes, PetscInt bs) in SNESMultiblockSetBlockSize_Default() argument
630 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESMultiblockSetBlockSize_Default()
633 …PetscCheck(bs >= 1, PetscObjectComm((PetscObject)snes), PETSC_ERR_ARG_OUTOFRANGE, "Blocksize must … in SNESMultiblockSetBlockSize_Default()
634 …PetscCheck(mb->bs <= 0 || mb->bs == bs, PetscObjectComm((PetscObject)snes), PETSC_ERR_ARG_WRONGSTA… in SNESMultiblockSetBlockSize_Default()
639 static PetscErrorCode SNESMultiblockGetSubSNES_Default(SNES snes, PetscInt *n, SNES **subsnes) in SNESMultiblockGetSubSNES_Default() argument
641 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESMultiblockGetSubSNES_Default()
648 (*subsnes)[cnt++] = blocks->snes; in SNESMultiblockGetSubSNES_Default()
657 static PetscErrorCode SNESMultiblockSetType_Default(SNES snes, PCCompositeType type) in SNESMultiblockSetType_Default() argument
659 SNES_Multiblock *mb = (SNES_Multiblock *)snes->data; in SNESMultiblockSetType_Default()
665 …SETERRQ(PetscObjectComm((PetscObject)snes), PETSC_ERR_SUP, "The Schur composite type is not yet su… in SNESMultiblockSetType_Default()
667 snes->ops->solve = SNESSolve_Multiblock_Schur; in SNESMultiblockSetType_Default()
668 snes->ops->view = SNESView_Multiblock_Schur; in SNESMultiblockSetType_Default()
670 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESMultiblockGetSubSNES_C", SNESMultiblo… in SNESMultiblockSetType_Default()
671 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESMultiblockSchurPrecondition_C", SNESM… in SNESMultiblockSetType_Default()
674 snes->ops->solve = SNESSolve_Multiblock; in SNESMultiblockSetType_Default()
675 snes->ops->view = SNESView_Multiblock; in SNESMultiblockSetType_Default()
677 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESMultiblockGetSubSNES_C", SNESMultiblo… in SNESMultiblockSetType_Default()
678 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESMultiblockSchurPrecondition_C", NULL)… in SNESMultiblockSetType_Default()
710 PetscErrorCode SNESMultiblockSetFields(SNES snes, const char name[], PetscInt n, const PetscInt *fi… in SNESMultiblockSetFields() argument
713 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESMultiblockSetFields()
715 …PetscCheck(n >= 1, PetscObjectComm((PetscObject)snes), PETSC_ERR_ARG_OUTOFRANGE, "Provided number … in SNESMultiblockSetFields()
717 …PetscTryMethod(snes, "SNESMultiblockSetFields_C", (SNES, const char[], PetscInt, const PetscInt *)… in SNESMultiblockSetFields()
741 PetscErrorCode SNESMultiblockSetIS(SNES snes, const char name[], IS is) in SNESMultiblockSetIS() argument
744 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESMultiblockSetIS()
747 PetscTryMethod(snes, "SNESMultiblockSetIS_C", (SNES, const char[], IS), (snes, name, is)); in SNESMultiblockSetIS()
771 PetscErrorCode SNESMultiblockSetType(SNES snes, PCCompositeType type) in SNESMultiblockSetType() argument
774 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESMultiblockSetType()
775 PetscTryMethod(snes, "SNESMultiblockSetType_C", (SNES, PCCompositeType), (snes, type)); in SNESMultiblockSetType()
792 PetscErrorCode SNESMultiblockSetBlockSize(SNES snes, PetscInt bs) in SNESMultiblockSetBlockSize() argument
795 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESMultiblockSetBlockSize()
796 PetscValidLogicalCollectiveInt(snes, bs, 2); in SNESMultiblockSetBlockSize()
797 PetscTryMethod(snes, "SNESMultiblockSetBlockSize_C", (SNES, PetscInt), (snes, bs)); in SNESMultiblockSetBlockSize()
823 PetscErrorCode SNESMultiblockGetSubSNES(SNES snes, PetscInt *n, SNES *subsnes[]) in SNESMultiblockGetSubSNES() argument
826 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESMultiblockGetSubSNES()
828 …PetscUseMethod(snes, "SNESMultiblockGetSubSNES_C", (SNES, PetscInt *, SNES **), (snes, n, subsnes)… in SNESMultiblockGetSubSNES()
845 PETSC_EXTERN PetscErrorCode SNESCreate_Multiblock(SNES snes) in SNESCreate_Multiblock() argument
850 snes->ops->destroy = SNESDestroy_Multiblock; in SNESCreate_Multiblock()
851 snes->ops->setup = SNESSetUp_Multiblock; in SNESCreate_Multiblock()
852 snes->ops->setfromoptions = SNESSetFromOptions_Multiblock; in SNESCreate_Multiblock()
853 snes->ops->view = SNESView_Multiblock; in SNESCreate_Multiblock()
854 snes->ops->solve = SNESSolve_Multiblock; in SNESCreate_Multiblock()
855 snes->ops->reset = SNESReset_Multiblock; in SNESCreate_Multiblock()
857 snes->usesksp = PETSC_FALSE; in SNESCreate_Multiblock()
858 snes->usesnpc = PETSC_FALSE; in SNESCreate_Multiblock()
860 snes->alwayscomputesfinalresidual = PETSC_TRUE; in SNESCreate_Multiblock()
862 PetscCall(SNESParametersInitialize(snes)); in SNESCreate_Multiblock()
865 snes->data = (void *)mb; in SNESCreate_Multiblock()
872 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESMultiblockSetFields_C", SNESMultibloc… in SNESCreate_Multiblock()
873 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESMultiblockSetIS_C", SNESMultiblockSet… in SNESCreate_Multiblock()
874 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESMultiblockSetType_C", SNESMultiblockS… in SNESCreate_Multiblock()
875 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESMultiblockSetBlockSize_C", SNESMultib… in SNESCreate_Multiblock()
876 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESMultiblockGetSubSNES_C", SNESMultiblo… in SNESCreate_Multiblock()