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 11bc952696SBarry 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 19bc952696SBarry Smith Notes: 20bc952696SBarry Smith TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 21bc952696SBarry Smith 22df5474d8SHong Zhang Level: developer 23bc952696SBarry Smith 24db781477SPatrick Sanan .seealso: `TSTrajectoryRegisterAll()` 25bc952696SBarry Smith @*/ 269371c9d4SSatish Balay PetscErrorCode TSTrajectoryRegister(const char sname[], PetscErrorCode (*function)(TSTrajectory, TS)) { 27bc952696SBarry Smith PetscFunctionBegin; 289566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&TSTrajectoryList, sname, function)); 29bc952696SBarry Smith PetscFunctionReturn(0); 30bc952696SBarry Smith } 31bc952696SBarry Smith 32fe8322adSStefano Zampini /*@ 33fe8322adSStefano Zampini TSTrajectorySet - Sets a vector of state in the trajectory object 34fe8322adSStefano Zampini 35fe8322adSStefano Zampini Collective on TSTrajectory 36fe8322adSStefano Zampini 37fe8322adSStefano Zampini Input Parameters: 38fe8322adSStefano Zampini + tj - the trajectory object 39fe8322adSStefano Zampini . ts - the time stepper object (optional) 40fe8322adSStefano Zampini . stepnum - the step number 41fe8322adSStefano Zampini . time - the current time 42fe8322adSStefano Zampini - X - the current solution 43fe8322adSStefano Zampini 44fe8322adSStefano Zampini Level: developer 45fe8322adSStefano Zampini 46fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 47fe8322adSStefano Zampini 48db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()` 49fe8322adSStefano Zampini @*/ 509371c9d4SSatish Balay PetscErrorCode TSTrajectorySet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X) { 51bc952696SBarry Smith PetscFunctionBegin; 52bc952696SBarry Smith if (!tj) PetscFunctionReturn(0); 53fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 54fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 55fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 56fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 4); 57fe8322adSStefano Zampini PetscValidHeaderSpecific(X, VEC_CLASSID, 5); 583c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 59*48a46eb9SPierre 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)); 609566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Set, tj, ts, 0, 0)); 61dbbe0bcdSBarry Smith PetscUseTypeMethod(tj, set, ts, stepnum, time, X); 629566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Set, tj, ts, 0, 0)); 631baa6e33SBarry Smith if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh, stepnum, time)); 64fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL; 65bc952696SBarry Smith PetscFunctionReturn(0); 66bc952696SBarry Smith } 67bc952696SBarry Smith 68fe8322adSStefano Zampini /*@ 69fe8322adSStefano Zampini TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet(). 70fe8322adSStefano Zampini 71fe8322adSStefano Zampini Not collective. 72fe8322adSStefano Zampini 73fe8322adSStefano Zampini Input Parameters: 74fe8322adSStefano Zampini . tj - the trajectory object 75fe8322adSStefano Zampini 76fe8322adSStefano Zampini Output Parameter: 77fe8322adSStefano Zampini . steps - the number of steps 78fe8322adSStefano Zampini 79fe8322adSStefano Zampini Level: developer 80fe8322adSStefano Zampini 81db781477SPatrick Sanan .seealso: `TSTrajectorySet()` 82fe8322adSStefano Zampini @*/ 839371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) { 84fe8322adSStefano Zampini PetscFunctionBegin; 85fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 86fe8322adSStefano Zampini PetscValidIntPointer(steps, 2); 879566063dSJacob Faibussowitsch PetscCall(TSHistoryGetNumSteps(tj->tsh, steps)); 88fe8322adSStefano Zampini PetscFunctionReturn(0); 89fe8322adSStefano Zampini } 90fe8322adSStefano Zampini 91fe8322adSStefano Zampini /*@ 92fe8322adSStefano Zampini TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory 93fe8322adSStefano Zampini 94fe8322adSStefano Zampini Collective on TS 95fe8322adSStefano Zampini 96fe8322adSStefano Zampini Input Parameters: 97fe8322adSStefano Zampini + tj - the trajectory object 98fe8322adSStefano Zampini . ts - the time stepper object 99fe8322adSStefano Zampini - stepnum - the step number 100fe8322adSStefano Zampini 101fe8322adSStefano Zampini Output Parameter: 102fe8322adSStefano Zampini . time - the time associated with the step number 103fe8322adSStefano Zampini 104fe8322adSStefano Zampini Level: developer 105fe8322adSStefano Zampini 106fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 107fe8322adSStefano Zampini 108db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()` 109fe8322adSStefano Zampini @*/ 1109371c9d4SSatish Balay PetscErrorCode TSTrajectoryGet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time) { 111bc952696SBarry Smith PetscFunctionBegin; 1123c633725SBarry Smith PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory"); 113fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 114fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 115fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 116dadcf809SJacob Faibussowitsch PetscValidRealPointer(time, 4); 1173c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 1183c633725SBarry Smith PetscCheck(stepnum >= 0, PetscObjectComm((PetscObject)tj), PETSC_ERR_PLIB, "Requesting negative step number"); 119fe8322adSStefano Zampini if (tj->monitor) { 12063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n", stepnum, (PetscInt)!tj->solution_only)); 1219566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 122fe8322adSStefano Zampini } 1239566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Get, tj, ts, 0, 0)); 124dbbe0bcdSBarry Smith PetscUseTypeMethod(tj, get, ts, stepnum, time); 1259566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Get, tj, ts, 0, 0)); 126bc952696SBarry Smith PetscFunctionReturn(0); 127bc952696SBarry Smith } 128bc952696SBarry Smith 129fe8322adSStefano Zampini /*@ 130fe8322adSStefano Zampini TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS 131fe8322adSStefano Zampini 132fe8322adSStefano Zampini Collective on TS 133fe8322adSStefano Zampini 134fe8322adSStefano Zampini Input Parameters: 135fe8322adSStefano Zampini + tj - the trajectory object 136fe8322adSStefano Zampini . ts - the time stepper object (optional) 137fe8322adSStefano Zampini - stepnum - the requested step number 138fe8322adSStefano Zampini 1396b867d5aSJose E. Roman Input/Output Parameter: 140fe8322adSStefano Zampini 141fe8322adSStefano Zampini Output Parameters: 142f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number 143f1a722f8SMatthew G. Knepley . U - state vector (can be NULL) 144fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL) 145fe8322adSStefano Zampini 146fe8322adSStefano Zampini Level: developer 147fe8322adSStefano Zampini 148fe8322adSStefano Zampini Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory. 149fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 150fe8322adSStefano Zampini 151db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()` 152fe8322adSStefano Zampini @*/ 1539371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot) { 154fe8322adSStefano Zampini PetscFunctionBegin; 1553c633725SBarry Smith PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory"); 156fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 157fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 158fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 159dadcf809SJacob Faibussowitsch PetscValidRealPointer(time, 4); 160fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5); 161fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6); 162fe8322adSStefano Zampini if (!U && !Udot) PetscFunctionReturn(0); 1633c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 1649566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0)); 165fe8322adSStefano Zampini if (tj->monitor) { 166fe8322adSStefano Zampini PetscInt pU, pUdot; 167fe8322adSStefano Zampini pU = U ? 1 : 0; 168fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 16963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time)); 1709566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 171fe8322adSStefano Zampini } 172fe8322adSStefano Zampini if (U && tj->lag.caching) { 173fe8322adSStefano Zampini PetscObjectId id; 174fe8322adSStefano Zampini PetscObjectState state; 175fe8322adSStefano Zampini 1769566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &state)); 1779566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &id)); 178fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 179fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 180fe8322adSStefano Zampini } else { 181fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 182fe8322adSStefano Zampini } 183fe8322adSStefano Zampini if (tj->monitor && !U) { 1849566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 1859566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n")); 1869566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 1879566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 188fe8322adSStefano Zampini } 189fe8322adSStefano Zampini } 190fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 191fe8322adSStefano Zampini PetscObjectId id; 192fe8322adSStefano Zampini PetscObjectState state; 193fe8322adSStefano Zampini 1949566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)Udot, &state)); 1959566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)Udot, &id)); 196fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 197fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 198fe8322adSStefano Zampini } else { 199fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 200fe8322adSStefano Zampini } 201fe8322adSStefano Zampini if (tj->monitor && !Udot) { 2029566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 2039566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n")); 2049566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2059566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 206fe8322adSStefano Zampini } 207fe8322adSStefano Zampini } 208fe8322adSStefano Zampini if (!U && !Udot) { 2099566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0)); 210fe8322adSStefano Zampini PetscFunctionReturn(0); 211fe8322adSStefano Zampini } 212fe8322adSStefano Zampini 213fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 2141baa6e33SBarry Smith if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 215fe8322adSStefano Zampini /* cached states will be updated in the function */ 2169566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot)); 217fe8322adSStefano Zampini if (tj->monitor) { 2189566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2199566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 220fe8322adSStefano Zampini } 221fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 222fe8322adSStefano Zampini TS fakets = ts; 223fe8322adSStefano Zampini Vec U2; 224fe8322adSStefano Zampini 225fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 226fe8322adSStefano Zampini if (!ts) { 2279566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets)); 228fe8322adSStefano Zampini if (!fakets) { 2299566063dSJacob Faibussowitsch PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets)); 2309566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets)); 2319566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)fakets)); 2329566063dSJacob Faibussowitsch PetscCall(VecDuplicate(U, &U2)); 2339566063dSJacob Faibussowitsch PetscCall(TSSetSolution(fakets, U2)); 2349566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)U2)); 235fe8322adSStefano Zampini } 236fe8322adSStefano Zampini } 2379566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time)); 2389566063dSJacob Faibussowitsch PetscCall(TSGetSolution(fakets, &U2)); 2399566063dSJacob Faibussowitsch PetscCall(VecCopy(U2, U)); 2409566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state)); 2419566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id)); 242fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 243fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 244fe8322adSStefano Zampini } 2459566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0)); 246fe8322adSStefano Zampini PetscFunctionReturn(0); 247fe8322adSStefano Zampini } 248fe8322adSStefano Zampini 249bc952696SBarry Smith /*@C 250fe2efc57SMark TSTrajectoryViewFromOptions - View from Options 251fe2efc57SMark 252fe2efc57SMark Collective on TSTrajectory 253fe2efc57SMark 254fe2efc57SMark Input Parameters: 255fe2efc57SMark + A - the TSTrajectory context 256736c3998SJose E. Roman . obj - Optional object 257736c3998SJose E. Roman - name - command line option 258fe2efc57SMark 259fe2efc57SMark Level: intermediate 260db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()` 261fe2efc57SMark @*/ 2629371c9d4SSatish Balay PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[]) { 263fe2efc57SMark PetscFunctionBegin; 264fe2efc57SMark PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1); 2659566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 266fe2efc57SMark PetscFunctionReturn(0); 267fe2efc57SMark } 268fe2efc57SMark 269fe2efc57SMark /*@C 270bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 271bc952696SBarry Smith 272bc952696SBarry Smith Collective on TSTrajectory 273bc952696SBarry Smith 274bc952696SBarry Smith Input Parameters: 275b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 276bc952696SBarry Smith - viewer - visualization context 277bc952696SBarry Smith 278bc952696SBarry Smith Options Database Key: 279e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 280bc952696SBarry Smith 281bc952696SBarry Smith Notes: 282bc952696SBarry Smith The available visualization contexts include 283bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 284bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 285bc952696SBarry Smith output where only the first processor opens 286bc952696SBarry Smith the file. All other processors send their 287bc952696SBarry Smith data to the first processor to print. 288bc952696SBarry Smith 289bc952696SBarry Smith The user can open an alternative visualization context with 290bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 291bc952696SBarry Smith 292df5474d8SHong Zhang Level: developer 293bc952696SBarry Smith 294db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()` 295bc952696SBarry Smith @*/ 2969371c9d4SSatish Balay PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer) { 297bc952696SBarry Smith PetscBool iascii; 298bc952696SBarry Smith 299bc952696SBarry Smith PetscFunctionBegin; 3001a5a771fSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 301*48a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer)); 302bc952696SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 303b1d74d50SHong Zhang PetscCheckSameComm(tj, 1, viewer, 2); 304bc952696SBarry Smith 3059566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 306bc952696SBarry Smith if (iascii) { 3079566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer)); 30863a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps)); 30963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads)); 31063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites)); 3119566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 312dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, view, viewer); 3139566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 314bc952696SBarry Smith } 315bc952696SBarry Smith PetscFunctionReturn(0); 316bc952696SBarry Smith } 317bc952696SBarry Smith 318bc952696SBarry Smith /*@C 31978fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 32078fbdcc8SBarry Smith 32178fbdcc8SBarry Smith Collective on TSTrajectory 32278fbdcc8SBarry Smith 32378fbdcc8SBarry Smith Input Parameters: 32478fbdcc8SBarry Smith + tr - the trajectory context 32578fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 32678fbdcc8SBarry Smith 32778fbdcc8SBarry Smith Level: intermediate 32878fbdcc8SBarry Smith 329db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 330db901c5bSHong Zhang 331db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSGetTrajectory()` 33278fbdcc8SBarry Smith @*/ 3339371c9d4SSatish Balay PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names) { 33478fbdcc8SBarry Smith PetscFunctionBegin; 335fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1); 336fe8322adSStefano Zampini PetscValidPointer(names, 2); 3379566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&ctx->names)); 3389566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(names, &ctx->names)); 33978fbdcc8SBarry Smith PetscFunctionReturn(0); 34078fbdcc8SBarry Smith } 34178fbdcc8SBarry Smith 34278fbdcc8SBarry Smith /*@C 343fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 34408347785SBarry Smith 34508347785SBarry Smith Collective on TSLGCtx 34608347785SBarry Smith 34708347785SBarry Smith Input Parameters: 34808347785SBarry Smith + tj - the TSTrajectory context 34908347785SBarry Smith . transform - the transform function 35008347785SBarry Smith . destroy - function to destroy the optional context 35108347785SBarry Smith - ctx - optional context used by transform function 35208347785SBarry Smith 35308347785SBarry Smith Level: intermediate 35408347785SBarry Smith 355db781477SPatrick Sanan .seealso: `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()` 35608347785SBarry Smith @*/ 3579371c9d4SSatish Balay PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx) { 35808347785SBarry Smith PetscFunctionBegin; 359fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 36008347785SBarry Smith tj->transform = transform; 36108347785SBarry Smith tj->transformdestroy = destroy; 36208347785SBarry Smith tj->transformctx = tctx; 36308347785SBarry Smith PetscFunctionReturn(0); 36408347785SBarry Smith } 36508347785SBarry Smith 366db901c5bSHong Zhang /*@ 367bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 368bc952696SBarry Smith 369d083f849SBarry Smith Collective 370bc952696SBarry Smith 371bc952696SBarry Smith Input Parameter: 3723c0fce88SHong Zhang . comm - the communicator 373bc952696SBarry Smith 374bc952696SBarry Smith Output Parameter: 3753c0fce88SHong Zhang . tj - the trajectory object 376bc952696SBarry Smith 377df5474d8SHong Zhang Level: developer 378bc952696SBarry Smith 37995452b02SPatrick Sanan Notes: 38095452b02SPatrick Sanan Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 381bc952696SBarry Smith 382db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()` 383bc952696SBarry Smith @*/ 3849371c9d4SSatish Balay PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj) { 385bc952696SBarry Smith TSTrajectory t; 386bc952696SBarry Smith 387bc952696SBarry Smith PetscFunctionBegin; 388b1d74d50SHong Zhang PetscValidPointer(tj, 2); 389b1d74d50SHong Zhang *tj = NULL; 3909566063dSJacob Faibussowitsch PetscCall(TSInitializePackage()); 391bc952696SBarry Smith 3929566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView)); 39368bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 3949566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(comm, &t->tsh)); 395fe8322adSStefano Zampini 396fe8322adSStefano Zampini t->lag.order = 1; 397fe8322adSStefano Zampini t->lag.L = NULL; 398fe8322adSStefano Zampini t->lag.T = NULL; 399fe8322adSStefano Zampini t->lag.W = NULL; 400fe8322adSStefano Zampini t->lag.WW = NULL; 401fe8322adSStefano Zampini t->lag.TW = NULL; 402fe8322adSStefano Zampini t->lag.TT = NULL; 403fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 404fe8322adSStefano Zampini t->lag.Ucached.id = 0; 405fe8322adSStefano Zampini t->lag.Ucached.state = -1; 406fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 407fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 408fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 409fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 410fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 411fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 412fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 413fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 414fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 415ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 416b1d74d50SHong Zhang *tj = t; 41763a3b9bcSJacob Faibussowitsch PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin")); 418bc952696SBarry Smith PetscFunctionReturn(0); 419bc952696SBarry Smith } 420bc952696SBarry Smith 421bc952696SBarry Smith /*@C 422bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 423bc952696SBarry Smith 424bc952696SBarry Smith Collective on TS 425bc952696SBarry Smith 426bc952696SBarry Smith Input Parameters: 4273c0fce88SHong Zhang + tj - the TSTrajectory context 4283c0fce88SHong Zhang . ts - the TS context 4293c0fce88SHong Zhang - type - a known method 430bc952696SBarry Smith 431bc952696SBarry Smith Options Database Command: 432e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 433bc952696SBarry Smith 434df5474d8SHong Zhang Level: developer 435bc952696SBarry Smith 436db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()` 437bc952696SBarry Smith 438bc952696SBarry Smith @*/ 4399371c9d4SSatish Balay PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type) { 440972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory, TS); 441bc952696SBarry Smith PetscBool match; 442bc952696SBarry Smith 443bc952696SBarry Smith PetscFunctionBegin; 444972caf09SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 4459566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match)); 446bc952696SBarry Smith if (match) PetscFunctionReturn(0); 447bc952696SBarry Smith 4489566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r)); 4493c633725SBarry Smith PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type); 450972caf09SHong Zhang if (tj->ops->destroy) { 4519566063dSJacob Faibussowitsch PetscCall((*(tj)->ops->destroy)(tj)); 452bc952696SBarry Smith 453972caf09SHong Zhang tj->ops->destroy = NULL; 454bc952696SBarry Smith } 4559566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops))); 456bc952696SBarry Smith 4579566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type)); 4589566063dSJacob Faibussowitsch PetscCall((*r)(tj, ts)); 459bc952696SBarry Smith PetscFunctionReturn(0); 460bc952696SBarry Smith } 461bc952696SBarry Smith 462881c1a9bSHong Zhang /*@C 463881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 464881c1a9bSHong Zhang 465881c1a9bSHong Zhang Collective on TS 466881c1a9bSHong Zhang 467881c1a9bSHong Zhang Input Parameters: 468881c1a9bSHong Zhang + tj - the TSTrajectory context 469881c1a9bSHong Zhang - ts - the TS context 470881c1a9bSHong Zhang 471881c1a9bSHong Zhang Output Parameters: 472881c1a9bSHong Zhang . type - a known method 473881c1a9bSHong Zhang 474881c1a9bSHong Zhang Level: developer 475881c1a9bSHong Zhang 476db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()` 477881c1a9bSHong Zhang 478881c1a9bSHong Zhang @*/ 4799371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type) { 480881c1a9bSHong Zhang PetscFunctionBegin; 481881c1a9bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 482881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 483881c1a9bSHong Zhang PetscFunctionReturn(0); 484881c1a9bSHong Zhang } 485881c1a9bSHong Zhang 486972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS); 487972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS); 4889a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS); 4892b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS); 490bc952696SBarry Smith 491bc952696SBarry Smith /*@C 492bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 493bc952696SBarry Smith 494bc952696SBarry Smith Not Collective 495bc952696SBarry Smith 496df5474d8SHong Zhang Level: developer 497bc952696SBarry Smith 498db781477SPatrick Sanan .seealso: `TSTrajectoryRegister()` 499bc952696SBarry Smith @*/ 5009371c9d4SSatish Balay PetscErrorCode TSTrajectoryRegisterAll(void) { 501bc952696SBarry Smith PetscFunctionBegin; 502560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 503bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 504bc952696SBarry Smith 5059566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic)); 5069566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile)); 5079566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory)); 5089566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization)); 509bc952696SBarry Smith PetscFunctionReturn(0); 510bc952696SBarry Smith } 511bc952696SBarry Smith 512bc952696SBarry Smith /*@ 5131550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5141550c9b9SHong Zhang 5151550c9b9SHong Zhang Collective on TSTrajectory 5161550c9b9SHong Zhang 5171550c9b9SHong Zhang Input Parameter: 5181550c9b9SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5191550c9b9SHong Zhang 5201550c9b9SHong Zhang Level: developer 5211550c9b9SHong Zhang 522db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 5231550c9b9SHong Zhang @*/ 5249371c9d4SSatish Balay PetscErrorCode TSTrajectoryReset(TSTrajectory tj) { 5251550c9b9SHong Zhang PetscFunctionBegin; 5269a992471SHong Zhang if (!tj) PetscFunctionReturn(0); 5279a992471SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 528dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, reset); 5299566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 5309566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&tj->tsh)); 5319566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh)); 532fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5331550c9b9SHong Zhang PetscFunctionReturn(0); 5341550c9b9SHong Zhang } 5351550c9b9SHong Zhang 5361550c9b9SHong Zhang /*@ 537bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 538bc952696SBarry Smith 539bc952696SBarry Smith Collective on TSTrajectory 540bc952696SBarry Smith 541bc952696SBarry Smith Input Parameter: 5423c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 543bc952696SBarry Smith 544df5474d8SHong Zhang Level: developer 545bc952696SBarry Smith 546db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 547bc952696SBarry Smith @*/ 5489371c9d4SSatish Balay PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) { 549bc952696SBarry Smith PetscFunctionBegin; 550972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 551972caf09SHong Zhang PetscValidHeaderSpecific((*tj), TSTRAJECTORY_CLASSID, 1); 5529371c9d4SSatish Balay if (--((PetscObject)(*tj))->refct > 0) { 5539371c9d4SSatish Balay *tj = NULL; 5549371c9d4SSatish Balay PetscFunctionReturn(0); 5559371c9d4SSatish Balay } 556bc952696SBarry Smith 5579566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReset(*tj)); 5589566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&(*tj)->tsh)); 5599566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W)); 5609566063dSJacob Faibussowitsch PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW)); 5619566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->U)); 5629566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->Udot)); 5639a992471SHong Zhang 5649566063dSJacob Faibussowitsch if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx)); 565dbbe0bcdSBarry Smith PetscTryTypeMethod((*tj), destroy); 566fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 567fe8322adSStefano Zampini PetscMPIInt rank; 568fe8322adSStefano Zampini MPI_Comm comm; 569fe8322adSStefano Zampini 5709566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)(*tj), &comm)); 5719566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 572dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 5739566063dSJacob Faibussowitsch PetscCall(PetscRMTree((*tj)->dirname)); 574fe8322adSStefano Zampini } 575fe8322adSStefano Zampini } 5769566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*tj)->names)); 5779566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->dirname)); 5789566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->filetemplate)); 5799566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tj)); 580bc952696SBarry Smith PetscFunctionReturn(0); 581bc952696SBarry Smith } 582bc952696SBarry Smith 583bc952696SBarry Smith /* 584772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 585bc952696SBarry Smith 586bc952696SBarry Smith Collective on TSTrajectory 587bc952696SBarry Smith 588bc952696SBarry Smith Input Parameter: 5893c0fce88SHong Zhang + tj - the TSTrajectory context 5903c0fce88SHong Zhang - ts - the TS context 5913c0fce88SHong Zhang 5923c0fce88SHong Zhang Options Database Keys: 5933c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 594bc952696SBarry Smith 595df5474d8SHong Zhang Level: developer 596bc952696SBarry Smith 597db781477SPatrick Sanan .seealso: `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()` 598bc952696SBarry Smith */ 5999371c9d4SSatish Balay static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts) { 600bc952696SBarry Smith PetscBool opt; 601bc952696SBarry Smith const char *defaultType; 602bc952696SBarry Smith char typeName[256]; 603bc952696SBarry Smith 604bc952696SBarry Smith PetscFunctionBegin; 605b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 606bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 607bc952696SBarry Smith 6089566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegisterAll()); 6099566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt)); 610bc952696SBarry Smith if (opt) { 6119566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, typeName)); 612bc952696SBarry Smith } else { 6139566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, defaultType)); 614bc952696SBarry Smith } 615bc952696SBarry Smith PetscFunctionReturn(0); 616bc952696SBarry Smith } 617bc952696SBarry Smith 618ed695a29SHong Zhang /*@ 6199ffb3502SHong Zhang TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory 6209ffb3502SHong Zhang 6219ffb3502SHong Zhang Collective on TSTrajectory 6229ffb3502SHong Zhang 6234165533cSJose E. Roman Input Parameters: 6249ffb3502SHong Zhang + tj - the TSTrajectory context 6259ffb3502SHong Zhang - flg - PETSC_TRUE to save, PETSC_FALSE to disable 6269ffb3502SHong Zhang 6279ffb3502SHong Zhang Options Database Keys: 6289ffb3502SHong Zhang . -ts_trajectory_use_history - have it use TSHistory 6299ffb3502SHong Zhang 6309ffb3502SHong Zhang Level: advanced 6319ffb3502SHong Zhang 632db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 6339ffb3502SHong Zhang @*/ 6349371c9d4SSatish Balay PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg) { 6359ffb3502SHong Zhang PetscFunctionBegin; 6369ffb3502SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 6379ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 6389ffb3502SHong Zhang tj->usehistory = flg; 6399ffb3502SHong Zhang PetscFunctionReturn(0); 6409ffb3502SHong Zhang } 6419ffb3502SHong Zhang 6429ffb3502SHong Zhang /*@ 643ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 644ed695a29SHong Zhang 645ed695a29SHong Zhang Collective on TSTrajectory 646ed695a29SHong Zhang 6474165533cSJose E. Roman Input Parameters: 648ed695a29SHong Zhang + tj - the TSTrajectory context 649ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 650ed695a29SHong Zhang 6513c0fce88SHong Zhang Options Database Keys: 652063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 6533c0fce88SHong Zhang 654df5474d8SHong Zhang Level: developer 655ed695a29SHong Zhang 656db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 657ed695a29SHong Zhang @*/ 6589371c9d4SSatish Balay PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg) { 659ed695a29SHong Zhang PetscFunctionBegin; 660ed695a29SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 661ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 662fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 663fe8322adSStefano Zampini else tj->monitor = NULL; 664ed695a29SHong Zhang PetscFunctionReturn(0); 665ed695a29SHong Zhang } 666ed695a29SHong Zhang 667bc952696SBarry Smith /*@ 66864fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 66964fc91eeSBarry Smith 67064fc91eeSBarry Smith Collective on TSTrajectory 67164fc91eeSBarry Smith 6724165533cSJose E. Roman Input Parameters: 67364fc91eeSBarry Smith + tj - the TSTrajectory context 67464fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 67564fc91eeSBarry Smith 67664fc91eeSBarry Smith Options Database Keys: 67764fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 67864fc91eeSBarry Smith 67995452b02SPatrick Sanan Notes: 68095452b02SPatrick Sanan 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. 68164fc91eeSBarry Smith 68264fc91eeSBarry Smith Level: advanced 68364fc91eeSBarry Smith 684db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()` 68564fc91eeSBarry Smith @*/ 6869371c9d4SSatish Balay PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg) { 68764fc91eeSBarry Smith PetscFunctionBegin; 68864fc91eeSBarry Smith PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 68964fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj, flg, 2); 69064fc91eeSBarry Smith tj->keepfiles = flg; 69164fc91eeSBarry Smith PetscFunctionReturn(0); 69264fc91eeSBarry Smith } 69364fc91eeSBarry Smith 694db901c5bSHong Zhang /*@C 69564e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 69664e38db7SHong Zhang 69764e38db7SHong Zhang Collective on TSTrajectory 69864e38db7SHong Zhang 6994165533cSJose E. Roman Input Parameters: 70064e38db7SHong Zhang + tj - the TSTrajectory context 70164e38db7SHong Zhang - dirname - the directory name 70264e38db7SHong Zhang 70364e38db7SHong Zhang Options Database Keys: 70464e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 70564e38db7SHong Zhang 70695452b02SPatrick Sanan Notes: 70795452b02SPatrick Sanan The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 7081585b412SBarry Smith 70964e38db7SHong Zhang Level: developer 71064e38db7SHong Zhang 711c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()` 71264e38db7SHong Zhang @*/ 7139371c9d4SSatish Balay PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[]) { 714a17281aeSStefano Zampini PetscBool flg; 715a17281aeSStefano Zampini 71664e38db7SHong Zhang PetscFunctionBegin; 71764e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 7189566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(tj->dirname, dirname, &flg)); 719049d1499SBarry Smith PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup"); 7209566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirname)); 7219566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(dirname, &tj->dirname)); 72264e38db7SHong Zhang PetscFunctionReturn(0); 72364e38db7SHong Zhang } 72464e38db7SHong Zhang 725db901c5bSHong Zhang /*@C 72664e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 72764e38db7SHong Zhang 72864e38db7SHong Zhang Collective on TSTrajectory 72964e38db7SHong Zhang 7304165533cSJose E. Roman Input Parameters: 73164e38db7SHong Zhang + tj - the TSTrajectory context 7321585b412SBarry Smith - filetemplate - the template 73364e38db7SHong Zhang 73464e38db7SHong Zhang Options Database Keys: 7351585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7361585b412SBarry Smith 73795452b02SPatrick Sanan Notes: 73863a3b9bcSJacob Faibussowitsch The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading / 7391585b412SBarry Smith 74063a3b9bcSJacob Faibussowitsch 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 7411585b412SBarry Smith timestep counter 74264e38db7SHong Zhang 74364e38db7SHong Zhang Level: developer 74464e38db7SHong Zhang 745c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetDirname()`, `TSTrajectorySetUp()` 74664e38db7SHong Zhang @*/ 7479371c9d4SSatish Balay PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[]) { 7489afe7f3eSBarry Smith const char *ptr, *ptr2; 7499afe7f3eSBarry Smith 75064e38db7SHong Zhang PetscFunctionBegin; 75164e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 75263a3b9bcSJacob Faibussowitsch PetscValidCharPointer(filetemplate, 2); 7533c633725SBarry Smith PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup"); 7549afe7f3eSBarry Smith 75563a3b9bcSJacob 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"); 7569afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7579566063dSJacob Faibussowitsch PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr)); 75863a3b9bcSJacob 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"); 7599afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 76063a3b9bcSJacob Faibussowitsch PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2)); 76163a3b9bcSJacob 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"); 7629afe7f3eSBarry Smith if (ptr2) break; 7639afe7f3eSBarry Smith } 7649566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->filetemplate)); 7659566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate)); 76664e38db7SHong Zhang PetscFunctionReturn(0); 76764e38db7SHong Zhang } 76864e38db7SHong Zhang 76964e38db7SHong Zhang /*@ 770bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 771bc952696SBarry Smith 772bc952696SBarry Smith Collective on TSTrajectory 773bc952696SBarry Smith 774d8d19677SJose E. Roman Input Parameters: 7753c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 7763c0fce88SHong Zhang - ts - the TS context 777bc952696SBarry Smith 778bc952696SBarry Smith Options Database Keys: 7793c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 78064fc91eeSBarry Smith . -ts_trajectory_keep_files <true,false> - keep the files generated by the code after the program ends. This is true by default for TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 781063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 782bc952696SBarry Smith 783df5474d8SHong Zhang Level: developer 784bc952696SBarry Smith 78595452b02SPatrick Sanan Notes: 78695452b02SPatrick Sanan This is not normally called directly by users 787bc952696SBarry Smith 788db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectorySetUp()` 789bc952696SBarry Smith @*/ 7909371c9d4SSatish Balay PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts) { 791ed695a29SHong Zhang PetscBool set, flg; 79264e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN]; 793bc952696SBarry Smith 794bc952696SBarry Smith PetscFunctionBegin; 795b1d74d50SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 796fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 797d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tj); 7989566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts)); 7999566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL)); 8009566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set)); 8019566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetMonitor(tj, flg)); 8029566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL)); 8039566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL)); 8049566063dSJacob 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)); 8059566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL)); 8069566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set)); 8079566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg)); 80864e38db7SHong Zhang 8099566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set)); 8101baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetDirname(tj, dirname)); 81164e38db7SHong Zhang 81263a3b9bcSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set)); 8131baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate)); 81464e38db7SHong Zhang 81564e38db7SHong Zhang /* Handle specific TSTrajectory options */ 816dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject); 817d0609cedSBarry Smith PetscOptionsEnd(); 818bc952696SBarry Smith PetscFunctionReturn(0); 819bc952696SBarry Smith } 82068bece0bSHong Zhang 82168bece0bSHong Zhang /*@ 82268bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 82368bece0bSHong Zhang of a TS trajectory. 82468bece0bSHong Zhang 82568bece0bSHong Zhang Collective on TS 82668bece0bSHong Zhang 827d8d19677SJose E. Roman Input Parameters: 8283c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 8293c0fce88SHong Zhang - tj - the TS trajectory context 83068bece0bSHong Zhang 831df5474d8SHong Zhang Level: developer 83268bece0bSHong Zhang 833db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()` 83468bece0bSHong Zhang @*/ 8359371c9d4SSatish Balay PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts) { 8369afe7f3eSBarry Smith size_t s1, s2; 83768bece0bSHong Zhang 83868bece0bSHong Zhang PetscFunctionBegin; 83968bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 84068bece0bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 841fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 84268bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 84368bece0bSHong Zhang 8449566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0)); 845*48a46eb9SPierre Jolivet if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC)); 846dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setup, ts); 84768bece0bSHong Zhang 84868bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 84953b27ddbSHong Zhang 85053b27ddbSHong Zhang /* Set the counters to zero */ 8511a5a771fSHong Zhang tj->recomps = 0; 85253b27ddbSHong Zhang tj->diskreads = 0; 85353b27ddbSHong Zhang tj->diskwrites = 0; 8549566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->dirname, &s1)); 8559566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->filetemplate, &s2)); 8569566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 8579566063dSJacob Faibussowitsch PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate)); 8589566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate)); 8599566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0)); 86068bece0bSHong Zhang PetscFunctionReturn(0); 86168bece0bSHong Zhang } 862fe8322adSStefano Zampini 863fe8322adSStefano Zampini /*@ 864fe8322adSStefano Zampini TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also. 865fe8322adSStefano Zampini 866fe8322adSStefano Zampini Collective on TSTrajectory 867fe8322adSStefano Zampini 868d8d19677SJose E. Roman Input Parameters: 869fe8322adSStefano Zampini + tj - the TS trajectory context 870fe8322adSStefano Zampini - flg - the boolean flag 871fe8322adSStefano Zampini 872fe8322adSStefano Zampini Level: developer 873fe8322adSStefano Zampini 874db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()` 875fe8322adSStefano Zampini @*/ 8769371c9d4SSatish Balay PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only) { 877fe8322adSStefano Zampini PetscFunctionBegin; 878fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 879fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj, solution_only, 2); 880fe8322adSStefano Zampini tj->solution_only = solution_only; 881fe8322adSStefano Zampini PetscFunctionReturn(0); 882fe8322adSStefano Zampini } 883fe8322adSStefano Zampini 884fe8322adSStefano Zampini /*@ 885fe8322adSStefano Zampini TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly. 886fe8322adSStefano Zampini 887fe8322adSStefano Zampini Logically collective on TSTrajectory 888fe8322adSStefano Zampini 889fe8322adSStefano Zampini Input Parameter: 890fe8322adSStefano Zampini . tj - the TS trajectory context 891fe8322adSStefano Zampini 892fe8322adSStefano Zampini Output Parameter: 893d8d19677SJose E. Roman . flg - the boolean flag 894fe8322adSStefano Zampini 895fe8322adSStefano Zampini Level: developer 896fe8322adSStefano Zampini 897db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()` 898fe8322adSStefano Zampini @*/ 8999371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only) { 900fe8322adSStefano Zampini PetscFunctionBegin; 901fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 902dadcf809SJacob Faibussowitsch PetscValidBoolPointer(solution_only, 2); 903fe8322adSStefano Zampini *solution_only = tj->solution_only; 904fe8322adSStefano Zampini PetscFunctionReturn(0); 905fe8322adSStefano Zampini } 906fe8322adSStefano Zampini 907fe8322adSStefano Zampini /*@ 908fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 909fe8322adSStefano Zampini 910fe8322adSStefano Zampini Collective on TSTrajectory 911fe8322adSStefano Zampini 912d8d19677SJose E. Roman Input Parameters: 913fe8322adSStefano Zampini + tj - the TS trajectory context 914fe8322adSStefano Zampini . ts - the TS solver context 915fe8322adSStefano Zampini - time - the requested time 916fe8322adSStefano Zampini 917d8d19677SJose E. Roman Output Parameters: 918fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 919fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 920fe8322adSStefano Zampini 921fe8322adSStefano Zampini Level: developer 922fe8322adSStefano Zampini 923fe8322adSStefano Zampini Notes: The vectors are interpolated if time does not match any time step stored in the TSTrajectory(). Pass NULL to not request a vector. 924fe8322adSStefano Zampini This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by 925fe8322adSStefano Zampini calling TSTrajectoryRestoreUpdatedHistoryVecs(). 926fe8322adSStefano Zampini 927db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()` 928fe8322adSStefano Zampini @*/ 9299371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) { 930fe8322adSStefano Zampini PetscFunctionBegin; 931fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 932fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 933fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 3); 934fe8322adSStefano Zampini if (U) PetscValidPointer(U, 4); 935fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot, 5); 936fe8322adSStefano Zampini if (U && !tj->U) { 937fe8322adSStefano Zampini DM dm; 938fe8322adSStefano Zampini 9399566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9409566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->U)); 941fe8322adSStefano Zampini } 942fe8322adSStefano Zampini if (Udot && !tj->Udot) { 943fe8322adSStefano Zampini DM dm; 944fe8322adSStefano Zampini 9459566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9469566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->Udot)); 947fe8322adSStefano Zampini } 9489566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL)); 949fe8322adSStefano Zampini if (U) { 9509566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->U)); 951fe8322adSStefano Zampini *U = tj->U; 952fe8322adSStefano Zampini } 953fe8322adSStefano Zampini if (Udot) { 9549566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->Udot)); 955fe8322adSStefano Zampini *Udot = tj->Udot; 956fe8322adSStefano Zampini } 957fe8322adSStefano Zampini PetscFunctionReturn(0); 958fe8322adSStefano Zampini } 959fe8322adSStefano Zampini 960fe8322adSStefano Zampini /*@ 961fe8322adSStefano Zampini TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs(). 962fe8322adSStefano Zampini 963fe8322adSStefano Zampini Collective on TSTrajectory 964fe8322adSStefano Zampini 965d8d19677SJose E. Roman Input Parameters: 966fe8322adSStefano Zampini + tj - the TS trajectory context 967fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 968fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 969fe8322adSStefano Zampini 970fe8322adSStefano Zampini Level: developer 971fe8322adSStefano Zampini 972db781477SPatrick Sanan .seealso: `TSTrajectoryGetUpdatedHistoryVecs()` 973fe8322adSStefano Zampini @*/ 9749371c9d4SSatish Balay PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) { 975fe8322adSStefano Zampini PetscFunctionBegin; 976fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 977fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2); 978fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3); 9793c633725SBarry Smith PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 9803c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 981fe8322adSStefano Zampini if (U) { 9829566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->U)); 983fe8322adSStefano Zampini *U = NULL; 984fe8322adSStefano Zampini } 985fe8322adSStefano Zampini if (Udot) { 9869566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->Udot)); 987fe8322adSStefano Zampini *Udot = NULL; 988fe8322adSStefano Zampini } 989fe8322adSStefano Zampini PetscFunctionReturn(0); 990fe8322adSStefano Zampini } 991