Lines Matching refs:ark

8   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;  in TSARKIMEXSetSplits()  local
12 PetscCall(TSRHSSplitGetSubTS(ts, "slow", &ark->subts_slow)); in TSARKIMEXSetSplits()
13 PetscCall(TSRHSSplitGetSubTS(ts, "fast", &ark->subts_fast)); in TSARKIMEXSetSplits()
16 if (ark->subts_slow) { in TSARKIMEXSetSplits()
18 PetscCall(TSGetDM(ark->subts_slow, &subdm)); in TSARKIMEXSetSplits()
20 PetscCall(TSSetDM(ark->subts_slow, newdm)); in TSARKIMEXSetSplits()
23 if (ark->subts_fast) { in TSARKIMEXSetSplits()
25 PetscCall(TSGetDM(ark->subts_fast, &subdm)); in TSARKIMEXSetSplits()
27 PetscCall(TSSetDM(ark->subts_fast, newdm)); in TSARKIMEXSetSplits()
35 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in SNESTSFormFunction_ARKIMEX_FastSlowSplit() local
37 Vec Z = ark->Z, Ydot = ark->Ydot, Y = ark->Y_snes; in SNESTSFormFunction_ARKIMEX_FastSlowSplit()
44 PetscReal shift = ark->scoeff / ts->time_step; in SNESTSFormFunction_ARKIMEX_FastSlowSplit()
46 if (ark->is_slow) PetscCall(VecISCopy(Y, ark->is_fast, SCATTER_FORWARD, X)); in SNESTSFormFunction_ARKIMEX_FastSlowSplit()
48 PetscCall(TSComputeIFunction(ark->subts_fast, ark->stage_time, Y, Ydot, F, ark->imex)); in SNESTSFormFunction_ARKIMEX_FastSlowSplit()
56 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in SNESTSFormJacobian_ARKIMEX_FastSlowSplit() local
58 Vec Z = ark->Z, Ydot = ark->Ydot, Y = ark->Y_snes; in SNESTSFormJacobian_ARKIMEX_FastSlowSplit()
66 shift = ark->scoeff / ts->time_step; in SNESTSFormJacobian_ARKIMEX_FastSlowSplit()
67 if (ark->is_slow) PetscCall(VecISCopy(Y, ark->is_fast, SCATTER_FORWARD, X)); in SNESTSFormJacobian_ARKIMEX_FastSlowSplit()
69 PetscCall(TSComputeIJacobian(ark->subts_fast, ark->stage_time, Y, Ydot, shift, A, B, ark->imex)); in SNESTSFormJacobian_ARKIMEX_FastSlowSplit()
77 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSExtrapolate_ARKIMEX_FastSlowSplit() local
78 ARKTableau tab = ark->tableau; in TSExtrapolate_ARKIMEX_FastSlowSplit()
81 PetscScalar *bt = ark->work, *b = ark->work + s; in TSExtrapolate_ARKIMEX_FastSlowSplit()
86 …ect)ts), PETSC_ERR_SUP, "TSARKIMEX %s does not have an interpolation formula", ark->tableau->name); in TSExtrapolate_ARKIMEX_FastSlowSplit()
97 …PetscCheck(ark->Y_prev, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Stages from previous ste… in TSExtrapolate_ARKIMEX_FastSlowSplit()
98 PetscCall(VecCopy(ark->Y_prev[0], X)); in TSExtrapolate_ARKIMEX_FastSlowSplit()
99 PetscCall(VecMAXPY(X, s, bt, ark->YdotI_prev)); in TSExtrapolate_ARKIMEX_FastSlowSplit()
100 PetscCall(TSHasRHSFunction(ark->subts_fast, &fasthasE)); in TSExtrapolate_ARKIMEX_FastSlowSplit()
101 if (fasthasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS_prev)); in TSExtrapolate_ARKIMEX_FastSlowSplit()
122 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSEvaluateStep_ARKIMEX_FastSlowSplit() local
123 ARKTableau tab = ark->tableau; in TSEvaluateStep_ARKIMEX_FastSlowSplit()
125 PetscScalar *w = ark->work; in TSEvaluateStep_ARKIMEX_FastSlowSplit()
131 switch (ark->status) { in TSEvaluateStep_ARKIMEX_FastSlowSplit()
142 if (ark->is_fast) PetscCall(TSHasRHSFunction(ark->subts_fast, &fasthasE)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
144 if (ark->status == TS_STEP_INCOMPLETE) { in TSEvaluateStep_ARKIMEX_FastSlowSplit()
147 if (ark->is_slow) { in TSEvaluateStep_ARKIMEX_FastSlowSplit()
148 PetscCall(VecGetSubVector(X, ark->is_slow, &Xslow)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
149 PetscCall(VecMAXPY(Xslow, s, w, ark->YdotRHS_slow)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
150 PetscCall(VecRestoreSubVector(X, ark->is_slow, &Xslow)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
152 if (ark->is_fast) { in TSEvaluateStep_ARKIMEX_FastSlowSplit()
153 PetscCall(VecGetSubVector(X, ark->is_fast, &Xfast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
154 if (fasthasE) PetscCall(VecMAXPY(Xfast, s, w, ark->YdotRHS_fast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
156 PetscCall(VecMAXPY(Xfast, s, w, ark->YdotI_fast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
157 PetscCall(VecRestoreSubVector(X, ark->is_fast, &Xfast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
164 if (ark->status == TS_STEP_INCOMPLETE) { /* Complete with the embedded method (bet,be) */ in TSEvaluateStep_ARKIMEX_FastSlowSplit()
167 if (ark->is_slow) { in TSEvaluateStep_ARKIMEX_FastSlowSplit()
168 PetscCall(VecGetSubVector(X, ark->is_slow, &Xslow)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
169 PetscCall(VecMAXPY(Xslow, s, w, ark->YdotRHS_slow)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
170 PetscCall(VecRestoreSubVector(X, ark->is_slow, &Xslow)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
172 if (ark->is_fast) { in TSEvaluateStep_ARKIMEX_FastSlowSplit()
173 PetscCall(VecGetSubVector(X, ark->is_fast, &Xfast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
174 if (fasthasE) PetscCall(VecMAXPY(Xfast, s, w, ark->YdotRHS_fast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
176 PetscCall(VecMAXPY(Xfast, s, w, ark->YdotI_fast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
177 PetscCall(VecRestoreSubVector(X, ark->is_fast, &Xfast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
182 if (ark->is_slow) { in TSEvaluateStep_ARKIMEX_FastSlowSplit()
183 PetscCall(VecGetSubVector(X, ark->is_slow, &Xslow)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
184 PetscCall(VecMAXPY(Xslow, s, w, ark->YdotRHS_slow)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
185 PetscCall(VecRestoreSubVector(X, ark->is_slow, &Xslow)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
187 if (ark->is_fast) { in TSEvaluateStep_ARKIMEX_FastSlowSplit()
188 PetscCall(VecGetSubVector(X, ark->is_fast, &Xfast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
189 if (fasthasE) PetscCall(VecMAXPY(Xfast, tab->s, w, ark->YdotRHS_fast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
191 PetscCall(VecMAXPY(Xfast, tab->s, w, ark->YdotI_fast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
192 PetscCall(VecRestoreSubVector(X, ark->is_fast, &Xfast)); in TSEvaluateStep_ARKIMEX_FastSlowSplit()
216 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSStep_ARKIMEX_FastSlowSplit() local
217 ARKTableau tab = ark->tableau; in TSStep_ARKIMEX_FastSlowSplit()
220 PetscScalar *w = ark->work; in TSStep_ARKIMEX_FastSlowSplit()
221ark->Y, Ydot_fast = ark->Ydot, Ydot0_fast = ark->Ydot0, Z = ark->Z, *YdotRHS_fast = ark->YdotRHS_f… in TSStep_ARKIMEX_FastSlowSplit()
222 PetscBool extrapolate = ark->extrapolate; in TSStep_ARKIMEX_FastSlowSplit()
231 if (ark->is_fast) PetscCall(TSHasRHSFunction(ark->subts_fast, &fasthasE)); in TSStep_ARKIMEX_FastSlowSplit()
232 if (ark->extrapolate && !ark->Y_prev) { in TSStep_ARKIMEX_FastSlowSplit()
233 PetscCall(VecGetSubVector(ts->vec_sol, ark->is_fast, &Xfast)); in TSStep_ARKIMEX_FastSlowSplit()
234 PetscCall(VecDuplicateVecs(Xfast, tab->s, &ark->Y_prev)); in TSStep_ARKIMEX_FastSlowSplit()
235 PetscCall(VecDuplicateVecs(Xfast, tab->s, &ark->YdotI_prev)); in TSStep_ARKIMEX_FastSlowSplit()
236 if (fasthasE) PetscCall(VecDuplicateVecs(Xfast, tab->s, &ark->YdotRHS_prev)); 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()
246 …if (ark->extrapolate && !ts->steprestart) { /* Save the Y, YdotI, YdotRHS for extrapolation initia… in TSStep_ARKIMEX_FastSlowSplit()
248 PetscCall(VecISCopy(Y[i], ark->is_fast, SCATTER_REVERSE, ark->Y_prev[i])); in TSStep_ARKIMEX_FastSlowSplit()
249 PetscCall(VecCopy(YdotI_fast[i], ark->YdotI_prev[i])); in TSStep_ARKIMEX_FastSlowSplit()
250 if (fasthasE) PetscCall(VecCopy(YdotRHS_fast[i], ark->YdotRHS_prev[i])); in TSStep_ARKIMEX_FastSlowSplit()
288 ark->status = TS_STEP_INCOMPLETE; in TSStep_ARKIMEX_FastSlowSplit()
289 while (!ts->reason && ark->status != TS_STEP_COMPLETE) { in TSStep_ARKIMEX_FastSlowSplit()
293 ark->stage_time = t + h * ct[i]; in TSStep_ARKIMEX_FastSlowSplit()
294 PetscCall(TSPreStage(ts, ark->stage_time)); in TSStep_ARKIMEX_FastSlowSplit()
297 if (ark->is_fast) { in TSStep_ARKIMEX_FastSlowSplit()
300 PetscCall(VecGetSubVector(Y[i], ark->is_fast, &Yfast)); in TSStep_ARKIMEX_FastSlowSplit()
307 PetscCall(VecRestoreSubVector(Y[i], ark->is_fast, &Yfast)); in TSStep_ARKIMEX_FastSlowSplit()
309 ark->scoeff = 1. / At[i * s + i]; in TSStep_ARKIMEX_FastSlowSplit()
311 PetscCall(VecISCopy(ts->vec_sol, ark->is_fast, SCATTER_REVERSE, Z)); 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()
320 else ark->Y_snes = Y[i]; in TSStep_ARKIMEX_FastSlowSplit()
321 PetscCall(VecGetSubVector(Y[i], ark->is_fast, &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()
330 PetscCall(VecRestoreSubVector(Y[i], ark->is_fast, &Yfast)); in TSStep_ARKIMEX_FastSlowSplit()
336 PetscCall(TSAdaptCheckStage(adapt, ts, ark->stage_time, Y[i], &stageok)); in TSStep_ARKIMEX_FastSlowSplit()
348 ((PetscObject)ts)->type_name, ark->tableau->name); in TSStep_ARKIMEX_FastSlowSplit()
351 PetscCall(VecGetSubVector(Y[i], ark->is_fast, &Yfast)); in TSStep_ARKIMEX_FastSlowSplit()
352 …PetscCall(VecAXPBYPCZ(YdotI_fast[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Yfast)); /* YdotI = … in TSStep_ARKIMEX_FastSlowSplit()
353 PetscCall(VecRestoreSubVector(Y[i], ark->is_fast, &Yfast)); in TSStep_ARKIMEX_FastSlowSplit()
358 …PetscCall(TSComputeIFunction(ark->subts_fast, ark->stage_time, Y[i], Ydot_fast, YdotI_fast[i], ark in TSStep_ARKIMEX_FastSlowSplit()
361 PetscCall(VecGetSubVector(Y[i], ark->is_fast, &Yfast)); in TSStep_ARKIMEX_FastSlowSplit()
362 …PetscCall(VecAXPBYPCZ(YdotI_fast[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Yfast)); /* YdotI = … in TSStep_ARKIMEX_FastSlowSplit()
363 PetscCall(VecRestoreSubVector(Y[i], ark->is_fast, &Yfast)); in TSStep_ARKIMEX_FastSlowSplit()
365 …if (fasthasE) PetscCall(TSComputeRHSFunction(ark->subts_fast, ark->stage_time, Y[i], YdotRHS_fast[… in TSStep_ARKIMEX_FastSlowSplit()
369 if (ark->is_slow) { in TSStep_ARKIMEX_FastSlowSplit()
371 PetscCall(VecGetSubVector(Y[i], ark->is_slow, &Yslow)); in TSStep_ARKIMEX_FastSlowSplit()
373 PetscCall(VecRestoreSubVector(Y[i], ark->is_slow, &Yslow)); in TSStep_ARKIMEX_FastSlowSplit()
374 PetscCall(TSComputeRHSFunction(ark->subts_slow, ark->stage_time, Y[i], YdotRHS_slow[i])); in TSStep_ARKIMEX_FastSlowSplit()
376 PetscCall(TSPostStage(ts, ark->stage_time, i, Y)); in TSStep_ARKIMEX_FastSlowSplit()
378 ark->status = TS_STEP_INCOMPLETE; in TSStep_ARKIMEX_FastSlowSplit()
380 ark->status = TS_STEP_PENDING; in TSStep_ARKIMEX_FastSlowSplit()
385 ark->status = accept ? TS_STEP_COMPLETE : TS_STEP_INCOMPLETE; in TSStep_ARKIMEX_FastSlowSplit()
409 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSSetUp_ARKIMEX_FastSlowSplit() local
410 ARKTableau tab = ark->tableau; in TSSetUp_ARKIMEX_FastSlowSplit()
414 PetscCall(PetscMalloc1(2 * tab->s, &ark->work)); 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()
420 PetscCall(VecDestroy(&ark->Ydot)); in TSSetUp_ARKIMEX_FastSlowSplit()
421 PetscCall(VecDestroy(&ark->Ydot0)); in TSSetUp_ARKIMEX_FastSlowSplit()
422 PetscCall(VecDestroy(&ark->Z)); in TSSetUp_ARKIMEX_FastSlowSplit()
423 PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_fast)); in TSSetUp_ARKIMEX_FastSlowSplit()
424 …if (ark->extrapolate && ark->is_slow) { // need to resize these vectors if the fast subvectors is … in TSSetUp_ARKIMEX_FastSlowSplit()
425 PetscCall(VecDestroyVecs(tab->s, &ark->Y_prev)); in TSSetUp_ARKIMEX_FastSlowSplit()
426 PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_prev)); in TSSetUp_ARKIMEX_FastSlowSplit()
427 PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_prev)); 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()
431 if (ark->is_fast) { in TSSetUp_ARKIMEX_FastSlowSplit()
432 PetscCall(VecGetSubVector(ts->vec_sol, ark->is_fast, &Xfast)); in TSSetUp_ARKIMEX_FastSlowSplit()
433 PetscCall(VecDuplicateVecs(Xfast, tab->s, &ark->YdotRHS_fast)); in TSSetUp_ARKIMEX_FastSlowSplit()
434 PetscCall(VecDuplicateVecs(Xfast, tab->s, &ark->YdotI_fast)); in TSSetUp_ARKIMEX_FastSlowSplit()
435 PetscCall(VecDuplicate(Xfast, &ark->Ydot)); in TSSetUp_ARKIMEX_FastSlowSplit()
436 PetscCall(VecDuplicate(Xfast, &ark->Ydot0)); in TSSetUp_ARKIMEX_FastSlowSplit()
437 PetscCall(VecDuplicate(Xfast, &ark->Z)); in TSSetUp_ARKIMEX_FastSlowSplit()
438 if (ark->extrapolate) { in TSSetUp_ARKIMEX_FastSlowSplit()
439 PetscCall(VecDuplicateVecs(Xfast, tab->s, &ark->Y_prev)); in TSSetUp_ARKIMEX_FastSlowSplit()
440 PetscCall(VecDuplicateVecs(Xfast, tab->s, &ark->YdotI_prev)); in TSSetUp_ARKIMEX_FastSlowSplit()
441 PetscCall(VecDuplicateVecs(Xfast, tab->s, &ark->YdotRHS_prev)); in TSSetUp_ARKIMEX_FastSlowSplit()
443 PetscCall(VecRestoreSubVector(ts->vec_sol, ark->is_fast, &Xfast)); in TSSetUp_ARKIMEX_FastSlowSplit()
445 if (ark->is_slow) { in TSSetUp_ARKIMEX_FastSlowSplit()
446 PetscCall(VecGetSubVector(ts->vec_sol, ark->is_slow, &Xslow)); in TSSetUp_ARKIMEX_FastSlowSplit()
447 PetscCall(VecDuplicateVecs(Xslow, tab->s, &ark->YdotRHS_slow)); in TSSetUp_ARKIMEX_FastSlowSplit()
448 PetscCall(VecRestoreSubVector(ts->vec_sol, ark->is_slow, &Xslow)); in TSSetUp_ARKIMEX_FastSlowSplit()
453 …if (ark->subts_fast) { // subts SNESJacobian is set when users set the subts Jacobian, but the mai… in TSSetUp_ARKIMEX_FastSlowSplit()
458 PetscCall(TSGetSNES(ark->subts_fast, &snes_fast)); in TSSetUp_ARKIMEX_FastSlowSplit()
469 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSReset_ARKIMEX_FastSlowSplit() local
470 ARKTableau tab = ark->tableau; in TSReset_ARKIMEX_FastSlowSplit()
474 PetscCall(PetscFree(ark->work)); in TSReset_ARKIMEX_FastSlowSplit()
475 PetscCall(VecDestroyVecs(tab->s, &ark->Y)); in TSReset_ARKIMEX_FastSlowSplit()
476 if (ark->is_fast && ark->is_slow) PetscCall(VecDestroy(&ark->Y_snes)); in TSReset_ARKIMEX_FastSlowSplit()
477 PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_slow)); in TSReset_ARKIMEX_FastSlowSplit()
478 PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_fast)); in TSReset_ARKIMEX_FastSlowSplit()
479 PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_fast)); in TSReset_ARKIMEX_FastSlowSplit()
480 PetscCall(VecDestroy(&ark->Ydot)); in TSReset_ARKIMEX_FastSlowSplit()
481 PetscCall(VecDestroy(&ark->Ydot0)); in TSReset_ARKIMEX_FastSlowSplit()
482 PetscCall(VecDestroy(&ark->Z)); in TSReset_ARKIMEX_FastSlowSplit()
483 if (ark->extrapolate) { in TSReset_ARKIMEX_FastSlowSplit()
484 PetscCall(VecDestroyVecs(tab->s, &ark->Y_prev)); in TSReset_ARKIMEX_FastSlowSplit()
485 PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_prev)); in TSReset_ARKIMEX_FastSlowSplit()
486 PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_prev)); in TSReset_ARKIMEX_FastSlowSplit()
494 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSARKIMEXSetFastSlowSplit_ARKIMEX() local
498 ark->fastslowsplit = fastslowsplit; in TSARKIMEXSetFastSlowSplit_ARKIMEX()
508 TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; in TSARKIMEXGetFastSlowSplit_ARKIMEX() local
512 *fastslowsplit = ark->fastslowsplit; in TSARKIMEXGetFastSlowSplit_ARKIMEX()