Lines Matching refs:ts

6 static PetscErrorCode TSARKIMEXSetSplits(TS ts)  in TSARKIMEXSetSplits()  argument
8 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSARKIMEXSetSplits()
12 PetscCall(TSRHSSplitGetSubTS(ts, "slow", &ark->subts_slow)); in TSARKIMEXSetSplits()
13 PetscCall(TSRHSSplitGetSubTS(ts, "fast", &ark->subts_fast)); in TSARKIMEXSetSplits()
15 PetscCall(TSGetDM(ts, &dm)); in TSARKIMEXSetSplits()
33 static PetscErrorCode SNESTSFormFunction_ARKIMEX_FastSlowSplit(SNES snes, Vec X, Vec F, TS ts) in SNESTSFormFunction_ARKIMEX_FastSlowSplit() argument
35 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in SNESTSFormFunction_ARKIMEX_FastSlowSplit()
41 dmsave = ts->dm; in SNESTSFormFunction_ARKIMEX_FastSlowSplit()
42 ts->dm = dm; // Use the SNES DM to compute IFunction in SNESTSFormFunction_ARKIMEX_FastSlowSplit()
44 PetscReal shift = ark->scoeff / ts->time_step; in SNESTSFormFunction_ARKIMEX_FastSlowSplit()
50 ts->dm = dmsave; in SNESTSFormFunction_ARKIMEX_FastSlowSplit()
54 …atic PetscErrorCode SNESTSFormJacobian_ARKIMEX_FastSlowSplit(SNES snes, Vec X, Mat A, Mat B, TS ts) in SNESTSFormJacobian_ARKIMEX_FastSlowSplit() argument
56 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in SNESTSFormJacobian_ARKIMEX_FastSlowSplit()
63 dmsave = ts->dm; in SNESTSFormJacobian_ARKIMEX_FastSlowSplit()
64 ts->dm = dm; in SNESTSFormJacobian_ARKIMEX_FastSlowSplit()
66 shift = ark->scoeff / ts->time_step; in SNESTSFormJacobian_ARKIMEX_FastSlowSplit()
71 ts->dm = dmsave; in SNESTSFormJacobian_ARKIMEX_FastSlowSplit()
75 static PetscErrorCode TSExtrapolate_ARKIMEX_FastSlowSplit(TS ts, PetscReal c, Vec X) in TSExtrapolate_ARKIMEX_FastSlowSplit() argument
77 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSExtrapolate_ARKIMEX_FastSlowSplit()
86 …PetscCheck(Bt && B, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "TSARKIMEX %s does not have a… in TSExtrapolate_ARKIMEX_FastSlowSplit()
87 h = ts->time_step; in TSExtrapolate_ARKIMEX_FastSlowSplit()
88 h_prev = ts->ptime - ts->ptime_prev; in TSExtrapolate_ARKIMEX_FastSlowSplit()
97 …PetscCheck(ark->Y_prev, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Stages from previous ste… in TSExtrapolate_ARKIMEX_FastSlowSplit()
120 static PetscErrorCode TSEvaluateStep_ARKIMEX_FastSlowSplit(TS ts, PetscInt order, Vec X, PetscBool … in TSEvaluateStep_ARKIMEX_FastSlowSplit() argument
122 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSEvaluateStep_ARKIMEX_FastSlowSplit()
134 h = ts->time_step; in TSEvaluateStep_ARKIMEX_FastSlowSplit()
137 h = ts->ptime - ts->ptime_prev; in TSEvaluateStep_ARKIMEX_FastSlowSplit()
140 SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
145 PetscCall(VecCopy(ts->vec_sol, X)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
159 } else PetscCall(VecCopy(ts->vec_sol, X)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
165 PetscCall(VecCopy(ts->vec_sol, X)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
180 PetscCall(VecCopy(ts->vec_sol, X)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
199 …PetscCheck(done, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "ARKIMEX '%s' of order %" PetscI… in TSEvaluateStep_ARKIMEX_FastSlowSplit()
214 static PetscErrorCode TSStep_ARKIMEX_FastSlowSplit(TS ts) in TSStep_ARKIMEX_FastSlowSplit() argument
216 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSStep_ARKIMEX_FastSlowSplit()
228 PetscReal next_time_step = ts->time_step; in TSStep_ARKIMEX_FastSlowSplit()
233 PetscCall(VecGetSubVector(ts->vec_sol, ark->is_fast, &Xfast)); in TSStep_ARKIMEX_FastSlowSplit()
237 PetscCall(VecRestoreSubVector(ts->vec_sol, ark->is_fast, &Xfast)); in TSStep_ARKIMEX_FastSlowSplit()
238 PetscCall(VecGetSubVector(ts->vec_sol, ark->is_slow, &Xslow)); in TSStep_ARKIMEX_FastSlowSplit()
239 PetscCall(VecRestoreSubVector(ts->vec_sol, ark->is_fast, &Xslow)); in TSStep_ARKIMEX_FastSlowSplit()
242 if (!ts->steprollback) { in TSStep_ARKIMEX_FastSlowSplit()
243 if (ts->equation_type >= TS_EQ_IMPLICIT) { /* Save the initial slope for the next step */ in TSStep_ARKIMEX_FastSlowSplit()
246 …if (ark->extrapolate && !ts->steprestart) { /* Save the Y, YdotI, YdotRHS for extrapolation initia… in TSStep_ARKIMEX_FastSlowSplit()
256 if (ts->equation_type >= TS_EQ_IMPLICIT && tab->explicit_first_stage && ts->steprestart) { in TSStep_ARKIMEX_FastSlowSplit()
258 PetscCall(TSClone(ts, &ts_start)); in TSStep_ARKIMEX_FastSlowSplit()
259 PetscCall(TSSetSolution(ts_start, ts->vec_sol)); in TSStep_ARKIMEX_FastSlowSplit()
260 PetscCall(TSSetTime(ts_start, ts->ptime)); in TSStep_ARKIMEX_FastSlowSplit()
261 PetscCall(TSSetMaxSteps(ts_start, ts->steps + 1)); in TSStep_ARKIMEX_FastSlowSplit()
262 PetscCall(TSSetMaxTime(ts_start, ts->ptime + ts->time_step)); in TSStep_ARKIMEX_FastSlowSplit()
264 PetscCall(TSSetTimeStep(ts_start, ts->time_step)); in TSStep_ARKIMEX_FastSlowSplit()
270 PetscCall(TSSolve(ts_start, ts->vec_sol)); in TSStep_ARKIMEX_FastSlowSplit()
271 PetscCall(TSGetTime(ts_start, &ts->ptime)); in TSStep_ARKIMEX_FastSlowSplit()
272 PetscCall(TSGetTimeStep(ts_start, &ts->time_step)); in TSStep_ARKIMEX_FastSlowSplit()
278 ts->steps++; in TSStep_ARKIMEX_FastSlowSplit()
282 PetscCall(TSRHSSplitGetSNES(ts, &snes)); in TSStep_ARKIMEX_FastSlowSplit()
283 PetscCall(TSRHSSplitSetSNES(ts, snes)); in TSStep_ARKIMEX_FastSlowSplit()
289 while (!ts->reason && ark->status != TS_STEP_COMPLETE) { in TSStep_ARKIMEX_FastSlowSplit()
290 PetscReal t = ts->ptime; in TSStep_ARKIMEX_FastSlowSplit()
291 PetscReal h = ts->time_step; in TSStep_ARKIMEX_FastSlowSplit()
294 PetscCall(TSPreStage(ts, ark->stage_time)); in TSStep_ARKIMEX_FastSlowSplit()
295 PetscCall(VecCopy(ts->vec_sol, Y[i])); in TSStep_ARKIMEX_FastSlowSplit()
299 …PetscCheck(i == 0 || ts->equation_type < TS_EQ_IMPLICIT, PetscObjectComm((PetscObject)ts), PETSC_E… in TSStep_ARKIMEX_FastSlowSplit()
311 PetscCall(VecISCopy(ts->vec_sol, ark->is_fast, SCATTER_REVERSE, Z)); in TSStep_ARKIMEX_FastSlowSplit()
318 PetscCall(TSRHSSplitGetSNES(ts, &snes)); in TSStep_ARKIMEX_FastSlowSplit()
319 if (ark->is_slow) PetscCall(VecCopy(i > 0 ? Y[i - 1] : ts->vec_sol, ark->Y_snes)); in TSStep_ARKIMEX_FastSlowSplit()
322 if (extrapolate && !ts->steprestart) { in TSStep_ARKIMEX_FastSlowSplit()
324 PetscCall(TSExtrapolate_ARKIMEX_FastSlowSplit(ts, ct[i], Yfast)); in TSStep_ARKIMEX_FastSlowSplit()
327 … PetscCall(VecISCopy(i > 0 ? Y[i - 1] : ts->vec_sol, ark->is_fast, SCATTER_REVERSE, Yfast)); in TSStep_ARKIMEX_FastSlowSplit()
333 ts->snes_its += its; in TSStep_ARKIMEX_FastSlowSplit()
334 ts->ksp_its += lits; in TSStep_ARKIMEX_FastSlowSplit()
335 PetscCall(TSGetAdapt(ts, &adapt)); in TSStep_ARKIMEX_FastSlowSplit()
336 PetscCall(TSAdaptCheckStage(adapt, ts, ark->stage_time, Y[i], &stageok)); in TSStep_ARKIMEX_FastSlowSplit()
345 if (ts->equation_type >= TS_EQ_IMPLICIT) { in TSStep_ARKIMEX_FastSlowSplit()
347 …PetscCheck(tab->stiffly_accurate, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "%s %s is not s… in TSStep_ARKIMEX_FastSlowSplit()
348 ((PetscObject)ts)->type_name, ark->tableau->name); in TSStep_ARKIMEX_FastSlowSplit()
376 PetscCall(TSPostStage(ts, ark->stage_time, i, Y)); in TSStep_ARKIMEX_FastSlowSplit()
379 PetscCall(TSEvaluateStep_ARKIMEX_FastSlowSplit(ts, tab->order, ts->vec_sol, NULL)); in TSStep_ARKIMEX_FastSlowSplit()
381 PetscCall(TSGetAdapt(ts, &adapt)); in TSStep_ARKIMEX_FastSlowSplit()
384 PetscCall(TSAdaptChoose(adapt, ts, ts->time_step, NULL, &next_time_step, &accept)); in TSStep_ARKIMEX_FastSlowSplit()
387 PetscCall(VecCopy(ts->vec_sol0, ts->vec_sol)); in TSStep_ARKIMEX_FastSlowSplit()
388 ts->time_step = next_time_step; in TSStep_ARKIMEX_FastSlowSplit()
392 ts->ptime += ts->time_step; in TSStep_ARKIMEX_FastSlowSplit()
393 ts->time_step = next_time_step; in TSStep_ARKIMEX_FastSlowSplit()
397 ts->reject++; in TSStep_ARKIMEX_FastSlowSplit()
399 if (!ts->reason && ++rejections > ts->max_reject && ts->max_reject >= 0) { in TSStep_ARKIMEX_FastSlowSplit()
400 ts->reason = TS_DIVERGED_STEP_REJECTED; in TSStep_ARKIMEX_FastSlowSplit()
401 …tscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", step rejections %" PetscInt_FMT " greater than curr… in TSStep_ARKIMEX_FastSlowSplit()
407 static PetscErrorCode TSSetUp_ARKIMEX_FastSlowSplit(TS ts) in TSSetUp_ARKIMEX_FastSlowSplit() argument
409 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSSetUp_ARKIMEX_FastSlowSplit()
415 PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y)); in TSSetUp_ARKIMEX_FastSlowSplit()
416 PetscCall(TSRHSSplitGetIS(ts, "slow", &ark->is_slow)); in TSSetUp_ARKIMEX_FastSlowSplit()
417 PetscCall(TSRHSSplitGetIS(ts, "fast", &ark->is_fast)); in TSSetUp_ARKIMEX_FastSlowSplit()
418 …PetscCheck(ark->is_slow || ark->is_fast, PetscObjectComm((PetscObject)ts), PETSC_ERR_USER, "Must s… in TSSetUp_ARKIMEX_FastSlowSplit()
430 …if (ark->is_fast && ark->is_slow) PetscCall(VecDuplicate(ts->vec_sol, &ark->Y_snes)); // need an a… in TSSetUp_ARKIMEX_FastSlowSplit()
432 PetscCall(VecGetSubVector(ts->vec_sol, ark->is_fast, &Xfast)); in TSSetUp_ARKIMEX_FastSlowSplit()
443 PetscCall(VecRestoreSubVector(ts->vec_sol, ark->is_fast, &Xfast)); in TSSetUp_ARKIMEX_FastSlowSplit()
446 PetscCall(VecGetSubVector(ts->vec_sol, ark->is_slow, &Xslow)); in TSSetUp_ARKIMEX_FastSlowSplit()
448 PetscCall(VecRestoreSubVector(ts->vec_sol, ark->is_slow, &Xslow)); in TSSetUp_ARKIMEX_FastSlowSplit()
450 ts->ops->step = TSStep_ARKIMEX_FastSlowSplit; in TSSetUp_ARKIMEX_FastSlowSplit()
451 ts->ops->evaluatestep = TSEvaluateStep_ARKIMEX_FastSlowSplit; in TSSetUp_ARKIMEX_FastSlowSplit()
452 PetscCall(TSARKIMEXSetSplits(ts)); in TSSetUp_ARKIMEX_FastSlowSplit()
457 PetscCall(TSRHSSplitGetSNES(ts, &snes)); in TSSetUp_ARKIMEX_FastSlowSplit()
460 … (func == SNESTSFormJacobian) PetscCall(SNESSetJacobian(snes, Amat, Pmat, SNESTSFormJacobian, ts)); in TSSetUp_ARKIMEX_FastSlowSplit()
461 ts->ops->snesfunction = SNESTSFormFunction_ARKIMEX_FastSlowSplit; in TSSetUp_ARKIMEX_FastSlowSplit()
462 ts->ops->snesjacobian = SNESTSFormJacobian_ARKIMEX_FastSlowSplit; in TSSetUp_ARKIMEX_FastSlowSplit()
467 static PetscErrorCode TSReset_ARKIMEX_FastSlowSplit(TS ts) in TSReset_ARKIMEX_FastSlowSplit() argument
469 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSReset_ARKIMEX_FastSlowSplit()
492 PetscErrorCode TSARKIMEXSetFastSlowSplit_ARKIMEX(TS ts, PetscBool fastslowsplit) in TSARKIMEXSetFastSlowSplit_ARKIMEX() argument
494 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSARKIMEXSetFastSlowSplit_ARKIMEX()
497 PetscValidHeaderSpecific(ts, TS_CLASSID, 1); in TSARKIMEXSetFastSlowSplit_ARKIMEX()
500 …PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSSetUp_ARKIMEX_FastSlowSplit_C", TSSetUp_A… in TSARKIMEXSetFastSlowSplit_ARKIMEX()
501 …PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSReset_ARKIMEX_FastSlowSplit_C", TSReset_A… in TSARKIMEXSetFastSlowSplit_ARKIMEX()
506 PetscErrorCode TSARKIMEXGetFastSlowSplit_ARKIMEX(TS ts, PetscBool *fastslowsplit) in TSARKIMEXGetFastSlowSplit_ARKIMEX() argument
508 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSARKIMEXGetFastSlowSplit_ARKIMEX()
511 PetscValidHeaderSpecific(ts, TS_CLASSID, 1); in TSARKIMEXGetFastSlowSplit_ARKIMEX()