1af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 2fe8322adSStefano Zampini #include <petsc/private/tshistoryimpl.h> 3fe8322adSStefano Zampini #include <petscdm.h> 4bc952696SBarry Smith 5bc952696SBarry Smith PetscFunctionList TSTrajectoryList = NULL; 6bc952696SBarry Smith PetscBool TSTrajectoryRegisterAllCalled = PETSC_FALSE; 7bc952696SBarry Smith PetscClassId TSTRAJECTORY_CLASSID; 82bf6d308SHong Zhang PetscLogEvent TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs, TSTrajectory_SetUp; 9bc952696SBarry Smith 10bc952696SBarry Smith /*@C 11bcf0153eSBarry Smith TSTrajectoryRegister - Adds a way of storing trajectories to the `TS` package 12bc952696SBarry Smith 13cc4c1da9SBarry Smith Not Collective, No Fortran Support 14bc952696SBarry Smith 15bc952696SBarry Smith Input Parameters: 162fe279fdSBarry Smith + sname - the name of a new user-defined creation routine 172fe279fdSBarry Smith - function - the creation routine itself 18bc952696SBarry Smith 19df5474d8SHong Zhang Level: developer 20bc952696SBarry Smith 21bcf0153eSBarry Smith Note: 22bcf0153eSBarry Smith `TSTrajectoryRegister()` may be called multiple times to add several user-defined tses. 23bcf0153eSBarry Smith 241cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryRegisterAll()` 25bc952696SBarry Smith @*/ 26d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegister(const char sname[], PetscErrorCode (*function)(TSTrajectory, TS)) 27d71ae5a4SJacob Faibussowitsch { 28bc952696SBarry Smith PetscFunctionBegin; 299566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&TSTrajectoryList, sname, function)); 303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 31bc952696SBarry Smith } 32bc952696SBarry Smith 33fe8322adSStefano Zampini /*@ 34fe8322adSStefano Zampini TSTrajectorySet - Sets a vector of state in the trajectory object 35fe8322adSStefano Zampini 36c3339decSBarry Smith Collective 37fe8322adSStefano Zampini 38fe8322adSStefano Zampini Input Parameters: 39fe8322adSStefano Zampini + tj - the trajectory object 40fe8322adSStefano Zampini . ts - the time stepper object (optional) 41fe8322adSStefano Zampini . stepnum - the step number 42fe8322adSStefano Zampini . time - the current time 43fe8322adSStefano Zampini - X - the current solution 44fe8322adSStefano Zampini 45fe8322adSStefano Zampini Level: developer 46fe8322adSStefano Zampini 47bcf0153eSBarry Smith Note: 48bcf0153eSBarry Smith Usually one does not call this routine, it is called automatically during `TSSolve()` 49fe8322adSStefano Zampini 501cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()` 51fe8322adSStefano Zampini @*/ 52d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X) 53d71ae5a4SJacob Faibussowitsch { 54bc952696SBarry Smith PetscFunctionBegin; 553ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS); 56fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 57fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 58fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 59fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 4); 60fe8322adSStefano Zampini PetscValidHeaderSpecific(X, VEC_CLASSID, 5); 613c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 6248a46eb9SPierre Jolivet if (tj->monitor) PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectorySet: stepnum %" PetscInt_FMT ", time %g (stages %" PetscInt_FMT ")\n", stepnum, (double)time, (PetscInt)!tj->solution_only)); 639566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Set, tj, ts, 0, 0)); 64dbbe0bcdSBarry Smith PetscUseTypeMethod(tj, set, ts, stepnum, time, X); 659566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Set, tj, ts, 0, 0)); 661baa6e33SBarry Smith if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh, stepnum, time)); 67fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL; 683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 69bc952696SBarry Smith } 70bc952696SBarry Smith 71fe8322adSStefano Zampini /*@ 72bcf0153eSBarry Smith TSTrajectoryGetNumSteps - Return the number of steps registered in the `TSTrajectory` via `TSTrajectorySet()`. 73fe8322adSStefano Zampini 7420f4b53cSBarry Smith Not Collective. 75fe8322adSStefano Zampini 762fe279fdSBarry Smith Input Parameter: 77fe8322adSStefano Zampini . tj - the trajectory object 78fe8322adSStefano Zampini 79fe8322adSStefano Zampini Output Parameter: 80fe8322adSStefano Zampini . steps - the number of steps 81fe8322adSStefano Zampini 82fe8322adSStefano Zampini Level: developer 83fe8322adSStefano Zampini 841cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectorySet()` 85fe8322adSStefano Zampini @*/ 86d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) 87d71ae5a4SJacob Faibussowitsch { 88fe8322adSStefano Zampini PetscFunctionBegin; 89fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 904f572ea9SToby Isaac PetscAssertPointer(steps, 2); 919566063dSJacob Faibussowitsch PetscCall(TSHistoryGetNumSteps(tj->tsh, steps)); 923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 93fe8322adSStefano Zampini } 94fe8322adSStefano Zampini 95fe8322adSStefano Zampini /*@ 96bcf0153eSBarry Smith TSTrajectoryGet - Updates the solution vector of a time stepper object by querying the `TSTrajectory` 97fe8322adSStefano Zampini 98c3339decSBarry Smith Collective 99fe8322adSStefano Zampini 100fe8322adSStefano Zampini Input Parameters: 101fe8322adSStefano Zampini + tj - the trajectory object 102fe8322adSStefano Zampini . ts - the time stepper object 103fe8322adSStefano Zampini - stepnum - the step number 104fe8322adSStefano Zampini 105fe8322adSStefano Zampini Output Parameter: 106fe8322adSStefano Zampini . time - the time associated with the step number 107fe8322adSStefano Zampini 108fe8322adSStefano Zampini Level: developer 109fe8322adSStefano Zampini 110bcf0153eSBarry Smith Note: 111bcf0153eSBarry Smith Usually one does not call this routine, it is called automatically during `TSSolve()` 112fe8322adSStefano Zampini 1131cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSSolve()`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()` 114fe8322adSStefano Zampini @*/ 115d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time) 116d71ae5a4SJacob Faibussowitsch { 117bc952696SBarry Smith PetscFunctionBegin; 1183c633725SBarry Smith PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory"); 119fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 120fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 121fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 1224f572ea9SToby Isaac PetscAssertPointer(time, 4); 1233c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 1243c633725SBarry Smith PetscCheck(stepnum >= 0, PetscObjectComm((PetscObject)tj), PETSC_ERR_PLIB, "Requesting negative step number"); 125fe8322adSStefano Zampini if (tj->monitor) { 12663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n", stepnum, (PetscInt)!tj->solution_only)); 1279566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 128fe8322adSStefano Zampini } 1299566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Get, tj, ts, 0, 0)); 130dbbe0bcdSBarry Smith PetscUseTypeMethod(tj, get, ts, stepnum, time); 1319566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Get, tj, ts, 0, 0)); 1323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 133bc952696SBarry Smith } 134bc952696SBarry Smith 135fe8322adSStefano Zampini /*@ 136bcf0153eSBarry Smith TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the `TSTrajectory` and, possibly, from the `TS` 137fe8322adSStefano Zampini 138c3339decSBarry Smith Collective 139fe8322adSStefano Zampini 140fe8322adSStefano Zampini Input Parameters: 141fe8322adSStefano Zampini + tj - the trajectory object 142fe8322adSStefano Zampini . ts - the time stepper object (optional) 143fe8322adSStefano Zampini - stepnum - the requested step number 144fe8322adSStefano Zampini 145fe8322adSStefano Zampini Output Parameters: 146bcf0153eSBarry Smith + time - On input time for the step if step number is `PETSC_DECIDE`, on output the time associated with the step number 1472fe279fdSBarry Smith . U - state vector (can be `NULL`) 1482fe279fdSBarry Smith - Udot - time derivative of state vector (can be `NULL`) 149fe8322adSStefano Zampini 150fe8322adSStefano Zampini Level: developer 151fe8322adSStefano Zampini 152bcf0153eSBarry Smith Notes: 153bcf0153eSBarry Smith If the step number is `PETSC_DECIDE`, the time argument is used to inquire the trajectory. 154fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 155fe8322adSStefano Zampini 1561cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()` 157fe8322adSStefano Zampini @*/ 158d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot) 159d71ae5a4SJacob Faibussowitsch { 160fe8322adSStefano Zampini PetscFunctionBegin; 1613c633725SBarry Smith PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory"); 162fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 163fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 164fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 1654f572ea9SToby Isaac PetscAssertPointer(time, 4); 166fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5); 167fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6); 1683ba16761SJacob Faibussowitsch if (!U && !Udot) PetscFunctionReturn(PETSC_SUCCESS); 1693c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 1709566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0)); 171fe8322adSStefano Zampini if (tj->monitor) { 172fe8322adSStefano Zampini PetscInt pU, pUdot; 173fe8322adSStefano Zampini pU = U ? 1 : 0; 174fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 17563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time)); 1769566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 177fe8322adSStefano Zampini } 178fe8322adSStefano Zampini if (U && tj->lag.caching) { 179fe8322adSStefano Zampini PetscObjectId id; 180fe8322adSStefano Zampini PetscObjectState state; 181fe8322adSStefano Zampini 1829566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &state)); 1839566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &id)); 184fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 185fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 186fe8322adSStefano Zampini } else { 187fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 188fe8322adSStefano Zampini } 189fe8322adSStefano Zampini if (tj->monitor && !U) { 1909566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 1919566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n")); 1929566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 1939566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 194fe8322adSStefano Zampini } 195fe8322adSStefano Zampini } 196fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 197fe8322adSStefano Zampini PetscObjectId id; 198fe8322adSStefano Zampini PetscObjectState state; 199fe8322adSStefano Zampini 2009566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)Udot, &state)); 2019566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)Udot, &id)); 202fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 203fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 204fe8322adSStefano Zampini } else { 205fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 206fe8322adSStefano Zampini } 207fe8322adSStefano Zampini if (tj->monitor && !Udot) { 2089566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 2099566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n")); 2109566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2119566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 212fe8322adSStefano Zampini } 213fe8322adSStefano Zampini } 214fe8322adSStefano Zampini if (!U && !Udot) { 2159566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0)); 2163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 217fe8322adSStefano Zampini } 218fe8322adSStefano Zampini 219fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 2201baa6e33SBarry Smith if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 221fe8322adSStefano Zampini /* cached states will be updated in the function */ 2229566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot)); 223fe8322adSStefano Zampini if (tj->monitor) { 2249566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2259566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 226fe8322adSStefano Zampini } 227fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 228fe8322adSStefano Zampini TS fakets = ts; 229fe8322adSStefano Zampini Vec U2; 230fe8322adSStefano Zampini 231fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 232fe8322adSStefano Zampini if (!ts) { 2339566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets)); 234fe8322adSStefano Zampini if (!fakets) { 2359566063dSJacob Faibussowitsch PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets)); 2369566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets)); 2379566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)fakets)); 2389566063dSJacob Faibussowitsch PetscCall(VecDuplicate(U, &U2)); 2399566063dSJacob Faibussowitsch PetscCall(TSSetSolution(fakets, U2)); 2409566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)U2)); 241fe8322adSStefano Zampini } 242fe8322adSStefano Zampini } 2439566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time)); 2449566063dSJacob Faibussowitsch PetscCall(TSGetSolution(fakets, &U2)); 2459566063dSJacob Faibussowitsch PetscCall(VecCopy(U2, U)); 2469566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state)); 2479566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id)); 248fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 249fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 250fe8322adSStefano Zampini } 2519566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0)); 2523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 253fe8322adSStefano Zampini } 254fe8322adSStefano Zampini 255ffeef943SBarry Smith /*@ 256bcf0153eSBarry Smith TSTrajectoryViewFromOptions - View a `TSTrajectory` based on values in the options database 257fe2efc57SMark 258c3339decSBarry Smith Collective 259fe2efc57SMark 260fe2efc57SMark Input Parameters: 261bcf0153eSBarry Smith + A - the `TSTrajectory` context 262bcf0153eSBarry Smith . obj - Optional object that provides prefix used for option name 263736c3998SJose E. Roman - name - command line option 264fe2efc57SMark 265fe2efc57SMark Level: intermediate 266bcf0153eSBarry Smith 2671cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()` 268fe2efc57SMark @*/ 269d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[]) 270d71ae5a4SJacob Faibussowitsch { 271fe2efc57SMark PetscFunctionBegin; 272fe2efc57SMark PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1); 2739566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 2743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 275fe2efc57SMark } 276fe2efc57SMark 277ffeef943SBarry Smith /*@ 278bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 279bc952696SBarry Smith 280c3339decSBarry Smith Collective 281bc952696SBarry Smith 282bc952696SBarry Smith Input Parameters: 283bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()` 284bc952696SBarry Smith - viewer - visualization context 285bc952696SBarry Smith 286bc952696SBarry Smith Options Database Key: 287bcf0153eSBarry Smith . -ts_trajectory_view - calls `TSTrajectoryView()` at end of `TSAdjointStep()` 288bcf0153eSBarry Smith 289bcf0153eSBarry Smith Level: developer 290bc952696SBarry Smith 291bc952696SBarry Smith Notes: 292bc952696SBarry Smith The available visualization contexts include 293bcf0153eSBarry Smith + `PETSC_VIEWER_STDOUT_SELF` - standard output (default) 294bcf0153eSBarry Smith - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard 295bc952696SBarry Smith output where only the first processor opens 296bc952696SBarry Smith the file. All other processors send their 297bc952696SBarry Smith data to the first processor to print. 298bc952696SBarry Smith 299bc952696SBarry Smith The user can open an alternative visualization context with 300bcf0153eSBarry Smith `PetscViewerASCIIOpen()` - output to a specified file. 301bc952696SBarry Smith 3021cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `PetscViewer`, `PetscViewerASCIIOpen()` 303bc952696SBarry Smith @*/ 304d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer) 305d71ae5a4SJacob Faibussowitsch { 306bc952696SBarry Smith PetscBool iascii; 307bc952696SBarry Smith 308bc952696SBarry Smith PetscFunctionBegin; 3091a5a771fSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 31048a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer)); 311bc952696SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 312b1d74d50SHong Zhang PetscCheckSameComm(tj, 1, viewer, 2); 313bc952696SBarry Smith 3149566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 315bc952696SBarry Smith if (iascii) { 3169566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer)); 31763a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps)); 31863a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads)); 31963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites)); 3209566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 321dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, view, viewer); 3229566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 323bc952696SBarry Smith } 3243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 325bc952696SBarry Smith } 326bc952696SBarry Smith 327bc952696SBarry Smith /*@C 32878fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 32978fbdcc8SBarry Smith 330c3339decSBarry Smith Collective 33178fbdcc8SBarry Smith 33278fbdcc8SBarry Smith Input Parameters: 333b43aa488SJacob Faibussowitsch + ctx - the trajectory context 334dc9a610eSPierre Jolivet - names - the names of the components, final string must be `NULL` 33578fbdcc8SBarry Smith 33678fbdcc8SBarry Smith Level: intermediate 33778fbdcc8SBarry Smith 338b43aa488SJacob Faibussowitsch Fortran Notes: 339bcf0153eSBarry Smith Fortran interface is not possible because of the string array argument 340db901c5bSHong Zhang 3411cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSGetTrajectory()` 34278fbdcc8SBarry Smith @*/ 343d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names) 344d71ae5a4SJacob Faibussowitsch { 34578fbdcc8SBarry Smith PetscFunctionBegin; 346fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1); 3474f572ea9SToby Isaac PetscAssertPointer(names, 2); 3489566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&ctx->names)); 3499566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(names, &ctx->names)); 3503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 35178fbdcc8SBarry Smith } 35278fbdcc8SBarry Smith 35378fbdcc8SBarry Smith /*@C 354fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 35508347785SBarry Smith 356c3339decSBarry Smith Collective 35708347785SBarry Smith 35808347785SBarry Smith Input Parameters: 359bcf0153eSBarry Smith + tj - the `TSTrajectory` context 36008347785SBarry Smith . transform - the transform function 36108347785SBarry Smith . destroy - function to destroy the optional context 362b43aa488SJacob Faibussowitsch - tctx - optional context used by transform function 36308347785SBarry Smith 36408347785SBarry Smith Level: intermediate 36508347785SBarry Smith 3661cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()` 36708347785SBarry Smith @*/ 368d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx) 369d71ae5a4SJacob Faibussowitsch { 37008347785SBarry Smith PetscFunctionBegin; 371fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 37208347785SBarry Smith tj->transform = transform; 37308347785SBarry Smith tj->transformdestroy = destroy; 37408347785SBarry Smith tj->transformctx = tctx; 3753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 37608347785SBarry Smith } 37708347785SBarry Smith 378db901c5bSHong Zhang /*@ 379bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 380bc952696SBarry Smith 381d083f849SBarry Smith Collective 382bc952696SBarry Smith 383bc952696SBarry Smith Input Parameter: 3843c0fce88SHong Zhang . comm - the communicator 385bc952696SBarry Smith 386bc952696SBarry Smith Output Parameter: 3873c0fce88SHong Zhang . tj - the trajectory object 388bc952696SBarry Smith 389df5474d8SHong Zhang Level: developer 390bc952696SBarry Smith 39195452b02SPatrick Sanan Notes: 392bcf0153eSBarry Smith Usually one does not call this routine, it is called automatically when one calls `TSSetSaveTrajectory()`. 393bc952696SBarry Smith 3941cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()` 395bc952696SBarry Smith @*/ 396d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj) 397d71ae5a4SJacob Faibussowitsch { 398bc952696SBarry Smith TSTrajectory t; 399bc952696SBarry Smith 400bc952696SBarry Smith PetscFunctionBegin; 4014f572ea9SToby Isaac PetscAssertPointer(tj, 2); 4029566063dSJacob Faibussowitsch PetscCall(TSInitializePackage()); 403bc952696SBarry Smith 4049566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView)); 40568bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 4069566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(comm, &t->tsh)); 407fe8322adSStefano Zampini t->lag.order = 1; 408fe8322adSStefano Zampini t->lag.L = NULL; 409fe8322adSStefano Zampini t->lag.T = NULL; 410fe8322adSStefano Zampini t->lag.W = NULL; 411fe8322adSStefano Zampini t->lag.WW = NULL; 412fe8322adSStefano Zampini t->lag.TW = NULL; 413fe8322adSStefano Zampini t->lag.TT = NULL; 414fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 415fe8322adSStefano Zampini t->lag.Ucached.id = 0; 416fe8322adSStefano Zampini t->lag.Ucached.state = -1; 417fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 418*1690c2aeSBarry Smith t->lag.Ucached.step = PETSC_INT_MAX; 419fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 420fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 421fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 422*1690c2aeSBarry Smith t->lag.Udotcached.step = PETSC_INT_MAX; 423fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 424fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 425fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 426ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 427b1d74d50SHong Zhang *tj = t; 42863a3b9bcSJacob Faibussowitsch PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin")); 4293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 430bc952696SBarry Smith } 431bc952696SBarry Smith 432cc4c1da9SBarry Smith /*@ 433bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 434bc952696SBarry Smith 435c3339decSBarry Smith Collective 436bc952696SBarry Smith 437bc952696SBarry Smith Input Parameters: 438bcf0153eSBarry Smith + tj - the `TSTrajectory` context 439bcf0153eSBarry Smith . ts - the `TS` context 4403c0fce88SHong Zhang - type - a known method 441bc952696SBarry Smith 442bcf0153eSBarry Smith Options Database Key: 443e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 444bc952696SBarry Smith 445df5474d8SHong Zhang Level: developer 446bc952696SBarry Smith 447b43aa488SJacob Faibussowitsch Developer Notes: 448bcf0153eSBarry Smith Why does this option require access to the `TS` 449bc952696SBarry Smith 4501cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()` 451bc952696SBarry Smith @*/ 452d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type) 453d71ae5a4SJacob Faibussowitsch { 454972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory, TS); 455bc952696SBarry Smith PetscBool match; 456bc952696SBarry Smith 457bc952696SBarry Smith PetscFunctionBegin; 458972caf09SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 4599566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match)); 4603ba16761SJacob Faibussowitsch if (match) PetscFunctionReturn(PETSC_SUCCESS); 461bc952696SBarry Smith 4629566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r)); 4636adde796SStefano Zampini PetscCheck(r, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type); 4649927e4dfSBarry Smith PetscTryTypeMethod(tj, destroy); 465972caf09SHong Zhang tj->ops->destroy = NULL; 4669566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops))); 467bc952696SBarry Smith 4689566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type)); 4699566063dSJacob Faibussowitsch PetscCall((*r)(tj, ts)); 4703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 471bc952696SBarry Smith } 472bc952696SBarry Smith 473cc4c1da9SBarry Smith /*@ 474881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 475881c1a9bSHong Zhang 476c3339decSBarry Smith Collective 477881c1a9bSHong Zhang 478881c1a9bSHong Zhang Input Parameters: 479bcf0153eSBarry Smith + tj - the `TSTrajectory` context 480bcf0153eSBarry Smith - ts - the `TS` context 481881c1a9bSHong Zhang 4822fe279fdSBarry Smith Output Parameter: 483881c1a9bSHong Zhang . type - a known method 484881c1a9bSHong Zhang 485881c1a9bSHong Zhang Level: developer 486881c1a9bSHong Zhang 4871cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()` 488881c1a9bSHong Zhang @*/ 489d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type) 490d71ae5a4SJacob Faibussowitsch { 491881c1a9bSHong Zhang PetscFunctionBegin; 492881c1a9bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 493881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 4943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 495881c1a9bSHong Zhang } 496881c1a9bSHong Zhang 497972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS); 498972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS); 4999a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS); 5002b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS); 501bc952696SBarry Smith 502bc952696SBarry Smith /*@C 503bcf0153eSBarry Smith TSTrajectoryRegisterAll - Registers all of the `TSTrajectory` storage schecmes in the `TS` package. 504bc952696SBarry Smith 505bc952696SBarry Smith Not Collective 506bc952696SBarry Smith 507df5474d8SHong Zhang Level: developer 508bc952696SBarry Smith 5091cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryRegister()` 510bc952696SBarry Smith @*/ 511d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void) 512d71ae5a4SJacob Faibussowitsch { 513bc952696SBarry Smith PetscFunctionBegin; 5143ba16761SJacob Faibussowitsch if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 515bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 516bc952696SBarry Smith 5179566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic)); 5189566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile)); 5199566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory)); 5209566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization)); 5213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 522bc952696SBarry Smith } 523bc952696SBarry Smith 524bc952696SBarry Smith /*@ 5251550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5261550c9b9SHong Zhang 527c3339decSBarry Smith Collective 5281550c9b9SHong Zhang 5291550c9b9SHong Zhang Input Parameter: 530bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSGetTrajectory()` 5311550c9b9SHong Zhang 5321550c9b9SHong Zhang Level: developer 5331550c9b9SHong Zhang 5341cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 5351550c9b9SHong Zhang @*/ 536d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 537d71ae5a4SJacob Faibussowitsch { 5381550c9b9SHong Zhang PetscFunctionBegin; 5393ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS); 5409a992471SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 541dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, reset); 5429566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 5439566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&tj->tsh)); 5449566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh)); 545fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5471550c9b9SHong Zhang } 5481550c9b9SHong Zhang 5491550c9b9SHong Zhang /*@ 550bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 551bc952696SBarry Smith 552c3339decSBarry Smith Collective 553bc952696SBarry Smith 554bc952696SBarry Smith Input Parameter: 555bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()` 556bc952696SBarry Smith 557df5474d8SHong Zhang Level: developer 558bc952696SBarry Smith 5591cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 560bc952696SBarry Smith @*/ 561d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 562d71ae5a4SJacob Faibussowitsch { 563bc952696SBarry Smith PetscFunctionBegin; 5643ba16761SJacob Faibussowitsch if (!*tj) PetscFunctionReturn(PETSC_SUCCESS); 565f4f49eeaSPierre Jolivet PetscValidHeaderSpecific(*tj, TSTRAJECTORY_CLASSID, 1); 566f4f49eeaSPierre Jolivet if (--((PetscObject)*tj)->refct > 0) { 5679371c9d4SSatish Balay *tj = NULL; 5683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5699371c9d4SSatish Balay } 570bc952696SBarry Smith 5719566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReset(*tj)); 5729566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&(*tj)->tsh)); 5739566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W)); 5749566063dSJacob Faibussowitsch PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW)); 5759566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->U)); 5769566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->Udot)); 5779a992471SHong Zhang 5789566063dSJacob Faibussowitsch if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx)); 579f4f49eeaSPierre Jolivet PetscTryTypeMethod(*tj, destroy); 580fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 581fe8322adSStefano Zampini PetscMPIInt rank; 582fe8322adSStefano Zampini MPI_Comm comm; 583fe8322adSStefano Zampini 584f4f49eeaSPierre Jolivet PetscCall(PetscObjectGetComm((PetscObject)*tj, &comm)); 5859566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 586dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 5879566063dSJacob Faibussowitsch PetscCall(PetscRMTree((*tj)->dirname)); 588fe8322adSStefano Zampini } 589fe8322adSStefano Zampini } 5909566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*tj)->names)); 5919566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->dirname)); 5929566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->filetemplate)); 5939566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tj)); 5943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 595bc952696SBarry Smith } 596bc952696SBarry Smith 597bc952696SBarry Smith /* 598bcf0153eSBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of `TSTrajectory` from user options. 599bc952696SBarry Smith 600c3339decSBarry Smith Collective 601bc952696SBarry Smith 602bc952696SBarry Smith Input Parameter: 603bcf0153eSBarry Smith + tj - the `TSTrajectory` context 6043c0fce88SHong Zhang - ts - the TS context 6053c0fce88SHong Zhang 606bcf0153eSBarry Smith Options Database Key: 6073c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 608bc952696SBarry Smith 609df5474d8SHong Zhang Level: developer 610bc952696SBarry Smith 6111cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryType`, `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()` 612bc952696SBarry Smith */ 613d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts) 614d71ae5a4SJacob Faibussowitsch { 615bc952696SBarry Smith PetscBool opt; 616bc952696SBarry Smith const char *defaultType; 617bc952696SBarry Smith char typeName[256]; 618bc952696SBarry Smith 619bc952696SBarry Smith PetscFunctionBegin; 620b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 621bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 622bc952696SBarry Smith 6239566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegisterAll()); 6249566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt)); 625bc952696SBarry Smith if (opt) { 6269566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, typeName)); 627bc952696SBarry Smith } else { 6289566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, defaultType)); 629bc952696SBarry Smith } 6303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 631bc952696SBarry Smith } 632bc952696SBarry Smith 633ed695a29SHong Zhang /*@ 634bcf0153eSBarry Smith TSTrajectorySetUseHistory - Use `TSHistory` in `TSTrajectory` 6359ffb3502SHong Zhang 636c3339decSBarry Smith Collective 6379ffb3502SHong Zhang 6384165533cSJose E. Roman Input Parameters: 639bcf0153eSBarry Smith + tj - the `TSTrajectory` context 640bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable 6419ffb3502SHong Zhang 642bcf0153eSBarry Smith Options Database Key: 643bcf0153eSBarry Smith . -ts_trajectory_use_history - have it use `TSHistory` 6449ffb3502SHong Zhang 6459ffb3502SHong Zhang Level: advanced 6469ffb3502SHong Zhang 6471cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 6489ffb3502SHong Zhang @*/ 649d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg) 650d71ae5a4SJacob Faibussowitsch { 6519ffb3502SHong Zhang PetscFunctionBegin; 6529ffb3502SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 6539ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 6549ffb3502SHong Zhang tj->usehistory = flg; 6553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6569ffb3502SHong Zhang } 6579ffb3502SHong Zhang 6589ffb3502SHong Zhang /*@ 659bcf0153eSBarry Smith TSTrajectorySetMonitor - Monitor the schedules generated by the `TSTrajectory` checkpointing controller 660ed695a29SHong Zhang 661c3339decSBarry Smith Collective 662ed695a29SHong Zhang 6634165533cSJose E. Roman Input Parameters: 664bcf0153eSBarry Smith + tj - the `TSTrajectory` context 665bcf0153eSBarry Smith - flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable 666ed695a29SHong Zhang 667bcf0153eSBarry Smith Options Database Key: 668bcf0153eSBarry Smith . -ts_trajectory_monitor - print `TSTrajectory` information 6693c0fce88SHong Zhang 670df5474d8SHong Zhang Level: developer 671ed695a29SHong Zhang 6721cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 673ed695a29SHong Zhang @*/ 674d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg) 675d71ae5a4SJacob Faibussowitsch { 676ed695a29SHong Zhang PetscFunctionBegin; 677ed695a29SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 678ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 679fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 680fe8322adSStefano Zampini else tj->monitor = NULL; 6813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 682ed695a29SHong Zhang } 683ed695a29SHong Zhang 684bc952696SBarry Smith /*@ 685bcf0153eSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the `TSTrajectory` once the program is done 68664fc91eeSBarry Smith 687c3339decSBarry Smith Collective 68864fc91eeSBarry Smith 6894165533cSJose E. Roman Input Parameters: 690bcf0153eSBarry Smith + tj - the `TSTrajectory` context 691bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable 69264fc91eeSBarry Smith 693bcf0153eSBarry Smith Options Database Key: 69464fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 69564fc91eeSBarry Smith 69664fc91eeSBarry Smith Level: advanced 69764fc91eeSBarry Smith 698bcf0153eSBarry Smith Note: 699bcf0153eSBarry Smith By default the `TSTrajectory` used for adjoint computations, `TSTRAJECTORYBASIC`, removes the files it generates at the end of the run. This causes the files to be kept. 700bcf0153eSBarry Smith 7011cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()` 70264fc91eeSBarry Smith @*/ 703d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg) 704d71ae5a4SJacob Faibussowitsch { 70564fc91eeSBarry Smith PetscFunctionBegin; 70664fc91eeSBarry Smith PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 70764fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj, flg, 2); 70864fc91eeSBarry Smith tj->keepfiles = flg; 7093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 71064fc91eeSBarry Smith } 71164fc91eeSBarry Smith 712cc4c1da9SBarry Smith /*@ 713bcf0153eSBarry Smith TSTrajectorySetDirname - Specify the name of the directory where `TSTrajectory` disk checkpoints are stored. 71464e38db7SHong Zhang 715c3339decSBarry Smith Collective 71664e38db7SHong Zhang 7174165533cSJose E. Roman Input Parameters: 718bcf0153eSBarry Smith + tj - the `TSTrajectory` context 71964e38db7SHong Zhang - dirname - the directory name 72064e38db7SHong Zhang 721bcf0153eSBarry Smith Options Database Key: 72264e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 72364e38db7SHong Zhang 72464e38db7SHong Zhang Level: developer 72564e38db7SHong Zhang 726bcf0153eSBarry Smith Notes: 727bcf0153eSBarry Smith The final location of the files is determined by dirname/filetemplate where filetemplate was provided by `TSTrajectorySetFiletemplate()` 728bcf0153eSBarry Smith 729bcf0153eSBarry Smith If this is not called `TSTrajectory` selects a unique new name for the directory 730bcf0153eSBarry Smith 7311cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()` 73264e38db7SHong Zhang @*/ 733d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[]) 734d71ae5a4SJacob Faibussowitsch { 735a17281aeSStefano Zampini PetscBool flg; 736a17281aeSStefano Zampini 73764e38db7SHong Zhang PetscFunctionBegin; 73864e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 7399566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(tj->dirname, dirname, &flg)); 740049d1499SBarry Smith PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup"); 7419566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirname)); 7429566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(dirname, &tj->dirname)); 7433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 74464e38db7SHong Zhang } 74564e38db7SHong Zhang 746cc4c1da9SBarry Smith /*@ 747bcf0153eSBarry Smith TSTrajectorySetFiletemplate - Specify the name template for the files storing `TSTrajectory` checkpoints. 74864e38db7SHong Zhang 749c3339decSBarry Smith Collective 75064e38db7SHong Zhang 7514165533cSJose E. Roman Input Parameters: 752bcf0153eSBarry Smith + tj - the `TSTrajectory` context 7531585b412SBarry Smith - filetemplate - the template 75464e38db7SHong Zhang 755bcf0153eSBarry Smith Options Database Key: 7561585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7571585b412SBarry Smith 758bcf0153eSBarry Smith Level: developer 759bcf0153eSBarry Smith 76095452b02SPatrick Sanan Notes: 76163a3b9bcSJacob Faibussowitsch The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading / 7621585b412SBarry Smith 763bcf0153eSBarry Smith The final location of the files is determined by dirname/filetemplate where dirname was provided by `TSTrajectorySetDirname()`. The %06" PetscInt_FMT " is replaced by the 7641585b412SBarry Smith timestep counter 76564e38db7SHong Zhang 7661cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetDirname()`, `TSTrajectorySetUp()` 76764e38db7SHong Zhang @*/ 768d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[]) 769d71ae5a4SJacob Faibussowitsch { 770bbcf679cSJacob Faibussowitsch const char *ptr = NULL, *ptr2 = NULL; 7719afe7f3eSBarry Smith 77264e38db7SHong Zhang PetscFunctionBegin; 77364e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 7744f572ea9SToby Isaac PetscAssertPointer(filetemplate, 2); 7753c633725SBarry Smith PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup"); 7769afe7f3eSBarry Smith 77763a3b9bcSJacob Faibussowitsch PetscCheck(filetemplate[0], PetscObjectComm((PetscObject)tj), PETSC_ERR_USER, "-ts_trajectory_file_template requires a file name template, e.g. filename-%%06" PetscInt_FMT ".bin"); 7789afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7799566063dSJacob Faibussowitsch PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr)); 78063a3b9bcSJacob Faibussowitsch PetscCheck(ptr, PetscObjectComm((PetscObject)tj), PETSC_ERR_USER, "-ts_trajectory_file_template requires a file name template, e.g. filename-%%06" PetscInt_FMT ".bin"); 7819afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 78263a3b9bcSJacob Faibussowitsch PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2)); 78363a3b9bcSJacob Faibussowitsch PetscCheck(ptr2 || (*ptr >= '0' && *ptr <= '9'), PetscObjectComm((PetscObject)tj), PETSC_ERR_USER, "Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06" PetscInt_FMT ".bin"); 7849afe7f3eSBarry Smith if (ptr2) break; 7859afe7f3eSBarry Smith } 7869566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->filetemplate)); 7879566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate)); 7883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 78964e38db7SHong Zhang } 79064e38db7SHong Zhang 79164e38db7SHong Zhang /*@ 792bcf0153eSBarry Smith TSTrajectorySetFromOptions - Sets various `TSTrajectory` parameters from user options. 793bc952696SBarry Smith 794c3339decSBarry Smith Collective 795bc952696SBarry Smith 796d8d19677SJose E. Roman Input Parameters: 797bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSGetTrajectory()` 798bcf0153eSBarry Smith - ts - the `TS` context 799bc952696SBarry Smith 800bc952696SBarry Smith Options Database Keys: 801bcf0153eSBarry Smith + -ts_trajectory_type <type> - basic, memory, singlefile, visualization 802bcf0153eSBarry Smith . -ts_trajectory_keep_files <true,false> - keep the files generated by the code after the program ends. This is true by default for singlefile and visualization 803bcf0153eSBarry Smith - -ts_trajectory_monitor - print `TSTrajectory` information 804bc952696SBarry Smith 805df5474d8SHong Zhang Level: developer 806bc952696SBarry Smith 807bcf0153eSBarry Smith Note: 80895452b02SPatrick Sanan This is not normally called directly by users 809bc952696SBarry Smith 8101cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectorySetUp()` 811bc952696SBarry Smith @*/ 812d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts) 813d71ae5a4SJacob Faibussowitsch { 814ed695a29SHong Zhang PetscBool set, flg; 81564e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN]; 816bc952696SBarry Smith 817bc952696SBarry Smith PetscFunctionBegin; 818b1d74d50SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 819fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 820d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tj); 8219566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts)); 8229566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL)); 8239566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set)); 8249566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetMonitor(tj, flg)); 8259566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL)); 8269566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL)); 8279566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_adjointmode", "Instruct the trajectory that will be used in a TSAdjointSolve()", NULL, tj->adjoint_solve_mode, &tj->adjoint_solve_mode, NULL)); 8289566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL)); 8299566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set)); 8309566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg)); 83164e38db7SHong Zhang 8329566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set)); 8331baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetDirname(tj, dirname)); 83464e38db7SHong Zhang 83563a3b9bcSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set)); 8361baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate)); 83764e38db7SHong Zhang 83864e38db7SHong Zhang /* Handle specific TSTrajectory options */ 839dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject); 840d0609cedSBarry Smith PetscOptionsEnd(); 8413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 842bc952696SBarry Smith } 84368bece0bSHong Zhang 84468bece0bSHong Zhang /*@ 84568bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 846bcf0153eSBarry Smith of a `TS` `TSTrajectory`. 84768bece0bSHong Zhang 848c3339decSBarry Smith Collective 84968bece0bSHong Zhang 850d8d19677SJose E. Roman Input Parameters: 851bcf0153eSBarry Smith + tj - the `TSTrajectory` context 852bcf0153eSBarry Smith - ts - the TS context obtained from `TSCreate()` 85368bece0bSHong Zhang 854df5474d8SHong Zhang Level: developer 85568bece0bSHong Zhang 8561cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()` 85768bece0bSHong Zhang @*/ 858d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts) 859d71ae5a4SJacob Faibussowitsch { 8609afe7f3eSBarry Smith size_t s1, s2; 86168bece0bSHong Zhang 86268bece0bSHong Zhang PetscFunctionBegin; 8633ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS); 86468bece0bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 865fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 8663ba16761SJacob Faibussowitsch if (tj->setupcalled) PetscFunctionReturn(PETSC_SUCCESS); 86768bece0bSHong Zhang 8689566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0)); 86948a46eb9SPierre Jolivet if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC)); 870dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setup, ts); 87168bece0bSHong Zhang 87268bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 87353b27ddbSHong Zhang 87453b27ddbSHong Zhang /* Set the counters to zero */ 8751a5a771fSHong Zhang tj->recomps = 0; 87653b27ddbSHong Zhang tj->diskreads = 0; 87753b27ddbSHong Zhang tj->diskwrites = 0; 8789566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->dirname, &s1)); 8799566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->filetemplate, &s2)); 8809566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 8819566063dSJacob Faibussowitsch PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate)); 8829566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate)); 8839566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0)); 8843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 88568bece0bSHong Zhang } 886fe8322adSStefano Zampini 887fe8322adSStefano Zampini /*@ 888bcf0153eSBarry Smith TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage information 889fe8322adSStefano Zampini 890c3339decSBarry Smith Collective 891fe8322adSStefano Zampini 892d8d19677SJose E. Roman Input Parameters: 893bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained with `TSGetTrajectory()` 894b43aa488SJacob Faibussowitsch - solution_only - the boolean flag 895fe8322adSStefano Zampini 896fe8322adSStefano Zampini Level: developer 897fe8322adSStefano Zampini 8981cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()` 899fe8322adSStefano Zampini @*/ 900d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only) 901d71ae5a4SJacob Faibussowitsch { 902fe8322adSStefano Zampini PetscFunctionBegin; 903fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 904fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj, solution_only, 2); 905fe8322adSStefano Zampini tj->solution_only = solution_only; 9063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 907fe8322adSStefano Zampini } 908fe8322adSStefano Zampini 909fe8322adSStefano Zampini /*@ 910bcf0153eSBarry Smith TSTrajectoryGetSolutionOnly - Gets the value set with `TSTrajectorySetSolutionOnly()`. 911fe8322adSStefano Zampini 91220f4b53cSBarry Smith Logically Collective 913fe8322adSStefano Zampini 914fe8322adSStefano Zampini Input Parameter: 915bcf0153eSBarry Smith . tj - the `TSTrajectory` context 916fe8322adSStefano Zampini 917fe8322adSStefano Zampini Output Parameter: 918b43aa488SJacob Faibussowitsch . solution_only - the boolean flag 919fe8322adSStefano Zampini 920fe8322adSStefano Zampini Level: developer 921fe8322adSStefano Zampini 9221cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()` 923fe8322adSStefano Zampini @*/ 924d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only) 925d71ae5a4SJacob Faibussowitsch { 926fe8322adSStefano Zampini PetscFunctionBegin; 927fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 9284f572ea9SToby Isaac PetscAssertPointer(solution_only, 2); 929fe8322adSStefano Zampini *solution_only = tj->solution_only; 9303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 931fe8322adSStefano Zampini } 932fe8322adSStefano Zampini 933fe8322adSStefano Zampini /*@ 934fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 935fe8322adSStefano Zampini 936c3339decSBarry Smith Collective 937fe8322adSStefano Zampini 938d8d19677SJose E. Roman Input Parameters: 939bcf0153eSBarry Smith + tj - the `TSTrajectory` context 940bcf0153eSBarry Smith . ts - the `TS` solver context 941fe8322adSStefano Zampini - time - the requested time 942fe8322adSStefano Zampini 943d8d19677SJose E. Roman Output Parameters: 944fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 945fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 946fe8322adSStefano Zampini 947fe8322adSStefano Zampini Level: developer 948fe8322adSStefano Zampini 949bcf0153eSBarry Smith Notes: 950bcf0153eSBarry Smith The vectors are interpolated if time does not match any time step stored in the `TSTrajectory()`. Pass NULL to not request a vector. 951fe8322adSStefano Zampini 952bcf0153eSBarry Smith This function differs from `TSTrajectoryGetVecs()` since the vectors obtained cannot be modified, and they need to be returned by 953bcf0153eSBarry Smith calling `TSTrajectoryRestoreUpdatedHistoryVecs()`. 954bcf0153eSBarry Smith 9551cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()` 956fe8322adSStefano Zampini @*/ 957d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 958d71ae5a4SJacob Faibussowitsch { 959fe8322adSStefano Zampini PetscFunctionBegin; 960fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 961fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 962fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 3); 9634f572ea9SToby Isaac if (U) PetscAssertPointer(U, 4); 9644f572ea9SToby Isaac if (Udot) PetscAssertPointer(Udot, 5); 965fe8322adSStefano Zampini if (U && !tj->U) { 966fe8322adSStefano Zampini DM dm; 967fe8322adSStefano Zampini 9689566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9699566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->U)); 970fe8322adSStefano Zampini } 971fe8322adSStefano Zampini if (Udot && !tj->Udot) { 972fe8322adSStefano Zampini DM dm; 973fe8322adSStefano Zampini 9749566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9759566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->Udot)); 976fe8322adSStefano Zampini } 9779566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL)); 978fe8322adSStefano Zampini if (U) { 9799566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->U)); 980fe8322adSStefano Zampini *U = tj->U; 981fe8322adSStefano Zampini } 982fe8322adSStefano Zampini if (Udot) { 9839566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->Udot)); 984fe8322adSStefano Zampini *Udot = tj->Udot; 985fe8322adSStefano Zampini } 9863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 987fe8322adSStefano Zampini } 988fe8322adSStefano Zampini 989fe8322adSStefano Zampini /*@ 990bcf0153eSBarry Smith TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with `TSTrajectoryGetUpdatedHistoryVecs()`. 991fe8322adSStefano Zampini 992c3339decSBarry Smith Collective 993fe8322adSStefano Zampini 994d8d19677SJose E. Roman Input Parameters: 995bcf0153eSBarry Smith + tj - the `TSTrajectory` context 996fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 997fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 998fe8322adSStefano Zampini 999fe8322adSStefano Zampini Level: developer 1000fe8322adSStefano Zampini 10011cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryGetUpdatedHistoryVecs()` 1002fe8322adSStefano Zampini @*/ 1003d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1004d71ae5a4SJacob Faibussowitsch { 1005fe8322adSStefano Zampini PetscFunctionBegin; 1006fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 1007fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2); 1008fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3); 10093c633725SBarry Smith PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 10103c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1011fe8322adSStefano Zampini if (U) { 10129566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->U)); 1013fe8322adSStefano Zampini *U = NULL; 1014fe8322adSStefano Zampini } 1015fe8322adSStefano Zampini if (Udot) { 10169566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->Udot)); 1017fe8322adSStefano Zampini *Udot = NULL; 1018fe8322adSStefano Zampini } 10193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1020fe8322adSStefano Zampini } 1021