Lines Matching refs:ts
55 static PetscErrorCode TSBDF_GetVecs(TS ts, DM dm, Vec *Xdot, Vec *Ydot) in TSBDF_GetVecs() argument
57 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDF_GetVecs()
60 if (dm && dm != ts->dm) { in TSBDF_GetVecs()
70 static PetscErrorCode TSBDF_RestoreVecs(TS ts, DM dm, Vec *Xdot, Vec *Ydot) in TSBDF_RestoreVecs() argument
72 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDF_RestoreVecs()
75 if (dm && dm != ts->dm) { in TSBDF_RestoreVecs()
79 …PetscCheck(*Xdot == bdf->vec_dot, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_INCOMP, "Vec doe… in TSBDF_RestoreVecs()
80 …PetscCheck(*Ydot == bdf->vec_wrk, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_INCOMP, "Vec doe… in TSBDF_RestoreVecs()
95 TS ts = (TS)ctx; in DMRestrictHook_TSBDF() local
100 PetscCall(TSBDF_GetVecs(ts, fine, &Xdot, &Ydot)); in DMRestrictHook_TSBDF()
101 PetscCall(TSBDF_GetVecs(ts, coarse, &Xdot_c, &Ydot_c)); in DMRestrictHook_TSBDF()
106 PetscCall(TSBDF_RestoreVecs(ts, fine, &Xdot, &Ydot)); in DMRestrictHook_TSBDF()
107 PetscCall(TSBDF_RestoreVecs(ts, coarse, &Xdot_c, &Ydot_c)); in DMRestrictHook_TSBDF()
111 static PetscErrorCode TSBDF_Advance(TS ts, PetscReal t, Vec X) in TSBDF_Advance() argument
113 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDF_Advance()
128 PetscCall(TSComputeTransientVariable(ts, tail, tvtail)); in TSBDF_Advance()
132 static PetscErrorCode TSBDF_VecLTE(TS ts, PetscInt order, Vec lte) in TSBDF_VecLTE() argument
134 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDF_VecLTE()
150 static PetscErrorCode TSBDF_Extrapolate(TS ts, PetscInt order, PetscReal t, Vec X) in TSBDF_Extrapolate() argument
152 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDF_Extrapolate()
166 static PetscErrorCode TSBDF_Interpolate(TS ts, PetscInt order, PetscReal t, Vec X) in TSBDF_Interpolate() argument
168 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDF_Interpolate()
185 static PetscErrorCode TSBDF_PreSolve(TS ts) in TSBDF_PreSolve() argument
187 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDF_PreSolve()
194 PetscCall(TSBDF_GetVecs(ts, NULL, &V, &V0)); in TSBDF_PreSolve()
200 PetscCall(TSBDF_RestoreVecs(ts, NULL, &V, &V0)); in TSBDF_PreSolve()
204 static PetscErrorCode TSBDF_SNESSolve(TS ts, Vec b, Vec x) in TSBDF_SNESSolve() argument
209 PetscCall(TSBDF_PreSolve(ts)); in TSBDF_SNESSolve()
210 PetscCall(SNESSolve(ts->snes, b, x)); in TSBDF_SNESSolve()
211 PetscCall(SNESGetIterationNumber(ts->snes, &nits)); in TSBDF_SNESSolve()
212 PetscCall(SNESGetLinearSolveIterations(ts->snes, &lits)); in TSBDF_SNESSolve()
213 ts->snes_its += nits; in TSBDF_SNESSolve()
214 ts->ksp_its += lits; in TSBDF_SNESSolve()
218 static PetscErrorCode TSBDF_Restart(TS ts, PetscBool *accept) in TSBDF_Restart() argument
220 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDF_Restart()
225 PetscCall(TSBDF_Advance(ts, ts->ptime, ts->vec_sol)); in TSBDF_Restart()
230 bdf->time[0] = ts->ptime + ts->time_step / 2; in TSBDF_Restart()
232 PetscCall(TSPreStage(ts, bdf->time[0])); in TSBDF_Restart()
233 PetscCall(TSBDF_SNESSolve(ts, NULL, bdf->work[0])); in TSBDF_Restart()
234 PetscCall(TSPostStage(ts, bdf->time[0], 0, &bdf->work[0])); in TSBDF_Restart()
235 PetscCall(TSAdaptCheckStage(ts->adapt, ts, bdf->time[0], bdf->work[0], accept)); in TSBDF_Restart()
242 PetscCall(TSComputeTransientVariable(ts, bdf->work[2], bdf->tvwork[2])); in TSBDF_Restart()
248 static PetscErrorCode TSStep_BDF(TS ts) in TSStep_BDF() argument
250 TS_BDF *bdf = (TS_BDF *)ts->data; in TSStep_BDF()
253 PetscReal next_time_step = ts->time_step; in TSStep_BDF()
258 if (!ts->steprollback && !ts->steprestart) { in TSStep_BDF()
260 PetscCall(TSBDF_Advance(ts, ts->ptime, ts->vec_sol)); in TSStep_BDF()
264 while (!ts->reason && bdf->status != TS_STEP_COMPLETE) { in TSStep_BDF()
265 if (ts->steprestart) { in TSStep_BDF()
266 PetscCall(TSBDF_Restart(ts, &stageok)); in TSStep_BDF()
270 bdf->time[0] = ts->ptime + ts->time_step; in TSStep_BDF()
271 …if (bdf->extrapolate) PetscCall(TSBDF_Extrapolate(ts, bdf->k - (accept ? 0 : 1), bdf->time[0], bdf… in TSStep_BDF()
272 else if (!accept) PetscCall(VecCopy(ts->vec_sol, bdf->work[0])); in TSStep_BDF()
273 PetscCall(TSPreStage(ts, bdf->time[0])); in TSStep_BDF()
274 PetscCall(TSBDF_SNESSolve(ts, NULL, bdf->work[0])); in TSStep_BDF()
275 PetscCall(TSPostStage(ts, bdf->time[0], 0, &bdf->work[0])); in TSStep_BDF()
276 PetscCall(TSAdaptCheckStage(ts->adapt, ts, bdf->time[0], bdf->work[0], &stageok)); in TSStep_BDF()
280 PetscCall(TSAdaptCandidatesClear(ts->adapt)); in TSStep_BDF()
281 …PetscCall(TSAdaptCandidateAdd(ts->adapt, BDF_SchemeName[bdf->k], bdf->k, 1, 1.0, 1.0, PETSC_TRUE)); in TSStep_BDF()
282 PetscCall(TSAdaptChoose(ts->adapt, ts, ts->time_step, NULL, &next_time_step, &accept)); in TSStep_BDF()
285 ts->time_step = next_time_step; in TSStep_BDF()
289 PetscCall(VecCopy(bdf->work[0], ts->vec_sol)); in TSStep_BDF()
290 ts->ptime += ts->time_step; in TSStep_BDF()
291 ts->time_step = next_time_step; in TSStep_BDF()
295 ts->reject++; in TSStep_BDF()
297 if (!ts->reason && ++rejections > ts->max_reject && ts->max_reject >= 0) { in TSStep_BDF()
298 …tscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", step rejections %" PetscInt_FMT " greater than curr… in TSStep_BDF()
299 ts->reason = TS_DIVERGED_STEP_REJECTED; in TSStep_BDF()
305 static PetscErrorCode TSInterpolate_BDF(TS ts, PetscReal t, Vec X) in TSInterpolate_BDF() argument
307 TS_BDF *bdf = (TS_BDF *)ts->data; in TSInterpolate_BDF()
310 PetscCall(TSBDF_Interpolate(ts, bdf->k, t, X)); in TSInterpolate_BDF()
314 static PetscErrorCode TSEvaluateWLTE_BDF(TS ts, NormType wnormtype, PetscInt *order, PetscReal *wlt… in TSEvaluateWLTE_BDF() argument
316 TS_BDF *bdf = (TS_BDF *)ts->data; in TSEvaluateWLTE_BDF()
327 PetscCall(TSBDF_VecLTE(ts, k, Y)); in TSEvaluateWLTE_BDF()
329 PetscCall(TSErrorWeightedNorm(ts, X, Y, wnormtype, wlte, &wltea, &wlter)); in TSEvaluateWLTE_BDF()
334 static PetscErrorCode TSResizeRegister_BDF(TS ts, PetscBool reg) in TSResizeRegister_BDF() argument
336 TS_BDF *bdf = (TS_BDF *)ts->data; in TSResizeRegister_BDF()
341 …PetscAssert(maxn == 8, PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "names need to be redefin… in TSResizeRegister_BDF()
343 …for (i = 1; i < PetscMin(bdf->n + 1, maxn); i++) PetscCall(TSResizeRegisterVec(ts, names[i], bdf->… in TSResizeRegister_BDF()
346 PetscCall(TSResizeRetrieveVec(ts, names[i], &bdf->work[i])); in TSResizeRegister_BDF()
351 PetscCall(TSComputeTransientVariable(ts, bdf->work[i], bdf->tvwork[i])); in TSResizeRegister_BDF()
358 static PetscErrorCode SNESTSFormFunction_BDF(SNES snes, Vec X, Vec F, TS ts) in SNESTSFormFunction_BDF() argument
360 TS_BDF *bdf = (TS_BDF *)ts->data; in SNESTSFormFunction_BDF()
361 DM dm, dmsave = ts->dm; in SNESTSFormFunction_BDF()
368 PetscCall(TSBDF_GetVecs(ts, dm, &V, &V0)); in SNESTSFormFunction_BDF()
370 PetscCall(TSComputeTransientVariable(ts, X, V)); in SNESTSFormFunction_BDF()
377 ts->dm = dm; in SNESTSFormFunction_BDF()
378 PetscCall(TSComputeIFunction(ts, t, X, V, F, PETSC_FALSE)); in SNESTSFormFunction_BDF()
379 ts->dm = dmsave; in SNESTSFormFunction_BDF()
381 PetscCall(TSBDF_RestoreVecs(ts, dm, &V, &V0)); in SNESTSFormFunction_BDF()
385 static PetscErrorCode SNESTSFormJacobian_BDF(SNES snes, Vec X, Mat J, Mat P, TS ts) in SNESTSFormJacobian_BDF() argument
387 TS_BDF *bdf = (TS_BDF *)ts->data; in SNESTSFormJacobian_BDF()
388 DM dm, dmsave = ts->dm; in SNESTSFormJacobian_BDF()
395 PetscCall(TSBDF_GetVecs(ts, dm, &V, &V0)); in SNESTSFormJacobian_BDF()
398 ts->dm = dm; in SNESTSFormJacobian_BDF()
399 PetscCall(TSComputeIJacobian(ts, t, X, V, shift, J, P, PETSC_FALSE)); in SNESTSFormJacobian_BDF()
400 ts->dm = dmsave; in SNESTSFormJacobian_BDF()
402 PetscCall(TSBDF_RestoreVecs(ts, dm, &V, &V0)); in SNESTSFormJacobian_BDF()
406 static PetscErrorCode TSReset_BDF(TS ts) in TSReset_BDF() argument
408 TS_BDF *bdf = (TS_BDF *)ts->data; in TSReset_BDF()
419 if (ts->dm) PetscCall(DMCoarsenHookRemove(ts->dm, DMCoarsenHook_TSBDF, DMRestrictHook_TSBDF, ts)); in TSReset_BDF()
423 static PetscErrorCode TSDestroy_BDF(TS ts) in TSDestroy_BDF() argument
426 PetscCall(TSReset_BDF(ts)); in TSDestroy_BDF()
427 PetscCall(PetscFree(ts->data)); in TSDestroy_BDF()
428 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSBDFSetOrder_C", NULL)); in TSDestroy_BDF()
429 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSBDFGetOrder_C", NULL)); in TSDestroy_BDF()
433 static PetscErrorCode TSSetUp_BDF(TS ts) in TSSetUp_BDF() argument
435 TS_BDF *bdf = (TS_BDF *)ts->data; in TSSetUp_BDF()
441 PetscCall(TSHasTransientVariable(ts, &bdf->transientvar)); in TSSetUp_BDF()
443 if (!bdf->work[i]) PetscCall(VecDuplicate(ts->vec_sol, &bdf->work[i])); in TSSetUp_BDF()
445 …if (i && bdf->transientvar && !bdf->tvwork[i]) PetscCall(VecDuplicate(ts->vec_sol, &bdf->tvwork[i]… in TSSetUp_BDF()
448 PetscCall(VecDuplicate(ts->vec_sol, &bdf->vec_dot)); in TSSetUp_BDF()
449 PetscCall(VecDuplicate(ts->vec_sol, &bdf->vec_wrk)); in TSSetUp_BDF()
450 PetscCall(VecDuplicate(ts->vec_sol, &bdf->vec_lte)); in TSSetUp_BDF()
451 PetscCall(TSGetDM(ts, &ts->dm)); in TSSetUp_BDF()
452 PetscCall(DMCoarsenHookAdd(ts->dm, DMCoarsenHook_TSBDF, DMRestrictHook_TSBDF, ts)); in TSSetUp_BDF()
454 PetscCall(TSGetAdapt(ts, &ts->adapt)); in TSSetUp_BDF()
455 PetscCall(TSAdaptCandidatesClear(ts->adapt)); in TSSetUp_BDF()
456 PetscCall(TSAdaptGetClip(ts->adapt, &low, &high)); in TSSetUp_BDF()
457 PetscCall(TSAdaptSetClip(ts->adapt, low, PetscMin(high, two))); in TSSetUp_BDF()
459 PetscCall(TSGetSNES(ts, &ts->snes)); in TSSetUp_BDF()
463 static PetscErrorCode TSSetFromOptions_BDF(TS ts, PetscOptionItems PetscOptionsObject) in TSSetFromOptions_BDF() argument
465 TS_BDF *bdf = (TS_BDF *)ts->data; in TSSetFromOptions_BDF()
472 PetscCall(TSBDFGetOrder(ts, &order)); in TSSetFromOptions_BDF()
474 if (flg) PetscCall(TSBDFSetOrder(ts, order)); in TSSetFromOptions_BDF()
481 static PetscErrorCode TSView_BDF(TS ts, PetscViewer viewer) in TSView_BDF() argument
483 TS_BDF *bdf = (TS_BDF *)ts->data; in TSView_BDF()
492 static PetscErrorCode TSBDFSetOrder_BDF(TS ts, PetscInt order) in TSBDFSetOrder_BDF() argument
494 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDFSetOrder_BDF()
498 …PetscCheck(order >= 1 && order <= 6, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_OUTOFRANGE, "… in TSBDFSetOrder_BDF()
503 static PetscErrorCode TSBDFGetOrder_BDF(TS ts, PetscInt *order) in TSBDFGetOrder_BDF() argument
505 TS_BDF *bdf = (TS_BDF *)ts->data; in TSBDFGetOrder_BDF()
523 PETSC_EXTERN PetscErrorCode TSCreate_BDF(TS ts) in TSCreate_BDF() argument
528 ts->ops->reset = TSReset_BDF; in TSCreate_BDF()
529 ts->ops->destroy = TSDestroy_BDF; in TSCreate_BDF()
530 ts->ops->view = TSView_BDF; in TSCreate_BDF()
531 ts->ops->setup = TSSetUp_BDF; in TSCreate_BDF()
532 ts->ops->setfromoptions = TSSetFromOptions_BDF; in TSCreate_BDF()
533 ts->ops->step = TSStep_BDF; in TSCreate_BDF()
534 ts->ops->evaluatewlte = TSEvaluateWLTE_BDF; in TSCreate_BDF()
535 ts->ops->interpolate = TSInterpolate_BDF; in TSCreate_BDF()
536 ts->ops->resizeregister = TSResizeRegister_BDF; in TSCreate_BDF()
537 ts->ops->snesfunction = SNESTSFormFunction_BDF; in TSCreate_BDF()
538 ts->ops->snesjacobian = SNESTSFormJacobian_BDF; in TSCreate_BDF()
539 ts->default_adapt_type = TSADAPTBASIC; in TSCreate_BDF()
541 ts->usessnes = PETSC_TRUE; in TSCreate_BDF()
544 ts->data = (void *)bdf; in TSCreate_BDF()
550 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSBDFSetOrder_C", TSBDFSetOrder_BDF)); in TSCreate_BDF()
551 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSBDFGetOrder_C", TSBDFGetOrder_BDF)); in TSCreate_BDF()
552 PetscCall(TSBDFSetOrder(ts, 2)); in TSCreate_BDF()
572 PetscErrorCode TSBDFSetOrder(TS ts, PetscInt order) in TSBDFSetOrder() argument
575 PetscValidHeaderSpecific(ts, TS_CLASSID, 1); in TSBDFSetOrder()
576 PetscValidLogicalCollectiveInt(ts, order, 2); in TSBDFSetOrder()
577 PetscTryMethod(ts, "TSBDFSetOrder_C", (TS, PetscInt), (ts, order)); in TSBDFSetOrder()
596 PetscErrorCode TSBDFGetOrder(TS ts, PetscInt *order) in TSBDFGetOrder() argument
599 PetscValidHeaderSpecific(ts, TS_CLASSID, 1); in TSBDFGetOrder()
601 PetscUseMethod(ts, "TSBDFGetOrder_C", (TS, PetscInt *), (ts, order)); in TSBDFGetOrder()