xref: /petsc/src/ts/adapt/interface/tsadapt.c (revision bcf0153e883cfed9568ef4557dcc209048fb58f7)
184df9cb4SJed Brown 
2af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I  "petscts.h" I*/
384df9cb4SJed Brown 
41b9b13dfSLisandro Dalcin PetscClassId TSADAPT_CLASSID;
51b9b13dfSLisandro Dalcin 
6140e18c1SBarry Smith static PetscFunctionList TSAdaptList;
784df9cb4SJed Brown static PetscBool         TSAdaptPackageInitialized;
884df9cb4SJed Brown static PetscBool         TSAdaptRegisterAllCalled;
984df9cb4SJed Brown 
108cc058d9SJed Brown PETSC_EXTERN PetscErrorCode TSAdaptCreate_None(TSAdapt);
111566a47fSLisandro Dalcin PETSC_EXTERN PetscErrorCode TSAdaptCreate_Basic(TSAdapt);
12cb7ab186SLisandro Dalcin PETSC_EXTERN PetscErrorCode TSAdaptCreate_DSP(TSAdapt);
138cc058d9SJed Brown PETSC_EXTERN PetscErrorCode TSAdaptCreate_CFL(TSAdapt);
141917a363SLisandro Dalcin PETSC_EXTERN PetscErrorCode TSAdaptCreate_GLEE(TSAdapt);
15d949e4a4SStefano Zampini PETSC_EXTERN PetscErrorCode TSAdaptCreate_History(TSAdapt);
1684df9cb4SJed Brown 
1784df9cb4SJed Brown /*@C
181c84c290SBarry Smith    TSAdaptRegister -  adds a TSAdapt implementation
191c84c290SBarry Smith 
201c84c290SBarry Smith    Not Collective
211c84c290SBarry Smith 
221c84c290SBarry Smith    Input Parameters:
231c84c290SBarry Smith +  name_scheme - name of user-defined adaptivity scheme
241c84c290SBarry Smith -  routine_create - routine to create method context
251c84c290SBarry Smith 
26*bcf0153eSBarry Smith    Level: advanced
27*bcf0153eSBarry Smith 
281c84c290SBarry Smith    Notes:
29*bcf0153eSBarry Smith    `TSAdaptRegister()` may be called multiple times to add several user-defined families.
301c84c290SBarry Smith 
311c84c290SBarry Smith    Sample usage:
321c84c290SBarry Smith .vb
33bdf89e91SBarry Smith    TSAdaptRegister("my_scheme",MySchemeCreate);
341c84c290SBarry Smith .ve
351c84c290SBarry Smith 
361c84c290SBarry Smith    Then, your scheme can be chosen with the procedural interface via
371c84c290SBarry Smith $     TSAdaptSetType(ts,"my_scheme")
381c84c290SBarry Smith    or at runtime via the option
391c84c290SBarry Smith $     -ts_adapt_type my_scheme
4084df9cb4SJed Brown 
41*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdaptRegisterAll()`
4284df9cb4SJed Brown @*/
43d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptRegister(const char sname[], PetscErrorCode (*function)(TSAdapt))
44d71ae5a4SJacob Faibussowitsch {
4584df9cb4SJed Brown   PetscFunctionBegin;
469566063dSJacob Faibussowitsch   PetscCall(TSAdaptInitializePackage());
479566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&TSAdaptList, sname, function));
4884df9cb4SJed Brown   PetscFunctionReturn(0);
4984df9cb4SJed Brown }
5084df9cb4SJed Brown 
5184df9cb4SJed Brown /*@C
5284df9cb4SJed Brown   TSAdaptRegisterAll - Registers all of the adaptivity schemes in TSAdapt
5384df9cb4SJed Brown 
5484df9cb4SJed Brown   Not Collective
5584df9cb4SJed Brown 
5684df9cb4SJed Brown   Level: advanced
5784df9cb4SJed Brown 
58*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdaptRegisterDestroy()`
5984df9cb4SJed Brown @*/
60d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptRegisterAll(void)
61d71ae5a4SJacob Faibussowitsch {
6284df9cb4SJed Brown   PetscFunctionBegin;
630f51fdf8SToby Isaac   if (TSAdaptRegisterAllCalled) PetscFunctionReturn(0);
640f51fdf8SToby Isaac   TSAdaptRegisterAllCalled = PETSC_TRUE;
659566063dSJacob Faibussowitsch   PetscCall(TSAdaptRegister(TSADAPTNONE, TSAdaptCreate_None));
669566063dSJacob Faibussowitsch   PetscCall(TSAdaptRegister(TSADAPTBASIC, TSAdaptCreate_Basic));
679566063dSJacob Faibussowitsch   PetscCall(TSAdaptRegister(TSADAPTDSP, TSAdaptCreate_DSP));
689566063dSJacob Faibussowitsch   PetscCall(TSAdaptRegister(TSADAPTCFL, TSAdaptCreate_CFL));
699566063dSJacob Faibussowitsch   PetscCall(TSAdaptRegister(TSADAPTGLEE, TSAdaptCreate_GLEE));
709566063dSJacob Faibussowitsch   PetscCall(TSAdaptRegister(TSADAPTHISTORY, TSAdaptCreate_History));
7184df9cb4SJed Brown   PetscFunctionReturn(0);
7284df9cb4SJed Brown }
7384df9cb4SJed Brown 
7484df9cb4SJed Brown /*@C
75560360afSLisandro Dalcin   TSAdaptFinalizePackage - This function destroys everything in the TS package. It is
7684df9cb4SJed Brown   called from PetscFinalize().
7784df9cb4SJed Brown 
7884df9cb4SJed Brown   Level: developer
7984df9cb4SJed Brown 
80*bcf0153eSBarry Smith .seealso: [](chapter_ts), `PetscFinalize()`
8184df9cb4SJed Brown @*/
82d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptFinalizePackage(void)
83d71ae5a4SJacob Faibussowitsch {
8484df9cb4SJed Brown   PetscFunctionBegin;
859566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&TSAdaptList));
8684df9cb4SJed Brown   TSAdaptPackageInitialized = PETSC_FALSE;
8784df9cb4SJed Brown   TSAdaptRegisterAllCalled  = PETSC_FALSE;
8884df9cb4SJed Brown   PetscFunctionReturn(0);
8984df9cb4SJed Brown }
9084df9cb4SJed Brown 
9184df9cb4SJed Brown /*@C
9284df9cb4SJed Brown   TSAdaptInitializePackage - This function initializes everything in the TSAdapt package. It is
938a690491SBarry Smith   called from TSInitializePackage().
9484df9cb4SJed Brown 
9584df9cb4SJed Brown   Level: developer
9684df9cb4SJed Brown 
97*bcf0153eSBarry Smith .seealso: [](chapter_ts), `PetscInitialize()`
9884df9cb4SJed Brown @*/
99d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptInitializePackage(void)
100d71ae5a4SJacob Faibussowitsch {
10184df9cb4SJed Brown   PetscFunctionBegin;
10284df9cb4SJed Brown   if (TSAdaptPackageInitialized) PetscFunctionReturn(0);
10384df9cb4SJed Brown   TSAdaptPackageInitialized = PETSC_TRUE;
1049566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("TSAdapt", &TSADAPT_CLASSID));
1059566063dSJacob Faibussowitsch   PetscCall(TSAdaptRegisterAll());
1069566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(TSAdaptFinalizePackage));
10784df9cb4SJed Brown   PetscFunctionReturn(0);
10884df9cb4SJed Brown }
10984df9cb4SJed Brown 
1107eef6055SBarry Smith /*@C
111*bcf0153eSBarry Smith   TSAdaptSetType - sets the approach used for the error adapter
1127eef6055SBarry Smith 
113*bcf0153eSBarry Smith   Logicially Collective onadapt
1147eef6055SBarry Smith 
115d8d19677SJose E. Roman   Input Parameters:
116*bcf0153eSBarry Smith + adapt - the TS adapter, most likely obtained with `TSGetAdapt()`
117*bcf0153eSBarry Smith - type - one of the `TSAdaptType`
1187eef6055SBarry Smith 
119*bcf0153eSBarry Smith   Options Database Key:
120ec18b7bcSLisandro Dalcin . -ts_adapt_type <basic or dsp or none> - to set the adapter type
1217eef6055SBarry Smith 
1227eef6055SBarry Smith   Level: intermediate
1237eef6055SBarry Smith 
124*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSGetAdapt()`, `TSAdaptDestroy()`, `TSAdaptType`, `TSAdaptGetType()`, `TSAdaptType`
1257eef6055SBarry Smith @*/
126d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetType(TSAdapt adapt, TSAdaptType type)
127d71ae5a4SJacob Faibussowitsch {
128ef749922SLisandro Dalcin   PetscBool match;
1295f80ce2aSJacob Faibussowitsch   PetscErrorCode (*r)(TSAdapt);
13084df9cb4SJed Brown 
13184df9cb4SJed Brown   PetscFunctionBegin;
1324782b174SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
133b92453a8SLisandro Dalcin   PetscValidCharPointer(type, 2);
1349566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)adapt, type, &match));
135ef749922SLisandro Dalcin   if (match) PetscFunctionReturn(0);
1369566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSAdaptList, type, &r));
1373c633725SBarry Smith   PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSAdapt type \"%s\" given", type);
138dbbe0bcdSBarry Smith   PetscTryTypeMethod(adapt, destroy);
1399566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(adapt->ops, sizeof(struct _TSAdaptOps)));
1409566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)adapt, type));
1419566063dSJacob Faibussowitsch   PetscCall((*r)(adapt));
14284df9cb4SJed Brown   PetscFunctionReturn(0);
14384df9cb4SJed Brown }
14484df9cb4SJed Brown 
145d0288e4fSLisandro Dalcin /*@C
146d0288e4fSLisandro Dalcin   TSAdaptGetType - gets the TS adapter method type (as a string).
147d0288e4fSLisandro Dalcin 
148d0288e4fSLisandro Dalcin   Not Collective
149d0288e4fSLisandro Dalcin 
150d0288e4fSLisandro Dalcin   Input Parameter:
151d0288e4fSLisandro Dalcin . adapt - The TS adapter, most likely obtained with TSGetAdapt()
152d0288e4fSLisandro Dalcin 
153d0288e4fSLisandro Dalcin   Output Parameter:
154d0288e4fSLisandro Dalcin . type - The name of TS adapter method
155d0288e4fSLisandro Dalcin 
156d0288e4fSLisandro Dalcin   Level: intermediate
157d0288e4fSLisandro Dalcin 
158db781477SPatrick Sanan .seealso `TSAdaptSetType()`
159d0288e4fSLisandro Dalcin @*/
160d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptGetType(TSAdapt adapt, TSAdaptType *type)
161d71ae5a4SJacob Faibussowitsch {
162d0288e4fSLisandro Dalcin   PetscFunctionBegin;
163d0288e4fSLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
164d0288e4fSLisandro Dalcin   PetscValidPointer(type, 2);
165d0288e4fSLisandro Dalcin   *type = ((PetscObject)adapt)->type_name;
166d0288e4fSLisandro Dalcin   PetscFunctionReturn(0);
167d0288e4fSLisandro Dalcin }
168d0288e4fSLisandro Dalcin 
169d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetOptionsPrefix(TSAdapt adapt, const char prefix[])
170d71ae5a4SJacob Faibussowitsch {
17184df9cb4SJed Brown   PetscFunctionBegin;
1724782b174SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
1739566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)adapt, prefix));
17484df9cb4SJed Brown   PetscFunctionReturn(0);
17584df9cb4SJed Brown }
17684df9cb4SJed Brown 
177ad6bc421SBarry Smith /*@C
178ad6bc421SBarry Smith   TSAdaptLoad - Loads a TSAdapt that has been stored in binary  with TSAdaptView().
179ad6bc421SBarry Smith 
180*bcf0153eSBarry Smith   Collective on adapt
181ad6bc421SBarry Smith 
182ad6bc421SBarry Smith   Input Parameters:
183*bcf0153eSBarry Smith + newdm - the newly loaded `TSAdapt`, this needs to have been created with `TSAdaptCreate()` or
184*bcf0153eSBarry Smith            some related function before a call to `TSAdaptLoad()`.
185*bcf0153eSBarry Smith - viewer - binary file viewer, obtained from `PetscViewerBinaryOpen()` or
186*bcf0153eSBarry Smith            HDF5 file viewer, obtained from `PetscViewerHDF5Open()`
187ad6bc421SBarry Smith 
188ad6bc421SBarry Smith    Level: intermediate
189ad6bc421SBarry Smith 
190*bcf0153eSBarry Smith   Note:
191*bcf0153eSBarry Smith    The type is determined by the data in the file, any type set into the `TSAdapt` before this call is ignored.
192ad6bc421SBarry Smith 
193*bcf0153eSBarry Smith .seealso: [](chapter_ts), `PetscViewerBinaryOpen()`, `TSAdaptView()`, `MatLoad()`, `VecLoad()`, `TSAdapt`
194ad6bc421SBarry Smith @*/
195d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptLoad(TSAdapt adapt, PetscViewer viewer)
196d71ae5a4SJacob Faibussowitsch {
197ad6bc421SBarry Smith   PetscBool isbinary;
198ad6bc421SBarry Smith   char      type[256];
199ad6bc421SBarry Smith 
200ad6bc421SBarry Smith   PetscFunctionBegin;
2014782b174SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
202ad6bc421SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
2039566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY, &isbinary));
2043c633725SBarry Smith   PetscCheck(isbinary, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid viewer; open viewer with PetscViewerBinaryOpen()");
205ad6bc421SBarry Smith 
2069566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(viewer, type, 256, NULL, PETSC_CHAR));
2079566063dSJacob Faibussowitsch   PetscCall(TSAdaptSetType(adapt, type));
208dbbe0bcdSBarry Smith   PetscTryTypeMethod(adapt, load, viewer);
209ad6bc421SBarry Smith   PetscFunctionReturn(0);
210ad6bc421SBarry Smith }
211ad6bc421SBarry Smith 
212d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptView(TSAdapt adapt, PetscViewer viewer)
213d71ae5a4SJacob Faibussowitsch {
2141c167fc2SEmil Constantinescu   PetscBool iascii, isbinary, isnone, isglee;
21584df9cb4SJed Brown 
21684df9cb4SJed Brown   PetscFunctionBegin;
2174782b174SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
2189566063dSJacob Faibussowitsch   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)adapt), &viewer));
2194782b174SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
2204782b174SLisandro Dalcin   PetscCheckSameComm(adapt, 1, viewer, 2);
2219566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
2229566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY, &isbinary));
22384df9cb4SJed Brown   if (iascii) {
2249566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)adapt, viewer));
2259566063dSJacob Faibussowitsch     PetscCall(PetscObjectTypeCompare((PetscObject)adapt, TSADAPTNONE, &isnone));
2269566063dSJacob Faibussowitsch     PetscCall(PetscObjectTypeCompare((PetscObject)adapt, TSADAPTGLEE, &isglee));
2271917a363SLisandro Dalcin     if (!isnone) {
2289566063dSJacob Faibussowitsch       if (adapt->always_accept) PetscCall(PetscViewerASCIIPrintf(viewer, "  always accepting steps\n"));
2299566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  safety factor %g\n", (double)adapt->safety));
2309566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  extra safety factor after step rejection %g\n", (double)adapt->reject_safety));
2319566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  clip fastest increase %g\n", (double)adapt->clip[1]));
2329566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  clip fastest decrease %g\n", (double)adapt->clip[0]));
2339566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  maximum allowed timestep %g\n", (double)adapt->dt_max));
2349566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  minimum allowed timestep %g\n", (double)adapt->dt_min));
2359566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  maximum solution absolute value to be ignored %g\n", (double)adapt->ignore_max));
2361c167fc2SEmil Constantinescu     }
2371c167fc2SEmil Constantinescu     if (isglee) {
2381c167fc2SEmil Constantinescu       if (adapt->glee_use_local) {
2399566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(viewer, "  GLEE uses local error control\n"));
2401c167fc2SEmil Constantinescu       } else {
2419566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(viewer, "  GLEE uses global error control\n"));
2421c167fc2SEmil Constantinescu       }
2431917a363SLisandro Dalcin     }
2449566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
245dbbe0bcdSBarry Smith     PetscTryTypeMethod(adapt, view, viewer);
2469566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
247ad6bc421SBarry Smith   } else if (isbinary) {
248ad6bc421SBarry Smith     char type[256];
249ad6bc421SBarry Smith 
250ad6bc421SBarry Smith     /* need to save FILE_CLASS_ID for adapt class */
2519566063dSJacob Faibussowitsch     PetscCall(PetscStrncpy(type, ((PetscObject)adapt)->type_name, 256));
2529566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(viewer, type, 256, PETSC_CHAR));
253dbbe0bcdSBarry Smith   } else PetscTryTypeMethod(adapt, view, viewer);
25484df9cb4SJed Brown   PetscFunctionReturn(0);
25584df9cb4SJed Brown }
25684df9cb4SJed Brown 
257099af0a3SLisandro Dalcin /*@
258*bcf0153eSBarry Smith    TSAdaptReset - Resets a `TSAdapt` context to its defaults
259099af0a3SLisandro Dalcin 
260*bcf0153eSBarry Smith    Collective on adapt
261099af0a3SLisandro Dalcin 
262099af0a3SLisandro Dalcin    Input Parameter:
263*bcf0153eSBarry Smith .  adapt - the `TSAdapt` context obtained from `TSGetAdapt()` or `TSAdaptCreate()`
264099af0a3SLisandro Dalcin 
265099af0a3SLisandro Dalcin    Level: developer
266099af0a3SLisandro Dalcin 
267*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSGetAdapt()`, `TSAdapt`, `TSAdaptCreate()`, `TSAdaptDestroy()`
268099af0a3SLisandro Dalcin @*/
269d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptReset(TSAdapt adapt)
270d71ae5a4SJacob Faibussowitsch {
271099af0a3SLisandro Dalcin   PetscFunctionBegin;
272099af0a3SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
273dbbe0bcdSBarry Smith   PetscTryTypeMethod(adapt, reset);
274099af0a3SLisandro Dalcin   PetscFunctionReturn(0);
275099af0a3SLisandro Dalcin }
276099af0a3SLisandro Dalcin 
277d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptDestroy(TSAdapt *adapt)
278d71ae5a4SJacob Faibussowitsch {
27984df9cb4SJed Brown   PetscFunctionBegin;
28084df9cb4SJed Brown   if (!*adapt) PetscFunctionReturn(0);
28184df9cb4SJed Brown   PetscValidHeaderSpecific(*adapt, TSADAPT_CLASSID, 1);
2829371c9d4SSatish Balay   if (--((PetscObject)(*adapt))->refct > 0) {
2839371c9d4SSatish Balay     *adapt = NULL;
2849371c9d4SSatish Balay     PetscFunctionReturn(0);
2859371c9d4SSatish Balay   }
286099af0a3SLisandro Dalcin 
2879566063dSJacob Faibussowitsch   PetscCall(TSAdaptReset(*adapt));
288099af0a3SLisandro Dalcin 
289dbbe0bcdSBarry Smith   PetscTryTypeMethod((*adapt), destroy);
2909566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*adapt)->monitor));
2919566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(adapt));
29284df9cb4SJed Brown   PetscFunctionReturn(0);
29384df9cb4SJed Brown }
29484df9cb4SJed Brown 
2951c3436cfSJed Brown /*@
2961c3436cfSJed Brown    TSAdaptSetMonitor - Monitor the choices made by the adaptive controller
2971c3436cfSJed Brown 
298*bcf0153eSBarry Smith    Collective on adapt
2991c3436cfSJed Brown 
3004165533cSJose E. Roman    Input Parameters:
3011c3436cfSJed Brown +  adapt - adaptive controller context
302*bcf0153eSBarry Smith -  flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable
3031c3436cfSJed Brown 
304*bcf0153eSBarry Smith    Options Database Key:
305ec18b7bcSLisandro Dalcin .  -ts_adapt_monitor - to turn on monitoring
306bf997491SLisandro Dalcin 
3071c3436cfSJed Brown    Level: intermediate
3081c3436cfSJed Brown 
309*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSGetAdapt()`, `TSAdaptChoose()`
3101c3436cfSJed Brown @*/
311d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetMonitor(TSAdapt adapt, PetscBool flg)
312d71ae5a4SJacob Faibussowitsch {
3131c3436cfSJed Brown   PetscFunctionBegin;
3144782b174SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
3154782b174SLisandro Dalcin   PetscValidLogicalCollectiveBool(adapt, flg, 2);
3161c3436cfSJed Brown   if (flg) {
3179566063dSJacob Faibussowitsch     if (!adapt->monitor) PetscCall(PetscViewerASCIIOpen(PetscObjectComm((PetscObject)adapt), "stdout", &adapt->monitor));
3181c3436cfSJed Brown   } else {
3199566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&adapt->monitor));
3201c3436cfSJed Brown   }
3211c3436cfSJed Brown   PetscFunctionReturn(0);
3221c3436cfSJed Brown }
3231c3436cfSJed Brown 
3240873808bSJed Brown /*@C
325bf997491SLisandro Dalcin    TSAdaptSetCheckStage - Set a callback to check convergence for a stage
3260873808bSJed Brown 
327*bcf0153eSBarry Smith    Logically collective on adapt
3280873808bSJed Brown 
3294165533cSJose E. Roman    Input Parameters:
3300873808bSJed Brown +  adapt - adaptive controller context
3310873808bSJed Brown -  func - stage check function
3320873808bSJed Brown 
3330873808bSJed Brown    Arguments of func:
3340873808bSJed Brown $  PetscErrorCode func(TSAdapt adapt,TS ts,PetscBool *accept)
3350873808bSJed Brown 
3360873808bSJed Brown +  adapt - adaptive controller context
3370873808bSJed Brown .  ts - time stepping context
3380873808bSJed Brown -  accept - pending choice of whether to accept, can be modified by this routine
3390873808bSJed Brown 
3400873808bSJed Brown    Level: advanced
3410873808bSJed Brown 
342*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSGetAdapt()`, `TSAdaptChoose()`
3430873808bSJed Brown @*/
344d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetCheckStage(TSAdapt adapt, PetscErrorCode (*func)(TSAdapt, TS, PetscReal, Vec, PetscBool *))
345d71ae5a4SJacob Faibussowitsch {
3460873808bSJed Brown   PetscFunctionBegin;
3470873808bSJed Brown   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
34868ae941aSLisandro Dalcin   adapt->checkstage = func;
3490873808bSJed Brown   PetscFunctionReturn(0);
3500873808bSJed Brown }
3510873808bSJed Brown 
3521c3436cfSJed Brown /*@
353bf997491SLisandro Dalcin    TSAdaptSetAlwaysAccept - Set whether to always accept steps regardless of
354bf997491SLisandro Dalcin    any error or stability condition not meeting the prescribed goal.
355bf997491SLisandro Dalcin 
356*bcf0153eSBarry Smith    Logically collective on adapt
357bf997491SLisandro Dalcin 
3584165533cSJose E. Roman    Input Parameters:
359*bcf0153eSBarry Smith +  adapt - time step adaptivity context, usually gotten with `TSGetAdapt()`
360bf997491SLisandro Dalcin -  flag - whether to always accept steps
361bf997491SLisandro Dalcin 
362*bcf0153eSBarry Smith    Options Database Key:
363ec18b7bcSLisandro Dalcin .  -ts_adapt_always_accept - to always accept steps
364bf997491SLisandro Dalcin 
365bf997491SLisandro Dalcin    Level: intermediate
366bf997491SLisandro Dalcin 
367*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSGetAdapt()`, `TSAdaptChoose()`
368bf997491SLisandro Dalcin @*/
369d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetAlwaysAccept(TSAdapt adapt, PetscBool flag)
370d71ae5a4SJacob Faibussowitsch {
371bf997491SLisandro Dalcin   PetscFunctionBegin;
372bf997491SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
373bf997491SLisandro Dalcin   PetscValidLogicalCollectiveBool(adapt, flag, 2);
374bf997491SLisandro Dalcin   adapt->always_accept = flag;
375bf997491SLisandro Dalcin   PetscFunctionReturn(0);
376bf997491SLisandro Dalcin }
377bf997491SLisandro Dalcin 
378bf997491SLisandro Dalcin /*@
379*bcf0153eSBarry Smith    TSAdaptSetSafety - Set safety factors for time step adaptor
3801c3436cfSJed Brown 
381*bcf0153eSBarry Smith    Logically collective on adapt
3821917a363SLisandro Dalcin 
3834165533cSJose E. Roman    Input Parameters:
3841917a363SLisandro Dalcin +  adapt - adaptive controller context
3851917a363SLisandro Dalcin .  safety - safety factor relative to target error/stability goal
386ec18b7bcSLisandro Dalcin -  reject_safety - extra safety factor to apply if the last step was rejected
3871917a363SLisandro Dalcin 
3881917a363SLisandro Dalcin    Options Database Keys:
389ec18b7bcSLisandro Dalcin +  -ts_adapt_safety <safety> - to set safety factor
390ec18b7bcSLisandro Dalcin -  -ts_adapt_reject_safety <reject_safety> - to set reject safety factor
3911917a363SLisandro Dalcin 
3921917a363SLisandro Dalcin    Level: intermediate
3931917a363SLisandro Dalcin 
394*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptGetSafety()`, `TSAdaptChoose()`
3951917a363SLisandro Dalcin @*/
396d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetSafety(TSAdapt adapt, PetscReal safety, PetscReal reject_safety)
397d71ae5a4SJacob Faibussowitsch {
3981917a363SLisandro Dalcin   PetscFunctionBegin;
3991917a363SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
4001917a363SLisandro Dalcin   PetscValidLogicalCollectiveReal(adapt, safety, 2);
4011917a363SLisandro Dalcin   PetscValidLogicalCollectiveReal(adapt, reject_safety, 3);
4023c633725SBarry Smith   PetscCheck(safety == PETSC_DEFAULT || safety >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Safety factor %g must be non negative", (double)safety);
4033c633725SBarry Smith   PetscCheck(safety == PETSC_DEFAULT || safety <= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Safety factor %g must be less than one", (double)safety);
4043c633725SBarry Smith   PetscCheck(reject_safety == PETSC_DEFAULT || reject_safety >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Reject safety factor %g must be non negative", (double)reject_safety);
4053c633725SBarry Smith   PetscCheck(reject_safety == PETSC_DEFAULT || reject_safety <= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Reject safety factor %g must be less than one", (double)reject_safety);
4061917a363SLisandro Dalcin   if (safety != PETSC_DEFAULT) adapt->safety = safety;
4071917a363SLisandro Dalcin   if (reject_safety != PETSC_DEFAULT) adapt->reject_safety = reject_safety;
4081917a363SLisandro Dalcin   PetscFunctionReturn(0);
4091917a363SLisandro Dalcin }
4101917a363SLisandro Dalcin 
4111917a363SLisandro Dalcin /*@
412*bcf0153eSBarry Smith    TSAdaptGetSafety - Get safety factors for time step adapter
4131917a363SLisandro Dalcin 
4141917a363SLisandro Dalcin    Not Collective
4151917a363SLisandro Dalcin 
4164165533cSJose E. Roman    Input Parameter:
4171917a363SLisandro Dalcin .  adapt - adaptive controller context
4181917a363SLisandro Dalcin 
4194165533cSJose E. Roman    Output Parameters:
4201917a363SLisandro Dalcin .  safety - safety factor relative to target error/stability goal
4211917a363SLisandro Dalcin +  reject_safety - extra safety factor to apply if the last step was rejected
4221917a363SLisandro Dalcin 
4231917a363SLisandro Dalcin    Level: intermediate
4241917a363SLisandro Dalcin 
425*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptSetSafety()`, `TSAdaptChoose()`
4261917a363SLisandro Dalcin @*/
427d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptGetSafety(TSAdapt adapt, PetscReal *safety, PetscReal *reject_safety)
428d71ae5a4SJacob Faibussowitsch {
4291917a363SLisandro Dalcin   PetscFunctionBegin;
4301917a363SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
4311917a363SLisandro Dalcin   if (safety) PetscValidRealPointer(safety, 2);
4321917a363SLisandro Dalcin   if (reject_safety) PetscValidRealPointer(reject_safety, 3);
4331917a363SLisandro Dalcin   if (safety) *safety = adapt->safety;
4341917a363SLisandro Dalcin   if (reject_safety) *reject_safety = adapt->reject_safety;
4351917a363SLisandro Dalcin   PetscFunctionReturn(0);
4361917a363SLisandro Dalcin }
4371917a363SLisandro Dalcin 
4381917a363SLisandro Dalcin /*@
439*bcf0153eSBarry Smith    TSAdaptSetMaxIgnore - Set error estimation threshold. Solution components below this threshold value will not be considered when computing error norms
440*bcf0153eSBarry Smith    for time step adaptivity (in absolute value). A negative value (default) of the threshold leads to considering all solution components.
44176cddca1SEmil Constantinescu 
442*bcf0153eSBarry Smith    Logically collective on adapt
44376cddca1SEmil Constantinescu 
4444165533cSJose E. Roman    Input Parameters:
44576cddca1SEmil Constantinescu +  adapt - adaptive controller context
44676cddca1SEmil Constantinescu -  max_ignore - threshold for solution components that are ignored during error estimation
44776cddca1SEmil Constantinescu 
448*bcf0153eSBarry Smith    Options Database Key:
44976cddca1SEmil Constantinescu .  -ts_adapt_max_ignore <max_ignore> - to set the threshold
45076cddca1SEmil Constantinescu 
45176cddca1SEmil Constantinescu    Level: intermediate
45276cddca1SEmil Constantinescu 
453*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptGetMaxIgnore()`, `TSAdaptChoose()`
45476cddca1SEmil Constantinescu @*/
455d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetMaxIgnore(TSAdapt adapt, PetscReal max_ignore)
456d71ae5a4SJacob Faibussowitsch {
45776cddca1SEmil Constantinescu   PetscFunctionBegin;
45876cddca1SEmil Constantinescu   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
45976cddca1SEmil Constantinescu   PetscValidLogicalCollectiveReal(adapt, max_ignore, 2);
46076cddca1SEmil Constantinescu   adapt->ignore_max = max_ignore;
46176cddca1SEmil Constantinescu   PetscFunctionReturn(0);
46276cddca1SEmil Constantinescu }
46376cddca1SEmil Constantinescu 
46476cddca1SEmil Constantinescu /*@
465*bcf0153eSBarry Smith    TSAdaptGetMaxIgnore - Get error estimation threshold. Solution components below this threshold value will not be considered when computing error norms
466*bcf0153eSBarry Smith    for time step adaptivity (in absolute value).
46776cddca1SEmil Constantinescu 
46876cddca1SEmil Constantinescu    Not Collective
46976cddca1SEmil Constantinescu 
4704165533cSJose E. Roman    Input Parameter:
47176cddca1SEmil Constantinescu .  adapt - adaptive controller context
47276cddca1SEmil Constantinescu 
4734165533cSJose E. Roman    Output Parameter:
47476cddca1SEmil Constantinescu .  max_ignore - threshold for solution components that are ignored during error estimation
47576cddca1SEmil Constantinescu 
47676cddca1SEmil Constantinescu    Level: intermediate
47776cddca1SEmil Constantinescu 
478*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptSetMaxIgnore()`, `TSAdaptChoose()`
47976cddca1SEmil Constantinescu @*/
480d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptGetMaxIgnore(TSAdapt adapt, PetscReal *max_ignore)
481d71ae5a4SJacob Faibussowitsch {
48276cddca1SEmil Constantinescu   PetscFunctionBegin;
48376cddca1SEmil Constantinescu   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
48476cddca1SEmil Constantinescu   PetscValidRealPointer(max_ignore, 2);
48576cddca1SEmil Constantinescu   *max_ignore = adapt->ignore_max;
48676cddca1SEmil Constantinescu   PetscFunctionReturn(0);
48776cddca1SEmil Constantinescu }
48876cddca1SEmil Constantinescu 
48976cddca1SEmil Constantinescu /*@
490*bcf0153eSBarry Smith    TSAdaptSetClip - Sets the admissible decrease/increase factor in step size in the time step adapter
4911917a363SLisandro Dalcin 
492*bcf0153eSBarry Smith    Logically collective on adapt
4931917a363SLisandro Dalcin 
4944165533cSJose E. Roman    Input Parameters:
4951917a363SLisandro Dalcin +  adapt - adaptive controller context
4961917a363SLisandro Dalcin .  low - admissible decrease factor
497ec18b7bcSLisandro Dalcin -  high - admissible increase factor
4981917a363SLisandro Dalcin 
499*bcf0153eSBarry Smith    Options Database Key:
500ec18b7bcSLisandro Dalcin .  -ts_adapt_clip <low>,<high> - to set admissible time step decrease and increase factors
5011917a363SLisandro Dalcin 
5021917a363SLisandro Dalcin    Level: intermediate
5031917a363SLisandro Dalcin 
504*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptChoose()`, `TSAdaptGetClip()`, `TSAdaptSetScaleSolveFailed()`
5051917a363SLisandro Dalcin @*/
506d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetClip(TSAdapt adapt, PetscReal low, PetscReal high)
507d71ae5a4SJacob Faibussowitsch {
5081917a363SLisandro Dalcin   PetscFunctionBegin;
5091917a363SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
5101917a363SLisandro Dalcin   PetscValidLogicalCollectiveReal(adapt, low, 2);
5111917a363SLisandro Dalcin   PetscValidLogicalCollectiveReal(adapt, high, 3);
5123c633725SBarry Smith   PetscCheck(low == PETSC_DEFAULT || low >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Decrease factor %g must be non negative", (double)low);
5133c633725SBarry Smith   PetscCheck(low == PETSC_DEFAULT || low <= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Decrease factor %g must be less than one", (double)low);
5143c633725SBarry Smith   PetscCheck(high == PETSC_DEFAULT || high >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Increase factor %g must be greater than one", (double)high);
5151917a363SLisandro Dalcin   if (low != PETSC_DEFAULT) adapt->clip[0] = low;
5161917a363SLisandro Dalcin   if (high != PETSC_DEFAULT) adapt->clip[1] = high;
5171917a363SLisandro Dalcin   PetscFunctionReturn(0);
5181917a363SLisandro Dalcin }
5191917a363SLisandro Dalcin 
5201917a363SLisandro Dalcin /*@
521*bcf0153eSBarry Smith    TSAdaptGetClip - Gets the admissible decrease/increase factor in step size in the time step adapter
5221917a363SLisandro Dalcin 
5231917a363SLisandro Dalcin    Not Collective
5241917a363SLisandro Dalcin 
5254165533cSJose E. Roman    Input Parameter:
5261917a363SLisandro Dalcin .  adapt - adaptive controller context
5271917a363SLisandro Dalcin 
5284165533cSJose E. Roman    Output Parameters:
5291917a363SLisandro Dalcin +  low - optional, admissible decrease factor
5301917a363SLisandro Dalcin -  high - optional, admissible increase factor
5311917a363SLisandro Dalcin 
5321917a363SLisandro Dalcin    Level: intermediate
5331917a363SLisandro Dalcin 
534*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptChoose()`, `TSAdaptSetClip()`, `TSAdaptSetScaleSolveFailed()`
5351917a363SLisandro Dalcin @*/
536d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptGetClip(TSAdapt adapt, PetscReal *low, PetscReal *high)
537d71ae5a4SJacob Faibussowitsch {
5381917a363SLisandro Dalcin   PetscFunctionBegin;
5391917a363SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
5401917a363SLisandro Dalcin   if (low) PetscValidRealPointer(low, 2);
5411917a363SLisandro Dalcin   if (high) PetscValidRealPointer(high, 3);
5421917a363SLisandro Dalcin   if (low) *low = adapt->clip[0];
5431917a363SLisandro Dalcin   if (high) *high = adapt->clip[1];
5441917a363SLisandro Dalcin   PetscFunctionReturn(0);
5451917a363SLisandro Dalcin }
5461917a363SLisandro Dalcin 
5471917a363SLisandro Dalcin /*@
548*bcf0153eSBarry Smith    TSAdaptSetScaleSolveFailed - Scale step size by this factor if solve fails
54962c23b28SMark 
550*bcf0153eSBarry Smith    Logically collective on adapt
55162c23b28SMark 
5524165533cSJose E. Roman    Input Parameters:
55362c23b28SMark +  adapt - adaptive controller context
554ee300463SSatish Balay -  scale - scale
55562c23b28SMark 
556*bcf0153eSBarry Smith    Options Database Key:
55762c23b28SMark .  -ts_adapt_scale_solve_failed <scale> - to set scale step by this factor if solve fails
55862c23b28SMark 
55962c23b28SMark    Level: intermediate
56062c23b28SMark 
561*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptChoose()`, `TSAdaptGetScaleSolveFailed()`, `TSAdaptGetClip()`
56262c23b28SMark @*/
563d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetScaleSolveFailed(TSAdapt adapt, PetscReal scale)
564d71ae5a4SJacob Faibussowitsch {
56562c23b28SMark   PetscFunctionBegin;
56662c23b28SMark   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
56762c23b28SMark   PetscValidLogicalCollectiveReal(adapt, scale, 2);
5683c633725SBarry Smith   PetscCheck(scale == PETSC_DEFAULT || scale > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Scale factor %g must be positive", (double)scale);
5693c633725SBarry Smith   PetscCheck(scale == PETSC_DEFAULT || scale <= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Scale factor %g must be less than one", (double)scale);
57062c23b28SMark   if (scale != PETSC_DEFAULT) adapt->scale_solve_failed = scale;
57162c23b28SMark   PetscFunctionReturn(0);
57262c23b28SMark }
57362c23b28SMark 
57462c23b28SMark /*@
57562c23b28SMark    TSAdaptGetScaleSolveFailed - Gets the admissible decrease/increase factor in step size
57662c23b28SMark 
57762c23b28SMark    Not Collective
57862c23b28SMark 
5794165533cSJose E. Roman    Input Parameter:
58062c23b28SMark .  adapt - adaptive controller context
58162c23b28SMark 
5824165533cSJose E. Roman    Output Parameter:
583ee300463SSatish Balay .  scale - scale factor
58462c23b28SMark 
58562c23b28SMark    Level: intermediate
58662c23b28SMark 
587*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptChoose()`, `TSAdaptSetScaleSolveFailed()`, `TSAdaptSetClip()`
58862c23b28SMark @*/
589d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptGetScaleSolveFailed(TSAdapt adapt, PetscReal *scale)
590d71ae5a4SJacob Faibussowitsch {
59162c23b28SMark   PetscFunctionBegin;
59262c23b28SMark   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
59362c23b28SMark   if (scale) PetscValidRealPointer(scale, 2);
59462c23b28SMark   if (scale) *scale = adapt->scale_solve_failed;
59562c23b28SMark   PetscFunctionReturn(0);
59662c23b28SMark }
59762c23b28SMark 
59862c23b28SMark /*@
599*bcf0153eSBarry Smith    TSAdaptSetStepLimits - Set the minimum and maximum step sizes to be considered by the time step controller
6001917a363SLisandro Dalcin 
601*bcf0153eSBarry Smith    Logically collective on adapt
6021c3436cfSJed Brown 
6034165533cSJose E. Roman    Input Parameters:
604*bcf0153eSBarry Smith +  adapt - time step adaptivity context, usually gotten with `TSGetAdapt()`
6051c3436cfSJed Brown .  hmin - minimum time step
6061c3436cfSJed Brown -  hmax - maximum time step
6071c3436cfSJed Brown 
6081c3436cfSJed Brown    Options Database Keys:
609ec18b7bcSLisandro Dalcin +  -ts_adapt_dt_min <min> - to set minimum time step
610ec18b7bcSLisandro Dalcin -  -ts_adapt_dt_max <max> - to set maximum time step
6111c3436cfSJed Brown 
6121c3436cfSJed Brown    Level: intermediate
6131c3436cfSJed Brown 
614*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptGetStepLimits()`, `TSAdaptChoose()`
6151c3436cfSJed Brown @*/
616d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetStepLimits(TSAdapt adapt, PetscReal hmin, PetscReal hmax)
617d71ae5a4SJacob Faibussowitsch {
6181c3436cfSJed Brown   PetscFunctionBegin;
6194782b174SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
620b1f5bccaSLisandro Dalcin   PetscValidLogicalCollectiveReal(adapt, hmin, 2);
621b1f5bccaSLisandro Dalcin   PetscValidLogicalCollectiveReal(adapt, hmax, 3);
6223c633725SBarry Smith   PetscCheck(hmin == PETSC_DEFAULT || hmin >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Minimum time step %g must be non negative", (double)hmin);
6233c633725SBarry Smith   PetscCheck(hmax == PETSC_DEFAULT || hmax >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Minimum time step %g must be non negative", (double)hmax);
624b1f5bccaSLisandro Dalcin   if (hmin != PETSC_DEFAULT) adapt->dt_min = hmin;
625b1f5bccaSLisandro Dalcin   if (hmax != PETSC_DEFAULT) adapt->dt_max = hmax;
626b1f5bccaSLisandro Dalcin   hmin = adapt->dt_min;
627b1f5bccaSLisandro Dalcin   hmax = adapt->dt_max;
6283c633725SBarry Smith   PetscCheck(hmax > hmin, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Maximum time step %g must greater than minimum time step %g", (double)hmax, (double)hmin);
6291917a363SLisandro Dalcin   PetscFunctionReturn(0);
6301917a363SLisandro Dalcin }
6311917a363SLisandro Dalcin 
6321917a363SLisandro Dalcin /*@
633*bcf0153eSBarry Smith    TSAdaptGetStepLimits - Get the minimum and maximum step sizes to be considered by the time step controller
6341917a363SLisandro Dalcin 
6351917a363SLisandro Dalcin    Not Collective
6361917a363SLisandro Dalcin 
6374165533cSJose E. Roman    Input Parameter:
638*bcf0153eSBarry Smith .  adapt - time step adaptivity context, usually gotten with `TSGetAdapt()`
6391917a363SLisandro Dalcin 
6404165533cSJose E. Roman    Output Parameters:
6411917a363SLisandro Dalcin +  hmin - minimum time step
6421917a363SLisandro Dalcin -  hmax - maximum time step
6431917a363SLisandro Dalcin 
6441917a363SLisandro Dalcin    Level: intermediate
6451917a363SLisandro Dalcin 
646*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptSetStepLimits()`, `TSAdaptChoose()`
6471917a363SLisandro Dalcin @*/
648d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptGetStepLimits(TSAdapt adapt, PetscReal *hmin, PetscReal *hmax)
649d71ae5a4SJacob Faibussowitsch {
6501917a363SLisandro Dalcin   PetscFunctionBegin;
6511917a363SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
6521917a363SLisandro Dalcin   if (hmin) PetscValidRealPointer(hmin, 2);
6531917a363SLisandro Dalcin   if (hmax) PetscValidRealPointer(hmax, 3);
6541917a363SLisandro Dalcin   if (hmin) *hmin = adapt->dt_min;
6551917a363SLisandro Dalcin   if (hmax) *hmax = adapt->dt_max;
6561c3436cfSJed Brown   PetscFunctionReturn(0);
6571c3436cfSJed Brown }
6581c3436cfSJed Brown 
659e55864a3SBarry Smith /*
660*bcf0153eSBarry Smith    TSAdaptSetFromOptions - Sets various `TSAdapt` parameters from user options.
66184df9cb4SJed Brown 
662*bcf0153eSBarry Smith    Collective on adapt
66384df9cb4SJed Brown 
66484df9cb4SJed Brown    Input Parameter:
665*bcf0153eSBarry Smith .  adapt - the `TSAdapt` context
66684df9cb4SJed Brown 
66784df9cb4SJed Brown    Options Database Keys:
6681917a363SLisandro Dalcin +  -ts_adapt_type <type> - algorithm to use for adaptivity
669bf997491SLisandro Dalcin .  -ts_adapt_always_accept - always accept steps regardless of error/stability goals
6701917a363SLisandro Dalcin .  -ts_adapt_safety <safety> - safety factor relative to target error/stability goal
6711917a363SLisandro Dalcin .  -ts_adapt_reject_safety <safety> - extra safety factor to apply if the last step was rejected
6721917a363SLisandro Dalcin .  -ts_adapt_clip <low,high> - admissible time step decrease and increase factors
67323de1d84SBarry Smith .  -ts_adapt_dt_min <min> - minimum timestep to use
67423de1d84SBarry Smith .  -ts_adapt_dt_max <max> - maximum timestep to use
67523de1d84SBarry Smith .  -ts_adapt_scale_solve_failed <scale> - scale timestep by this factor if a solve fails
676de50f1caSBarry Smith .  -ts_adapt_wnormtype <2 or infinity> - type of norm for computing error estimates
677de50f1caSBarry Smith -  -ts_adapt_time_step_increase_delay - number of timesteps to delay increasing the time step after it has been decreased due to failed solver
67884df9cb4SJed Brown 
67984df9cb4SJed Brown    Level: advanced
68084df9cb4SJed Brown 
681*bcf0153eSBarry Smith    Note:
682*bcf0153eSBarry Smith    This function is automatically called by `TSSetFromOptions()`
68384df9cb4SJed Brown 
684*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSGetAdapt()`, `TSAdaptSetType()`, `TSAdaptSetAlwaysAccept()`, `TSAdaptSetSafety()`,
685db781477SPatrick Sanan           `TSAdaptSetClip()`, `TSAdaptSetScaleSolveFailed()`, `TSAdaptSetStepLimits()`, `TSAdaptSetMonitor()`
686e55864a3SBarry Smith */
687d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetFromOptions(TSAdapt adapt, PetscOptionItems *PetscOptionsObject)
688d71ae5a4SJacob Faibussowitsch {
68984df9cb4SJed Brown   char      type[256] = TSADAPTBASIC;
69062c23b28SMark   PetscReal safety, reject_safety, clip[2], scale, hmin, hmax;
6911c3436cfSJed Brown   PetscBool set, flg;
6921917a363SLisandro Dalcin   PetscInt  two;
69384df9cb4SJed Brown 
69484df9cb4SJed Brown   PetscFunctionBegin;
695dbbe0bcdSBarry Smith   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
69684df9cb4SJed Brown   /* This should use PetscOptionsBegin() if/when this becomes an object used outside of TS, but currently this
6971566a47fSLisandro Dalcin    * function can only be called from inside TSSetFromOptions()  */
698d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "TS Adaptivity options");
6999566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_adapt_type", "Algorithm to use for adaptivity", "TSAdaptSetType", TSAdaptList, ((PetscObject)adapt)->type_name ? ((PetscObject)adapt)->type_name : type, type, sizeof(type), &flg));
70048a46eb9SPierre Jolivet   if (flg || !((PetscObject)adapt)->type_name) PetscCall(TSAdaptSetType(adapt, type));
7011917a363SLisandro Dalcin 
7029566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_adapt_always_accept", "Always accept the step", "TSAdaptSetAlwaysAccept", adapt->always_accept, &flg, &set));
7039566063dSJacob Faibussowitsch   if (set) PetscCall(TSAdaptSetAlwaysAccept(adapt, flg));
7041917a363SLisandro Dalcin 
7059371c9d4SSatish Balay   safety        = adapt->safety;
7069371c9d4SSatish Balay   reject_safety = adapt->reject_safety;
7079566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-ts_adapt_safety", "Safety factor relative to target error/stability goal", "TSAdaptSetSafety", safety, &safety, &set));
7089566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-ts_adapt_reject_safety", "Extra safety factor to apply if the last step was rejected", "TSAdaptSetSafety", reject_safety, &reject_safety, &flg));
7099566063dSJacob Faibussowitsch   if (set || flg) PetscCall(TSAdaptSetSafety(adapt, safety, reject_safety));
7101917a363SLisandro Dalcin 
7119371c9d4SSatish Balay   two     = 2;
7129371c9d4SSatish Balay   clip[0] = adapt->clip[0];
7139371c9d4SSatish Balay   clip[1] = adapt->clip[1];
7149566063dSJacob Faibussowitsch   PetscCall(PetscOptionsRealArray("-ts_adapt_clip", "Admissible decrease/increase factor in step size", "TSAdaptSetClip", clip, &two, &set));
7153c633725SBarry Smith   PetscCheck(!set || (two == 2), PetscObjectComm((PetscObject)adapt), PETSC_ERR_ARG_OUTOFRANGE, "Must give exactly two values to -ts_adapt_clip");
7169566063dSJacob Faibussowitsch   if (set) PetscCall(TSAdaptSetClip(adapt, clip[0], clip[1]));
7171917a363SLisandro Dalcin 
7189371c9d4SSatish Balay   hmin = adapt->dt_min;
7199371c9d4SSatish Balay   hmax = adapt->dt_max;
7209566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-ts_adapt_dt_min", "Minimum time step considered", "TSAdaptSetStepLimits", hmin, &hmin, &set));
7219566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-ts_adapt_dt_max", "Maximum time step considered", "TSAdaptSetStepLimits", hmax, &hmax, &flg));
7229566063dSJacob Faibussowitsch   if (set || flg) PetscCall(TSAdaptSetStepLimits(adapt, hmin, hmax));
7231917a363SLisandro Dalcin 
7249566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-ts_adapt_max_ignore", "Adaptor ignores (absolute) solution values smaller than this value", "", adapt->ignore_max, &adapt->ignore_max, &set));
7259566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_adapt_glee_use_local", "GLEE adaptor uses local error estimation for step control", "", adapt->glee_use_local, &adapt->glee_use_local, &set));
726d580f011SEmil Constantinescu 
7279566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-ts_adapt_scale_solve_failed", "Scale step by this factor if solve fails", "TSAdaptSetScaleSolveFailed", adapt->scale_solve_failed, &scale, &set));
7289566063dSJacob Faibussowitsch   if (set) PetscCall(TSAdaptSetScaleSolveFailed(adapt, scale));
7291917a363SLisandro Dalcin 
7309566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-ts_adapt_wnormtype", "Type of norm computed for error estimation", "", NormTypes, (PetscEnum)adapt->wnormtype, (PetscEnum *)&adapt->wnormtype, NULL));
7313c633725SBarry Smith   PetscCheck(adapt->wnormtype == NORM_2 || adapt->wnormtype == NORM_INFINITY, PetscObjectComm((PetscObject)adapt), PETSC_ERR_SUP, "Only 2-norm and infinite norm supported");
7321917a363SLisandro Dalcin 
7339566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-ts_adapt_time_step_increase_delay", "Number of timesteps to delay increasing the time step after it has been decreased due to failed solver", "TSAdaptSetTimeStepIncreaseDelay", adapt->timestepjustdecreased_delay, &adapt->timestepjustdecreased_delay, NULL));
734de50f1caSBarry Smith 
7359566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_adapt_monitor", "Print choices made by adaptive controller", "TSAdaptSetMonitor", adapt->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set));
7369566063dSJacob Faibussowitsch   if (set) PetscCall(TSAdaptSetMonitor(adapt, flg));
7371917a363SLisandro Dalcin 
738dbbe0bcdSBarry Smith   PetscTryTypeMethod(adapt, setfromoptions, PetscOptionsObject);
739d0609cedSBarry Smith   PetscOptionsHeadEnd();
74084df9cb4SJed Brown   PetscFunctionReturn(0);
74184df9cb4SJed Brown }
74284df9cb4SJed Brown 
74384df9cb4SJed Brown /*@
74484df9cb4SJed Brown    TSAdaptCandidatesClear - clear any previously set candidate schemes
74584df9cb4SJed Brown 
746*bcf0153eSBarry Smith    Logically collective on adapt
74784df9cb4SJed Brown 
7484165533cSJose E. Roman    Input Parameter:
74984df9cb4SJed Brown .  adapt - adaptive controller
75084df9cb4SJed Brown 
75184df9cb4SJed Brown    Level: developer
75284df9cb4SJed Brown 
753*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptCreate()`, `TSAdaptCandidateAdd()`, `TSAdaptChoose()`
75484df9cb4SJed Brown @*/
755d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptCandidatesClear(TSAdapt adapt)
756d71ae5a4SJacob Faibussowitsch {
75784df9cb4SJed Brown   PetscFunctionBegin;
7584782b174SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
7599566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(&adapt->candidates, sizeof(adapt->candidates)));
76084df9cb4SJed Brown   PetscFunctionReturn(0);
76184df9cb4SJed Brown }
76284df9cb4SJed Brown 
76384df9cb4SJed Brown /*@C
76484df9cb4SJed Brown    TSAdaptCandidateAdd - add a candidate scheme for the adaptive controller to select from
76584df9cb4SJed Brown 
766*bcf0153eSBarry Smith    Logically collective on adapt
76784df9cb4SJed Brown 
7684165533cSJose E. Roman    Input Parameters:
769*bcf0153eSBarry Smith +  adapt - time step adaptivity context, obtained with `TSGetAdapt()` or `TSAdaptCreate()`
77084df9cb4SJed Brown .  name - name of the candidate scheme to add
77184df9cb4SJed Brown .  order - order of the candidate scheme
77284df9cb4SJed Brown .  stageorder - stage order of the candidate scheme
7738d59e960SJed Brown .  ccfl - stability coefficient relative to explicit Euler, used for CFL constraints
77484df9cb4SJed Brown .  cost - relative measure of the amount of work required for the candidate scheme
77584df9cb4SJed Brown -  inuse - indicates that this scheme is the one currently in use, this flag can only be set for one scheme
77684df9cb4SJed Brown 
77784df9cb4SJed Brown    Level: developer
77884df9cb4SJed Brown 
779*bcf0153eSBarry Smith    Fortran Note:
780*bcf0153eSBarry Smith    This routine is not available in Fortran.
781*bcf0153eSBarry Smith 
782*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptCandidatesClear()`, `TSAdaptChoose()`
78384df9cb4SJed Brown @*/
784d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptCandidateAdd(TSAdapt adapt, const char name[], PetscInt order, PetscInt stageorder, PetscReal ccfl, PetscReal cost, PetscBool inuse)
785d71ae5a4SJacob Faibussowitsch {
78684df9cb4SJed Brown   PetscInt c;
78784df9cb4SJed Brown 
78884df9cb4SJed Brown   PetscFunctionBegin;
78984df9cb4SJed Brown   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
79063a3b9bcSJacob Faibussowitsch   PetscCheck(order >= 1, PetscObjectComm((PetscObject)adapt), PETSC_ERR_ARG_OUTOFRANGE, "Classical order %" PetscInt_FMT " must be a positive integer", order);
79184df9cb4SJed Brown   if (inuse) {
7923c633725SBarry Smith     PetscCheck(!adapt->candidates.inuse_set, PetscObjectComm((PetscObject)adapt), PETSC_ERR_ARG_WRONGSTATE, "Cannot set the inuse method twice, maybe forgot to call TSAdaptCandidatesClear()");
79384df9cb4SJed Brown     adapt->candidates.inuse_set = PETSC_TRUE;
79484df9cb4SJed Brown   }
7951c3436cfSJed Brown   /* first slot if this is the current scheme, otherwise the next available slot */
7961c3436cfSJed Brown   c = inuse ? 0 : !adapt->candidates.inuse_set + adapt->candidates.n;
797bbd56ea5SKarl Rupp 
79884df9cb4SJed Brown   adapt->candidates.name[c]       = name;
79984df9cb4SJed Brown   adapt->candidates.order[c]      = order;
80084df9cb4SJed Brown   adapt->candidates.stageorder[c] = stageorder;
8018d59e960SJed Brown   adapt->candidates.ccfl[c]       = ccfl;
80284df9cb4SJed Brown   adapt->candidates.cost[c]       = cost;
80384df9cb4SJed Brown   adapt->candidates.n++;
80484df9cb4SJed Brown   PetscFunctionReturn(0);
80584df9cb4SJed Brown }
80684df9cb4SJed Brown 
8078d59e960SJed Brown /*@C
8088d59e960SJed Brown    TSAdaptCandidatesGet - Get the list of candidate orders of accuracy and cost
8098d59e960SJed Brown 
8108d59e960SJed Brown    Not Collective
8118d59e960SJed Brown 
8124165533cSJose E. Roman    Input Parameter:
8138d59e960SJed Brown .  adapt - time step adaptivity context
8148d59e960SJed Brown 
8154165533cSJose E. Roman    Output Parameters:
8168d59e960SJed Brown +  n - number of candidate schemes, always at least 1
8178d59e960SJed Brown .  order - the order of each candidate scheme
8188d59e960SJed Brown .  stageorder - the stage order of each candidate scheme
8198d59e960SJed Brown .  ccfl - the CFL coefficient of each scheme
8208d59e960SJed Brown -  cost - the relative cost of each scheme
8218d59e960SJed Brown 
8228d59e960SJed Brown    Level: developer
8238d59e960SJed Brown 
8248d59e960SJed Brown    Note:
8258d59e960SJed Brown    The current scheme is always returned in the first slot
8268d59e960SJed Brown 
827*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptCandidatesClear()`, `TSAdaptCandidateAdd()`, `TSAdaptChoose()`
8288d59e960SJed Brown @*/
829d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptCandidatesGet(TSAdapt adapt, PetscInt *n, const PetscInt **order, const PetscInt **stageorder, const PetscReal **ccfl, const PetscReal **cost)
830d71ae5a4SJacob Faibussowitsch {
8318d59e960SJed Brown   PetscFunctionBegin;
8328d59e960SJed Brown   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
8338d59e960SJed Brown   if (n) *n = adapt->candidates.n;
8348d59e960SJed Brown   if (order) *order = adapt->candidates.order;
8358d59e960SJed Brown   if (stageorder) *stageorder = adapt->candidates.stageorder;
8368d59e960SJed Brown   if (ccfl) *ccfl = adapt->candidates.ccfl;
8378d59e960SJed Brown   if (cost) *cost = adapt->candidates.cost;
8388d59e960SJed Brown   PetscFunctionReturn(0);
8398d59e960SJed Brown }
8408d59e960SJed Brown 
84184df9cb4SJed Brown /*@C
84284df9cb4SJed Brown    TSAdaptChoose - choose which method and step size to use for the next step
84384df9cb4SJed Brown 
844*bcf0153eSBarry Smith    Collective on adapt
84584df9cb4SJed Brown 
8464165533cSJose E. Roman    Input Parameters:
84784df9cb4SJed Brown +  adapt - adaptive contoller
84897bb3fdcSJose E. Roman .  ts - time stepper
84984df9cb4SJed Brown -  h - current step size
85084df9cb4SJed Brown 
8514165533cSJose E. Roman    Output Parameters:
8521566a47fSLisandro Dalcin +  next_sc - optional, scheme to use for the next step
85384df9cb4SJed Brown .  next_h - step size to use for the next step
854*bcf0153eSBarry Smith -  accept - `PETSC_TRUE` to accept the current step, `PETSC_FALSE` to repeat the current step with the new step size
8551c3436cfSJed Brown 
85684df9cb4SJed Brown    Level: developer
85784df9cb4SJed Brown 
858*bcf0153eSBarry Smith    Note:
859*bcf0153eSBarry Smith    The input value of parameter accept is retained from the last time step, so it will be `PETSC_FALSE` if the step is
860*bcf0153eSBarry Smith    being retried after an initial rejection.
861*bcf0153eSBarry Smith 
862*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSAdaptCandidatesClear()`, `TSAdaptCandidateAdd()`
86384df9cb4SJed Brown @*/
864d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptChoose(TSAdapt adapt, TS ts, PetscReal h, PetscInt *next_sc, PetscReal *next_h, PetscBool *accept)
865d71ae5a4SJacob Faibussowitsch {
8661566a47fSLisandro Dalcin   PetscInt  ncandidates = adapt->candidates.n;
8671566a47fSLisandro Dalcin   PetscInt  scheme      = 0;
8680b99f514SJed Brown   PetscReal wlte        = -1.0;
8695e4ed32fSEmil Constantinescu   PetscReal wltea       = -1.0;
8705e4ed32fSEmil Constantinescu   PetscReal wlter       = -1.0;
87184df9cb4SJed Brown 
87284df9cb4SJed Brown   PetscFunctionBegin;
87384df9cb4SJed Brown   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
87484df9cb4SJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
8751566a47fSLisandro Dalcin   if (next_sc) PetscValidIntPointer(next_sc, 4);
876dadcf809SJacob Faibussowitsch   PetscValidRealPointer(next_h, 5);
877064a246eSJacob Faibussowitsch   PetscValidBoolPointer(accept, 6);
8781566a47fSLisandro Dalcin   if (next_sc) *next_sc = 0;
8791566a47fSLisandro Dalcin 
8801566a47fSLisandro Dalcin   /* Do not mess with adaptivity while handling events*/
8811566a47fSLisandro Dalcin   if (ts->event && ts->event->status != TSEVENT_NONE) {
8821566a47fSLisandro Dalcin     *next_h = h;
8831566a47fSLisandro Dalcin     *accept = PETSC_TRUE;
8841566a47fSLisandro Dalcin     PetscFunctionReturn(0);
8851566a47fSLisandro Dalcin   }
8861566a47fSLisandro Dalcin 
887dbbe0bcdSBarry Smith   PetscUseTypeMethod(adapt, choose, ts, h, &scheme, next_h, accept, &wlte, &wltea, &wlter);
88863a3b9bcSJacob Faibussowitsch   PetscCheck(scheme >= 0 && (ncandidates <= 0 || scheme < ncandidates), PetscObjectComm((PetscObject)adapt), PETSC_ERR_ARG_OUTOFRANGE, "Chosen scheme %" PetscInt_FMT " not in valid range 0..%" PetscInt_FMT, scheme, ncandidates - 1);
8893c633725SBarry Smith   PetscCheck(*next_h >= 0, PetscObjectComm((PetscObject)adapt), PETSC_ERR_ARG_OUTOFRANGE, "Computed step size %g must be positive", (double)*next_h);
8901566a47fSLisandro Dalcin   if (next_sc) *next_sc = scheme;
8911566a47fSLisandro Dalcin 
89249354f04SShri Abhyankar   if (*accept && ts->exact_final_time == TS_EXACTFINALTIME_MATCHSTEP) {
89336b54a69SLisandro Dalcin     /* Increase/reduce step size if end time of next step is close to or overshoots max time */
89436b54a69SLisandro Dalcin     PetscReal t = ts->ptime + ts->time_step, h = *next_h;
8954a658b32SHong Zhang     PetscReal tend = t + h, tmax, hmax;
896fe7350e0SStefano Zampini     PetscReal a    = (PetscReal)(1.0 + adapt->matchstepfac[0]);
897fe7350e0SStefano Zampini     PetscReal b    = adapt->matchstepfac[1];
8984a658b32SHong Zhang 
8994a658b32SHong Zhang     if (ts->tspan) {
900e1db57b0SHong Zhang       if (PetscIsCloseAtTol(t, ts->tspan->span_times[ts->tspan->spanctr], ts->tspan->reltol * h + ts->tspan->abstol, 0)) /* hit a span time point */
9014a658b32SHong Zhang         if (ts->tspan->spanctr + 1 < ts->tspan->num_span_times) tmax = ts->tspan->span_times[ts->tspan->spanctr + 1];
9024a658b32SHong Zhang         else tmax = ts->max_time; /* hit the last span time point */
9034a658b32SHong Zhang       else tmax = ts->tspan->span_times[ts->tspan->spanctr];
9044a658b32SHong Zhang     } else tmax = ts->max_time;
9054a658b32SHong Zhang     hmax = tmax - t;
90636b54a69SLisandro Dalcin     if (t < tmax && tend > tmax) *next_h = hmax;
907fe7350e0SStefano Zampini     if (t < tmax && tend < tmax && h * b > hmax) *next_h = hmax / 2;
90836b54a69SLisandro Dalcin     if (t < tmax && tend < tmax && h * a > hmax) *next_h = hmax;
909e1db57b0SHong Zhang     /* if step size is changed to match a span time point */
910e1db57b0SHong Zhang     if (ts->tspan && h != *next_h && !adapt->dt_span_cached) adapt->dt_span_cached = h;
911e1db57b0SHong Zhang     /* reset time step after a span time point */
912e1db57b0SHong Zhang     if (ts->tspan && h == *next_h && adapt->dt_span_cached && PetscIsCloseAtTol(t, ts->tspan->span_times[ts->tspan->spanctr], ts->tspan->reltol * h + ts->tspan->abstol, 0)) {
913e1db57b0SHong Zhang       *next_h               = adapt->dt_span_cached;
914e1db57b0SHong Zhang       adapt->dt_span_cached = 0;
91549354f04SShri Abhyankar     }
916e1db57b0SHong Zhang   }
9171c3436cfSJed Brown   if (adapt->monitor) {
9181566a47fSLisandro Dalcin     const char *sc_name = (scheme < ncandidates) ? adapt->candidates.name[scheme] : "";
9199566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIAddTab(adapt->monitor, ((PetscObject)adapt)->tablevel));
9200b99f514SJed Brown     if (wlte < 0) {
9219371c9d4SSatish Balay       PetscCall(PetscViewerASCIIPrintf(adapt->monitor, "    TSAdapt %s %s %" PetscInt_FMT ":%s step %3" PetscInt_FMT " %s t=%-11g+%10.3e dt=%-10.3e\n", ((PetscObject)adapt)->type_name, ((PetscObject)ts)->type_name, scheme, sc_name, ts->steps, *accept ? "accepted" : "rejected",
9229371c9d4SSatish Balay                                        (double)ts->ptime, (double)h, (double)*next_h));
9230b99f514SJed Brown     } else {
9249371c9d4SSatish Balay       PetscCall(PetscViewerASCIIPrintf(adapt->monitor, "    TSAdapt %s %s %" PetscInt_FMT ":%s step %3" PetscInt_FMT " %s t=%-11g+%10.3e dt=%-10.3e wlte=%5.3g  wltea=%5.3g wlter=%5.3g\n", ((PetscObject)adapt)->type_name, ((PetscObject)ts)->type_name, scheme, sc_name, ts->steps, *accept ? "accepted" : "rejected",
9259371c9d4SSatish Balay                                        (double)ts->ptime, (double)h, (double)*next_h, (double)wlte, (double)wltea, (double)wlter));
9260b99f514SJed Brown     }
9279566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIISubtractTab(adapt->monitor, ((PetscObject)adapt)->tablevel));
9281c3436cfSJed Brown   }
92984df9cb4SJed Brown   PetscFunctionReturn(0);
93084df9cb4SJed Brown }
93184df9cb4SJed Brown 
93297335746SJed Brown /*@
933de50f1caSBarry Smith    TSAdaptSetTimeStepIncreaseDelay - The number of timesteps to wait after a decrease in the timestep due to failed solver
934de50f1caSBarry Smith                                      before increasing the time step.
935de50f1caSBarry Smith 
936*bcf0153eSBarry Smith    Logicially Collective on adapt
937de50f1caSBarry Smith 
9384165533cSJose E. Roman    Input Parameters:
939de50f1caSBarry Smith +  adapt - adaptive controller context
940de50f1caSBarry Smith -  cnt - the number of timesteps
941de50f1caSBarry Smith 
942de50f1caSBarry Smith    Options Database Key:
943de50f1caSBarry Smith .  -ts_adapt_time_step_increase_delay cnt - number of steps to delay the increase
944de50f1caSBarry Smith 
945de50f1caSBarry Smith    Level: advanced
946de50f1caSBarry Smith 
947*bcf0153eSBarry Smith    Notes:
948*bcf0153eSBarry Smith    This is to prevent an adaptor from bouncing back and forth between two nearby timesteps. The default is 0.
949*bcf0153eSBarry Smith 
950*bcf0153eSBarry Smith    The successful use of this option is problem dependent
951*bcf0153eSBarry Smith 
952*bcf0153eSBarry Smith    Developer Note:
953*bcf0153eSBarry Smith    There is no theory to support this option
954*bcf0153eSBarry Smith 
955*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`
956de50f1caSBarry Smith @*/
957d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptSetTimeStepIncreaseDelay(TSAdapt adapt, PetscInt cnt)
958d71ae5a4SJacob Faibussowitsch {
959de50f1caSBarry Smith   PetscFunctionBegin;
960de50f1caSBarry Smith   adapt->timestepjustdecreased_delay = cnt;
961de50f1caSBarry Smith   PetscFunctionReturn(0);
962de50f1caSBarry Smith }
963de50f1caSBarry Smith 
964de50f1caSBarry Smith /*@
9656bc98fa9SBarry Smith    TSAdaptCheckStage - checks whether to accept a stage, (e.g. reject and change time step size if nonlinear solve fails or solution vector is infeasible)
96697335746SJed Brown 
967*bcf0153eSBarry Smith    Collective on tsadapt
96897335746SJed Brown 
9694165533cSJose E. Roman    Input Parameters:
97097335746SJed Brown +  adapt - adaptive controller context
971b295832fSPierre Barbier de Reuille .  ts - time stepper
972b295832fSPierre Barbier de Reuille .  t - Current simulation time
973b295832fSPierre Barbier de Reuille -  Y - Current solution vector
97497335746SJed Brown 
9754165533cSJose E. Roman    Output Parameter:
976*bcf0153eSBarry Smith .  accept - `PETSC_TRUE` to accept the stage, `PETSC_FALSE` to reject
97797335746SJed Brown 
97897335746SJed Brown    Level: developer
97997335746SJed Brown 
980*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`
98197335746SJed Brown @*/
982d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptCheckStage(TSAdapt adapt, TS ts, PetscReal t, Vec Y, PetscBool *accept)
983d71ae5a4SJacob Faibussowitsch {
9841566a47fSLisandro Dalcin   SNESConvergedReason snesreason = SNES_CONVERGED_ITERATING;
98597335746SJed Brown 
98697335746SJed Brown   PetscFunctionBegin;
9874782b174SLisandro Dalcin   PetscValidHeaderSpecific(adapt, TSADAPT_CLASSID, 1);
9884782b174SLisandro Dalcin   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
989064a246eSJacob Faibussowitsch   PetscValidBoolPointer(accept, 5);
9901566a47fSLisandro Dalcin 
9919566063dSJacob Faibussowitsch   if (ts->snes) PetscCall(SNESGetConvergedReason(ts->snes, &snesreason));
99297335746SJed Brown   if (snesreason < 0) {
99397335746SJed Brown     *accept = PETSC_FALSE;
9946de24e2aSJed Brown     if (++ts->num_snes_failures >= ts->max_snes_failures && ts->max_snes_failures > 0) {
99597335746SJed Brown       ts->reason = TS_DIVERGED_NONLINEAR_SOLVE;
99663a3b9bcSJacob Faibussowitsch       PetscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", nonlinear solve failures %" PetscInt_FMT " greater than current TS allowed, stopping solve\n", ts->steps, ts->num_snes_failures));
99797335746SJed Brown       if (adapt->monitor) {
9989566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIAddTab(adapt->monitor, ((PetscObject)adapt)->tablevel));
9999371c9d4SSatish Balay         PetscCall(PetscViewerASCIIPrintf(adapt->monitor, "    TSAdapt %s step %3" PetscInt_FMT " stage rejected t=%-11g+%10.3e, nonlinear solve failures %" PetscInt_FMT " greater than current TS allowed\n", ((PetscObject)adapt)->type_name, ts->steps,
10009371c9d4SSatish Balay                                          (double)ts->ptime, (double)ts->time_step, ts->num_snes_failures));
10019566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISubtractTab(adapt->monitor, ((PetscObject)adapt)->tablevel));
100297335746SJed Brown       }
1003cb9d8021SPierre Barbier de Reuille     }
1004cb9d8021SPierre Barbier de Reuille   } else {
10051566a47fSLisandro Dalcin     *accept = PETSC_TRUE;
10069566063dSJacob Faibussowitsch     PetscCall(TSFunctionDomainError(ts, t, Y, accept));
1007cb9d8021SPierre Barbier de Reuille     if (*accept && adapt->checkstage) {
10089566063dSJacob Faibussowitsch       PetscCall((*adapt->checkstage)(adapt, ts, t, Y, accept));
10096bc98fa9SBarry Smith       if (!*accept) {
101063a3b9bcSJacob Faibussowitsch         PetscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", solution rejected by user function provided by TSSetFunctionDomainError()\n", ts->steps));
10116bc98fa9SBarry Smith         if (adapt->monitor) {
10129566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIAddTab(adapt->monitor, ((PetscObject)adapt)->tablevel));
101363a3b9bcSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(adapt->monitor, "    TSAdapt %s step %3" PetscInt_FMT " stage rejected by user function provided by TSSetFunctionDomainError()\n", ((PetscObject)adapt)->type_name, ts->steps));
10149566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIISubtractTab(adapt->monitor, ((PetscObject)adapt)->tablevel));
10156bc98fa9SBarry Smith         }
10166bc98fa9SBarry Smith       }
1017cb9d8021SPierre Barbier de Reuille     }
1018cb9d8021SPierre Barbier de Reuille   }
1019cb9d8021SPierre Barbier de Reuille 
10201566a47fSLisandro Dalcin   if (!(*accept) && !ts->reason) {
10211566a47fSLisandro Dalcin     PetscReal dt, new_dt;
10229566063dSJacob Faibussowitsch     PetscCall(TSGetTimeStep(ts, &dt));
1023cb9d8021SPierre Barbier de Reuille     new_dt = dt * adapt->scale_solve_failed;
10249566063dSJacob Faibussowitsch     PetscCall(TSSetTimeStep(ts, new_dt));
1025de50f1caSBarry Smith     adapt->timestepjustdecreased += adapt->timestepjustdecreased_delay;
102697335746SJed Brown     if (adapt->monitor) {
10279566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIAddTab(adapt->monitor, ((PetscObject)adapt)->tablevel));
102863a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(adapt->monitor, "    TSAdapt %s step %3" PetscInt_FMT " stage rejected (%s) t=%-11g+%10.3e retrying with dt=%-10.3e\n", ((PetscObject)adapt)->type_name, ts->steps, SNESConvergedReasons[snesreason], (double)ts->ptime, (double)dt, (double)new_dt));
10299566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISubtractTab(adapt->monitor, ((PetscObject)adapt)->tablevel));
103097335746SJed Brown     }
103197335746SJed Brown   }
103297335746SJed Brown   PetscFunctionReturn(0);
103397335746SJed Brown }
103497335746SJed Brown 
103584df9cb4SJed Brown /*@
103684df9cb4SJed Brown   TSAdaptCreate - create an adaptive controller context for time stepping
103784df9cb4SJed Brown 
1038d083f849SBarry Smith   Collective
103984df9cb4SJed Brown 
104084df9cb4SJed Brown   Input Parameter:
104184df9cb4SJed Brown . comm - The communicator
104284df9cb4SJed Brown 
104384df9cb4SJed Brown   Output Parameter:
1044*bcf0153eSBarry Smith . adapt - new `TSAdapt` object
104584df9cb4SJed Brown 
104684df9cb4SJed Brown   Level: developer
104784df9cb4SJed Brown 
1048*bcf0153eSBarry Smith   Note:
1049*bcf0153eSBarry Smith   `TSAdapt` creation is handled by `TS`, so users should not need to call this function.
105084df9cb4SJed Brown 
1051*bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSAdapt`, `TSGetAdapt()`, `TSAdaptSetType()`, `TSAdaptDestroy()`
105284df9cb4SJed Brown @*/
1053d71ae5a4SJacob Faibussowitsch PetscErrorCode TSAdaptCreate(MPI_Comm comm, TSAdapt *inadapt)
1054d71ae5a4SJacob Faibussowitsch {
105584df9cb4SJed Brown   TSAdapt adapt;
105684df9cb4SJed Brown 
105784df9cb4SJed Brown   PetscFunctionBegin;
1058064a246eSJacob Faibussowitsch   PetscValidPointer(inadapt, 2);
10593b3bcf4cSLisandro Dalcin   *inadapt = NULL;
10609566063dSJacob Faibussowitsch   PetscCall(TSAdaptInitializePackage());
10613b3bcf4cSLisandro Dalcin 
10629566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(adapt, TSADAPT_CLASSID, "TSAdapt", "Time stepping adaptivity", "TS", comm, TSAdaptDestroy, TSAdaptView));
10631c3436cfSJed Brown 
1064bf997491SLisandro Dalcin   adapt->always_accept      = PETSC_FALSE;
10651917a363SLisandro Dalcin   adapt->safety             = 0.9;
10661917a363SLisandro Dalcin   adapt->reject_safety      = 0.5;
10671917a363SLisandro Dalcin   adapt->clip[0]            = 0.1;
10681917a363SLisandro Dalcin   adapt->clip[1]            = 10.;
10691c3436cfSJed Brown   adapt->dt_min             = 1e-20;
10701917a363SLisandro Dalcin   adapt->dt_max             = 1e+20;
10711c167fc2SEmil Constantinescu   adapt->ignore_max         = -1.0;
1072d580f011SEmil Constantinescu   adapt->glee_use_local     = PETSC_TRUE;
107397335746SJed Brown   adapt->scale_solve_failed = 0.25;
1074fe7350e0SStefano Zampini   /* these two safety factors are not public, and they are used only in the TS_EXACTFINALTIME_MATCHSTEP case
1075fe7350e0SStefano Zampini      to prevent from situations were unreasonably small time steps are taken in order to match the final time */
1076fe7350e0SStefano Zampini   adapt->matchstepfac[0]             = 0.01; /* allow 1% step size increase in the last step */
1077fe7350e0SStefano Zampini   adapt->matchstepfac[1]             = 2.0;  /* halve last step if it is greater than what remains divided this factor */
10787619abb3SShri   adapt->wnormtype                   = NORM_2;
1079de50f1caSBarry Smith   adapt->timestepjustdecreased_delay = 0;
10801917a363SLisandro Dalcin 
108184df9cb4SJed Brown   *inadapt = adapt;
108284df9cb4SJed Brown   PetscFunctionReturn(0);
108384df9cb4SJed Brown }
1084