Lines Matching refs:snes
46 static PetscErrorCode SNESNEWTONLSCheckLocalMin_Private(SNES snes, Mat A, Vec F, PetscReal fnorm, P… in SNESNEWTONLSCheckLocalMin_Private() argument
55 PetscCall(SNESGetObjective(snes, &objective, NULL)); in SNESNEWTONLSCheckLocalMin_Private()
63 …PetscCall(PetscInfo(snes, "|| J^T F|| %14.12e near zero implies found a local minimum\n", (double)… in SNESNEWTONLSCheckLocalMin_Private()
77 …PetscCall(PetscInfo(snes, "(F^T J random)/(|| F ||*||random|| %14.12e near zero implies found a lo… in SNESNEWTONLSCheckLocalMin_Private()
88 static PetscErrorCode SNESNEWTONLSCheckResidual_Private(SNES snes, Mat A, Vec F, Vec X) in SNESNEWTONLSCheckResidual_Private() argument
96 PetscCall(SNESGetObjective(snes, &objective, NULL)); in SNESNEWTONLSCheckResidual_Private()
109 …if (a1 != 0.0) PetscCall(PetscInfo(snes, "||J^T(F-Ax)||/||F-AX|| %14.12e near zero implies inconsi… in SNESNEWTONLSCheckResidual_Private()
125 static PetscErrorCode SNESSolve_NEWTONLS(SNES snes) in SNESSolve_NEWTONLS() argument
139 …snes->xl && !snes->xu && !snes->ops->computevariablebounds, PetscObjectComm((PetscObject)snes), PE… in SNESSolve_NEWTONLS()
141 snes->numFailures = 0; in SNESSolve_NEWTONLS()
142 snes->numLinearSolveFailures = 0; in SNESSolve_NEWTONLS()
143 snes->reason = SNES_CONVERGED_ITERATING; in SNESSolve_NEWTONLS()
145 maxits = snes->max_its; /* maximum number of iterations */ in SNESSolve_NEWTONLS()
146 X = snes->vec_sol; /* solution vector */ in SNESSolve_NEWTONLS()
147 F = snes->vec_func; /* residual vector */ in SNESSolve_NEWTONLS()
148 Y = snes->vec_sol_update; /* newton step */ in SNESSolve_NEWTONLS()
150 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_NEWTONLS()
151 snes->iter = 0; in SNESSolve_NEWTONLS()
152 snes->norm = 0.0; in SNESSolve_NEWTONLS()
153 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_NEWTONLS()
154 PetscCall(SNESGetLineSearch(snes, &linesearch)); in SNESSolve_NEWTONLS()
157 if (snes->npc && snes->npcside == PC_LEFT && snes->functype == SNES_FUNCTION_PRECONDITIONED) { in SNESSolve_NEWTONLS()
158 PetscCall(SNESApplyNPC(snes, X, NULL, F)); in SNESSolve_NEWTONLS()
159 PetscCall(SNESGetConvergedReason(snes->npc, &reason)); in SNESSolve_NEWTONLS()
161 PetscCall(SNESSetConvergedReason(snes, SNES_DIVERGED_INNER)); in SNESSolve_NEWTONLS()
168 if (!snes->vec_func_init_set) PetscCall(SNESComputeFunction(snes, X, F)); in SNESSolve_NEWTONLS()
169 else snes->vec_func_init_set = PETSC_FALSE; in SNESSolve_NEWTONLS()
173 SNESCheckFunctionDomainError(snes, fnorm); in SNESSolve_NEWTONLS()
174 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_NEWTONLS()
175 snes->norm = fnorm; in SNESSolve_NEWTONLS()
176 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_NEWTONLS()
177 PetscCall(SNESLogConvergenceHistory(snes, fnorm, 0)); in SNESSolve_NEWTONLS()
180 PetscCall(SNESConverged(snes, 0, 0.0, 0.0, fnorm)); in SNESSolve_NEWTONLS()
181 PetscCall(SNESMonitor(snes, 0, fnorm)); in SNESSolve_NEWTONLS()
182 if (snes->reason) PetscFunctionReturn(PETSC_SUCCESS); in SNESSolve_NEWTONLS()
185 PetscCall(KSPGetPC(snes->ksp, &pc)); in SNESSolve_NEWTONLS()
190 PetscTryTypeMethod(snes, update, snes->iter); in SNESSolve_NEWTONLS()
191 …PetscCall(VecNorm(snes->vec_func, NORM_2, &fnorm)); /* no-op unless update() function changed f() … in SNESSolve_NEWTONLS()
194 if (snes->npc) { in SNESSolve_NEWTONLS()
195 if (snes->npcside == PC_RIGHT) { in SNESSolve_NEWTONLS()
196 PetscCall(SNESSetInitialFunction(snes->npc, F)); in SNESSolve_NEWTONLS()
197 PetscCall(PetscLogEventBegin(SNES_NPCSolve, snes->npc, X, snes->vec_rhs, 0)); in SNESSolve_NEWTONLS()
198 PetscCall(SNESSolve(snes->npc, snes->vec_rhs, X)); in SNESSolve_NEWTONLS()
199 PetscCall(PetscLogEventEnd(SNES_NPCSolve, snes->npc, X, snes->vec_rhs, 0)); in SNESSolve_NEWTONLS()
200 PetscCall(SNESGetConvergedReason(snes->npc, &reason)); in SNESSolve_NEWTONLS()
202 PetscCall(SNESSetConvergedReason(snes, SNES_DIVERGED_INNER)); in SNESSolve_NEWTONLS()
205 PetscCall(SNESGetNPCFunction(snes, F, &fnorm)); in SNESSolve_NEWTONLS()
206 } else if (snes->npcside == PC_LEFT && snes->functype == SNES_FUNCTION_UNPRECONDITIONED) { in SNESSolve_NEWTONLS()
207 PetscCall(SNESApplyNPC(snes, X, F, F)); in SNESSolve_NEWTONLS()
208 PetscCall(SNESGetConvergedReason(snes->npc, &reason)); in SNESSolve_NEWTONLS()
210 PetscCall(SNESSetConvergedReason(snes, SNES_DIVERGED_INNER)); in SNESSolve_NEWTONLS()
217 PetscCall(SNESComputeJacobian(snes, X, snes->jacobian, snes->jacobian_pre)); in SNESSolve_NEWTONLS()
218 SNESCheckJacobianDomainError(snes); in SNESSolve_NEWTONLS()
219 PetscCall(KSPSetOperators(snes->ksp, snes->jacobian, snes->jacobian_pre)); in SNESSolve_NEWTONLS()
220 PetscCall(KSPSolve(snes->ksp, F, Y)); in SNESSolve_NEWTONLS()
221 SNESCheckKSPSolve(snes); in SNESSolve_NEWTONLS()
222 PetscCall(KSPGetIterationNumber(snes->ksp, &lits)); in SNESSolve_NEWTONLS()
223 …PetscCall(PetscInfo(snes, "iter=%" PetscInt_FMT ", linear solve iterations=%" PetscInt_FMT "\n", s… in SNESSolve_NEWTONLS()
225 if (PetscLogPrintInfo) PetscCall(SNESNEWTONLSCheckResidual_Private(snes, snes->jacobian, F, Y)); in SNESSolve_NEWTONLS()
235 if (snes->reason) break; in SNESSolve_NEWTONLS()
237 …PetscCall(PetscInfo(snes, "fnorm=%18.16e, gnorm=%18.16e, ynorm=%18.16e, lsreason=%d\n", (double)gn… in SNESSolve_NEWTONLS()
238 SNESCheckFunctionDomainError(snes, fnorm); in SNESSolve_NEWTONLS()
241 if (snes->stol * xnorm > ynorm) { in SNESSolve_NEWTONLS()
242 snes->reason = SNES_CONVERGED_SNORM_RELATIVE; in SNESSolve_NEWTONLS()
245 snes->reason = SNES_DIVERGED_FUNCTION_DOMAIN; in SNESSolve_NEWTONLS()
248 snes->reason = SNES_DIVERGED_FUNCTION_NANORINF; in SNESSolve_NEWTONLS()
251 snes->reason = SNES_DIVERGED_OBJECTIVE_DOMAIN; in SNESSolve_NEWTONLS()
254 snes->reason = SNES_DIVERGED_JACOBIAN_DOMAIN; in SNESSolve_NEWTONLS()
256 } else if (++snes->numFailures >= snes->maxFailures) { in SNESSolve_NEWTONLS()
259 snes->reason = SNES_DIVERGED_LINE_SEARCH; in SNESSolve_NEWTONLS()
260 PetscCall(SNESNEWTONLSCheckLocalMin_Private(snes, snes->jacobian, F, fnorm, &ismin)); in SNESSolve_NEWTONLS()
261 if (ismin) snes->reason = SNES_DIVERGED_LOCAL_MIN; in SNESSolve_NEWTONLS()
266 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_NEWTONLS()
267 snes->iter = i + 1; in SNESSolve_NEWTONLS()
268 snes->norm = fnorm; in SNESSolve_NEWTONLS()
269 snes->ynorm = ynorm; in SNESSolve_NEWTONLS()
270 snes->xnorm = xnorm; in SNESSolve_NEWTONLS()
271 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_NEWTONLS()
272 PetscCall(SNESLogConvergenceHistory(snes, snes->norm, lits)); in SNESSolve_NEWTONLS()
274 PetscCall(SNESConverged(snes, snes->iter, xnorm, ynorm, fnorm)); in SNESSolve_NEWTONLS()
275 PetscCall(SNESMonitor(snes, snes->iter, snes->norm)); in SNESSolve_NEWTONLS()
276 if (snes->reason) break; in SNESSolve_NEWTONLS()
292 static PetscErrorCode SNESSetUp_NEWTONLS(SNES snes) in SNESSetUp_NEWTONLS() argument
295 PetscCall(SNESSetUpMatrices(snes)); in SNESSetUp_NEWTONLS()
296 …if (snes->npcside == PC_LEFT && snes->functype == SNES_FUNCTION_DEFAULT) snes->functype = SNES_FUN… in SNESSetUp_NEWTONLS()
309 static PetscErrorCode SNESDestroy_NEWTONLS(SNES snes) in SNESDestroy_NEWTONLS() argument
312 PetscCall(PetscFree(snes->data)); in SNESDestroy_NEWTONLS()
337 PETSC_EXTERN PetscErrorCode SNESCreate_NEWTONLS(SNES snes) in SNESCreate_NEWTONLS() argument
343 snes->ops->setup = SNESSetUp_NEWTONLS; in SNESCreate_NEWTONLS()
344 snes->ops->solve = SNESSolve_NEWTONLS; in SNESCreate_NEWTONLS()
345 snes->ops->destroy = SNESDestroy_NEWTONLS; in SNESCreate_NEWTONLS()
347 snes->npcside = PC_RIGHT; in SNESCreate_NEWTONLS()
348 snes->usesksp = PETSC_TRUE; in SNESCreate_NEWTONLS()
349 snes->usesnpc = PETSC_TRUE; in SNESCreate_NEWTONLS()
351 PetscCall(SNESGetLineSearch(snes, &linesearch)); in SNESCreate_NEWTONLS()
354 snes->alwayscomputesfinalresidual = PETSC_TRUE; in SNESCreate_NEWTONLS()
356 PetscCall(SNESParametersInitialize(snes)); in SNESCreate_NEWTONLS()
359 snes->data = (void *)neP; in SNESCreate_NEWTONLS()