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: 163c0fce88SHong Zhang + name - the name of a new user-defined creation routine 173c0fce88SHong Zhang - create_func - 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 24bcf0153eSBarry Smith .seealso: [](chapter_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 50bcf0153eSBarry Smith .seealso: [](chapter_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 74*20f4b53cSBarry Smith Not Collective. 75fe8322adSStefano Zampini 76fe8322adSStefano Zampini Input Parameters: 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 84bcf0153eSBarry Smith .seealso: [](chapter_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 113bcf0153eSBarry Smith .seealso: [](chapter_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 1456b867d5aSJose E. Roman Input/Output Parameter: 146fe8322adSStefano Zampini 147fe8322adSStefano Zampini Output Parameters: 148bcf0153eSBarry Smith + time - On input time for the step if step number is `PETSC_DECIDE`, on output the time associated with the step number 149f1a722f8SMatthew G. Knepley . U - state vector (can be NULL) 150fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL) 151fe8322adSStefano Zampini 152fe8322adSStefano Zampini Level: developer 153fe8322adSStefano Zampini 154bcf0153eSBarry Smith Notes: 155bcf0153eSBarry Smith If the step number is `PETSC_DECIDE`, the time argument is used to inquire the trajectory. 156fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 157fe8322adSStefano Zampini 158bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()` 159fe8322adSStefano Zampini @*/ 160d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot) 161d71ae5a4SJacob Faibussowitsch { 162fe8322adSStefano Zampini PetscFunctionBegin; 1633c633725SBarry Smith PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory"); 164fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 165fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 166fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 167dadcf809SJacob Faibussowitsch PetscValidRealPointer(time, 4); 168fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5); 169fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6); 1703ba16761SJacob Faibussowitsch if (!U && !Udot) PetscFunctionReturn(PETSC_SUCCESS); 1713c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 1729566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0)); 173fe8322adSStefano Zampini if (tj->monitor) { 174fe8322adSStefano Zampini PetscInt pU, pUdot; 175fe8322adSStefano Zampini pU = U ? 1 : 0; 176fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 17763a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time)); 1789566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 179fe8322adSStefano Zampini } 180fe8322adSStefano Zampini if (U && tj->lag.caching) { 181fe8322adSStefano Zampini PetscObjectId id; 182fe8322adSStefano Zampini PetscObjectState state; 183fe8322adSStefano Zampini 1849566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &state)); 1859566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &id)); 186fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 187fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 188fe8322adSStefano Zampini } else { 189fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 190fe8322adSStefano Zampini } 191fe8322adSStefano Zampini if (tj->monitor && !U) { 1929566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 1939566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n")); 1949566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 1959566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 196fe8322adSStefano Zampini } 197fe8322adSStefano Zampini } 198fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 199fe8322adSStefano Zampini PetscObjectId id; 200fe8322adSStefano Zampini PetscObjectState state; 201fe8322adSStefano Zampini 2029566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)Udot, &state)); 2039566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)Udot, &id)); 204fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 205fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 206fe8322adSStefano Zampini } else { 207fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 208fe8322adSStefano Zampini } 209fe8322adSStefano Zampini if (tj->monitor && !Udot) { 2109566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 2119566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n")); 2129566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2139566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 214fe8322adSStefano Zampini } 215fe8322adSStefano Zampini } 216fe8322adSStefano Zampini if (!U && !Udot) { 2179566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0)); 2183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 219fe8322adSStefano Zampini } 220fe8322adSStefano Zampini 221fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 2221baa6e33SBarry Smith if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 223fe8322adSStefano Zampini /* cached states will be updated in the function */ 2249566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot)); 225fe8322adSStefano Zampini if (tj->monitor) { 2269566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2279566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 228fe8322adSStefano Zampini } 229fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 230fe8322adSStefano Zampini TS fakets = ts; 231fe8322adSStefano Zampini Vec U2; 232fe8322adSStefano Zampini 233fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 234fe8322adSStefano Zampini if (!ts) { 2359566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets)); 236fe8322adSStefano Zampini if (!fakets) { 2379566063dSJacob Faibussowitsch PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets)); 2389566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets)); 2399566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)fakets)); 2409566063dSJacob Faibussowitsch PetscCall(VecDuplicate(U, &U2)); 2419566063dSJacob Faibussowitsch PetscCall(TSSetSolution(fakets, U2)); 2429566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)U2)); 243fe8322adSStefano Zampini } 244fe8322adSStefano Zampini } 2459566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time)); 2469566063dSJacob Faibussowitsch PetscCall(TSGetSolution(fakets, &U2)); 2479566063dSJacob Faibussowitsch PetscCall(VecCopy(U2, U)); 2489566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state)); 2499566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id)); 250fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 251fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 252fe8322adSStefano Zampini } 2539566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0)); 2543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 255fe8322adSStefano Zampini } 256fe8322adSStefano Zampini 257bc952696SBarry Smith /*@C 258bcf0153eSBarry Smith TSTrajectoryViewFromOptions - View a `TSTrajectory` based on values in the options database 259fe2efc57SMark 260c3339decSBarry Smith Collective 261fe2efc57SMark 262fe2efc57SMark Input Parameters: 263bcf0153eSBarry Smith + A - the `TSTrajectory` context 264bcf0153eSBarry Smith . obj - Optional object that provides prefix used for option name 265736c3998SJose E. Roman - name - command line option 266fe2efc57SMark 267fe2efc57SMark Level: intermediate 268bcf0153eSBarry Smith 269bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()` 270fe2efc57SMark @*/ 271d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[]) 272d71ae5a4SJacob Faibussowitsch { 273fe2efc57SMark PetscFunctionBegin; 274fe2efc57SMark PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1); 2759566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 2763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 277fe2efc57SMark } 278fe2efc57SMark 279fe2efc57SMark /*@C 280bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 281bc952696SBarry Smith 282c3339decSBarry Smith Collective 283bc952696SBarry Smith 284bc952696SBarry Smith Input Parameters: 285bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()` 286bc952696SBarry Smith - viewer - visualization context 287bc952696SBarry Smith 288bc952696SBarry Smith Options Database Key: 289bcf0153eSBarry Smith . -ts_trajectory_view - calls `TSTrajectoryView()` at end of `TSAdjointStep()` 290bcf0153eSBarry Smith 291bcf0153eSBarry Smith Level: developer 292bc952696SBarry Smith 293bc952696SBarry Smith Notes: 294bc952696SBarry Smith The available visualization contexts include 295bcf0153eSBarry Smith + `PETSC_VIEWER_STDOUT_SELF` - standard output (default) 296bcf0153eSBarry Smith - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard 297bc952696SBarry Smith output where only the first processor opens 298bc952696SBarry Smith the file. All other processors send their 299bc952696SBarry Smith data to the first processor to print. 300bc952696SBarry Smith 301bc952696SBarry Smith The user can open an alternative visualization context with 302bcf0153eSBarry Smith `PetscViewerASCIIOpen()` - output to a specified file. 303bc952696SBarry Smith 304bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `PetscViewer`, `PetscViewerASCIIOpen()` 305bc952696SBarry Smith @*/ 306d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer) 307d71ae5a4SJacob Faibussowitsch { 308bc952696SBarry Smith PetscBool iascii; 309bc952696SBarry Smith 310bc952696SBarry Smith PetscFunctionBegin; 3111a5a771fSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 31248a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer)); 313bc952696SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 314b1d74d50SHong Zhang PetscCheckSameComm(tj, 1, viewer, 2); 315bc952696SBarry Smith 3169566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 317bc952696SBarry Smith if (iascii) { 3189566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer)); 31963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps)); 32063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads)); 32163a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites)); 3229566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 323dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, view, viewer); 3249566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 325bc952696SBarry Smith } 3263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 327bc952696SBarry Smith } 328bc952696SBarry Smith 329bc952696SBarry Smith /*@C 33078fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 33178fbdcc8SBarry Smith 332c3339decSBarry Smith Collective 33378fbdcc8SBarry Smith 33478fbdcc8SBarry Smith Input Parameters: 33578fbdcc8SBarry Smith + tr - the trajectory context 33678fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 33778fbdcc8SBarry Smith 33878fbdcc8SBarry Smith Level: intermediate 33978fbdcc8SBarry Smith 340bcf0153eSBarry Smith Fortran Note: 341bcf0153eSBarry Smith Fortran interface is not possible because of the string array argument 342db901c5bSHong Zhang 343bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSGetTrajectory()` 34478fbdcc8SBarry Smith @*/ 345d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names) 346d71ae5a4SJacob Faibussowitsch { 34778fbdcc8SBarry Smith PetscFunctionBegin; 348fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1); 349fe8322adSStefano Zampini PetscValidPointer(names, 2); 3509566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&ctx->names)); 3519566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(names, &ctx->names)); 3523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 35378fbdcc8SBarry Smith } 35478fbdcc8SBarry Smith 35578fbdcc8SBarry Smith /*@C 356fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 35708347785SBarry Smith 358c3339decSBarry Smith Collective 35908347785SBarry Smith 36008347785SBarry Smith Input Parameters: 361bcf0153eSBarry Smith + tj - the `TSTrajectory` context 36208347785SBarry Smith . transform - the transform function 36308347785SBarry Smith . destroy - function to destroy the optional context 36408347785SBarry Smith - ctx - optional context used by transform function 36508347785SBarry Smith 36608347785SBarry Smith Level: intermediate 36708347785SBarry Smith 368bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()` 36908347785SBarry Smith @*/ 370d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx) 371d71ae5a4SJacob Faibussowitsch { 37208347785SBarry Smith PetscFunctionBegin; 373fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 37408347785SBarry Smith tj->transform = transform; 37508347785SBarry Smith tj->transformdestroy = destroy; 37608347785SBarry Smith tj->transformctx = tctx; 3773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 37808347785SBarry Smith } 37908347785SBarry Smith 380db901c5bSHong Zhang /*@ 381bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 382bc952696SBarry Smith 383d083f849SBarry Smith Collective 384bc952696SBarry Smith 385bc952696SBarry Smith Input Parameter: 3863c0fce88SHong Zhang . comm - the communicator 387bc952696SBarry Smith 388bc952696SBarry Smith Output Parameter: 3893c0fce88SHong Zhang . tj - the trajectory object 390bc952696SBarry Smith 391df5474d8SHong Zhang Level: developer 392bc952696SBarry Smith 39395452b02SPatrick Sanan Notes: 394bcf0153eSBarry Smith Usually one does not call this routine, it is called automatically when one calls `TSSetSaveTrajectory()`. 395bc952696SBarry Smith 396bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()` 397bc952696SBarry Smith @*/ 398d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj) 399d71ae5a4SJacob Faibussowitsch { 400bc952696SBarry Smith TSTrajectory t; 401bc952696SBarry Smith 402bc952696SBarry Smith PetscFunctionBegin; 403b1d74d50SHong Zhang PetscValidPointer(tj, 2); 404b1d74d50SHong Zhang *tj = NULL; 4059566063dSJacob Faibussowitsch PetscCall(TSInitializePackage()); 406bc952696SBarry Smith 4079566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView)); 40868bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 4099566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(comm, &t->tsh)); 410fe8322adSStefano Zampini 411fe8322adSStefano Zampini t->lag.order = 1; 412fe8322adSStefano Zampini t->lag.L = NULL; 413fe8322adSStefano Zampini t->lag.T = NULL; 414fe8322adSStefano Zampini t->lag.W = NULL; 415fe8322adSStefano Zampini t->lag.WW = NULL; 416fe8322adSStefano Zampini t->lag.TW = NULL; 417fe8322adSStefano Zampini t->lag.TT = NULL; 418fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 419fe8322adSStefano Zampini t->lag.Ucached.id = 0; 420fe8322adSStefano Zampini t->lag.Ucached.state = -1; 421fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 422fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 423fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 424fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 425fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 426fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 427fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 428fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 429fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 430ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 431b1d74d50SHong Zhang *tj = t; 43263a3b9bcSJacob Faibussowitsch PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin")); 4333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 434bc952696SBarry Smith } 435bc952696SBarry Smith 436bc952696SBarry Smith /*@C 437bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 438bc952696SBarry Smith 439c3339decSBarry Smith Collective 440bc952696SBarry Smith 441bc952696SBarry Smith Input Parameters: 442bcf0153eSBarry Smith + tj - the `TSTrajectory` context 443bcf0153eSBarry Smith . ts - the `TS` context 4443c0fce88SHong Zhang - type - a known method 445bc952696SBarry Smith 446bcf0153eSBarry Smith Options Database Key: 447e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 448bc952696SBarry Smith 449df5474d8SHong Zhang Level: developer 450bc952696SBarry Smith 451bcf0153eSBarry Smith Developer Note: 452bcf0153eSBarry Smith Why does this option require access to the `TS` 453bc952696SBarry Smith 454bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()` 455bc952696SBarry Smith @*/ 456d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type) 457d71ae5a4SJacob Faibussowitsch { 458972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory, TS); 459bc952696SBarry Smith PetscBool match; 460bc952696SBarry Smith 461bc952696SBarry Smith PetscFunctionBegin; 462972caf09SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 4639566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match)); 4643ba16761SJacob Faibussowitsch if (match) PetscFunctionReturn(PETSC_SUCCESS); 465bc952696SBarry Smith 4669566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r)); 4673c633725SBarry Smith PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type); 468972caf09SHong Zhang if (tj->ops->destroy) { 4699566063dSJacob Faibussowitsch PetscCall((*(tj)->ops->destroy)(tj)); 470bc952696SBarry Smith 471972caf09SHong Zhang tj->ops->destroy = NULL; 472bc952696SBarry Smith } 4739566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops))); 474bc952696SBarry Smith 4759566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type)); 4769566063dSJacob Faibussowitsch PetscCall((*r)(tj, ts)); 4773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 478bc952696SBarry Smith } 479bc952696SBarry Smith 480881c1a9bSHong Zhang /*@C 481881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 482881c1a9bSHong Zhang 483c3339decSBarry Smith Collective 484881c1a9bSHong Zhang 485881c1a9bSHong Zhang Input Parameters: 486bcf0153eSBarry Smith + tj - the `TSTrajectory` context 487bcf0153eSBarry Smith - ts - the `TS` context 488881c1a9bSHong Zhang 489881c1a9bSHong Zhang Output Parameters: 490881c1a9bSHong Zhang . type - a known method 491881c1a9bSHong Zhang 492881c1a9bSHong Zhang Level: developer 493881c1a9bSHong Zhang 494bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()` 495881c1a9bSHong Zhang @*/ 496d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type) 497d71ae5a4SJacob Faibussowitsch { 498881c1a9bSHong Zhang PetscFunctionBegin; 499881c1a9bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 500881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 5013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 502881c1a9bSHong Zhang } 503881c1a9bSHong Zhang 504972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS); 505972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS); 5069a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS); 5072b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS); 508bc952696SBarry Smith 509bc952696SBarry Smith /*@C 510bcf0153eSBarry Smith TSTrajectoryRegisterAll - Registers all of the `TSTrajectory` storage schecmes in the `TS` package. 511bc952696SBarry Smith 512bc952696SBarry Smith Not Collective 513bc952696SBarry Smith 514df5474d8SHong Zhang Level: developer 515bc952696SBarry Smith 516bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryRegister()` 517bc952696SBarry Smith @*/ 518d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void) 519d71ae5a4SJacob Faibussowitsch { 520bc952696SBarry Smith PetscFunctionBegin; 5213ba16761SJacob Faibussowitsch if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 522bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 523bc952696SBarry Smith 5249566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic)); 5259566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile)); 5269566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory)); 5279566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization)); 5283ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 529bc952696SBarry Smith } 530bc952696SBarry Smith 531bc952696SBarry Smith /*@ 5321550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5331550c9b9SHong Zhang 534c3339decSBarry Smith Collective 5351550c9b9SHong Zhang 5361550c9b9SHong Zhang Input Parameter: 537bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSGetTrajectory()` 5381550c9b9SHong Zhang 5391550c9b9SHong Zhang Level: developer 5401550c9b9SHong Zhang 541bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 5421550c9b9SHong Zhang @*/ 543d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 544d71ae5a4SJacob Faibussowitsch { 5451550c9b9SHong Zhang PetscFunctionBegin; 5463ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS); 5479a992471SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 548dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, reset); 5499566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 5509566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&tj->tsh)); 5519566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh)); 552fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5541550c9b9SHong Zhang } 5551550c9b9SHong Zhang 5561550c9b9SHong Zhang /*@ 557bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 558bc952696SBarry Smith 559c3339decSBarry Smith Collective 560bc952696SBarry Smith 561bc952696SBarry Smith Input Parameter: 562bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()` 563bc952696SBarry Smith 564df5474d8SHong Zhang Level: developer 565bc952696SBarry Smith 566bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 567bc952696SBarry Smith @*/ 568d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 569d71ae5a4SJacob Faibussowitsch { 570bc952696SBarry Smith PetscFunctionBegin; 5713ba16761SJacob Faibussowitsch if (!*tj) PetscFunctionReturn(PETSC_SUCCESS); 572972caf09SHong Zhang PetscValidHeaderSpecific((*tj), TSTRAJECTORY_CLASSID, 1); 5739371c9d4SSatish Balay if (--((PetscObject)(*tj))->refct > 0) { 5749371c9d4SSatish Balay *tj = NULL; 5753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5769371c9d4SSatish Balay } 577bc952696SBarry Smith 5789566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReset(*tj)); 5799566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&(*tj)->tsh)); 5809566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W)); 5819566063dSJacob Faibussowitsch PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW)); 5829566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->U)); 5839566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->Udot)); 5849a992471SHong Zhang 5859566063dSJacob Faibussowitsch if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx)); 586dbbe0bcdSBarry Smith PetscTryTypeMethod((*tj), destroy); 587fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 588fe8322adSStefano Zampini PetscMPIInt rank; 589fe8322adSStefano Zampini MPI_Comm comm; 590fe8322adSStefano Zampini 5919566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)(*tj), &comm)); 5929566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 593dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 5949566063dSJacob Faibussowitsch PetscCall(PetscRMTree((*tj)->dirname)); 595fe8322adSStefano Zampini } 596fe8322adSStefano Zampini } 5979566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*tj)->names)); 5989566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->dirname)); 5999566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->filetemplate)); 6009566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tj)); 6013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 602bc952696SBarry Smith } 603bc952696SBarry Smith 604bc952696SBarry Smith /* 605bcf0153eSBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of `TSTrajectory` from user options. 606bc952696SBarry Smith 607c3339decSBarry Smith Collective 608bc952696SBarry Smith 609bc952696SBarry Smith Input Parameter: 610bcf0153eSBarry Smith + tj - the `TSTrajectory` context 6113c0fce88SHong Zhang - ts - the TS context 6123c0fce88SHong Zhang 613bcf0153eSBarry Smith Options Database Key: 6143c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 615bc952696SBarry Smith 616df5474d8SHong Zhang Level: developer 617bc952696SBarry Smith 618bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryType`, `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()` 619bc952696SBarry Smith */ 620d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts) 621d71ae5a4SJacob Faibussowitsch { 622bc952696SBarry Smith PetscBool opt; 623bc952696SBarry Smith const char *defaultType; 624bc952696SBarry Smith char typeName[256]; 625bc952696SBarry Smith 626bc952696SBarry Smith PetscFunctionBegin; 627b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 628bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 629bc952696SBarry Smith 6309566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegisterAll()); 6319566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt)); 632bc952696SBarry Smith if (opt) { 6339566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, typeName)); 634bc952696SBarry Smith } else { 6359566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, defaultType)); 636bc952696SBarry Smith } 6373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 638bc952696SBarry Smith } 639bc952696SBarry Smith 640ed695a29SHong Zhang /*@ 641bcf0153eSBarry Smith TSTrajectorySetUseHistory - Use `TSHistory` in `TSTrajectory` 6429ffb3502SHong Zhang 643c3339decSBarry Smith Collective 6449ffb3502SHong Zhang 6454165533cSJose E. Roman Input Parameters: 646bcf0153eSBarry Smith + tj - the `TSTrajectory` context 647bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable 6489ffb3502SHong Zhang 649bcf0153eSBarry Smith Options Database Key: 650bcf0153eSBarry Smith . -ts_trajectory_use_history - have it use `TSHistory` 6519ffb3502SHong Zhang 6529ffb3502SHong Zhang Level: advanced 6539ffb3502SHong Zhang 654bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 6559ffb3502SHong Zhang @*/ 656d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg) 657d71ae5a4SJacob Faibussowitsch { 6589ffb3502SHong Zhang PetscFunctionBegin; 6599ffb3502SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 6609ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 6619ffb3502SHong Zhang tj->usehistory = flg; 6623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6639ffb3502SHong Zhang } 6649ffb3502SHong Zhang 6659ffb3502SHong Zhang /*@ 666bcf0153eSBarry Smith TSTrajectorySetMonitor - Monitor the schedules generated by the `TSTrajectory` checkpointing controller 667ed695a29SHong Zhang 668c3339decSBarry Smith Collective 669ed695a29SHong Zhang 6704165533cSJose E. Roman Input Parameters: 671bcf0153eSBarry Smith + tj - the `TSTrajectory` context 672bcf0153eSBarry Smith - flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable 673ed695a29SHong Zhang 674bcf0153eSBarry Smith Options Database Key: 675bcf0153eSBarry Smith . -ts_trajectory_monitor - print `TSTrajectory` information 6763c0fce88SHong Zhang 677df5474d8SHong Zhang Level: developer 678ed695a29SHong Zhang 679bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 680ed695a29SHong Zhang @*/ 681d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg) 682d71ae5a4SJacob Faibussowitsch { 683ed695a29SHong Zhang PetscFunctionBegin; 684ed695a29SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 685ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 686fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 687fe8322adSStefano Zampini else tj->monitor = NULL; 6883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 689ed695a29SHong Zhang } 690ed695a29SHong Zhang 691bc952696SBarry Smith /*@ 692bcf0153eSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the `TSTrajectory` once the program is done 69364fc91eeSBarry Smith 694c3339decSBarry Smith Collective 69564fc91eeSBarry Smith 6964165533cSJose E. Roman Input Parameters: 697bcf0153eSBarry Smith + tj - the `TSTrajectory` context 698bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable 69964fc91eeSBarry Smith 700bcf0153eSBarry Smith Options Database Key: 70164fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 70264fc91eeSBarry Smith 70364fc91eeSBarry Smith Level: advanced 70464fc91eeSBarry Smith 705bcf0153eSBarry Smith Note: 706bcf0153eSBarry 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. 707bcf0153eSBarry Smith 708bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()` 70964fc91eeSBarry Smith @*/ 710d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg) 711d71ae5a4SJacob Faibussowitsch { 71264fc91eeSBarry Smith PetscFunctionBegin; 71364fc91eeSBarry Smith PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 71464fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj, flg, 2); 71564fc91eeSBarry Smith tj->keepfiles = flg; 7163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 71764fc91eeSBarry Smith } 71864fc91eeSBarry Smith 719db901c5bSHong Zhang /*@C 720bcf0153eSBarry Smith TSTrajectorySetDirname - Specify the name of the directory where `TSTrajectory` disk checkpoints are stored. 72164e38db7SHong Zhang 722c3339decSBarry Smith Collective 72364e38db7SHong Zhang 7244165533cSJose E. Roman Input Parameters: 725bcf0153eSBarry Smith + tj - the `TSTrajectory` context 72664e38db7SHong Zhang - dirname - the directory name 72764e38db7SHong Zhang 728bcf0153eSBarry Smith Options Database Key: 72964e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 73064e38db7SHong Zhang 73164e38db7SHong Zhang Level: developer 73264e38db7SHong Zhang 733bcf0153eSBarry Smith Notes: 734bcf0153eSBarry Smith The final location of the files is determined by dirname/filetemplate where filetemplate was provided by `TSTrajectorySetFiletemplate()` 735bcf0153eSBarry Smith 736bcf0153eSBarry Smith If this is not called `TSTrajectory` selects a unique new name for the directory 737bcf0153eSBarry Smith 738bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()` 73964e38db7SHong Zhang @*/ 740d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[]) 741d71ae5a4SJacob Faibussowitsch { 742a17281aeSStefano Zampini PetscBool flg; 743a17281aeSStefano Zampini 74464e38db7SHong Zhang PetscFunctionBegin; 74564e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 7469566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(tj->dirname, dirname, &flg)); 747049d1499SBarry Smith PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup"); 7489566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirname)); 7499566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(dirname, &tj->dirname)); 7503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 75164e38db7SHong Zhang } 75264e38db7SHong Zhang 753db901c5bSHong Zhang /*@C 754bcf0153eSBarry Smith TSTrajectorySetFiletemplate - Specify the name template for the files storing `TSTrajectory` checkpoints. 75564e38db7SHong Zhang 756c3339decSBarry Smith Collective 75764e38db7SHong Zhang 7584165533cSJose E. Roman Input Parameters: 759bcf0153eSBarry Smith + tj - the `TSTrajectory` context 7601585b412SBarry Smith - filetemplate - the template 76164e38db7SHong Zhang 762bcf0153eSBarry Smith Options Database Key: 7631585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7641585b412SBarry Smith 765bcf0153eSBarry Smith Level: developer 766bcf0153eSBarry Smith 76795452b02SPatrick Sanan Notes: 76863a3b9bcSJacob Faibussowitsch The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading / 7691585b412SBarry Smith 770bcf0153eSBarry 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 7711585b412SBarry Smith timestep counter 77264e38db7SHong Zhang 773bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectorySetDirname()`, `TSTrajectorySetUp()` 77464e38db7SHong Zhang @*/ 775d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[]) 776d71ae5a4SJacob Faibussowitsch { 777bbcf679cSJacob Faibussowitsch const char *ptr = NULL, *ptr2 = NULL; 7789afe7f3eSBarry Smith 77964e38db7SHong Zhang PetscFunctionBegin; 78064e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 78163a3b9bcSJacob Faibussowitsch PetscValidCharPointer(filetemplate, 2); 7823c633725SBarry Smith PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup"); 7839afe7f3eSBarry Smith 78463a3b9bcSJacob 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"); 7859afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7869566063dSJacob Faibussowitsch PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr)); 78763a3b9bcSJacob 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"); 7889afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 78963a3b9bcSJacob Faibussowitsch PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2)); 79063a3b9bcSJacob 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"); 7919afe7f3eSBarry Smith if (ptr2) break; 7929afe7f3eSBarry Smith } 7939566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->filetemplate)); 7949566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate)); 7953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 79664e38db7SHong Zhang } 79764e38db7SHong Zhang 79864e38db7SHong Zhang /*@ 799bcf0153eSBarry Smith TSTrajectorySetFromOptions - Sets various `TSTrajectory` parameters from user options. 800bc952696SBarry Smith 801c3339decSBarry Smith Collective 802bc952696SBarry Smith 803d8d19677SJose E. Roman Input Parameters: 804bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSGetTrajectory()` 805bcf0153eSBarry Smith - ts - the `TS` context 806bc952696SBarry Smith 807bc952696SBarry Smith Options Database Keys: 808bcf0153eSBarry Smith + -ts_trajectory_type <type> - basic, memory, singlefile, visualization 809bcf0153eSBarry 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 810bcf0153eSBarry Smith - -ts_trajectory_monitor - print `TSTrajectory` information 811bc952696SBarry Smith 812df5474d8SHong Zhang Level: developer 813bc952696SBarry Smith 814bcf0153eSBarry Smith Note: 81595452b02SPatrick Sanan This is not normally called directly by users 816bc952696SBarry Smith 817bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectorySetUp()` 818bc952696SBarry Smith @*/ 819d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts) 820d71ae5a4SJacob Faibussowitsch { 821ed695a29SHong Zhang PetscBool set, flg; 82264e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN]; 823bc952696SBarry Smith 824bc952696SBarry Smith PetscFunctionBegin; 825b1d74d50SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 826fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 827d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tj); 8289566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts)); 8299566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL)); 8309566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set)); 8319566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetMonitor(tj, flg)); 8329566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL)); 8339566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL)); 8349566063dSJacob 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)); 8359566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL)); 8369566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set)); 8379566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg)); 83864e38db7SHong Zhang 8399566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set)); 8401baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetDirname(tj, dirname)); 84164e38db7SHong Zhang 84263a3b9bcSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set)); 8431baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate)); 84464e38db7SHong Zhang 84564e38db7SHong Zhang /* Handle specific TSTrajectory options */ 846dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject); 847d0609cedSBarry Smith PetscOptionsEnd(); 8483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 849bc952696SBarry Smith } 85068bece0bSHong Zhang 85168bece0bSHong Zhang /*@ 85268bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 853bcf0153eSBarry Smith of a `TS` `TSTrajectory`. 85468bece0bSHong Zhang 855c3339decSBarry Smith Collective 85668bece0bSHong Zhang 857d8d19677SJose E. Roman Input Parameters: 858bcf0153eSBarry Smith + tj - the `TSTrajectory` context 859bcf0153eSBarry Smith - ts - the TS context obtained from `TSCreate()` 86068bece0bSHong Zhang 861df5474d8SHong Zhang Level: developer 86268bece0bSHong Zhang 863bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()` 86468bece0bSHong Zhang @*/ 865d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts) 866d71ae5a4SJacob Faibussowitsch { 8679afe7f3eSBarry Smith size_t s1, s2; 86868bece0bSHong Zhang 86968bece0bSHong Zhang PetscFunctionBegin; 8703ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS); 87168bece0bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 872fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 8733ba16761SJacob Faibussowitsch if (tj->setupcalled) PetscFunctionReturn(PETSC_SUCCESS); 87468bece0bSHong Zhang 8759566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0)); 87648a46eb9SPierre Jolivet if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC)); 877dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setup, ts); 87868bece0bSHong Zhang 87968bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 88053b27ddbSHong Zhang 88153b27ddbSHong Zhang /* Set the counters to zero */ 8821a5a771fSHong Zhang tj->recomps = 0; 88353b27ddbSHong Zhang tj->diskreads = 0; 88453b27ddbSHong Zhang tj->diskwrites = 0; 8859566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->dirname, &s1)); 8869566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->filetemplate, &s2)); 8879566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 8889566063dSJacob Faibussowitsch PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate)); 8899566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate)); 8909566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0)); 8913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 89268bece0bSHong Zhang } 893fe8322adSStefano Zampini 894fe8322adSStefano Zampini /*@ 895bcf0153eSBarry Smith TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage information 896fe8322adSStefano Zampini 897c3339decSBarry Smith Collective 898fe8322adSStefano Zampini 899d8d19677SJose E. Roman Input Parameters: 900bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained with `TSGetTrajectory()` 901fe8322adSStefano Zampini - flg - the boolean flag 902fe8322adSStefano Zampini 903fe8322adSStefano Zampini Level: developer 904fe8322adSStefano Zampini 905bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()` 906fe8322adSStefano Zampini @*/ 907d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only) 908d71ae5a4SJacob Faibussowitsch { 909fe8322adSStefano Zampini PetscFunctionBegin; 910fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 911fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj, solution_only, 2); 912fe8322adSStefano Zampini tj->solution_only = solution_only; 9133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 914fe8322adSStefano Zampini } 915fe8322adSStefano Zampini 916fe8322adSStefano Zampini /*@ 917bcf0153eSBarry Smith TSTrajectoryGetSolutionOnly - Gets the value set with `TSTrajectorySetSolutionOnly()`. 918fe8322adSStefano Zampini 919*20f4b53cSBarry Smith Logically Collective 920fe8322adSStefano Zampini 921fe8322adSStefano Zampini Input Parameter: 922bcf0153eSBarry Smith . tj - the `TSTrajectory` context 923fe8322adSStefano Zampini 924fe8322adSStefano Zampini Output Parameter: 925d8d19677SJose E. Roman . flg - the boolean flag 926fe8322adSStefano Zampini 927fe8322adSStefano Zampini Level: developer 928fe8322adSStefano Zampini 929bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()` 930fe8322adSStefano Zampini @*/ 931d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only) 932d71ae5a4SJacob Faibussowitsch { 933fe8322adSStefano Zampini PetscFunctionBegin; 934fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 935dadcf809SJacob Faibussowitsch PetscValidBoolPointer(solution_only, 2); 936fe8322adSStefano Zampini *solution_only = tj->solution_only; 9373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 938fe8322adSStefano Zampini } 939fe8322adSStefano Zampini 940fe8322adSStefano Zampini /*@ 941fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 942fe8322adSStefano Zampini 943c3339decSBarry Smith Collective 944fe8322adSStefano Zampini 945d8d19677SJose E. Roman Input Parameters: 946bcf0153eSBarry Smith + tj - the `TSTrajectory` context 947bcf0153eSBarry Smith . ts - the `TS` solver context 948fe8322adSStefano Zampini - time - the requested time 949fe8322adSStefano Zampini 950d8d19677SJose E. Roman Output Parameters: 951fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 952fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 953fe8322adSStefano Zampini 954fe8322adSStefano Zampini Level: developer 955fe8322adSStefano Zampini 956bcf0153eSBarry Smith Notes: 957bcf0153eSBarry Smith The vectors are interpolated if time does not match any time step stored in the `TSTrajectory()`. Pass NULL to not request a vector. 958fe8322adSStefano Zampini 959bcf0153eSBarry Smith This function differs from `TSTrajectoryGetVecs()` since the vectors obtained cannot be modified, and they need to be returned by 960bcf0153eSBarry Smith calling `TSTrajectoryRestoreUpdatedHistoryVecs()`. 961bcf0153eSBarry Smith 962bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()` 963fe8322adSStefano Zampini @*/ 964d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 965d71ae5a4SJacob Faibussowitsch { 966fe8322adSStefano Zampini PetscFunctionBegin; 967fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 968fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 969fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 3); 970fe8322adSStefano Zampini if (U) PetscValidPointer(U, 4); 971fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot, 5); 972fe8322adSStefano Zampini if (U && !tj->U) { 973fe8322adSStefano Zampini DM dm; 974fe8322adSStefano Zampini 9759566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9769566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->U)); 977fe8322adSStefano Zampini } 978fe8322adSStefano Zampini if (Udot && !tj->Udot) { 979fe8322adSStefano Zampini DM dm; 980fe8322adSStefano Zampini 9819566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9829566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->Udot)); 983fe8322adSStefano Zampini } 9849566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL)); 985fe8322adSStefano Zampini if (U) { 9869566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->U)); 987fe8322adSStefano Zampini *U = tj->U; 988fe8322adSStefano Zampini } 989fe8322adSStefano Zampini if (Udot) { 9909566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->Udot)); 991fe8322adSStefano Zampini *Udot = tj->Udot; 992fe8322adSStefano Zampini } 9933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 994fe8322adSStefano Zampini } 995fe8322adSStefano Zampini 996fe8322adSStefano Zampini /*@ 997bcf0153eSBarry Smith TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with `TSTrajectoryGetUpdatedHistoryVecs()`. 998fe8322adSStefano Zampini 999c3339decSBarry Smith Collective 1000fe8322adSStefano Zampini 1001d8d19677SJose E. Roman Input Parameters: 1002bcf0153eSBarry Smith + tj - the `TSTrajectory` context 1003fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 1004fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 1005fe8322adSStefano Zampini 1006fe8322adSStefano Zampini Level: developer 1007fe8322adSStefano Zampini 1008bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryGetUpdatedHistoryVecs()` 1009fe8322adSStefano Zampini @*/ 1010d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1011d71ae5a4SJacob Faibussowitsch { 1012fe8322adSStefano Zampini PetscFunctionBegin; 1013fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 1014fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2); 1015fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3); 10163c633725SBarry Smith PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 10173c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1018fe8322adSStefano Zampini if (U) { 10199566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->U)); 1020fe8322adSStefano Zampini *U = NULL; 1021fe8322adSStefano Zampini } 1022fe8322adSStefano Zampini if (Udot) { 10239566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->Udot)); 1024fe8322adSStefano Zampini *Udot = NULL; 1025fe8322adSStefano Zampini } 10263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1027fe8322adSStefano Zampini } 1028