Actual source code: adapthist.c

  1: #include <petsc/private/tshistoryimpl.h>

  3: typedef struct {
  4:   TSHistory hist;
  5:   PetscBool bw;
  6: } TSAdapt_History;

  8: static PetscErrorCode TSAdaptChoose_History(TSAdapt adapt, TS ts, PetscReal h, PetscInt *next_sc, PetscReal *next_h, PetscBool *accept, PetscReal *wlte, PetscReal *wltea, PetscReal *wlter)
  9: {
 10:   PetscInt         step;
 11:   TSAdapt_History *thadapt = (TSAdapt_History *)adapt->data;

 13:   PetscFunctionBegin;
 14:   PetscCheck(thadapt->hist, PetscObjectComm((PetscObject)adapt), PETSC_ERR_ORDER, "Need to call TSAdaptHistorySetHistory() first");
 15:   PetscCall(TSGetStepNumber(ts, &step));
 16:   PetscCall(TSHistoryGetTimeStep(thadapt->hist, thadapt->bw, step + 1, next_h));
 17:   *accept  = PETSC_TRUE;
 18:   *next_sc = 0;
 19:   *wlte    = -1;
 20:   *wltea   = -1;
 21:   *wlter   = -1;
 22:   PetscFunctionReturn(PETSC_SUCCESS);
 23: }

 25: static PetscErrorCode TSAdaptReset_History(TSAdapt adapt)
 26: {
 27:   TSAdapt_History *thadapt = (TSAdapt_History *)adapt->data;

 29:   PetscFunctionBegin;
 30:   PetscCall(TSHistoryDestroy(&thadapt->hist));
 31:   PetscFunctionReturn(PETSC_SUCCESS);
 32: }

 34: static PetscErrorCode TSAdaptDestroy_History(TSAdapt adapt)
 35: {
 36:   PetscFunctionBegin;
 37:   PetscCall(TSAdaptReset_History(adapt));
 38:   PetscCall(PetscFree(adapt->data));
 39:   PetscFunctionReturn(PETSC_SUCCESS);
 40: }

 42: /* this is not public, as TSHistory is not a public object */
 43: PetscErrorCode TSAdaptHistorySetTSHistory(TSAdapt adapt, TSHistory hist, PetscBool backward)
 44: {
 45:   PetscReal *hist_t;
 46:   PetscInt   n;
 47:   PetscBool  flg;

 49:   PetscFunctionBegin;
 52:   PetscCall(PetscObjectTypeCompare((PetscObject)adapt, TSADAPTHISTORY, &flg));
 53:   if (!flg) PetscFunctionReturn(PETSC_SUCCESS);
 54:   PetscCall(TSHistoryGetHistory(hist, &n, (const PetscReal **)&hist_t, NULL, NULL));
 55:   PetscCall(TSAdaptHistorySetHistory(adapt, n, hist_t, backward));
 56:   PetscFunctionReturn(PETSC_SUCCESS);
 57: }

 59: /*@
 60:   TSAdaptHistoryGetStep - Gets time and time step for a given step number in the history

 62:   Logically Collective

 64:   Input Parameters:
 65: + adapt - the TSAdapt context
 66: - step  - the step number

 68:   Output Parameters:
 69: + t  - the time corresponding to the requested step (can be `NULL`)
 70: - dt - the time step to be taken at the requested step (can be `NULL`)

 72:   Level: advanced

 74:   Note:
 75:   The time history is internally copied, and the user can free the hist array. The user still needs to specify the termination of the solve via `TSSetMaxSteps()`.

 77: .seealso: [](ch_ts), `TS`, `TSGetAdapt()`, `TSAdaptSetType()`, `TSAdaptHistorySetTrajectory()`, `TSADAPTHISTORY`
 78: @*/
 79: PetscErrorCode TSAdaptHistoryGetStep(TSAdapt adapt, PetscInt step, PetscReal *t, PetscReal *dt)
 80: {
 81:   TSAdapt_History *thadapt;
 82:   PetscBool        flg;

 84:   PetscFunctionBegin;
 87:   PetscCall(PetscObjectTypeCompare((PetscObject)adapt, TSADAPTHISTORY, &flg));
 88:   PetscCheck(flg, PetscObjectComm((PetscObject)adapt), PETSC_ERR_SUP, "Not for type %s", ((PetscObject)adapt)->type_name);
 89:   thadapt = (TSAdapt_History *)adapt->data;
 90:   PetscCall(TSHistoryGetTimeStep(thadapt->hist, thadapt->bw, step, dt));
 91:   PetscCall(TSHistoryGetTime(thadapt->hist, thadapt->bw, step, t));
 92:   PetscFunctionReturn(PETSC_SUCCESS);
 93: }

 95: /*@
 96:   TSAdaptHistorySetHistory - Sets the time history in the adaptor

 98:   Logically Collective

100:   Input Parameters:
101: + adapt    - the `TSAdapt` context
102: . n        - size of the time history
103: . hist     - the time history
104: - backward - if the time history has to be followed backward

106:   Level: advanced

108:   Note:
109:   The time history is internally copied, and the user can free the hist array. The user still needs to specify the termination of the solve via `TSSetMaxSteps()`.

111: .seealso: [](ch_ts), `TSGetAdapt()`, `TSAdaptSetType()`, `TSAdaptHistorySetTrajectory()`, `TSADAPTHISTORY`
112: @*/
113: PetscErrorCode TSAdaptHistorySetHistory(TSAdapt adapt, PetscInt n, PetscReal hist[], PetscBool backward)
114: {
115:   TSAdapt_History *thadapt;
116:   PetscBool        flg;

118:   PetscFunctionBegin;
121:   PetscAssertPointer(hist, 3);
123:   PetscCall(PetscObjectTypeCompare((PetscObject)adapt, TSADAPTHISTORY, &flg));
124:   if (!flg) PetscFunctionReturn(PETSC_SUCCESS);
125:   thadapt = (TSAdapt_History *)adapt->data;
126:   PetscCall(TSHistoryDestroy(&thadapt->hist));
127:   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)adapt), &thadapt->hist));
128:   PetscCall(TSHistorySetHistory(thadapt->hist, n, hist, NULL, PETSC_FALSE));
129:   thadapt->bw = backward;
130:   PetscFunctionReturn(PETSC_SUCCESS);
131: }

133: /*@
134:   TSAdaptHistorySetTrajectory - Sets a time history in the adaptor from a given `TSTrajectory`

136:   Logically Collective

138:   Input Parameters:
139: + adapt    - the `TSAdapt` context
140: . tj       - the `TSTrajectory` context
141: - backward - if the time history has to be followed backward

143:   Level: advanced

145:   Notes:
146:   The time history is internally copied, and the user can destroy the `TSTrajectory` if not needed.

148:   The user still needs to specify the termination of the solve via `TSSetMaxSteps()`.

150: .seealso: [](ch_ts), `TSGetAdapt()`, `TSAdaptSetType()`, `TSAdaptHistorySetHistory()`, `TSADAPTHISTORY`, `TSAdapt`
151: @*/
152: PetscErrorCode TSAdaptHistorySetTrajectory(TSAdapt adapt, TSTrajectory tj, PetscBool backward)
153: {
154:   PetscBool flg;

156:   PetscFunctionBegin;
160:   PetscCall(PetscObjectTypeCompare((PetscObject)adapt, TSADAPTHISTORY, &flg));
161:   if (!flg) PetscFunctionReturn(PETSC_SUCCESS);
162:   PetscCall(TSAdaptHistorySetTSHistory(adapt, tj->tsh, backward));
163:   PetscFunctionReturn(PETSC_SUCCESS);
164: }

166: /*MC
167:    TSADAPTHISTORY - Time stepping controller that follows a given time history, used for Tangent Linear Model simulations

169:    Level: developer

171: .seealso: [](ch_ts), `TS`, `TSAdapt`, `TSGetAdapt()`, `TSAdaptHistorySetHistory()`, `TSAdaptType`
172: M*/
173: PETSC_EXTERN PetscErrorCode TSAdaptCreate_History(TSAdapt adapt)
174: {
175:   TSAdapt_History *thadapt;

177:   PetscFunctionBegin;
178:   PetscCall(PetscNew(&thadapt));
179:   adapt->matchstepfac[0] = PETSC_SMALL; /* prevent from accumulation errors */
180:   adapt->matchstepfac[1] = 0.0;         /* we will always match the final step, prevent TSAdaptChoose to mess with it */
181:   adapt->data            = thadapt;

183:   adapt->ops->choose  = TSAdaptChoose_History;
184:   adapt->ops->reset   = TSAdaptReset_History;
185:   adapt->ops->destroy = TSAdaptDestroy_History;
186:   PetscFunctionReturn(PETSC_SUCCESS);
187: }