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 13bc952696SBarry Smith Not Collective 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 24*1cc06b55SBarry 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 50*1cc06b55SBarry 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 84*1cc06b55SBarry 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); 90fe8322adSStefano Zampini PetscValidIntPointer(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 113*1cc06b55SBarry 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); 122dadcf809SJacob Faibussowitsch PetscValidRealPointer(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 156*1cc06b55SBarry 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); 165dadcf809SJacob Faibussowitsch PetscValidRealPointer(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 255bc952696SBarry Smith /*@C 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 267*1cc06b55SBarry 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 277fe2efc57SMark /*@C 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 302*1cc06b55SBarry 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: 33378fbdcc8SBarry Smith + tr - the trajectory context 33478fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 33578fbdcc8SBarry Smith 33678fbdcc8SBarry Smith Level: intermediate 33778fbdcc8SBarry Smith 338bcf0153eSBarry Smith Fortran Note: 339bcf0153eSBarry Smith Fortran interface is not possible because of the string array argument 340db901c5bSHong Zhang 341*1cc06b55SBarry 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); 347fe8322adSStefano Zampini PetscValidPointer(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 36208347785SBarry Smith - ctx - optional context used by transform function 36308347785SBarry Smith 36408347785SBarry Smith Level: intermediate 36508347785SBarry Smith 366*1cc06b55SBarry 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 394*1cc06b55SBarry 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; 401b1d74d50SHong Zhang PetscValidPointer(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 434bc952696SBarry Smith /*@C 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 449bcf0153eSBarry Smith Developer Note: 450bcf0153eSBarry Smith Why does this option require access to the `TS` 451bc952696SBarry Smith 452*1cc06b55SBarry 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)); 4653c633725SBarry Smith PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type); 466972caf09SHong Zhang if (tj->ops->destroy) { 4679566063dSJacob Faibussowitsch PetscCall((*(tj)->ops->destroy)(tj)); 468bc952696SBarry Smith 469972caf09SHong Zhang tj->ops->destroy = NULL; 470bc952696SBarry Smith } 4719566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops))); 472bc952696SBarry Smith 4739566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type)); 4749566063dSJacob Faibussowitsch PetscCall((*r)(tj, ts)); 4753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 476bc952696SBarry Smith } 477bc952696SBarry Smith 478881c1a9bSHong Zhang /*@C 479881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 480881c1a9bSHong Zhang 481c3339decSBarry Smith Collective 482881c1a9bSHong Zhang 483881c1a9bSHong Zhang Input Parameters: 484bcf0153eSBarry Smith + tj - the `TSTrajectory` context 485bcf0153eSBarry Smith - ts - the `TS` context 486881c1a9bSHong Zhang 4872fe279fdSBarry Smith Output Parameter: 488881c1a9bSHong Zhang . type - a known method 489881c1a9bSHong Zhang 490881c1a9bSHong Zhang Level: developer 491881c1a9bSHong Zhang 492*1cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()` 493881c1a9bSHong Zhang @*/ 494d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type) 495d71ae5a4SJacob Faibussowitsch { 496881c1a9bSHong Zhang PetscFunctionBegin; 497881c1a9bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 498881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 4993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 500881c1a9bSHong Zhang } 501881c1a9bSHong Zhang 502972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS); 503972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS); 5049a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS); 5052b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS); 506bc952696SBarry Smith 507bc952696SBarry Smith /*@C 508bcf0153eSBarry Smith TSTrajectoryRegisterAll - Registers all of the `TSTrajectory` storage schecmes in the `TS` package. 509bc952696SBarry Smith 510bc952696SBarry Smith Not Collective 511bc952696SBarry Smith 512df5474d8SHong Zhang Level: developer 513bc952696SBarry Smith 514*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryRegister()` 515bc952696SBarry Smith @*/ 516d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void) 517d71ae5a4SJacob Faibussowitsch { 518bc952696SBarry Smith PetscFunctionBegin; 5193ba16761SJacob Faibussowitsch if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 520bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 521bc952696SBarry Smith 5229566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic)); 5239566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile)); 5249566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory)); 5259566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization)); 5263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 527bc952696SBarry Smith } 528bc952696SBarry Smith 529bc952696SBarry Smith /*@ 5301550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5311550c9b9SHong Zhang 532c3339decSBarry Smith Collective 5331550c9b9SHong Zhang 5341550c9b9SHong Zhang Input Parameter: 535bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSGetTrajectory()` 5361550c9b9SHong Zhang 5371550c9b9SHong Zhang Level: developer 5381550c9b9SHong Zhang 539*1cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 5401550c9b9SHong Zhang @*/ 541d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 542d71ae5a4SJacob Faibussowitsch { 5431550c9b9SHong Zhang PetscFunctionBegin; 5443ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS); 5459a992471SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 546dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, reset); 5479566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 5489566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&tj->tsh)); 5499566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh)); 550fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5521550c9b9SHong Zhang } 5531550c9b9SHong Zhang 5541550c9b9SHong Zhang /*@ 555bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 556bc952696SBarry Smith 557c3339decSBarry Smith Collective 558bc952696SBarry Smith 559bc952696SBarry Smith Input Parameter: 560bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()` 561bc952696SBarry Smith 562df5474d8SHong Zhang Level: developer 563bc952696SBarry Smith 564*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 565bc952696SBarry Smith @*/ 566d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 567d71ae5a4SJacob Faibussowitsch { 568bc952696SBarry Smith PetscFunctionBegin; 5693ba16761SJacob Faibussowitsch if (!*tj) PetscFunctionReturn(PETSC_SUCCESS); 570972caf09SHong Zhang PetscValidHeaderSpecific((*tj), TSTRAJECTORY_CLASSID, 1); 5719371c9d4SSatish Balay if (--((PetscObject)(*tj))->refct > 0) { 5729371c9d4SSatish Balay *tj = NULL; 5733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5749371c9d4SSatish Balay } 575bc952696SBarry Smith 5769566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReset(*tj)); 5779566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&(*tj)->tsh)); 5789566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W)); 5799566063dSJacob Faibussowitsch PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW)); 5809566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->U)); 5819566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->Udot)); 5829a992471SHong Zhang 5839566063dSJacob Faibussowitsch if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx)); 584dbbe0bcdSBarry Smith PetscTryTypeMethod((*tj), destroy); 585fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 586fe8322adSStefano Zampini PetscMPIInt rank; 587fe8322adSStefano Zampini MPI_Comm comm; 588fe8322adSStefano Zampini 5899566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)(*tj), &comm)); 5909566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 591dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 5929566063dSJacob Faibussowitsch PetscCall(PetscRMTree((*tj)->dirname)); 593fe8322adSStefano Zampini } 594fe8322adSStefano Zampini } 5959566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*tj)->names)); 5969566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->dirname)); 5979566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->filetemplate)); 5989566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tj)); 5993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 600bc952696SBarry Smith } 601bc952696SBarry Smith 602bc952696SBarry Smith /* 603bcf0153eSBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of `TSTrajectory` from user options. 604bc952696SBarry Smith 605c3339decSBarry Smith Collective 606bc952696SBarry Smith 607bc952696SBarry Smith Input Parameter: 608bcf0153eSBarry Smith + tj - the `TSTrajectory` context 6093c0fce88SHong Zhang - ts - the TS context 6103c0fce88SHong Zhang 611bcf0153eSBarry Smith Options Database Key: 6123c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 613bc952696SBarry Smith 614df5474d8SHong Zhang Level: developer 615bc952696SBarry Smith 616*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryType`, `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()` 617bc952696SBarry Smith */ 618d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts) 619d71ae5a4SJacob Faibussowitsch { 620bc952696SBarry Smith PetscBool opt; 621bc952696SBarry Smith const char *defaultType; 622bc952696SBarry Smith char typeName[256]; 623bc952696SBarry Smith 624bc952696SBarry Smith PetscFunctionBegin; 625b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 626bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 627bc952696SBarry Smith 6289566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegisterAll()); 6299566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt)); 630bc952696SBarry Smith if (opt) { 6319566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, typeName)); 632bc952696SBarry Smith } else { 6339566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, defaultType)); 634bc952696SBarry Smith } 6353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 636bc952696SBarry Smith } 637bc952696SBarry Smith 638ed695a29SHong Zhang /*@ 639bcf0153eSBarry Smith TSTrajectorySetUseHistory - Use `TSHistory` in `TSTrajectory` 6409ffb3502SHong Zhang 641c3339decSBarry Smith Collective 6429ffb3502SHong Zhang 6434165533cSJose E. Roman Input Parameters: 644bcf0153eSBarry Smith + tj - the `TSTrajectory` context 645bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable 6469ffb3502SHong Zhang 647bcf0153eSBarry Smith Options Database Key: 648bcf0153eSBarry Smith . -ts_trajectory_use_history - have it use `TSHistory` 6499ffb3502SHong Zhang 6509ffb3502SHong Zhang Level: advanced 6519ffb3502SHong Zhang 652*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 6539ffb3502SHong Zhang @*/ 654d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg) 655d71ae5a4SJacob Faibussowitsch { 6569ffb3502SHong Zhang PetscFunctionBegin; 6579ffb3502SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 6589ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 6599ffb3502SHong Zhang tj->usehistory = flg; 6603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6619ffb3502SHong Zhang } 6629ffb3502SHong Zhang 6639ffb3502SHong Zhang /*@ 664bcf0153eSBarry Smith TSTrajectorySetMonitor - Monitor the schedules generated by the `TSTrajectory` checkpointing controller 665ed695a29SHong Zhang 666c3339decSBarry Smith Collective 667ed695a29SHong Zhang 6684165533cSJose E. Roman Input Parameters: 669bcf0153eSBarry Smith + tj - the `TSTrajectory` context 670bcf0153eSBarry Smith - flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable 671ed695a29SHong Zhang 672bcf0153eSBarry Smith Options Database Key: 673bcf0153eSBarry Smith . -ts_trajectory_monitor - print `TSTrajectory` information 6743c0fce88SHong Zhang 675df5474d8SHong Zhang Level: developer 676ed695a29SHong Zhang 677*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 678ed695a29SHong Zhang @*/ 679d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg) 680d71ae5a4SJacob Faibussowitsch { 681ed695a29SHong Zhang PetscFunctionBegin; 682ed695a29SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 683ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 684fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 685fe8322adSStefano Zampini else tj->monitor = NULL; 6863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 687ed695a29SHong Zhang } 688ed695a29SHong Zhang 689bc952696SBarry Smith /*@ 690bcf0153eSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the `TSTrajectory` once the program is done 69164fc91eeSBarry Smith 692c3339decSBarry Smith Collective 69364fc91eeSBarry Smith 6944165533cSJose E. Roman Input Parameters: 695bcf0153eSBarry Smith + tj - the `TSTrajectory` context 696bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable 69764fc91eeSBarry Smith 698bcf0153eSBarry Smith Options Database Key: 69964fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 70064fc91eeSBarry Smith 70164fc91eeSBarry Smith Level: advanced 70264fc91eeSBarry Smith 703bcf0153eSBarry Smith Note: 704bcf0153eSBarry 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. 705bcf0153eSBarry Smith 706*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()` 70764fc91eeSBarry Smith @*/ 708d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg) 709d71ae5a4SJacob Faibussowitsch { 71064fc91eeSBarry Smith PetscFunctionBegin; 71164fc91eeSBarry Smith PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 71264fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj, flg, 2); 71364fc91eeSBarry Smith tj->keepfiles = flg; 7143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 71564fc91eeSBarry Smith } 71664fc91eeSBarry Smith 717db901c5bSHong Zhang /*@C 718bcf0153eSBarry Smith TSTrajectorySetDirname - Specify the name of the directory where `TSTrajectory` disk checkpoints are stored. 71964e38db7SHong Zhang 720c3339decSBarry Smith Collective 72164e38db7SHong Zhang 7224165533cSJose E. Roman Input Parameters: 723bcf0153eSBarry Smith + tj - the `TSTrajectory` context 72464e38db7SHong Zhang - dirname - the directory name 72564e38db7SHong Zhang 726bcf0153eSBarry Smith Options Database Key: 72764e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 72864e38db7SHong Zhang 72964e38db7SHong Zhang Level: developer 73064e38db7SHong Zhang 731bcf0153eSBarry Smith Notes: 732bcf0153eSBarry Smith The final location of the files is determined by dirname/filetemplate where filetemplate was provided by `TSTrajectorySetFiletemplate()` 733bcf0153eSBarry Smith 734bcf0153eSBarry Smith If this is not called `TSTrajectory` selects a unique new name for the directory 735bcf0153eSBarry Smith 736*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()` 73764e38db7SHong Zhang @*/ 738d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[]) 739d71ae5a4SJacob Faibussowitsch { 740a17281aeSStefano Zampini PetscBool flg; 741a17281aeSStefano Zampini 74264e38db7SHong Zhang PetscFunctionBegin; 74364e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 7449566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(tj->dirname, dirname, &flg)); 745049d1499SBarry Smith PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup"); 7469566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirname)); 7479566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(dirname, &tj->dirname)); 7483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 74964e38db7SHong Zhang } 75064e38db7SHong Zhang 751db901c5bSHong Zhang /*@C 752bcf0153eSBarry Smith TSTrajectorySetFiletemplate - Specify the name template for the files storing `TSTrajectory` checkpoints. 75364e38db7SHong Zhang 754c3339decSBarry Smith Collective 75564e38db7SHong Zhang 7564165533cSJose E. Roman Input Parameters: 757bcf0153eSBarry Smith + tj - the `TSTrajectory` context 7581585b412SBarry Smith - filetemplate - the template 75964e38db7SHong Zhang 760bcf0153eSBarry Smith Options Database Key: 7611585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7621585b412SBarry Smith 763bcf0153eSBarry Smith Level: developer 764bcf0153eSBarry Smith 76595452b02SPatrick Sanan Notes: 76663a3b9bcSJacob Faibussowitsch The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading / 7671585b412SBarry Smith 768bcf0153eSBarry 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 7691585b412SBarry Smith timestep counter 77064e38db7SHong Zhang 771*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetDirname()`, `TSTrajectorySetUp()` 77264e38db7SHong Zhang @*/ 773d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[]) 774d71ae5a4SJacob Faibussowitsch { 775bbcf679cSJacob Faibussowitsch const char *ptr = NULL, *ptr2 = NULL; 7769afe7f3eSBarry Smith 77764e38db7SHong Zhang PetscFunctionBegin; 77864e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 77963a3b9bcSJacob Faibussowitsch PetscValidCharPointer(filetemplate, 2); 7803c633725SBarry Smith PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup"); 7819afe7f3eSBarry Smith 78263a3b9bcSJacob 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"); 7839afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7849566063dSJacob Faibussowitsch PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr)); 78563a3b9bcSJacob 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"); 7869afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 78763a3b9bcSJacob Faibussowitsch PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2)); 78863a3b9bcSJacob 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"); 7899afe7f3eSBarry Smith if (ptr2) break; 7909afe7f3eSBarry Smith } 7919566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->filetemplate)); 7929566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate)); 7933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 79464e38db7SHong Zhang } 79564e38db7SHong Zhang 79664e38db7SHong Zhang /*@ 797bcf0153eSBarry Smith TSTrajectorySetFromOptions - Sets various `TSTrajectory` parameters from user options. 798bc952696SBarry Smith 799c3339decSBarry Smith Collective 800bc952696SBarry Smith 801d8d19677SJose E. Roman Input Parameters: 802bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSGetTrajectory()` 803bcf0153eSBarry Smith - ts - the `TS` context 804bc952696SBarry Smith 805bc952696SBarry Smith Options Database Keys: 806bcf0153eSBarry Smith + -ts_trajectory_type <type> - basic, memory, singlefile, visualization 807bcf0153eSBarry 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 808bcf0153eSBarry Smith - -ts_trajectory_monitor - print `TSTrajectory` information 809bc952696SBarry Smith 810df5474d8SHong Zhang Level: developer 811bc952696SBarry Smith 812bcf0153eSBarry Smith Note: 81395452b02SPatrick Sanan This is not normally called directly by users 814bc952696SBarry Smith 815*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectorySetUp()` 816bc952696SBarry Smith @*/ 817d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts) 818d71ae5a4SJacob Faibussowitsch { 819ed695a29SHong Zhang PetscBool set, flg; 82064e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN]; 821bc952696SBarry Smith 822bc952696SBarry Smith PetscFunctionBegin; 823b1d74d50SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 824fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 825d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tj); 8269566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts)); 8279566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL)); 8289566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set)); 8299566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetMonitor(tj, flg)); 8309566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL)); 8319566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL)); 8329566063dSJacob 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)); 8339566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL)); 8349566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set)); 8359566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg)); 83664e38db7SHong Zhang 8379566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set)); 8381baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetDirname(tj, dirname)); 83964e38db7SHong Zhang 84063a3b9bcSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set)); 8411baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate)); 84264e38db7SHong Zhang 84364e38db7SHong Zhang /* Handle specific TSTrajectory options */ 844dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject); 845d0609cedSBarry Smith PetscOptionsEnd(); 8463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 847bc952696SBarry Smith } 84868bece0bSHong Zhang 84968bece0bSHong Zhang /*@ 85068bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 851bcf0153eSBarry Smith of a `TS` `TSTrajectory`. 85268bece0bSHong Zhang 853c3339decSBarry Smith Collective 85468bece0bSHong Zhang 855d8d19677SJose E. Roman Input Parameters: 856bcf0153eSBarry Smith + tj - the `TSTrajectory` context 857bcf0153eSBarry Smith - ts - the TS context obtained from `TSCreate()` 85868bece0bSHong Zhang 859df5474d8SHong Zhang Level: developer 86068bece0bSHong Zhang 861*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()` 86268bece0bSHong Zhang @*/ 863d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts) 864d71ae5a4SJacob Faibussowitsch { 8659afe7f3eSBarry Smith size_t s1, s2; 86668bece0bSHong Zhang 86768bece0bSHong Zhang PetscFunctionBegin; 8683ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS); 86968bece0bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 870fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 8713ba16761SJacob Faibussowitsch if (tj->setupcalled) PetscFunctionReturn(PETSC_SUCCESS); 87268bece0bSHong Zhang 8739566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0)); 87448a46eb9SPierre Jolivet if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC)); 875dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setup, ts); 87668bece0bSHong Zhang 87768bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 87853b27ddbSHong Zhang 87953b27ddbSHong Zhang /* Set the counters to zero */ 8801a5a771fSHong Zhang tj->recomps = 0; 88153b27ddbSHong Zhang tj->diskreads = 0; 88253b27ddbSHong Zhang tj->diskwrites = 0; 8839566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->dirname, &s1)); 8849566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->filetemplate, &s2)); 8859566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 8869566063dSJacob Faibussowitsch PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate)); 8879566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate)); 8889566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0)); 8893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 89068bece0bSHong Zhang } 891fe8322adSStefano Zampini 892fe8322adSStefano Zampini /*@ 893bcf0153eSBarry Smith TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage information 894fe8322adSStefano Zampini 895c3339decSBarry Smith Collective 896fe8322adSStefano Zampini 897d8d19677SJose E. Roman Input Parameters: 898bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained with `TSGetTrajectory()` 899fe8322adSStefano Zampini - flg - the boolean flag 900fe8322adSStefano Zampini 901fe8322adSStefano Zampini Level: developer 902fe8322adSStefano Zampini 903*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()` 904fe8322adSStefano Zampini @*/ 905d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only) 906d71ae5a4SJacob Faibussowitsch { 907fe8322adSStefano Zampini PetscFunctionBegin; 908fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 909fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj, solution_only, 2); 910fe8322adSStefano Zampini tj->solution_only = solution_only; 9113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 912fe8322adSStefano Zampini } 913fe8322adSStefano Zampini 914fe8322adSStefano Zampini /*@ 915bcf0153eSBarry Smith TSTrajectoryGetSolutionOnly - Gets the value set with `TSTrajectorySetSolutionOnly()`. 916fe8322adSStefano Zampini 91720f4b53cSBarry Smith Logically Collective 918fe8322adSStefano Zampini 919fe8322adSStefano Zampini Input Parameter: 920bcf0153eSBarry Smith . tj - the `TSTrajectory` context 921fe8322adSStefano Zampini 922fe8322adSStefano Zampini Output Parameter: 923d8d19677SJose E. Roman . flg - the boolean flag 924fe8322adSStefano Zampini 925fe8322adSStefano Zampini Level: developer 926fe8322adSStefano Zampini 927*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()` 928fe8322adSStefano Zampini @*/ 929d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only) 930d71ae5a4SJacob Faibussowitsch { 931fe8322adSStefano Zampini PetscFunctionBegin; 932fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 933dadcf809SJacob Faibussowitsch PetscValidBoolPointer(solution_only, 2); 934fe8322adSStefano Zampini *solution_only = tj->solution_only; 9353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 936fe8322adSStefano Zampini } 937fe8322adSStefano Zampini 938fe8322adSStefano Zampini /*@ 939fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 940fe8322adSStefano Zampini 941c3339decSBarry Smith Collective 942fe8322adSStefano Zampini 943d8d19677SJose E. Roman Input Parameters: 944bcf0153eSBarry Smith + tj - the `TSTrajectory` context 945bcf0153eSBarry Smith . ts - the `TS` solver context 946fe8322adSStefano Zampini - time - the requested time 947fe8322adSStefano Zampini 948d8d19677SJose E. Roman Output Parameters: 949fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 950fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 951fe8322adSStefano Zampini 952fe8322adSStefano Zampini Level: developer 953fe8322adSStefano Zampini 954bcf0153eSBarry Smith Notes: 955bcf0153eSBarry Smith The vectors are interpolated if time does not match any time step stored in the `TSTrajectory()`. Pass NULL to not request a vector. 956fe8322adSStefano Zampini 957bcf0153eSBarry Smith This function differs from `TSTrajectoryGetVecs()` since the vectors obtained cannot be modified, and they need to be returned by 958bcf0153eSBarry Smith calling `TSTrajectoryRestoreUpdatedHistoryVecs()`. 959bcf0153eSBarry Smith 960*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()` 961fe8322adSStefano Zampini @*/ 962d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 963d71ae5a4SJacob Faibussowitsch { 964fe8322adSStefano Zampini PetscFunctionBegin; 965fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 966fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 967fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 3); 968fe8322adSStefano Zampini if (U) PetscValidPointer(U, 4); 969fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot, 5); 970fe8322adSStefano Zampini if (U && !tj->U) { 971fe8322adSStefano Zampini DM dm; 972fe8322adSStefano Zampini 9739566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9749566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->U)); 975fe8322adSStefano Zampini } 976fe8322adSStefano Zampini if (Udot && !tj->Udot) { 977fe8322adSStefano Zampini DM dm; 978fe8322adSStefano Zampini 9799566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9809566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->Udot)); 981fe8322adSStefano Zampini } 9829566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL)); 983fe8322adSStefano Zampini if (U) { 9849566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->U)); 985fe8322adSStefano Zampini *U = tj->U; 986fe8322adSStefano Zampini } 987fe8322adSStefano Zampini if (Udot) { 9889566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->Udot)); 989fe8322adSStefano Zampini *Udot = tj->Udot; 990fe8322adSStefano Zampini } 9913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 992fe8322adSStefano Zampini } 993fe8322adSStefano Zampini 994fe8322adSStefano Zampini /*@ 995bcf0153eSBarry Smith TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with `TSTrajectoryGetUpdatedHistoryVecs()`. 996fe8322adSStefano Zampini 997c3339decSBarry Smith Collective 998fe8322adSStefano Zampini 999d8d19677SJose E. Roman Input Parameters: 1000bcf0153eSBarry Smith + tj - the `TSTrajectory` context 1001fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 1002fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 1003fe8322adSStefano Zampini 1004fe8322adSStefano Zampini Level: developer 1005fe8322adSStefano Zampini 1006*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryGetUpdatedHistoryVecs()` 1007fe8322adSStefano Zampini @*/ 1008d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1009d71ae5a4SJacob Faibussowitsch { 1010fe8322adSStefano Zampini PetscFunctionBegin; 1011fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 1012fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2); 1013fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3); 10143c633725SBarry Smith PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 10153c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1016fe8322adSStefano Zampini if (U) { 10179566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->U)); 1018fe8322adSStefano Zampini *U = NULL; 1019fe8322adSStefano Zampini } 1020fe8322adSStefano Zampini if (Udot) { 10219566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->Udot)); 1022fe8322adSStefano Zampini *Udot = NULL; 1023fe8322adSStefano Zampini } 10243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1025fe8322adSStefano Zampini } 1026