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