Lines Matching refs:snes
11 SNES snes; member
47 static PetscErrorCode SNESCompositeApply_Multiplicative(SNES snes, Vec X, Vec B, Vec F, PetscReal *… in SNESCompositeApply_Multiplicative() argument
49 SNES_Composite *jac = (SNES_Composite *)snes->data; in SNESCompositeApply_Multiplicative()
55 …PetscCheck(next, PetscObjectComm((PetscObject)snes), PETSC_ERR_ARG_WRONGSTATE, "No composite SNESe… in SNESCompositeApply_Multiplicative()
56 if (snes->normschedule == SNES_NORM_ALWAYS) PetscCall(SNESSetInitialFunction(next->snes, F)); in SNESCompositeApply_Multiplicative()
57 PetscCall(SNESSolve(next->snes, B, X)); in SNESCompositeApply_Multiplicative()
58 PetscCall(SNESGetConvergedReason(next->snes, &reason)); in SNESCompositeApply_Multiplicative()
61 if (jac->innerFailures >= snes->maxFailures) { in SNESCompositeApply_Multiplicative()
62 snes->reason = SNES_DIVERGED_INNER; in SNESCompositeApply_Multiplicative()
69 if (next->snes->npcside == PC_RIGHT && next->snes->normschedule != SNES_NORM_NONE) { in SNESCompositeApply_Multiplicative()
70 PetscCall(SNESGetFunction(next->snes, &FSub, NULL, NULL)); in SNESCompositeApply_Multiplicative()
72 PetscCall(SNESSetInitialFunction(next->snes, FSub)); in SNESCompositeApply_Multiplicative()
76 PetscCall(SNESSolve(next->snes, B, X)); in SNESCompositeApply_Multiplicative()
77 PetscCall(SNESGetConvergedReason(next->snes, &reason)); in SNESCompositeApply_Multiplicative()
80 if (jac->innerFailures >= snes->maxFailures) { in SNESCompositeApply_Multiplicative()
81 snes->reason = SNES_DIVERGED_INNER; in SNESCompositeApply_Multiplicative()
86 if (next->snes->npcside == PC_RIGHT) { in SNESCompositeApply_Multiplicative()
87 PetscCall(SNESGetFunction(next->snes, &FSub, NULL, NULL)); in SNESCompositeApply_Multiplicative()
90 if (snes->xl && snes->xu) { in SNESCompositeApply_Multiplicative()
91 PetscCall(SNESVIComputeInactiveSetFnorm(snes, F, X, fnorm)); in SNESCompositeApply_Multiplicative()
95 SNESCheckFunctionDomainError(snes, *fnorm); in SNESCompositeApply_Multiplicative()
97 } else if (snes->normschedule == SNES_NORM_ALWAYS) { in SNESCompositeApply_Multiplicative()
98 PetscCall(SNESComputeFunction(snes, X, F)); in SNESCompositeApply_Multiplicative()
100 if (snes->xl && snes->xu) { in SNESCompositeApply_Multiplicative()
101 PetscCall(SNESVIComputeInactiveSetFnorm(snes, F, X, fnorm)); in SNESCompositeApply_Multiplicative()
105 SNESCheckFunctionDomainError(snes, *fnorm); in SNESCompositeApply_Multiplicative()
111 static PetscErrorCode SNESCompositeApply_Additive(SNES snes, Vec X, Vec B, Vec F, PetscReal *fnorm) in SNESCompositeApply_Additive() argument
113 SNES_Composite *jac = (SNES_Composite *)snes->data; in SNESCompositeApply_Additive()
119 Y = snes->vec_sol_update; in SNESCompositeApply_Additive()
123 …PetscCheck(next, PetscObjectComm((PetscObject)snes), PETSC_ERR_ARG_WRONGSTATE, "No composite SNESe… in SNESCompositeApply_Additive()
124 if (snes->normschedule == SNES_NORM_ALWAYS) { in SNESCompositeApply_Additive()
125 PetscCall(SNESSetInitialFunction(next->snes, F)); in SNESCompositeApply_Additive()
128 PetscCall(SNESSetInitialFunction(next->snes, F)); in SNESCompositeApply_Additive()
133 PetscCall(SNESSolve(next->snes, B, Y)); in SNESCompositeApply_Additive()
134 PetscCall(SNESGetConvergedReason(next->snes, &reason)); in SNESCompositeApply_Additive()
137 if (jac->innerFailures >= snes->maxFailures) { in SNESCompositeApply_Additive()
138 snes->reason = SNES_DIVERGED_INNER; in SNESCompositeApply_Additive()
147 PetscCall(SNESSolve(next->snes, B, Y)); in SNESCompositeApply_Additive()
148 PetscCall(SNESGetConvergedReason(next->snes, &reason)); in SNESCompositeApply_Additive()
151 if (jac->innerFailures >= snes->maxFailures) { in SNESCompositeApply_Additive()
152 snes->reason = SNES_DIVERGED_INNER; in SNESCompositeApply_Additive()
159 if (snes->normschedule == SNES_NORM_ALWAYS) { in SNESCompositeApply_Additive()
160 PetscCall(SNESComputeFunction(snes, X, F)); in SNESCompositeApply_Additive()
162 if (snes->xl && snes->xu) { in SNESCompositeApply_Additive()
163 PetscCall(SNESVIComputeInactiveSetFnorm(snes, F, X, fnorm)); in SNESCompositeApply_Additive()
167 SNESCheckFunctionDomainError(snes, *fnorm); in SNESCompositeApply_Additive()
184 static PetscErrorCode SNESCompositeApply_AdditiveOptimal(SNES snes, Vec X, Vec B, Vec F, PetscReal … in SNESCompositeApply_AdditiveOptimal() argument
186 SNES_Composite *jac = (SNES_Composite *)snes->data; in SNESCompositeApply_AdditiveOptimal()
196 …PetscCheck(next, PetscObjectComm((PetscObject)snes), PETSC_ERR_ARG_WRONGSTATE, "No composite SNESe… in SNESCompositeApply_AdditiveOptimal()
198 if (snes->normschedule == SNES_NORM_ALWAYS) { in SNESCompositeApply_AdditiveOptimal()
200 PetscCall(SNESSetInitialFunction(next->snes, F)); in SNESCompositeApply_AdditiveOptimal()
203 PetscCall(SNESSetInitialFunction(next->snes, F)); in SNESCompositeApply_AdditiveOptimal()
210 PetscCall(SNESSolve(next->snes, B, Xes[i])); in SNESCompositeApply_AdditiveOptimal()
211 PetscCall(SNESGetConvergedReason(next->snes, &reason)); in SNESCompositeApply_AdditiveOptimal()
214 if (jac->innerFailures >= snes->maxFailures) { in SNESCompositeApply_AdditiveOptimal()
215 snes->reason = SNES_DIVERGED_INNER; in SNESCompositeApply_AdditiveOptimal()
223 PetscCall(SNESSolve(next->snes, B, Xes[i])); in SNESCompositeApply_AdditiveOptimal()
224 PetscCall(SNESGetConvergedReason(next->snes, &reason)); in SNESCompositeApply_AdditiveOptimal()
227 if (jac->innerFailures >= snes->maxFailures) { in SNESCompositeApply_AdditiveOptimal()
228 snes->reason = SNES_DIVERGED_INNER; in SNESCompositeApply_AdditiveOptimal()
268 …PetscCheck(jac->info >= 0, PetscObjectComm((PetscObject)snes), PETSC_ERR_LIB, "Bad argument to GEL… in SNESCompositeApply_AdditiveOptimal()
269 …PetscCheck(jac->info <= 0, PetscObjectComm((PetscObject)snes), PETSC_ERR_LIB, "SVD failed to conve… in SNESCompositeApply_AdditiveOptimal()
273 …PetscCheck(!snes->errorifnotconverged || !PetscIsInfOrNanScalar(jac->beta[i]), PetscObjectComm((Pe… in SNESCompositeApply_AdditiveOptimal()
274 PetscCall(PetscInfo(snes, "%" PetscInt_FMT ": %g\n", i, (double)PetscRealPart(jac->beta[i]))); in SNESCompositeApply_AdditiveOptimal()
280 PetscCall(SNESComputeFunction(snes, X, F)); in SNESCompositeApply_AdditiveOptimal()
282 if (snes->xl && snes->xu) { in SNESCompositeApply_AdditiveOptimal()
283 PetscCall(SNESVIComputeInactiveSetFnorm(snes, F, X, fnorm)); in SNESCompositeApply_AdditiveOptimal()
287 SNESCheckFunctionDomainError(snes, *fnorm); in SNESCompositeApply_AdditiveOptimal()
308 static PetscErrorCode SNESSetUp_Composite(SNES snes) in SNESSetUp_Composite() argument
311 SNES_Composite *jac = (SNES_Composite *)snes->data; in SNESSetUp_Composite()
317 PetscCall(SNESGetDM(snes, &dm)); in SNESSetUp_Composite()
319 if (snes->ops->computevariablebounds) { in SNESSetUp_Composite()
321 if (!snes->xl) PetscCall(VecDuplicate(snes->vec_sol, &snes->xl)); in SNESSetUp_Composite()
322 if (!snes->xu) PetscCall(VecDuplicate(snes->vec_sol, &snes->xu)); in SNESSetUp_Composite()
323 PetscUseTypeMethod(snes, computevariablebounds, snes->xl, snes->xu); in SNESSetUp_Composite()
328 PetscCall(SNESSetDM(next->snes, dm)); in SNESSetUp_Composite()
329 PetscCall(SNESSetJacobian(next->snes, snes->jacobian, snes->jacobian_pre, NULL, NULL)); in SNESSetUp_Composite()
330 PetscCall(SNESSetApplicationContext(next->snes, snes->ctx)); in SNESSetUp_Composite()
331 if (snes->xl && snes->xu) { in SNESSetUp_Composite()
332 if (snes->ops->computevariablebounds) { in SNESSetUp_Composite()
333 PetscCall(SNESVISetComputeVariableBounds(next->snes, snes->ops->computevariablebounds)); in SNESSetUp_Composite()
335 PetscCall(SNESVISetVariableBounds(next->snes, snes->xl, snes->xu)); in SNESSetUp_Composite()
342 PetscCall(SNESGetFunction(snes, &F, NULL, NULL)); in SNESSetUp_Composite()
350 PetscCall(SNESGetFunction(next->snes, &F, NULL, NULL)); in SNESSetUp_Composite()
372 static PetscErrorCode SNESReset_Composite(SNES snes) in SNESReset_Composite() argument
374 SNES_Composite *jac = (SNES_Composite *)snes->data; in SNESReset_Composite()
379 PetscCall(SNESReset(next->snes)); in SNESReset_Composite()
392 static PetscErrorCode SNESDestroy_Composite(SNES snes) in SNESDestroy_Composite() argument
394 SNES_Composite *jac = (SNES_Composite *)snes->data; in SNESDestroy_Composite()
398 PetscCall(SNESReset_Composite(snes)); in SNESDestroy_Composite()
400 PetscCall(SNESDestroy(&next->snes)); in SNESDestroy_Composite()
405 PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESCompositeSetType_C", NULL)); in SNESDestroy_Composite()
406 PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESCompositeAddSNES_C", NULL)); in SNESDestroy_Composite()
407 PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESCompositeGetSNES_C", NULL)); in SNESDestroy_Composite()
408 PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESCompositeSetDamping_C", NULL)); in SNESDestroy_Composite()
409 PetscCall(PetscFree(snes->data)); in SNESDestroy_Composite()
413 static PetscErrorCode SNESSetFromOptions_Composite(SNES snes, PetscOptionItems PetscOptionsObject) in SNESSetFromOptions_Composite() argument
415 SNES_Composite *jac = (SNES_Composite *)snes->data; in SNESSetFromOptions_Composite()
425 if (flg) PetscCall(SNESCompositeSetType(snes, jac->type)); in SNESSetFromOptions_Composite()
429 PetscCall(SNESCompositeAddSNES(snes, sneses[i])); in SNESSetFromOptions_Composite()
435 for (i = 0; i < nmax; i++) PetscCall(SNESCompositeSetDamping(snes, i, dmps[i])); in SNESSetFromOptions_Composite()
443 PetscCall(SNESSetFromOptions(next->snes)); in SNESSetFromOptions_Composite()
449 static PetscErrorCode SNESView_Composite(SNES snes, PetscViewer viewer) in SNESView_Composite() argument
451 SNES_Composite *jac = (SNES_Composite *)snes->data; in SNESView_Composite()
464 PetscCall(SNESView(next->snes, viewer)); in SNESView_Composite()
474 static PetscErrorCode SNESCompositeSetType_Composite(SNES snes, SNESCompositeType type) in SNESCompositeSetType_Composite() argument
476 SNES_Composite *jac = (SNES_Composite *)snes->data; in SNESCompositeSetType_Composite()
483 static PetscErrorCode SNESCompositeAddSNES_Composite(SNES snes, SNESType type) in SNESCompositeAddSNES_Composite() argument
495 PetscCall(SNESCreate(PetscObjectComm((PetscObject)snes), &ilink->snes)); in SNESCompositeAddSNES_Composite()
496 PetscCall(PetscObjectIncrementTabLevel((PetscObject)ilink->snes, (PetscObject)snes, 1)); in SNESCompositeAddSNES_Composite()
497 PetscCall(SNESGetDM(snes, &dm)); in SNESCompositeAddSNES_Composite()
498 PetscCall(SNESSetDM(ilink->snes, dm)); in SNESCompositeAddSNES_Composite()
499 …PetscCall(SNESSetTolerances(ilink->snes, snes->abstol, snes->rtol, snes->stol, 1, snes->max_funcs)… in SNESCompositeAddSNES_Composite()
500 PetscCall(PetscObjectCopyFortranFunctionPointers((PetscObject)snes, (PetscObject)ilink->snes)); in SNESCompositeAddSNES_Composite()
501 jac = (SNES_Composite *)snes->data; in SNESCompositeAddSNES_Composite()
515 PetscCall(SNESGetOptionsPrefix(snes, &prefix)); in SNESCompositeAddSNES_Composite()
516 PetscCall(SNESSetOptionsPrefix(ilink->snes, prefix)); in SNESCompositeAddSNES_Composite()
518 PetscCall(SNESAppendOptionsPrefix(ilink->snes, newprefix)); in SNESCompositeAddSNES_Composite()
519 PetscCall(SNESSetType(ilink->snes, type)); in SNESCompositeAddSNES_Composite()
520 PetscCall(SNESSetNormSchedule(ilink->snes, SNES_NORM_FINAL_ONLY)); in SNESCompositeAddSNES_Composite()
527 static PetscErrorCode SNESCompositeGetSNES_Composite(SNES snes, PetscInt n, SNES *subsnes) in SNESCompositeGetSNES_Composite() argument
534 jac = (SNES_Composite *)snes->data; in SNESCompositeGetSNES_Composite()
537 …PetscCheck(next->next, PetscObjectComm((PetscObject)snes), PETSC_ERR_ARG_INCOMP, "Not enough SNESe… in SNESCompositeGetSNES_Composite()
540 *subsnes = next->snes; in SNESCompositeGetSNES_Composite()
561 PetscErrorCode SNESCompositeSetType(SNES snes, SNESCompositeType type) in SNESCompositeSetType() argument
564 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESCompositeSetType()
565 PetscValidLogicalCollectiveEnum(snes, type, 2); in SNESCompositeSetType()
566 PetscTryMethod(snes, "SNESCompositeSetType_C", (SNES, SNESCompositeType), (snes, type)); in SNESCompositeSetType()
583 PetscErrorCode SNESCompositeAddSNES(SNES snes, SNESType type) in SNESCompositeAddSNES() argument
586 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESCompositeAddSNES()
587 PetscTryMethod(snes, "SNESCompositeAddSNES_C", (SNES, SNESType), (snes, type)); in SNESCompositeAddSNES()
607 PetscErrorCode SNESCompositeGetSNES(SNES snes, PetscInt n, SNES *subsnes) in SNESCompositeGetSNES() argument
610 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESCompositeGetSNES()
612 PetscUseMethod(snes, "SNESCompositeGetSNES_C", (SNES, PetscInt, SNES *), (snes, n, subsnes)); in SNESCompositeGetSNES()
631 PetscErrorCode SNESCompositeGetNumber(SNES snes, PetscInt *n) in SNESCompositeGetNumber() argument
637 jac = (SNES_Composite *)snes->data; in SNESCompositeGetNumber()
648 static PetscErrorCode SNESCompositeSetDamping_Composite(SNES snes, PetscInt n, PetscReal dmp) in SNESCompositeSetDamping_Composite() argument
655 jac = (SNES_Composite *)snes->data; in SNESCompositeSetDamping_Composite()
658 …PetscCheck(next->next, PetscObjectComm((PetscObject)snes), PETSC_ERR_ARG_INCOMP, "Not enough SNESe… in SNESCompositeSetDamping_Composite()
680 PetscErrorCode SNESCompositeSetDamping(SNES snes, PetscInt n, PetscReal dmp) in SNESCompositeSetDamping() argument
683 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESCompositeSetDamping()
684 PetscUseMethod(snes, "SNESCompositeSetDamping_C", (SNES, PetscInt, PetscReal), (snes, n, dmp)); in SNESCompositeSetDamping()
688 static PetscErrorCode SNESSolve_Composite(SNES snes) in SNESSolve_Composite() argument
694 SNES_Composite *comp = (SNES_Composite *)snes->data; in SNESSolve_Composite()
697 X = snes->vec_sol; in SNESSolve_Composite()
698 F = snes->vec_func; in SNESSolve_Composite()
699 B = snes->vec_rhs; in SNESSolve_Composite()
700 Y = snes->vec_sol_update; in SNESSolve_Composite()
702 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_Composite()
703 snes->iter = 0; in SNESSolve_Composite()
704 snes->norm = 0.; in SNESSolve_Composite()
706 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_Composite()
707 snes->reason = SNES_CONVERGED_ITERATING; in SNESSolve_Composite()
708 PetscCall(SNESGetNormSchedule(snes, &normtype)); in SNESSolve_Composite()
710 if (!snes->vec_func_init_set) PetscCall(SNESComputeFunction(snes, X, F)); in SNESSolve_Composite()
711 else snes->vec_func_init_set = PETSC_FALSE; in SNESSolve_Composite()
713 if (snes->xl && snes->xu) { in SNESSolve_Composite()
714 PetscCall(SNESVIComputeInactiveSetFnorm(snes, F, X, &fnorm)); in SNESSolve_Composite()
718 SNESCheckFunctionDomainError(snes, fnorm); in SNESSolve_Composite()
719 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_Composite()
720 snes->iter = 0; in SNESSolve_Composite()
721 snes->norm = fnorm; in SNESSolve_Composite()
722 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_Composite()
723 PetscCall(SNESLogConvergenceHistory(snes, snes->norm, 0)); in SNESSolve_Composite()
726 PetscCall(SNESConverged(snes, 0, 0.0, 0.0, fnorm)); in SNESSolve_Composite()
727 PetscCall(SNESMonitor(snes, 0, snes->norm)); in SNESSolve_Composite()
728 if (snes->reason) PetscFunctionReturn(PETSC_SUCCESS); in SNESSolve_Composite()
730 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_Composite()
731 PetscCall(SNESLogConvergenceHistory(snes, snes->norm, 0)); in SNESSolve_Composite()
732 PetscCall(SNESMonitor(snes, 0, snes->norm)); in SNESSolve_Composite()
735 for (i = 0; i < snes->max_its; i++) { in SNESSolve_Composite()
737 PetscTryTypeMethod(snes, update, snes->iter); in SNESSolve_Composite()
744 PetscCall(SNESCompositeApply_Additive(snes, X, B, F, &fnorm)); in SNESSolve_Composite()
746 PetscCall(SNESCompositeApply_Multiplicative(snes, X, B, F, &fnorm)); in SNESSolve_Composite()
748 PetscCall(SNESCompositeApply_AdditiveOptimal(snes, X, B, F, &fnorm)); in SNESSolve_Composite()
749 …} else SETERRQ(PetscObjectComm((PetscObject)snes), PETSC_ERR_ARG_WRONGSTATE, "Unsupported SNESComp… in SNESSolve_Composite()
750 if (snes->reason < 0) break; in SNESSolve_Composite()
755 …if ((i == snes->max_its - 1) && (normtype == SNES_NORM_INITIAL_FINAL_ONLY || normtype == SNES_NORM… in SNESSolve_Composite()
756 PetscCall(SNESComputeFunction(snes, X, F)); in SNESSolve_Composite()
758 if (snes->xl && snes->xu) { in SNESSolve_Composite()
761 PetscCall(SNESVIComputeInactiveSetFnorm(snes, F, X, &fnorm)); in SNESSolve_Composite()
773 SNESCheckFunctionDomainError(snes, fnorm); in SNESSolve_Composite()
781 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_Composite()
782 snes->iter = i + 1; in SNESSolve_Composite()
783 snes->norm = fnorm; in SNESSolve_Composite()
784 snes->xnorm = xnorm; in SNESSolve_Composite()
785 snes->ynorm = snorm; in SNESSolve_Composite()
786 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_Composite()
787 PetscCall(SNESLogConvergenceHistory(snes, snes->norm, 0)); in SNESSolve_Composite()
789 PetscCall(SNESConverged(snes, snes->iter, xnorm, snorm, fnorm)); in SNESSolve_Composite()
790 PetscCall(SNESMonitor(snes, snes->iter, snes->norm)); in SNESSolve_Composite()
791 if (snes->reason) break; in SNESSolve_Composite()
810 PETSC_EXTERN PetscErrorCode SNESCreate_Composite(SNES snes) in SNESCreate_Composite() argument
817 snes->ops->solve = SNESSolve_Composite; in SNESCreate_Composite()
818 snes->ops->setup = SNESSetUp_Composite; in SNESCreate_Composite()
819 snes->ops->reset = SNESReset_Composite; in SNESCreate_Composite()
820 snes->ops->destroy = SNESDestroy_Composite; in SNESCreate_Composite()
821 snes->ops->setfromoptions = SNESSetFromOptions_Composite; in SNESCreate_Composite()
822 snes->ops->view = SNESView_Composite; in SNESCreate_Composite()
824 snes->usesksp = PETSC_FALSE; in SNESCreate_Composite()
826 snes->alwayscomputesfinalresidual = PETSC_FALSE; in SNESCreate_Composite()
828 PetscCall(SNESParametersInitialize(snes)); in SNESCreate_Composite()
830 snes->data = (void *)jac; in SNESCreate_Composite()
846 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESCompositeSetType_C", SNESCompositeSet… in SNESCreate_Composite()
847 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESCompositeAddSNES_C", SNESCompositeAdd… in SNESCreate_Composite()
848 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESCompositeGetSNES_C", SNESCompositeGet… in SNESCreate_Composite()
849 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESCompositeSetDamping_C", SNESComposite… in SNESCreate_Composite()