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 255*ffeef943SBarry 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 277*ffeef943SBarry 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); 402b1d74d50SHong Zhang *tj = NULL; 4039566063dSJacob Faibussowitsch PetscCall(TSInitializePackage()); 404bc952696SBarry Smith 4059566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView)); 40668bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 4079566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(comm, &t->tsh)); 408fe8322adSStefano Zampini 409fe8322adSStefano Zampini t->lag.order = 1; 410fe8322adSStefano Zampini t->lag.L = NULL; 411fe8322adSStefano Zampini t->lag.T = NULL; 412fe8322adSStefano Zampini t->lag.W = NULL; 413fe8322adSStefano Zampini t->lag.WW = NULL; 414fe8322adSStefano Zampini t->lag.TW = NULL; 415fe8322adSStefano Zampini t->lag.TT = NULL; 416fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 417fe8322adSStefano Zampini t->lag.Ucached.id = 0; 418fe8322adSStefano Zampini t->lag.Ucached.state = -1; 419fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 420fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 421fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 422fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 423fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 424fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 425fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 426fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 427fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 428ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 429b1d74d50SHong Zhang *tj = t; 43063a3b9bcSJacob Faibussowitsch PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin")); 4313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 432bc952696SBarry Smith } 433bc952696SBarry Smith 434cc4c1da9SBarry Smith /*@ 435bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 436bc952696SBarry Smith 437c3339decSBarry Smith Collective 438bc952696SBarry Smith 439bc952696SBarry Smith Input Parameters: 440bcf0153eSBarry Smith + tj - the `TSTrajectory` context 441bcf0153eSBarry Smith . ts - the `TS` context 4423c0fce88SHong Zhang - type - a known method 443bc952696SBarry Smith 444bcf0153eSBarry Smith Options Database Key: 445e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 446bc952696SBarry Smith 447df5474d8SHong Zhang Level: developer 448bc952696SBarry Smith 449b43aa488SJacob Faibussowitsch Developer Notes: 450bcf0153eSBarry Smith Why does this option require access to the `TS` 451bc952696SBarry Smith 4521cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()` 453bc952696SBarry Smith @*/ 454d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type) 455d71ae5a4SJacob Faibussowitsch { 456972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory, TS); 457bc952696SBarry Smith PetscBool match; 458bc952696SBarry Smith 459bc952696SBarry Smith PetscFunctionBegin; 460972caf09SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 4619566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match)); 4623ba16761SJacob Faibussowitsch if (match) PetscFunctionReturn(PETSC_SUCCESS); 463bc952696SBarry Smith 4649566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r)); 4656adde796SStefano Zampini PetscCheck(r, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type); 4669927e4dfSBarry Smith PetscTryTypeMethod(tj, destroy); 467972caf09SHong Zhang tj->ops->destroy = NULL; 4689566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops))); 469bc952696SBarry Smith 4709566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type)); 4719566063dSJacob Faibussowitsch PetscCall((*r)(tj, ts)); 4723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 473bc952696SBarry Smith } 474bc952696SBarry Smith 475cc4c1da9SBarry Smith /*@ 476881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 477881c1a9bSHong Zhang 478c3339decSBarry Smith Collective 479881c1a9bSHong Zhang 480881c1a9bSHong Zhang Input Parameters: 481bcf0153eSBarry Smith + tj - the `TSTrajectory` context 482bcf0153eSBarry Smith - ts - the `TS` context 483881c1a9bSHong Zhang 4842fe279fdSBarry Smith Output Parameter: 485881c1a9bSHong Zhang . type - a known method 486881c1a9bSHong Zhang 487881c1a9bSHong Zhang Level: developer 488881c1a9bSHong Zhang 4891cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()` 490881c1a9bSHong Zhang @*/ 491d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type) 492d71ae5a4SJacob Faibussowitsch { 493881c1a9bSHong Zhang PetscFunctionBegin; 494881c1a9bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 495881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 4963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 497881c1a9bSHong Zhang } 498881c1a9bSHong Zhang 499972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS); 500972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS); 5019a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS); 5022b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS); 503bc952696SBarry Smith 504bc952696SBarry Smith /*@C 505bcf0153eSBarry Smith TSTrajectoryRegisterAll - Registers all of the `TSTrajectory` storage schecmes in the `TS` package. 506bc952696SBarry Smith 507bc952696SBarry Smith Not Collective 508bc952696SBarry Smith 509df5474d8SHong Zhang Level: developer 510bc952696SBarry Smith 5111cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryRegister()` 512bc952696SBarry Smith @*/ 513d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void) 514d71ae5a4SJacob Faibussowitsch { 515bc952696SBarry Smith PetscFunctionBegin; 5163ba16761SJacob Faibussowitsch if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 517bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 518bc952696SBarry Smith 5199566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic)); 5209566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile)); 5219566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory)); 5229566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization)); 5233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 524bc952696SBarry Smith } 525bc952696SBarry Smith 526bc952696SBarry Smith /*@ 5271550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5281550c9b9SHong Zhang 529c3339decSBarry Smith Collective 5301550c9b9SHong Zhang 5311550c9b9SHong Zhang Input Parameter: 532bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSGetTrajectory()` 5331550c9b9SHong Zhang 5341550c9b9SHong Zhang Level: developer 5351550c9b9SHong Zhang 5361cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 5371550c9b9SHong Zhang @*/ 538d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 539d71ae5a4SJacob Faibussowitsch { 5401550c9b9SHong Zhang PetscFunctionBegin; 5413ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS); 5429a992471SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 543dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, reset); 5449566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 5459566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&tj->tsh)); 5469566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh)); 547fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5491550c9b9SHong Zhang } 5501550c9b9SHong Zhang 5511550c9b9SHong Zhang /*@ 552bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 553bc952696SBarry Smith 554c3339decSBarry Smith Collective 555bc952696SBarry Smith 556bc952696SBarry Smith Input Parameter: 557bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()` 558bc952696SBarry Smith 559df5474d8SHong Zhang Level: developer 560bc952696SBarry Smith 5611cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 562bc952696SBarry Smith @*/ 563d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 564d71ae5a4SJacob Faibussowitsch { 565bc952696SBarry Smith PetscFunctionBegin; 5663ba16761SJacob Faibussowitsch if (!*tj) PetscFunctionReturn(PETSC_SUCCESS); 567f4f49eeaSPierre Jolivet PetscValidHeaderSpecific(*tj, TSTRAJECTORY_CLASSID, 1); 568f4f49eeaSPierre Jolivet if (--((PetscObject)*tj)->refct > 0) { 5699371c9d4SSatish Balay *tj = NULL; 5703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5719371c9d4SSatish Balay } 572bc952696SBarry Smith 5739566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReset(*tj)); 5749566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&(*tj)->tsh)); 5759566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W)); 5769566063dSJacob Faibussowitsch PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW)); 5779566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->U)); 5789566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->Udot)); 5799a992471SHong Zhang 5809566063dSJacob Faibussowitsch if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx)); 581f4f49eeaSPierre Jolivet PetscTryTypeMethod(*tj, destroy); 582fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 583fe8322adSStefano Zampini PetscMPIInt rank; 584fe8322adSStefano Zampini MPI_Comm comm; 585fe8322adSStefano Zampini 586f4f49eeaSPierre Jolivet PetscCall(PetscObjectGetComm((PetscObject)*tj, &comm)); 5879566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 588dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 5899566063dSJacob Faibussowitsch PetscCall(PetscRMTree((*tj)->dirname)); 590fe8322adSStefano Zampini } 591fe8322adSStefano Zampini } 5929566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*tj)->names)); 5939566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->dirname)); 5949566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->filetemplate)); 5959566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tj)); 5963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 597bc952696SBarry Smith } 598bc952696SBarry Smith 599bc952696SBarry Smith /* 600bcf0153eSBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of `TSTrajectory` from user options. 601bc952696SBarry Smith 602c3339decSBarry Smith Collective 603bc952696SBarry Smith 604bc952696SBarry Smith Input Parameter: 605bcf0153eSBarry Smith + tj - the `TSTrajectory` context 6063c0fce88SHong Zhang - ts - the TS context 6073c0fce88SHong Zhang 608bcf0153eSBarry Smith Options Database Key: 6093c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 610bc952696SBarry Smith 611df5474d8SHong Zhang Level: developer 612bc952696SBarry Smith 6131cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryType`, `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()` 614bc952696SBarry Smith */ 615d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts) 616d71ae5a4SJacob Faibussowitsch { 617bc952696SBarry Smith PetscBool opt; 618bc952696SBarry Smith const char *defaultType; 619bc952696SBarry Smith char typeName[256]; 620bc952696SBarry Smith 621bc952696SBarry Smith PetscFunctionBegin; 622b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 623bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 624bc952696SBarry Smith 6259566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegisterAll()); 6269566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt)); 627bc952696SBarry Smith if (opt) { 6289566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, typeName)); 629bc952696SBarry Smith } else { 6309566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, defaultType)); 631bc952696SBarry Smith } 6323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 633bc952696SBarry Smith } 634bc952696SBarry Smith 635ed695a29SHong Zhang /*@ 636bcf0153eSBarry Smith TSTrajectorySetUseHistory - Use `TSHistory` in `TSTrajectory` 6379ffb3502SHong Zhang 638c3339decSBarry Smith Collective 6399ffb3502SHong Zhang 6404165533cSJose E. Roman Input Parameters: 641bcf0153eSBarry Smith + tj - the `TSTrajectory` context 642bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable 6439ffb3502SHong Zhang 644bcf0153eSBarry Smith Options Database Key: 645bcf0153eSBarry Smith . -ts_trajectory_use_history - have it use `TSHistory` 6469ffb3502SHong Zhang 6479ffb3502SHong Zhang Level: advanced 6489ffb3502SHong Zhang 6491cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 6509ffb3502SHong Zhang @*/ 651d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg) 652d71ae5a4SJacob Faibussowitsch { 6539ffb3502SHong Zhang PetscFunctionBegin; 6549ffb3502SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 6559ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 6569ffb3502SHong Zhang tj->usehistory = flg; 6573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6589ffb3502SHong Zhang } 6599ffb3502SHong Zhang 6609ffb3502SHong Zhang /*@ 661bcf0153eSBarry Smith TSTrajectorySetMonitor - Monitor the schedules generated by the `TSTrajectory` checkpointing controller 662ed695a29SHong Zhang 663c3339decSBarry Smith Collective 664ed695a29SHong Zhang 6654165533cSJose E. Roman Input Parameters: 666bcf0153eSBarry Smith + tj - the `TSTrajectory` context 667bcf0153eSBarry Smith - flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable 668ed695a29SHong Zhang 669bcf0153eSBarry Smith Options Database Key: 670bcf0153eSBarry Smith . -ts_trajectory_monitor - print `TSTrajectory` information 6713c0fce88SHong Zhang 672df5474d8SHong Zhang Level: developer 673ed695a29SHong Zhang 6741cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 675ed695a29SHong Zhang @*/ 676d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg) 677d71ae5a4SJacob Faibussowitsch { 678ed695a29SHong Zhang PetscFunctionBegin; 679ed695a29SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 680ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 681fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 682fe8322adSStefano Zampini else tj->monitor = NULL; 6833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 684ed695a29SHong Zhang } 685ed695a29SHong Zhang 686bc952696SBarry Smith /*@ 687bcf0153eSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the `TSTrajectory` once the program is done 68864fc91eeSBarry Smith 689c3339decSBarry Smith Collective 69064fc91eeSBarry Smith 6914165533cSJose E. Roman Input Parameters: 692bcf0153eSBarry Smith + tj - the `TSTrajectory` context 693bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable 69464fc91eeSBarry Smith 695bcf0153eSBarry Smith Options Database Key: 69664fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 69764fc91eeSBarry Smith 69864fc91eeSBarry Smith Level: advanced 69964fc91eeSBarry Smith 700bcf0153eSBarry Smith Note: 701bcf0153eSBarry 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. 702bcf0153eSBarry Smith 7031cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()` 70464fc91eeSBarry Smith @*/ 705d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg) 706d71ae5a4SJacob Faibussowitsch { 70764fc91eeSBarry Smith PetscFunctionBegin; 70864fc91eeSBarry Smith PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 70964fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj, flg, 2); 71064fc91eeSBarry Smith tj->keepfiles = flg; 7113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 71264fc91eeSBarry Smith } 71364fc91eeSBarry Smith 714cc4c1da9SBarry Smith /*@ 715bcf0153eSBarry Smith TSTrajectorySetDirname - Specify the name of the directory where `TSTrajectory` disk checkpoints are stored. 71664e38db7SHong Zhang 717c3339decSBarry Smith Collective 71864e38db7SHong Zhang 7194165533cSJose E. Roman Input Parameters: 720bcf0153eSBarry Smith + tj - the `TSTrajectory` context 72164e38db7SHong Zhang - dirname - the directory name 72264e38db7SHong Zhang 723bcf0153eSBarry Smith Options Database Key: 72464e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 72564e38db7SHong Zhang 72664e38db7SHong Zhang Level: developer 72764e38db7SHong Zhang 728bcf0153eSBarry Smith Notes: 729bcf0153eSBarry Smith The final location of the files is determined by dirname/filetemplate where filetemplate was provided by `TSTrajectorySetFiletemplate()` 730bcf0153eSBarry Smith 731bcf0153eSBarry Smith If this is not called `TSTrajectory` selects a unique new name for the directory 732bcf0153eSBarry Smith 7331cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()` 73464e38db7SHong Zhang @*/ 735d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[]) 736d71ae5a4SJacob Faibussowitsch { 737a17281aeSStefano Zampini PetscBool flg; 738a17281aeSStefano Zampini 73964e38db7SHong Zhang PetscFunctionBegin; 74064e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 7419566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(tj->dirname, dirname, &flg)); 742049d1499SBarry Smith PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup"); 7439566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirname)); 7449566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(dirname, &tj->dirname)); 7453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 74664e38db7SHong Zhang } 74764e38db7SHong Zhang 748cc4c1da9SBarry Smith /*@ 749bcf0153eSBarry Smith TSTrajectorySetFiletemplate - Specify the name template for the files storing `TSTrajectory` checkpoints. 75064e38db7SHong Zhang 751c3339decSBarry Smith Collective 75264e38db7SHong Zhang 7534165533cSJose E. Roman Input Parameters: 754bcf0153eSBarry Smith + tj - the `TSTrajectory` context 7551585b412SBarry Smith - filetemplate - the template 75664e38db7SHong Zhang 757bcf0153eSBarry Smith Options Database Key: 7581585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7591585b412SBarry Smith 760bcf0153eSBarry Smith Level: developer 761bcf0153eSBarry Smith 76295452b02SPatrick Sanan Notes: 76363a3b9bcSJacob Faibussowitsch The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading / 7641585b412SBarry Smith 765bcf0153eSBarry 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 7661585b412SBarry Smith timestep counter 76764e38db7SHong Zhang 7681cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetDirname()`, `TSTrajectorySetUp()` 76964e38db7SHong Zhang @*/ 770d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[]) 771d71ae5a4SJacob Faibussowitsch { 772bbcf679cSJacob Faibussowitsch const char *ptr = NULL, *ptr2 = NULL; 7739afe7f3eSBarry Smith 77464e38db7SHong Zhang PetscFunctionBegin; 77564e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 7764f572ea9SToby Isaac PetscAssertPointer(filetemplate, 2); 7773c633725SBarry Smith PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup"); 7789afe7f3eSBarry Smith 77963a3b9bcSJacob 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"); 7809afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7819566063dSJacob Faibussowitsch PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr)); 78263a3b9bcSJacob 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"); 7839afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 78463a3b9bcSJacob Faibussowitsch PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2)); 78563a3b9bcSJacob 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"); 7869afe7f3eSBarry Smith if (ptr2) break; 7879afe7f3eSBarry Smith } 7889566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->filetemplate)); 7899566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate)); 7903ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 79164e38db7SHong Zhang } 79264e38db7SHong Zhang 79364e38db7SHong Zhang /*@ 794bcf0153eSBarry Smith TSTrajectorySetFromOptions - Sets various `TSTrajectory` parameters from user options. 795bc952696SBarry Smith 796c3339decSBarry Smith Collective 797bc952696SBarry Smith 798d8d19677SJose E. Roman Input Parameters: 799bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSGetTrajectory()` 800bcf0153eSBarry Smith - ts - the `TS` context 801bc952696SBarry Smith 802bc952696SBarry Smith Options Database Keys: 803bcf0153eSBarry Smith + -ts_trajectory_type <type> - basic, memory, singlefile, visualization 804bcf0153eSBarry 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 805bcf0153eSBarry Smith - -ts_trajectory_monitor - print `TSTrajectory` information 806bc952696SBarry Smith 807df5474d8SHong Zhang Level: developer 808bc952696SBarry Smith 809bcf0153eSBarry Smith Note: 81095452b02SPatrick Sanan This is not normally called directly by users 811bc952696SBarry Smith 8121cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectorySetUp()` 813bc952696SBarry Smith @*/ 814d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts) 815d71ae5a4SJacob Faibussowitsch { 816ed695a29SHong Zhang PetscBool set, flg; 81764e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN]; 818bc952696SBarry Smith 819bc952696SBarry Smith PetscFunctionBegin; 820b1d74d50SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 821fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 822d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tj); 8239566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts)); 8249566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL)); 8259566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set)); 8269566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetMonitor(tj, flg)); 8279566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL)); 8289566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL)); 8299566063dSJacob 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)); 8309566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL)); 8319566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set)); 8329566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg)); 83364e38db7SHong Zhang 8349566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set)); 8351baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetDirname(tj, dirname)); 83664e38db7SHong Zhang 83763a3b9bcSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set)); 8381baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate)); 83964e38db7SHong Zhang 84064e38db7SHong Zhang /* Handle specific TSTrajectory options */ 841dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject); 842d0609cedSBarry Smith PetscOptionsEnd(); 8433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 844bc952696SBarry Smith } 84568bece0bSHong Zhang 84668bece0bSHong Zhang /*@ 84768bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 848bcf0153eSBarry Smith of a `TS` `TSTrajectory`. 84968bece0bSHong Zhang 850c3339decSBarry Smith Collective 85168bece0bSHong Zhang 852d8d19677SJose E. Roman Input Parameters: 853bcf0153eSBarry Smith + tj - the `TSTrajectory` context 854bcf0153eSBarry Smith - ts - the TS context obtained from `TSCreate()` 85568bece0bSHong Zhang 856df5474d8SHong Zhang Level: developer 85768bece0bSHong Zhang 8581cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()` 85968bece0bSHong Zhang @*/ 860d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts) 861d71ae5a4SJacob Faibussowitsch { 8629afe7f3eSBarry Smith size_t s1, s2; 86368bece0bSHong Zhang 86468bece0bSHong Zhang PetscFunctionBegin; 8653ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS); 86668bece0bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 867fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 8683ba16761SJacob Faibussowitsch if (tj->setupcalled) PetscFunctionReturn(PETSC_SUCCESS); 86968bece0bSHong Zhang 8709566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0)); 87148a46eb9SPierre Jolivet if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC)); 872dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setup, ts); 87368bece0bSHong Zhang 87468bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 87553b27ddbSHong Zhang 87653b27ddbSHong Zhang /* Set the counters to zero */ 8771a5a771fSHong Zhang tj->recomps = 0; 87853b27ddbSHong Zhang tj->diskreads = 0; 87953b27ddbSHong Zhang tj->diskwrites = 0; 8809566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->dirname, &s1)); 8819566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->filetemplate, &s2)); 8829566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 8839566063dSJacob Faibussowitsch PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate)); 8849566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate)); 8859566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0)); 8863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 88768bece0bSHong Zhang } 888fe8322adSStefano Zampini 889fe8322adSStefano Zampini /*@ 890bcf0153eSBarry Smith TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage information 891fe8322adSStefano Zampini 892c3339decSBarry Smith Collective 893fe8322adSStefano Zampini 894d8d19677SJose E. Roman Input Parameters: 895bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained with `TSGetTrajectory()` 896b43aa488SJacob Faibussowitsch - solution_only - the boolean flag 897fe8322adSStefano Zampini 898fe8322adSStefano Zampini Level: developer 899fe8322adSStefano Zampini 9001cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()` 901fe8322adSStefano Zampini @*/ 902d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only) 903d71ae5a4SJacob Faibussowitsch { 904fe8322adSStefano Zampini PetscFunctionBegin; 905fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 906fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj, solution_only, 2); 907fe8322adSStefano Zampini tj->solution_only = solution_only; 9083ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 909fe8322adSStefano Zampini } 910fe8322adSStefano Zampini 911fe8322adSStefano Zampini /*@ 912bcf0153eSBarry Smith TSTrajectoryGetSolutionOnly - Gets the value set with `TSTrajectorySetSolutionOnly()`. 913fe8322adSStefano Zampini 91420f4b53cSBarry Smith Logically Collective 915fe8322adSStefano Zampini 916fe8322adSStefano Zampini Input Parameter: 917bcf0153eSBarry Smith . tj - the `TSTrajectory` context 918fe8322adSStefano Zampini 919fe8322adSStefano Zampini Output Parameter: 920b43aa488SJacob Faibussowitsch . solution_only - the boolean flag 921fe8322adSStefano Zampini 922fe8322adSStefano Zampini Level: developer 923fe8322adSStefano Zampini 9241cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()` 925fe8322adSStefano Zampini @*/ 926d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only) 927d71ae5a4SJacob Faibussowitsch { 928fe8322adSStefano Zampini PetscFunctionBegin; 929fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 9304f572ea9SToby Isaac PetscAssertPointer(solution_only, 2); 931fe8322adSStefano Zampini *solution_only = tj->solution_only; 9323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 933fe8322adSStefano Zampini } 934fe8322adSStefano Zampini 935fe8322adSStefano Zampini /*@ 936fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 937fe8322adSStefano Zampini 938c3339decSBarry Smith Collective 939fe8322adSStefano Zampini 940d8d19677SJose E. Roman Input Parameters: 941bcf0153eSBarry Smith + tj - the `TSTrajectory` context 942bcf0153eSBarry Smith . ts - the `TS` solver context 943fe8322adSStefano Zampini - time - the requested time 944fe8322adSStefano Zampini 945d8d19677SJose E. Roman Output Parameters: 946fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 947fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 948fe8322adSStefano Zampini 949fe8322adSStefano Zampini Level: developer 950fe8322adSStefano Zampini 951bcf0153eSBarry Smith Notes: 952bcf0153eSBarry Smith The vectors are interpolated if time does not match any time step stored in the `TSTrajectory()`. Pass NULL to not request a vector. 953fe8322adSStefano Zampini 954bcf0153eSBarry Smith This function differs from `TSTrajectoryGetVecs()` since the vectors obtained cannot be modified, and they need to be returned by 955bcf0153eSBarry Smith calling `TSTrajectoryRestoreUpdatedHistoryVecs()`. 956bcf0153eSBarry Smith 9571cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()` 958fe8322adSStefano Zampini @*/ 959d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 960d71ae5a4SJacob Faibussowitsch { 961fe8322adSStefano Zampini PetscFunctionBegin; 962fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 963fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 964fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 3); 9654f572ea9SToby Isaac if (U) PetscAssertPointer(U, 4); 9664f572ea9SToby Isaac if (Udot) PetscAssertPointer(Udot, 5); 967fe8322adSStefano Zampini if (U && !tj->U) { 968fe8322adSStefano Zampini DM dm; 969fe8322adSStefano Zampini 9709566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9719566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->U)); 972fe8322adSStefano Zampini } 973fe8322adSStefano Zampini if (Udot && !tj->Udot) { 974fe8322adSStefano Zampini DM dm; 975fe8322adSStefano Zampini 9769566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9779566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->Udot)); 978fe8322adSStefano Zampini } 9799566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL)); 980fe8322adSStefano Zampini if (U) { 9819566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->U)); 982fe8322adSStefano Zampini *U = tj->U; 983fe8322adSStefano Zampini } 984fe8322adSStefano Zampini if (Udot) { 9859566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->Udot)); 986fe8322adSStefano Zampini *Udot = tj->Udot; 987fe8322adSStefano Zampini } 9883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 989fe8322adSStefano Zampini } 990fe8322adSStefano Zampini 991fe8322adSStefano Zampini /*@ 992bcf0153eSBarry Smith TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with `TSTrajectoryGetUpdatedHistoryVecs()`. 993fe8322adSStefano Zampini 994c3339decSBarry Smith Collective 995fe8322adSStefano Zampini 996d8d19677SJose E. Roman Input Parameters: 997bcf0153eSBarry Smith + tj - the `TSTrajectory` context 998fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 999fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 1000fe8322adSStefano Zampini 1001fe8322adSStefano Zampini Level: developer 1002fe8322adSStefano Zampini 10031cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryGetUpdatedHistoryVecs()` 1004fe8322adSStefano Zampini @*/ 1005d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1006d71ae5a4SJacob Faibussowitsch { 1007fe8322adSStefano Zampini PetscFunctionBegin; 1008fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 1009fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2); 1010fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3); 10113c633725SBarry Smith PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 10123c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1013fe8322adSStefano Zampini if (U) { 10149566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->U)); 1015fe8322adSStefano Zampini *U = NULL; 1016fe8322adSStefano Zampini } 1017fe8322adSStefano Zampini if (Udot) { 10189566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->Udot)); 1019fe8322adSStefano Zampini *Udot = NULL; 1020fe8322adSStefano Zampini } 10213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1022fe8322adSStefano Zampini } 1023