Lines Matching refs:ts
15 static PetscErrorCode TSMimexGetX0AndXdot(TS ts, DM dm, Vec *X0, Vec *Xdot) in TSMimexGetX0AndXdot() argument
17 TS_Mimex *mimex = (TS_Mimex *)ts->data; in TSMimexGetX0AndXdot()
21 if (dm && dm != ts->dm) PetscCall(DMGetNamedGlobalVector(dm, "TSMimex_X0", X0)); in TSMimexGetX0AndXdot()
22 else *X0 = ts->vec_sol; in TSMimexGetX0AndXdot()
25 if (dm && dm != ts->dm) PetscCall(DMGetNamedGlobalVector(dm, "TSMimex_Xdot", Xdot)); in TSMimexGetX0AndXdot()
31 static PetscErrorCode TSMimexRestoreX0AndXdot(TS ts, DM dm, Vec *X0, Vec *Xdot) in TSMimexRestoreX0AndXdot() argument
35 if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSMimex_X0", X0)); in TSMimexRestoreX0AndXdot()
37 if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSMimex_Xdot", Xdot)); in TSMimexRestoreX0AndXdot()
41 static PetscErrorCode TSMimexGetXstarAndG(TS ts, DM dm, Vec *Xstar, Vec *G) in TSMimexGetXstarAndG() argument
49 static PetscErrorCode TSMimexRestoreXstarAndG(TS ts, DM dm, Vec *Xstar, Vec *G) in TSMimexRestoreXstarAndG() argument
61 static PetscErrorCode SNESTSFormFunction_Mimex(SNES snes, Vec x, Vec y, TS ts) in SNESTSFormFunction_Mimex() argument
63 TS_Mimex *mimex = (TS_Mimex *)ts->data; in SNESTSFormFunction_Mimex()
66 PetscReal shift = 1. / ts->time_step; in SNESTSFormFunction_Mimex()
70 PetscCall(TSMimexGetX0AndXdot(ts, dm, &X0, &Xdot)); in SNESTSFormFunction_Mimex()
74 dmsave = ts->dm; in SNESTSFormFunction_Mimex()
75 ts->dm = dm; in SNESTSFormFunction_Mimex()
76 PetscCall(TSComputeIFunction(ts, mimex->stage_time, x, Xdot, y, PETSC_TRUE)); in SNESTSFormFunction_Mimex()
86 PetscCall(TSGetDM(ts, &dm)); in SNESTSFormFunction_Mimex()
91 PetscCall(TSMimexGetXstarAndG(ts, dm, &Xstar, &G)); in SNESTSFormFunction_Mimex()
113 PetscCall(TSComputeRHSFunction(ts, ts->ptime, Xstar, G)); in SNESTSFormFunction_Mimex()
115 PetscCall(TSMimexRestoreXstarAndG(ts, dm, &Xstar, &G)); in SNESTSFormFunction_Mimex()
117 ts->dm = dmsave; in SNESTSFormFunction_Mimex()
118 PetscCall(TSMimexRestoreX0AndXdot(ts, dm, &X0, &Xdot)); in SNESTSFormFunction_Mimex()
122 static PetscErrorCode SNESTSFormJacobian_Mimex(SNES snes, Vec x, Mat A, Mat B, TS ts) in SNESTSFormJacobian_Mimex() argument
124 TS_Mimex *mimex = (TS_Mimex *)ts->data; in SNESTSFormJacobian_Mimex()
127 PetscReal shift = 1. / ts->time_step; in SNESTSFormJacobian_Mimex()
132 PetscCall(TSMimexGetX0AndXdot(ts, dm, NULL, &Xdot)); in SNESTSFormJacobian_Mimex()
135 dmsave = ts->dm; in SNESTSFormJacobian_Mimex()
136 ts->dm = dm; in SNESTSFormJacobian_Mimex()
137 PetscCall(TSComputeIJacobian(ts, mimex->stage_time, x, Xdot, shift, A, B, PETSC_TRUE)); in SNESTSFormJacobian_Mimex()
138 ts->dm = dmsave; in SNESTSFormJacobian_Mimex()
139 PetscCall(TSMimexRestoreX0AndXdot(ts, dm, NULL, &Xdot)); in SNESTSFormJacobian_Mimex()
143 static PetscErrorCode TSStep_Mimex_Split(TS ts) in TSStep_Mimex_Split() argument
145 TS_Mimex *mimex = (TS_Mimex *)ts->data; in TSStep_Mimex_Split()
149 Vec sol = ts->vec_sol, update = mimex->update; in TSStep_Mimex_Split()
151 PetscScalar *asol, dt = ts->time_step; in TSStep_Mimex_Split()
155 PetscCall(TSGetDM(ts, &dm)); in TSStep_Mimex_Split()
160 PetscCall(TSPreStage(ts, ts->ptime)); in TSStep_Mimex_Split()
162 mimex->stage_time = ts->ptime + ts->time_step; in TSStep_Mimex_Split()
164 PetscCall(SNESSolve(ts->snes, NULL, update)); in TSStep_Mimex_Split()
186 PetscCall(TSComputeRHSFunction(ts, ts->ptime, sol, update)); in TSStep_Mimex_Split()
207 PetscCall(TSPostStage(ts, ts->ptime, 0, &sol)); in TSStep_Mimex_Split()
208 ts->ptime += ts->time_step; in TSStep_Mimex_Split()
213 static PetscErrorCode TSStep_Mimex_Implicit(TS ts) in TSStep_Mimex_Implicit() argument
215 TS_Mimex *mimex = (TS_Mimex *)ts->data; in TSStep_Mimex_Implicit()
216 Vec sol = ts->vec_sol; in TSStep_Mimex_Implicit()
220 PetscCall(TSPreStage(ts, ts->ptime)); in TSStep_Mimex_Implicit()
222 mimex->stage_time = ts->ptime + ts->time_step; in TSStep_Mimex_Implicit()
223 ts->ptime += ts->time_step; in TSStep_Mimex_Implicit()
225 PetscCall(SNESSolve(ts->snes, NULL, update)); in TSStep_Mimex_Implicit()
227 PetscCall(TSPostStage(ts, ts->ptime, 0, &sol)); in TSStep_Mimex_Implicit()
231 static PetscErrorCode TSStep_Mimex(TS ts) in TSStep_Mimex() argument
233 TS_Mimex *mimex = (TS_Mimex *)ts->data; in TSStep_Mimex()
238 PetscCall(TSStep_Mimex_Split(ts)); in TSStep_Mimex()
241 PetscCall(TSStep_Mimex_Implicit(ts)); in TSStep_Mimex()
244 …SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_OUTOFRANGE, "Unknown MIMEX version %" Pets… in TSStep_Mimex()
249 static PetscErrorCode TSSetUp_Mimex(TS ts) in TSSetUp_Mimex() argument
251 TS_Mimex *mimex = (TS_Mimex *)ts->data; in TSSetUp_Mimex()
254 PetscCall(VecDuplicate(ts->vec_sol, &mimex->update)); in TSSetUp_Mimex()
255 PetscCall(VecDuplicate(ts->vec_sol, &mimex->Xdot)); in TSSetUp_Mimex()
259 static PetscErrorCode TSReset_Mimex(TS ts) in TSReset_Mimex() argument
261 TS_Mimex *mimex = (TS_Mimex *)ts->data; in TSReset_Mimex()
269 static PetscErrorCode TSDestroy_Mimex(TS ts) in TSDestroy_Mimex() argument
272 PetscCall(TSReset_Mimex(ts)); in TSDestroy_Mimex()
273 PetscCall(PetscFree(ts->data)); in TSDestroy_Mimex()
277 static PetscErrorCode TSSetFromOptions_Mimex(TS ts, PetscOptionItems PetscOptionsObject) in TSSetFromOptions_Mimex() argument
279 TS_Mimex *mimex = (TS_Mimex *)ts->data; in TSSetFromOptions_Mimex()
290 static PetscErrorCode TSView_Mimex(TS ts, PetscViewer viewer) in TSView_Mimex() argument
292 TS_Mimex *mimex = (TS_Mimex *)ts->data; in TSView_Mimex()
301 static PetscErrorCode TSInterpolate_Mimex(TS ts, PetscReal t, Vec X) in TSInterpolate_Mimex() argument
303 PetscReal alpha = (ts->ptime - t) / ts->time_step; in TSInterpolate_Mimex()
306 PetscCall(VecAXPBY(ts->vec_sol, 1.0 - alpha, alpha, X)); in TSInterpolate_Mimex()
310 static PetscErrorCode TSComputeLinearStability_Mimex(TS ts, PetscReal xr, PetscReal xi, PetscReal *… in TSComputeLinearStability_Mimex() argument
325 PETSC_EXTERN PetscErrorCode TSCreate_Mimex(TS ts) in TSCreate_Mimex() argument
330 ts->ops->setup = TSSetUp_Mimex; in TSCreate_Mimex()
331 ts->ops->step = TSStep_Mimex; in TSCreate_Mimex()
332 ts->ops->reset = TSReset_Mimex; in TSCreate_Mimex()
333 ts->ops->destroy = TSDestroy_Mimex; in TSCreate_Mimex()
334 ts->ops->setfromoptions = TSSetFromOptions_Mimex; in TSCreate_Mimex()
335 ts->ops->view = TSView_Mimex; in TSCreate_Mimex()
336 ts->ops->interpolate = TSInterpolate_Mimex; in TSCreate_Mimex()
337 ts->ops->linearstability = TSComputeLinearStability_Mimex; in TSCreate_Mimex()
338 ts->ops->snesfunction = SNESTSFormFunction_Mimex; in TSCreate_Mimex()
339 ts->ops->snesjacobian = SNESTSFormJacobian_Mimex; in TSCreate_Mimex()
340 ts->default_adapt_type = TSADAPTNONE; in TSCreate_Mimex()
343 ts->data = (void *)mimex; in TSCreate_Mimex()