Lines Matching refs:snes
21 static PetscErrorCode SNESQNGetMatrix_Private(SNES snes, Mat *B) in SNESQNGetMatrix_Private() argument
23 SNES_QN *qn = (SNES_QN *)snes->data; in SNESQNGetMatrix_Private()
28 PetscCall(MatCreate(PetscObjectComm((PetscObject)snes), &qn->B)); in SNESQNGetMatrix_Private()
29 PetscCall(SNESGetOptionsPrefix(snes, &optionsprefix)); in SNESQNGetMatrix_Private()
62 static PetscErrorCode SNESSolve_QN(SNES snes) in SNESSolve_QN() argument
64 SNES_QN *qn = (SNES_QN *)snes->data; in SNESSolve_QN()
78 …snes->xl && !snes->xu && !snes->ops->computevariablebounds, PetscObjectComm((PetscObject)snes), PE… in SNESSolve_QN()
81 F = snes->vec_func; /* residual vector */ in SNESSolve_QN()
82 Y = snes->vec_sol_update; /* search direction generated by J^-1D*/ in SNESSolve_QN()
83 X = snes->vec_sol; /* solution vector */ in SNESSolve_QN()
86 W = snes->work[0]; in SNESSolve_QN()
87 D = snes->work[1]; in SNESSolve_QN()
88 Dold = snes->work[2]; in SNESSolve_QN()
90 snes->reason = SNES_CONVERGED_ITERATING; in SNESSolve_QN()
92 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_QN()
93 snes->iter = 0; in SNESSolve_QN()
94 snes->norm = 0.; in SNESSolve_QN()
95 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_QN()
97 if (snes->npc && snes->npcside == PC_LEFT && snes->functype == SNES_FUNCTION_PRECONDITIONED) { in SNESSolve_QN()
100 PetscCall(SNESApplyNPC(snes, X, NULL, F)); in SNESSolve_QN()
101 PetscCall(SNESGetConvergedReason(snes->npc, &reason)); in SNESSolve_QN()
103 snes->reason = SNES_DIVERGED_INNER; in SNESSolve_QN()
107 if (!snes->vec_func_init_set) PetscCall(SNESComputeFunction(snes, X, F)); in SNESSolve_QN()
108 else snes->vec_func_init_set = PETSC_FALSE; in SNESSolve_QN()
111 SNESCheckFunctionDomainError(snes, fnorm); in SNESSolve_QN()
113 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_QN()
114 snes->norm = fnorm; in SNESSolve_QN()
115 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_QN()
116 PetscCall(SNESLogConvergenceHistory(snes, fnorm, 0)); in SNESSolve_QN()
117 PetscCall(SNESMonitor(snes, 0, fnorm)); in SNESSolve_QN()
120 PetscCall(SNESConverged(snes, 0, 0.0, 0.0, fnorm)); in SNESSolve_QN()
121 if (snes->reason) PetscFunctionReturn(PETSC_SUCCESS); in SNESSolve_QN()
124 for (i = 0, i_r = 0; i < snes->max_its; i++, i_r++) { in SNESSolve_QN()
128 PetscTryTypeMethod(snes, update, snes->iter); in SNESSolve_QN()
130 if (snes->npc) { in SNESSolve_QN()
131 if (snes->npcside == PC_LEFT && snes->functype == SNES_FUNCTION_UNPRECONDITIONED) { in SNESSolve_QN()
132 PetscCall(SNESApplyNPC(snes, X, F, D)); in SNESSolve_QN()
133 PetscCall(SNESGetConvergedReason(snes->npc, &reason)); in SNESSolve_QN()
135 snes->reason = SNES_DIVERGED_INNER; in SNESSolve_QN()
138 } else if (snes->npcside == PC_RIGHT) { in SNESSolve_QN()
139 PetscCall(PetscLogEventBegin(SNES_NPCSolve, snes->npc, X, 0, 0)); in SNESSolve_QN()
140 PetscCall(SNESSolve(snes->npc, snes->vec_rhs, X)); in SNESSolve_QN()
141 PetscCall(PetscLogEventEnd(SNES_NPCSolve, snes->npc, X, 0, 0)); in SNESSolve_QN()
142 PetscCall(SNESGetConvergedReason(snes->npc, &reason)); in SNESSolve_QN()
144 snes->reason = SNES_DIVERGED_INNER; in SNESSolve_QN()
147 PetscCall(SNESGetNPCFunction(snes, F, &fnorm)); in SNESSolve_QN()
158 PetscCall(SNESComputeJacobian(snes, X, snes->jacobian, snes->jacobian_pre)); in SNESSolve_QN()
159 SNESCheckJacobianDomainError(snes); in SNESSolve_QN()
160 PetscCall(KSPSetOperators(snes->ksp, snes->jacobian, snes->jacobian_pre)); in SNESSolve_QN()
161 PetscCall(MatLMVMSetJ0KSP(qn->B, snes->ksp)); in SNESSolve_QN()
181 PetscCall(SNESLineSearchApply(snes->linesearch, X, F, &fnorm, Y)); in SNESSolve_QN()
182 if (snes->reason) break; in SNESSolve_QN()
183 SNESCheckLineSearchFailure(snes); in SNESSolve_QN()
184 PetscCall(SNESLineSearchGetReason(snes->linesearch, &lsreason)); in SNESSolve_QN()
186 PetscCall(SNESLineSearchGetNorms(snes->linesearch, &xnorm, &fnorm, &ynorm)); in SNESSolve_QN()
188 …PetscCall(PetscInfo(snes, "fnorm=%18.16e, gnorm=%18.16e, ynorm=%18.16e, lssucceed=%d\n", (double)f… in SNESSolve_QN()
190 PetscCall(PetscObjectSAWsTakeAccess((PetscObject)snes)); in SNESSolve_QN()
191 snes->iter = i + 1; in SNESSolve_QN()
192 snes->norm = fnorm; in SNESSolve_QN()
193 snes->xnorm = xnorm; in SNESSolve_QN()
194 snes->ynorm = ynorm; in SNESSolve_QN()
195 PetscCall(PetscObjectSAWsGrantAccess((PetscObject)snes)); in SNESSolve_QN()
197 PetscCall(SNESLogConvergenceHistory(snes, snes->norm, snes->iter)); in SNESSolve_QN()
200 PetscCall(SNESConverged(snes, snes->iter, xnorm, ynorm, fnorm)); in SNESSolve_QN()
201 PetscCall(SNESMonitor(snes, snes->iter, snes->norm)); in SNESSolve_QN()
202 if (snes->reason) PetscFunctionReturn(PETSC_SUCCESS); in SNESSolve_QN()
204 if (snes->npc && snes->npcside == PC_LEFT && snes->functype == SNES_FUNCTION_UNPRECONDITIONED) { in SNESSolve_QN()
205 PetscCall(SNESApplyNPC(snes, X, F, D)); in SNESSolve_QN()
206 PetscCall(SNESGetConvergedReason(snes->npc, &reason)); in SNESSolve_QN()
208 snes->reason = SNES_DIVERGED_INNER; in SNESSolve_QN()
220 PetscCall(MatMult(snes->jacobian, Dold, W)); in SNESSolve_QN()
240 PetscCall(PetscViewerASCIIAddTab(qn->monitor, ((PetscObject)snes)->tablevel + 2)); in SNESSolve_QN()
246 PetscCall(PetscViewerASCIISubtractTab(qn->monitor, ((PetscObject)snes)->tablevel + 2)); in SNESSolve_QN()
255 static PetscErrorCode SNESSetUp_QN(SNES snes) in SNESSetUp_QN() argument
257 SNES_QN *qn = (SNES_QN *)snes->data; in SNESSetUp_QN()
262 if (!snes->vec_sol) { in SNESSetUp_QN()
263 PetscCall(SNESGetDM(snes, &dm)); in SNESSetUp_QN()
264 PetscCall(DMCreateGlobalVector(dm, &snes->vec_sol)); in SNESSetUp_QN()
266 PetscCall(SNESSetWorkVecs(snes, 3)); in SNESSetUp_QN()
267 PetscCall(SNESQNGetMatrix_Private(snes, &qn->B)); in SNESSetUp_QN()
269 if (qn->scale_type == SNES_QN_SCALE_JACOBIAN) PetscCall(SNESSetUpMatrices(snes)); in SNESSetUp_QN()
270 …if (snes->npcside == PC_LEFT && snes->functype == SNES_FUNCTION_DEFAULT) snes->functype = SNES_FUN… in SNESSetUp_QN()
288 PetscCall(SNESQNGetMatrix_Private(snes, &qn->B)); in SNESSetUp_QN()
289 PetscCall(VecGetLocalSize(snes->vec_sol, &n)); in SNESSetUp_QN()
290 PetscCall(VecGetSize(snes->vec_sol, &N)); in SNESSetUp_QN()
295 PetscCall(MatLMVMAllocate(qn->B, snes->vec_sol, snes->vec_func)); in SNESSetUp_QN()
299 static PetscErrorCode SNESReset_QN(SNES snes) in SNESReset_QN() argument
301 SNES_QN *qn = (SNES_QN *)snes->data; in SNESReset_QN()
308 static PetscErrorCode SNESDestroy_QN(SNES snes) in SNESDestroy_QN() argument
311 PetscCall(SNESReset_QN(snes)); in SNESDestroy_QN()
312 PetscCall(PetscFree(snes->data)); in SNESDestroy_QN()
313 PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESQNSetScaleType_C", NULL)); in SNESDestroy_QN()
314 PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESQNSetRestartType_C", NULL)); in SNESDestroy_QN()
315 PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESQNSetType_C", NULL)); in SNESDestroy_QN()
319 static PetscErrorCode SNESSetFromOptions_QN(SNES snes, PetscOptionItems PetscOptionsObject) in SNESSetFromOptions_QN() argument
321 SNES_QN *qn = (SNES_QN *)snes->data; in SNESSetFromOptions_QN()
334 if (flg) PetscCall(SNESQNSetScaleType(snes, stype)); in SNESSetFromOptions_QN()
337 if (flg) PetscCall(SNESQNSetRestartType(snes, rtype)); in SNESSetFromOptions_QN()
340 if (flg) PetscCall(SNESQNSetType(snes, qtype)); in SNESSetFromOptions_QN()
342 PetscCall(SNESQNGetMatrix_Private(snes, &qn->B)); in SNESSetFromOptions_QN()
344 if (!snes->linesearch) { in SNESSetFromOptions_QN()
345 PetscCall(SNESGetLineSearch(snes, &linesearch)); in SNESSetFromOptions_QN()
356 …if (qn->monflg) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)snes), &qn->monit… in SNESSetFromOptions_QN()
360 static PetscErrorCode SNESView_QN(SNES snes, PetscViewer viewer) in SNESView_QN() argument
362 SNES_QN *qn = (SNES_QN *)snes->data; in SNESView_QN()
393 PetscErrorCode SNESQNSetRestartType(SNES snes, SNESQNRestartType rtype) in SNESQNSetRestartType() argument
396 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESQNSetRestartType()
397 PetscTryMethod(snes, "SNESQNSetRestartType_C", (SNES, SNESQNRestartType), (snes, rtype)); in SNESQNSetRestartType()
417 PetscErrorCode SNESQNSetScaleType(SNES snes, SNESQNScaleType stype) in SNESQNSetScaleType() argument
420 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESQNSetScaleType()
421 PetscTryMethod(snes, "SNESQNSetScaleType_C", (SNES, SNESQNScaleType), (snes, stype)); in SNESQNSetScaleType()
425 static PetscErrorCode SNESQNSetScaleType_QN(SNES snes, SNESQNScaleType stype) in SNESQNSetScaleType_QN() argument
427 SNES_QN *qn = (SNES_QN *)snes->data; in SNESQNSetScaleType_QN()
431 if (stype == SNES_QN_SCALE_JACOBIAN) snes->usesksp = PETSC_TRUE; in SNESQNSetScaleType_QN()
435 static PetscErrorCode SNESQNSetRestartType_QN(SNES snes, SNESQNRestartType rtype) in SNESQNSetRestartType_QN() argument
437 SNES_QN *qn = (SNES_QN *)snes->data; in SNESQNSetRestartType_QN()
460 PetscErrorCode SNESQNSetType(SNES snes, SNESQNType qtype) in SNESQNSetType() argument
463 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); in SNESQNSetType()
464 PetscTryMethod(snes, "SNESQNSetType_C", (SNES, SNESQNType), (snes, qtype)); in SNESQNSetType()
468 static PetscErrorCode SNESQNSetType_QN(SNES snes, SNESQNType qtype) in SNESQNSetType_QN() argument
470 SNES_QN *qn = (SNES_QN *)snes->data; in SNESQNSetType_QN()
510 PETSC_EXTERN PetscErrorCode SNESCreate_QN(SNES snes) in SNESCreate_QN() argument
515 snes->ops->setup = SNESSetUp_QN; in SNESCreate_QN()
516 snes->ops->solve = SNESSolve_QN; in SNESCreate_QN()
517 snes->ops->destroy = SNESDestroy_QN; in SNESCreate_QN()
518 snes->ops->setfromoptions = SNESSetFromOptions_QN; in SNESCreate_QN()
519 snes->ops->view = SNESView_QN; in SNESCreate_QN()
520 snes->ops->reset = SNESReset_QN; in SNESCreate_QN()
522 snes->npcside = PC_LEFT; in SNESCreate_QN()
524 snes->usesnpc = PETSC_TRUE; in SNESCreate_QN()
525 snes->usesksp = PETSC_FALSE; in SNESCreate_QN()
527 snes->alwayscomputesfinalresidual = PETSC_TRUE; in SNESCreate_QN()
529 PetscCall(SNESParametersInitialize(snes)); in SNESCreate_QN()
530 PetscObjectParameterSetDefault(snes, max_funcs, 30000); in SNESCreate_QN()
531 PetscObjectParameterSetDefault(snes, max_its, 10000); in SNESCreate_QN()
534 snes->data = (void *)qn; in SNESCreate_QN()
544 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESQNSetScaleType_C", SNESQNSetScaleType… in SNESCreate_QN()
545 …PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESQNSetRestartType_C", SNESQNSetRestart… in SNESCreate_QN()
546 PetscCall(PetscObjectComposeFunction((PetscObject)snes, "SNESQNSetType_C", SNESQNSetType_QN)); in SNESCreate_QN()