1 #include <petsc/private/tshistoryimpl.h> /*I "petscts.h" I*/ 2 3 typedef struct { 4 TSHistory hist; 5 PetscBool bw; 6 } TSAdapt_History; 7 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; 12 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 } 24 25 static PetscErrorCode TSAdaptReset_History(TSAdapt adapt) 26 { 27 TSAdapt_History *thadapt = (TSAdapt_History *)adapt->data; 28 29 PetscFunctionBegin; 30 PetscCall(TSHistoryDestroy(&thadapt->hist)); 31 PetscFunctionReturn(PETSC_SUCCESS); 32 } 33 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 } 41 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; 48 49 PetscFunctionBegin; 50 PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1); 51 PetscValidLogicalCollectiveBool(adapt, backward, 3); 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 } 58 59 /*@ 60 TSAdaptHistoryGetStep - Gets time and time step for a given step number in the history 61 62 Logically Collective 63 64 Input Parameters: 65 + adapt - the TSAdapt context 66 - step - the step number 67 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) 71 72 Level: advanced 73 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()`. 76 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; 83 84 PetscFunctionBegin; 85 PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1); 86 PetscValidLogicalCollectiveInt(adapt, step, 2); 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 } 94 95 /*@ 96 TSAdaptHistorySetHistory - Sets the time history in the adaptor 97 98 Logically Collective 99 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 105 106 Level: advanced 107 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()`. 110 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; 117 118 PetscFunctionBegin; 119 PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1); 120 PetscValidLogicalCollectiveInt(adapt, n, 2); 121 PetscValidRealPointer(hist, 3); 122 PetscValidLogicalCollectiveBool(adapt, backward, 4); 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 } 132 133 /*@ 134 TSAdaptHistorySetTrajectory - Sets a time history in the adaptor from a given `TSTrajectory` 135 136 Logically Collective 137 138 Input Parameters: 139 + adapt - the `TSAdapt` context 140 . tj - the `TSTrajectory` context 141 - backward - if the time history has to be followed backward 142 143 Level: advanced 144 145 Notes: 146 The time history is internally copied, and the user can destroy the `TSTrajectory` if not needed. 147 148 The user still needs to specify the termination of the solve via `TSSetMaxSteps()`. 149 150 .seealso: [](ch_ts), `TSGetAdapt()`, `TSAdaptSetType()`, `TSAdaptHistorySetHistory()`, `TSADAPTHISTORY`, `TSAdapt` 151 @*/ 152 PetscErrorCode TSAdaptHistorySetTrajectory(TSAdapt adapt, TSTrajectory tj, PetscBool backward) 153 { 154 PetscBool flg; 155 156 PetscFunctionBegin; 157 PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1); 158 PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 2); 159 PetscValidLogicalCollectiveBool(adapt, backward, 3); 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 } 165 166 /*MC 167 TSADAPTHISTORY - Time stepping controller that follows a given time history, used for Tangent Linear Model simulations 168 169 Level: developer 170 171 .seealso: [](ch_ts), `TS`, `TSAdapt`, `TSGetAdapt()`, `TSAdaptHistorySetHistory()`, `TSAdaptType` 172 M*/ 173 PETSC_EXTERN PetscErrorCode TSAdaptCreate_History(TSAdapt adapt) 174 { 175 TSAdapt_History *thadapt; 176 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; 182 183 adapt->ops->choose = TSAdaptChoose_History; 184 adapt->ops->reset = TSAdaptReset_History; 185 adapt->ops->destroy = TSAdaptDestroy_History; 186 PetscFunctionReturn(PETSC_SUCCESS); 187 } 188