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 @*/ 26*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegister(const char sname[], PetscErrorCode (*function)(TSTrajectory, TS)) 27*d71ae5a4SJacob Faibussowitsch { 28bc952696SBarry Smith PetscFunctionBegin; 299566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&TSTrajectoryList, sname, function)); 30bc952696SBarry Smith PetscFunctionReturn(0); 31bc952696SBarry Smith } 32bc952696SBarry Smith 33fe8322adSStefano Zampini /*@ 34fe8322adSStefano Zampini TSTrajectorySet - Sets a vector of state in the trajectory object 35fe8322adSStefano Zampini 36fe8322adSStefano Zampini Collective on TSTrajectory 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 47fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 48fe8322adSStefano Zampini 49db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()` 50fe8322adSStefano Zampini @*/ 51*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X) 52*d71ae5a4SJacob Faibussowitsch { 53bc952696SBarry Smith PetscFunctionBegin; 54bc952696SBarry Smith if (!tj) PetscFunctionReturn(0); 55fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 56fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 57fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 58fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 4); 59fe8322adSStefano Zampini PetscValidHeaderSpecific(X, VEC_CLASSID, 5); 603c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 6148a46eb9SPierre 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)); 629566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Set, tj, ts, 0, 0)); 63dbbe0bcdSBarry Smith PetscUseTypeMethod(tj, set, ts, stepnum, time, X); 649566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Set, tj, ts, 0, 0)); 651baa6e33SBarry Smith if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh, stepnum, time)); 66fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL; 67bc952696SBarry Smith PetscFunctionReturn(0); 68bc952696SBarry Smith } 69bc952696SBarry Smith 70fe8322adSStefano Zampini /*@ 71fe8322adSStefano Zampini TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet(). 72fe8322adSStefano Zampini 73fe8322adSStefano Zampini Not collective. 74fe8322adSStefano Zampini 75fe8322adSStefano Zampini Input Parameters: 76fe8322adSStefano Zampini . tj - the trajectory object 77fe8322adSStefano Zampini 78fe8322adSStefano Zampini Output Parameter: 79fe8322adSStefano Zampini . steps - the number of steps 80fe8322adSStefano Zampini 81fe8322adSStefano Zampini Level: developer 82fe8322adSStefano Zampini 83db781477SPatrick Sanan .seealso: `TSTrajectorySet()` 84fe8322adSStefano Zampini @*/ 85*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) 86*d71ae5a4SJacob Faibussowitsch { 87fe8322adSStefano Zampini PetscFunctionBegin; 88fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 89fe8322adSStefano Zampini PetscValidIntPointer(steps, 2); 909566063dSJacob Faibussowitsch PetscCall(TSHistoryGetNumSteps(tj->tsh, steps)); 91fe8322adSStefano Zampini PetscFunctionReturn(0); 92fe8322adSStefano Zampini } 93fe8322adSStefano Zampini 94fe8322adSStefano Zampini /*@ 95fe8322adSStefano Zampini TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory 96fe8322adSStefano Zampini 97fe8322adSStefano Zampini Collective on TS 98fe8322adSStefano Zampini 99fe8322adSStefano Zampini Input Parameters: 100fe8322adSStefano Zampini + tj - the trajectory object 101fe8322adSStefano Zampini . ts - the time stepper object 102fe8322adSStefano Zampini - stepnum - the step number 103fe8322adSStefano Zampini 104fe8322adSStefano Zampini Output Parameter: 105fe8322adSStefano Zampini . time - the time associated with the step number 106fe8322adSStefano Zampini 107fe8322adSStefano Zampini Level: developer 108fe8322adSStefano Zampini 109fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 110fe8322adSStefano Zampini 111db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()` 112fe8322adSStefano Zampini @*/ 113*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time) 114*d71ae5a4SJacob Faibussowitsch { 115bc952696SBarry Smith PetscFunctionBegin; 1163c633725SBarry Smith PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory"); 117fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 118fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 119fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 120dadcf809SJacob Faibussowitsch PetscValidRealPointer(time, 4); 1213c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 1223c633725SBarry Smith PetscCheck(stepnum >= 0, PetscObjectComm((PetscObject)tj), PETSC_ERR_PLIB, "Requesting negative step number"); 123fe8322adSStefano Zampini if (tj->monitor) { 12463a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n", stepnum, (PetscInt)!tj->solution_only)); 1259566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 126fe8322adSStefano Zampini } 1279566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Get, tj, ts, 0, 0)); 128dbbe0bcdSBarry Smith PetscUseTypeMethod(tj, get, ts, stepnum, time); 1299566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Get, tj, ts, 0, 0)); 130bc952696SBarry Smith PetscFunctionReturn(0); 131bc952696SBarry Smith } 132bc952696SBarry Smith 133fe8322adSStefano Zampini /*@ 134fe8322adSStefano Zampini TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS 135fe8322adSStefano Zampini 136fe8322adSStefano Zampini Collective on TS 137fe8322adSStefano Zampini 138fe8322adSStefano Zampini Input Parameters: 139fe8322adSStefano Zampini + tj - the trajectory object 140fe8322adSStefano Zampini . ts - the time stepper object (optional) 141fe8322adSStefano Zampini - stepnum - the requested step number 142fe8322adSStefano Zampini 1436b867d5aSJose E. Roman Input/Output Parameter: 144fe8322adSStefano Zampini 145fe8322adSStefano Zampini Output Parameters: 146f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number 147f1a722f8SMatthew G. Knepley . U - state vector (can be NULL) 148fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL) 149fe8322adSStefano Zampini 150fe8322adSStefano Zampini Level: developer 151fe8322adSStefano Zampini 152fe8322adSStefano Zampini Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory. 153fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 154fe8322adSStefano Zampini 155db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()` 156fe8322adSStefano Zampini @*/ 157*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot) 158*d71ae5a4SJacob Faibussowitsch { 159fe8322adSStefano Zampini PetscFunctionBegin; 1603c633725SBarry Smith PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory"); 161fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 162fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 163fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3); 164dadcf809SJacob Faibussowitsch PetscValidRealPointer(time, 4); 165fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5); 166fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6); 167fe8322adSStefano Zampini if (!U && !Udot) PetscFunctionReturn(0); 1683c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first"); 1699566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0)); 170fe8322adSStefano Zampini if (tj->monitor) { 171fe8322adSStefano Zampini PetscInt pU, pUdot; 172fe8322adSStefano Zampini pU = U ? 1 : 0; 173fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 17463a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time)); 1759566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 176fe8322adSStefano Zampini } 177fe8322adSStefano Zampini if (U && tj->lag.caching) { 178fe8322adSStefano Zampini PetscObjectId id; 179fe8322adSStefano Zampini PetscObjectState state; 180fe8322adSStefano Zampini 1819566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &state)); 1829566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &id)); 183fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 184fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 185fe8322adSStefano Zampini } else { 186fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 187fe8322adSStefano Zampini } 188fe8322adSStefano Zampini if (tj->monitor && !U) { 1899566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 1909566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n")); 1919566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 1929566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 193fe8322adSStefano Zampini } 194fe8322adSStefano Zampini } 195fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 196fe8322adSStefano Zampini PetscObjectId id; 197fe8322adSStefano Zampini PetscObjectState state; 198fe8322adSStefano Zampini 1999566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)Udot, &state)); 2009566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)Udot, &id)); 201fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 202fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 203fe8322adSStefano Zampini } else { 204fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 205fe8322adSStefano Zampini } 206fe8322adSStefano Zampini if (tj->monitor && !Udot) { 2079566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 2089566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n")); 2099566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2109566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 211fe8322adSStefano Zampini } 212fe8322adSStefano Zampini } 213fe8322adSStefano Zampini if (!U && !Udot) { 2149566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0)); 215fe8322adSStefano Zampini PetscFunctionReturn(0); 216fe8322adSStefano Zampini } 217fe8322adSStefano Zampini 218fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 2191baa6e33SBarry Smith if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 220fe8322adSStefano Zampini /* cached states will be updated in the function */ 2219566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot)); 222fe8322adSStefano Zampini if (tj->monitor) { 2239566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2249566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 225fe8322adSStefano Zampini } 226fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 227fe8322adSStefano Zampini TS fakets = ts; 228fe8322adSStefano Zampini Vec U2; 229fe8322adSStefano Zampini 230fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 231fe8322adSStefano Zampini if (!ts) { 2329566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets)); 233fe8322adSStefano Zampini if (!fakets) { 2349566063dSJacob Faibussowitsch PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets)); 2359566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets)); 2369566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)fakets)); 2379566063dSJacob Faibussowitsch PetscCall(VecDuplicate(U, &U2)); 2389566063dSJacob Faibussowitsch PetscCall(TSSetSolution(fakets, U2)); 2399566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)U2)); 240fe8322adSStefano Zampini } 241fe8322adSStefano Zampini } 2429566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time)); 2439566063dSJacob Faibussowitsch PetscCall(TSGetSolution(fakets, &U2)); 2449566063dSJacob Faibussowitsch PetscCall(VecCopy(U2, U)); 2459566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state)); 2469566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id)); 247fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 248fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 249fe8322adSStefano Zampini } 2509566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0)); 251fe8322adSStefano Zampini PetscFunctionReturn(0); 252fe8322adSStefano Zampini } 253fe8322adSStefano Zampini 254bc952696SBarry Smith /*@C 255fe2efc57SMark TSTrajectoryViewFromOptions - View from Options 256fe2efc57SMark 257fe2efc57SMark Collective on TSTrajectory 258fe2efc57SMark 259fe2efc57SMark Input Parameters: 260fe2efc57SMark + A - the TSTrajectory context 261736c3998SJose E. Roman . obj - Optional object 262736c3998SJose E. Roman - name - command line option 263fe2efc57SMark 264fe2efc57SMark Level: intermediate 265db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()` 266fe2efc57SMark @*/ 267*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[]) 268*d71ae5a4SJacob Faibussowitsch { 269fe2efc57SMark PetscFunctionBegin; 270fe2efc57SMark PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1); 2719566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 272fe2efc57SMark PetscFunctionReturn(0); 273fe2efc57SMark } 274fe2efc57SMark 275fe2efc57SMark /*@C 276bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 277bc952696SBarry Smith 278bc952696SBarry Smith Collective on TSTrajectory 279bc952696SBarry Smith 280bc952696SBarry Smith Input Parameters: 281b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 282bc952696SBarry Smith - viewer - visualization context 283bc952696SBarry Smith 284bc952696SBarry Smith Options Database Key: 285e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 286bc952696SBarry Smith 287bc952696SBarry Smith Notes: 288bc952696SBarry Smith The available visualization contexts include 289bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 290bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 291bc952696SBarry Smith output where only the first processor opens 292bc952696SBarry Smith the file. All other processors send their 293bc952696SBarry Smith data to the first processor to print. 294bc952696SBarry Smith 295bc952696SBarry Smith The user can open an alternative visualization context with 296bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 297bc952696SBarry Smith 298df5474d8SHong Zhang Level: developer 299bc952696SBarry Smith 300db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()` 301bc952696SBarry Smith @*/ 302*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer) 303*d71ae5a4SJacob Faibussowitsch { 304bc952696SBarry Smith PetscBool iascii; 305bc952696SBarry Smith 306bc952696SBarry Smith PetscFunctionBegin; 3071a5a771fSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 30848a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer)); 309bc952696SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 310b1d74d50SHong Zhang PetscCheckSameComm(tj, 1, viewer, 2); 311bc952696SBarry Smith 3129566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 313bc952696SBarry Smith if (iascii) { 3149566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer)); 31563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps)); 31663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads)); 31763a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites)); 3189566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 319dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, view, viewer); 3209566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 321bc952696SBarry Smith } 322bc952696SBarry Smith PetscFunctionReturn(0); 323bc952696SBarry Smith } 324bc952696SBarry Smith 325bc952696SBarry Smith /*@C 32678fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 32778fbdcc8SBarry Smith 32878fbdcc8SBarry Smith Collective on TSTrajectory 32978fbdcc8SBarry Smith 33078fbdcc8SBarry Smith Input Parameters: 33178fbdcc8SBarry Smith + tr - the trajectory context 33278fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 33378fbdcc8SBarry Smith 33478fbdcc8SBarry Smith Level: intermediate 33578fbdcc8SBarry Smith 336db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 337db901c5bSHong Zhang 338db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSGetTrajectory()` 33978fbdcc8SBarry Smith @*/ 340*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names) 341*d71ae5a4SJacob Faibussowitsch { 34278fbdcc8SBarry Smith PetscFunctionBegin; 343fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1); 344fe8322adSStefano Zampini PetscValidPointer(names, 2); 3459566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&ctx->names)); 3469566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(names, &ctx->names)); 34778fbdcc8SBarry Smith PetscFunctionReturn(0); 34878fbdcc8SBarry Smith } 34978fbdcc8SBarry Smith 35078fbdcc8SBarry Smith /*@C 351fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 35208347785SBarry Smith 35308347785SBarry Smith Collective on TSLGCtx 35408347785SBarry Smith 35508347785SBarry Smith Input Parameters: 35608347785SBarry Smith + tj - the TSTrajectory context 35708347785SBarry Smith . transform - the transform function 35808347785SBarry Smith . destroy - function to destroy the optional context 35908347785SBarry Smith - ctx - optional context used by transform function 36008347785SBarry Smith 36108347785SBarry Smith Level: intermediate 36208347785SBarry Smith 363db781477SPatrick Sanan .seealso: `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()` 36408347785SBarry Smith @*/ 365*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx) 366*d71ae5a4SJacob Faibussowitsch { 36708347785SBarry Smith PetscFunctionBegin; 368fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 36908347785SBarry Smith tj->transform = transform; 37008347785SBarry Smith tj->transformdestroy = destroy; 37108347785SBarry Smith tj->transformctx = tctx; 37208347785SBarry Smith PetscFunctionReturn(0); 37308347785SBarry Smith } 37408347785SBarry Smith 375db901c5bSHong Zhang /*@ 376bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 377bc952696SBarry Smith 378d083f849SBarry Smith Collective 379bc952696SBarry Smith 380bc952696SBarry Smith Input Parameter: 3813c0fce88SHong Zhang . comm - the communicator 382bc952696SBarry Smith 383bc952696SBarry Smith Output Parameter: 3843c0fce88SHong Zhang . tj - the trajectory object 385bc952696SBarry Smith 386df5474d8SHong Zhang Level: developer 387bc952696SBarry Smith 38895452b02SPatrick Sanan Notes: 38995452b02SPatrick Sanan Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 390bc952696SBarry Smith 391db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()` 392bc952696SBarry Smith @*/ 393*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj) 394*d71ae5a4SJacob Faibussowitsch { 395bc952696SBarry Smith TSTrajectory t; 396bc952696SBarry Smith 397bc952696SBarry Smith PetscFunctionBegin; 398b1d74d50SHong Zhang PetscValidPointer(tj, 2); 399b1d74d50SHong Zhang *tj = NULL; 4009566063dSJacob Faibussowitsch PetscCall(TSInitializePackage()); 401bc952696SBarry Smith 4029566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView)); 40368bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 4049566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(comm, &t->tsh)); 405fe8322adSStefano Zampini 406fe8322adSStefano Zampini t->lag.order = 1; 407fe8322adSStefano Zampini t->lag.L = NULL; 408fe8322adSStefano Zampini t->lag.T = NULL; 409fe8322adSStefano Zampini t->lag.W = NULL; 410fe8322adSStefano Zampini t->lag.WW = NULL; 411fe8322adSStefano Zampini t->lag.TW = NULL; 412fe8322adSStefano Zampini t->lag.TT = NULL; 413fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 414fe8322adSStefano Zampini t->lag.Ucached.id = 0; 415fe8322adSStefano Zampini t->lag.Ucached.state = -1; 416fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 417fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 418fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 419fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 420fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 421fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 422fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 423fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 424fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 425ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 426b1d74d50SHong Zhang *tj = t; 42763a3b9bcSJacob Faibussowitsch PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin")); 428bc952696SBarry Smith PetscFunctionReturn(0); 429bc952696SBarry Smith } 430bc952696SBarry Smith 431bc952696SBarry Smith /*@C 432bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 433bc952696SBarry Smith 434bc952696SBarry Smith Collective on TS 435bc952696SBarry Smith 436bc952696SBarry Smith Input Parameters: 4373c0fce88SHong Zhang + tj - the TSTrajectory context 4383c0fce88SHong Zhang . ts - the TS context 4393c0fce88SHong Zhang - type - a known method 440bc952696SBarry Smith 441bc952696SBarry Smith Options Database Command: 442e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 443bc952696SBarry Smith 444df5474d8SHong Zhang Level: developer 445bc952696SBarry Smith 446db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()` 447bc952696SBarry Smith 448bc952696SBarry Smith @*/ 449*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type) 450*d71ae5a4SJacob Faibussowitsch { 451972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory, TS); 452bc952696SBarry Smith PetscBool match; 453bc952696SBarry Smith 454bc952696SBarry Smith PetscFunctionBegin; 455972caf09SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 4569566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match)); 457bc952696SBarry Smith if (match) PetscFunctionReturn(0); 458bc952696SBarry Smith 4599566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r)); 4603c633725SBarry Smith PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type); 461972caf09SHong Zhang if (tj->ops->destroy) { 4629566063dSJacob Faibussowitsch PetscCall((*(tj)->ops->destroy)(tj)); 463bc952696SBarry Smith 464972caf09SHong Zhang tj->ops->destroy = NULL; 465bc952696SBarry Smith } 4669566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops))); 467bc952696SBarry Smith 4689566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type)); 4699566063dSJacob Faibussowitsch PetscCall((*r)(tj, ts)); 470bc952696SBarry Smith PetscFunctionReturn(0); 471bc952696SBarry Smith } 472bc952696SBarry Smith 473881c1a9bSHong Zhang /*@C 474881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 475881c1a9bSHong Zhang 476881c1a9bSHong Zhang Collective on TS 477881c1a9bSHong Zhang 478881c1a9bSHong Zhang Input Parameters: 479881c1a9bSHong Zhang + tj - the TSTrajectory context 480881c1a9bSHong Zhang - ts - the TS context 481881c1a9bSHong Zhang 482881c1a9bSHong Zhang Output Parameters: 483881c1a9bSHong Zhang . type - a known method 484881c1a9bSHong Zhang 485881c1a9bSHong Zhang Level: developer 486881c1a9bSHong Zhang 487db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()` 488881c1a9bSHong Zhang 489881c1a9bSHong Zhang @*/ 490*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type) 491*d71ae5a4SJacob Faibussowitsch { 492881c1a9bSHong Zhang PetscFunctionBegin; 493881c1a9bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 494881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 495881c1a9bSHong Zhang PetscFunctionReturn(0); 496881c1a9bSHong Zhang } 497881c1a9bSHong Zhang 498972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS); 499972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS); 5009a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS); 5012b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS); 502bc952696SBarry Smith 503bc952696SBarry Smith /*@C 504bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 505bc952696SBarry Smith 506bc952696SBarry Smith Not Collective 507bc952696SBarry Smith 508df5474d8SHong Zhang Level: developer 509bc952696SBarry Smith 510db781477SPatrick Sanan .seealso: `TSTrajectoryRegister()` 511bc952696SBarry Smith @*/ 512*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void) 513*d71ae5a4SJacob Faibussowitsch { 514bc952696SBarry Smith PetscFunctionBegin; 515560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 516bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 517bc952696SBarry Smith 5189566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic)); 5199566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile)); 5209566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory)); 5219566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization)); 522bc952696SBarry Smith PetscFunctionReturn(0); 523bc952696SBarry Smith } 524bc952696SBarry Smith 525bc952696SBarry Smith /*@ 5261550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5271550c9b9SHong Zhang 5281550c9b9SHong Zhang Collective on TSTrajectory 5291550c9b9SHong Zhang 5301550c9b9SHong Zhang Input Parameter: 5311550c9b9SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5321550c9b9SHong Zhang 5331550c9b9SHong Zhang Level: developer 5341550c9b9SHong Zhang 535db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 5361550c9b9SHong Zhang @*/ 537*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 538*d71ae5a4SJacob Faibussowitsch { 5391550c9b9SHong Zhang PetscFunctionBegin; 5409a992471SHong Zhang if (!tj) PetscFunctionReturn(0); 5419a992471SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 542dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, reset); 5439566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 5449566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&tj->tsh)); 5459566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh)); 546fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5471550c9b9SHong Zhang PetscFunctionReturn(0); 5481550c9b9SHong Zhang } 5491550c9b9SHong Zhang 5501550c9b9SHong Zhang /*@ 551bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 552bc952696SBarry Smith 553bc952696SBarry Smith Collective on TSTrajectory 554bc952696SBarry Smith 555bc952696SBarry Smith Input Parameter: 5563c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 557bc952696SBarry Smith 558df5474d8SHong Zhang Level: developer 559bc952696SBarry Smith 560db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 561bc952696SBarry Smith @*/ 562*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 563*d71ae5a4SJacob Faibussowitsch { 564bc952696SBarry Smith PetscFunctionBegin; 565972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 566972caf09SHong Zhang PetscValidHeaderSpecific((*tj), TSTRAJECTORY_CLASSID, 1); 5679371c9d4SSatish Balay if (--((PetscObject)(*tj))->refct > 0) { 5689371c9d4SSatish Balay *tj = NULL; 5699371c9d4SSatish Balay PetscFunctionReturn(0); 5709371c9d4SSatish Balay } 571bc952696SBarry Smith 5729566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReset(*tj)); 5739566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&(*tj)->tsh)); 5749566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W)); 5759566063dSJacob Faibussowitsch PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW)); 5769566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->U)); 5779566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->Udot)); 5789a992471SHong Zhang 5799566063dSJacob Faibussowitsch if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx)); 580dbbe0bcdSBarry Smith PetscTryTypeMethod((*tj), destroy); 581fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 582fe8322adSStefano Zampini PetscMPIInt rank; 583fe8322adSStefano Zampini MPI_Comm comm; 584fe8322adSStefano Zampini 5859566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)(*tj), &comm)); 5869566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 587dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 5889566063dSJacob Faibussowitsch PetscCall(PetscRMTree((*tj)->dirname)); 589fe8322adSStefano Zampini } 590fe8322adSStefano Zampini } 5919566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*tj)->names)); 5929566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->dirname)); 5939566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->filetemplate)); 5949566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tj)); 595bc952696SBarry Smith PetscFunctionReturn(0); 596bc952696SBarry Smith } 597bc952696SBarry Smith 598bc952696SBarry Smith /* 599772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 600bc952696SBarry Smith 601bc952696SBarry Smith Collective on TSTrajectory 602bc952696SBarry Smith 603bc952696SBarry Smith Input Parameter: 6043c0fce88SHong Zhang + tj - the TSTrajectory context 6053c0fce88SHong Zhang - ts - the TS context 6063c0fce88SHong Zhang 6073c0fce88SHong Zhang Options Database Keys: 6083c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 609bc952696SBarry Smith 610df5474d8SHong Zhang Level: developer 611bc952696SBarry Smith 612db781477SPatrick Sanan .seealso: `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()` 613bc952696SBarry Smith */ 614*d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts) 615*d71ae5a4SJacob Faibussowitsch { 616bc952696SBarry Smith PetscBool opt; 617bc952696SBarry Smith const char *defaultType; 618bc952696SBarry Smith char typeName[256]; 619bc952696SBarry Smith 620bc952696SBarry Smith PetscFunctionBegin; 621b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 622bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 623bc952696SBarry Smith 6249566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegisterAll()); 6259566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt)); 626bc952696SBarry Smith if (opt) { 6279566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, typeName)); 628bc952696SBarry Smith } else { 6299566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, defaultType)); 630bc952696SBarry Smith } 631bc952696SBarry Smith PetscFunctionReturn(0); 632bc952696SBarry Smith } 633bc952696SBarry Smith 634ed695a29SHong Zhang /*@ 6359ffb3502SHong Zhang TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory 6369ffb3502SHong Zhang 6379ffb3502SHong Zhang Collective on TSTrajectory 6389ffb3502SHong Zhang 6394165533cSJose E. Roman Input Parameters: 6409ffb3502SHong Zhang + tj - the TSTrajectory context 6419ffb3502SHong Zhang - flg - PETSC_TRUE to save, PETSC_FALSE to disable 6429ffb3502SHong Zhang 6439ffb3502SHong Zhang Options Database Keys: 6449ffb3502SHong Zhang . -ts_trajectory_use_history - have it use TSHistory 6459ffb3502SHong Zhang 6469ffb3502SHong Zhang Level: advanced 6479ffb3502SHong Zhang 648db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 6499ffb3502SHong Zhang @*/ 650*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg) 651*d71ae5a4SJacob Faibussowitsch { 6529ffb3502SHong Zhang PetscFunctionBegin; 6539ffb3502SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 6549ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 6559ffb3502SHong Zhang tj->usehistory = flg; 6569ffb3502SHong Zhang PetscFunctionReturn(0); 6579ffb3502SHong Zhang } 6589ffb3502SHong Zhang 6599ffb3502SHong Zhang /*@ 660ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 661ed695a29SHong Zhang 662ed695a29SHong Zhang Collective on TSTrajectory 663ed695a29SHong Zhang 6644165533cSJose E. Roman Input Parameters: 665ed695a29SHong Zhang + tj - the TSTrajectory context 666ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 667ed695a29SHong Zhang 6683c0fce88SHong Zhang Options Database Keys: 669063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 6703c0fce88SHong Zhang 671df5474d8SHong Zhang Level: developer 672ed695a29SHong Zhang 673db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 674ed695a29SHong Zhang @*/ 675*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg) 676*d71ae5a4SJacob Faibussowitsch { 677ed695a29SHong Zhang PetscFunctionBegin; 678ed695a29SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 679ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2); 680fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 681fe8322adSStefano Zampini else tj->monitor = NULL; 682ed695a29SHong Zhang PetscFunctionReturn(0); 683ed695a29SHong Zhang } 684ed695a29SHong Zhang 685bc952696SBarry Smith /*@ 68664fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 68764fc91eeSBarry Smith 68864fc91eeSBarry Smith Collective on TSTrajectory 68964fc91eeSBarry Smith 6904165533cSJose E. Roman Input Parameters: 69164fc91eeSBarry Smith + tj - the TSTrajectory context 69264fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 69364fc91eeSBarry Smith 69464fc91eeSBarry Smith Options Database Keys: 69564fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 69664fc91eeSBarry Smith 69795452b02SPatrick Sanan Notes: 69895452b02SPatrick 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. 69964fc91eeSBarry Smith 70064fc91eeSBarry Smith Level: advanced 70164fc91eeSBarry Smith 702db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()` 70364fc91eeSBarry Smith @*/ 704*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg) 705*d71ae5a4SJacob Faibussowitsch { 70664fc91eeSBarry Smith PetscFunctionBegin; 70764fc91eeSBarry Smith PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 70864fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj, flg, 2); 70964fc91eeSBarry Smith tj->keepfiles = flg; 71064fc91eeSBarry Smith PetscFunctionReturn(0); 71164fc91eeSBarry Smith } 71264fc91eeSBarry Smith 713db901c5bSHong Zhang /*@C 71464e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 71564e38db7SHong Zhang 71664e38db7SHong Zhang Collective on TSTrajectory 71764e38db7SHong Zhang 7184165533cSJose E. Roman Input Parameters: 71964e38db7SHong Zhang + tj - the TSTrajectory context 72064e38db7SHong Zhang - dirname - the directory name 72164e38db7SHong Zhang 72264e38db7SHong Zhang Options Database Keys: 72364e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 72464e38db7SHong Zhang 72595452b02SPatrick Sanan Notes: 72695452b02SPatrick Sanan The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 7271585b412SBarry Smith 72864e38db7SHong Zhang Level: developer 72964e38db7SHong Zhang 730c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()` 73164e38db7SHong Zhang @*/ 732*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[]) 733*d71ae5a4SJacob Faibussowitsch { 734a17281aeSStefano Zampini PetscBool flg; 735a17281aeSStefano Zampini 73664e38db7SHong Zhang PetscFunctionBegin; 73764e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 7389566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(tj->dirname, dirname, &flg)); 739049d1499SBarry Smith PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup"); 7409566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirname)); 7419566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(dirname, &tj->dirname)); 74264e38db7SHong Zhang PetscFunctionReturn(0); 74364e38db7SHong Zhang } 74464e38db7SHong Zhang 745db901c5bSHong Zhang /*@C 74664e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 74764e38db7SHong Zhang 74864e38db7SHong Zhang Collective on TSTrajectory 74964e38db7SHong Zhang 7504165533cSJose E. Roman Input Parameters: 75164e38db7SHong Zhang + tj - the TSTrajectory context 7521585b412SBarry Smith - filetemplate - the template 75364e38db7SHong Zhang 75464e38db7SHong Zhang Options Database Keys: 7551585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7561585b412SBarry Smith 75795452b02SPatrick Sanan Notes: 75863a3b9bcSJacob Faibussowitsch The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading / 7591585b412SBarry Smith 76063a3b9bcSJacob 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 7611585b412SBarry Smith timestep counter 76264e38db7SHong Zhang 76364e38db7SHong Zhang Level: developer 76464e38db7SHong Zhang 765c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetDirname()`, `TSTrajectorySetUp()` 76664e38db7SHong Zhang @*/ 767*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[]) 768*d71ae5a4SJacob Faibussowitsch { 7699afe7f3eSBarry Smith const char *ptr, *ptr2; 7709afe7f3eSBarry Smith 77164e38db7SHong Zhang PetscFunctionBegin; 77264e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 77363a3b9bcSJacob Faibussowitsch PetscValidCharPointer(filetemplate, 2); 7743c633725SBarry Smith PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup"); 7759afe7f3eSBarry Smith 77663a3b9bcSJacob 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"); 7779afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7789566063dSJacob Faibussowitsch PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr)); 77963a3b9bcSJacob 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"); 7809afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 78163a3b9bcSJacob Faibussowitsch PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2)); 78263a3b9bcSJacob 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"); 7839afe7f3eSBarry Smith if (ptr2) break; 7849afe7f3eSBarry Smith } 7859566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->filetemplate)); 7869566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate)); 78764e38db7SHong Zhang PetscFunctionReturn(0); 78864e38db7SHong Zhang } 78964e38db7SHong Zhang 79064e38db7SHong Zhang /*@ 791bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 792bc952696SBarry Smith 793bc952696SBarry Smith Collective on TSTrajectory 794bc952696SBarry Smith 795d8d19677SJose E. Roman Input Parameters: 7963c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 7973c0fce88SHong Zhang - ts - the TS context 798bc952696SBarry Smith 799bc952696SBarry Smith Options Database Keys: 8003c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 80164fc91eeSBarry 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 802063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 803bc952696SBarry Smith 804df5474d8SHong Zhang Level: developer 805bc952696SBarry Smith 80695452b02SPatrick Sanan Notes: 80795452b02SPatrick Sanan This is not normally called directly by users 808bc952696SBarry Smith 809db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectorySetUp()` 810bc952696SBarry Smith @*/ 811*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts) 812*d71ae5a4SJacob Faibussowitsch { 813ed695a29SHong Zhang PetscBool set, flg; 81464e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN]; 815bc952696SBarry Smith 816bc952696SBarry Smith PetscFunctionBegin; 817b1d74d50SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 818fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 819d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tj); 8209566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts)); 8219566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL)); 8229566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set)); 8239566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetMonitor(tj, flg)); 8249566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL)); 8259566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL)); 8269566063dSJacob 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)); 8279566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL)); 8289566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set)); 8299566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg)); 83064e38db7SHong Zhang 8319566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set)); 8321baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetDirname(tj, dirname)); 83364e38db7SHong Zhang 83463a3b9bcSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set)); 8351baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate)); 83664e38db7SHong Zhang 83764e38db7SHong Zhang /* Handle specific TSTrajectory options */ 838dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject); 839d0609cedSBarry Smith PetscOptionsEnd(); 840bc952696SBarry Smith PetscFunctionReturn(0); 841bc952696SBarry Smith } 84268bece0bSHong Zhang 84368bece0bSHong Zhang /*@ 84468bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 84568bece0bSHong Zhang of a TS trajectory. 84668bece0bSHong Zhang 84768bece0bSHong Zhang Collective on TS 84868bece0bSHong Zhang 849d8d19677SJose E. Roman Input Parameters: 8503c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 8513c0fce88SHong Zhang - tj - the TS trajectory context 85268bece0bSHong Zhang 853df5474d8SHong Zhang Level: developer 85468bece0bSHong Zhang 855db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()` 85668bece0bSHong Zhang @*/ 857*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts) 858*d71ae5a4SJacob Faibussowitsch { 8599afe7f3eSBarry Smith size_t s1, s2; 86068bece0bSHong Zhang 86168bece0bSHong Zhang PetscFunctionBegin; 86268bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 86368bece0bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 864fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 86568bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 86668bece0bSHong Zhang 8679566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0)); 86848a46eb9SPierre Jolivet if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC)); 869dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setup, ts); 87068bece0bSHong Zhang 87168bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 87253b27ddbSHong Zhang 87353b27ddbSHong Zhang /* Set the counters to zero */ 8741a5a771fSHong Zhang tj->recomps = 0; 87553b27ddbSHong Zhang tj->diskreads = 0; 87653b27ddbSHong Zhang tj->diskwrites = 0; 8779566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->dirname, &s1)); 8789566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->filetemplate, &s2)); 8799566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 8809566063dSJacob Faibussowitsch PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate)); 8819566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate)); 8829566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0)); 88368bece0bSHong Zhang PetscFunctionReturn(0); 88468bece0bSHong Zhang } 885fe8322adSStefano Zampini 886fe8322adSStefano Zampini /*@ 887fe8322adSStefano Zampini TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also. 888fe8322adSStefano Zampini 889fe8322adSStefano Zampini Collective on TSTrajectory 890fe8322adSStefano Zampini 891d8d19677SJose E. Roman Input Parameters: 892fe8322adSStefano Zampini + tj - the TS trajectory context 893fe8322adSStefano Zampini - flg - the boolean flag 894fe8322adSStefano Zampini 895fe8322adSStefano Zampini Level: developer 896fe8322adSStefano Zampini 897db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()` 898fe8322adSStefano Zampini @*/ 899*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only) 900*d71ae5a4SJacob Faibussowitsch { 901fe8322adSStefano Zampini PetscFunctionBegin; 902fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 903fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj, solution_only, 2); 904fe8322adSStefano Zampini tj->solution_only = solution_only; 905fe8322adSStefano Zampini PetscFunctionReturn(0); 906fe8322adSStefano Zampini } 907fe8322adSStefano Zampini 908fe8322adSStefano Zampini /*@ 909fe8322adSStefano Zampini TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly. 910fe8322adSStefano Zampini 911fe8322adSStefano Zampini Logically collective on TSTrajectory 912fe8322adSStefano Zampini 913fe8322adSStefano Zampini Input Parameter: 914fe8322adSStefano Zampini . tj - the TS trajectory context 915fe8322adSStefano Zampini 916fe8322adSStefano Zampini Output Parameter: 917d8d19677SJose E. Roman . flg - the boolean flag 918fe8322adSStefano Zampini 919fe8322adSStefano Zampini Level: developer 920fe8322adSStefano Zampini 921db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()` 922fe8322adSStefano Zampini @*/ 923*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only) 924*d71ae5a4SJacob Faibussowitsch { 925fe8322adSStefano Zampini PetscFunctionBegin; 926fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 927dadcf809SJacob Faibussowitsch PetscValidBoolPointer(solution_only, 2); 928fe8322adSStefano Zampini *solution_only = tj->solution_only; 929fe8322adSStefano Zampini PetscFunctionReturn(0); 930fe8322adSStefano Zampini } 931fe8322adSStefano Zampini 932fe8322adSStefano Zampini /*@ 933fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 934fe8322adSStefano Zampini 935fe8322adSStefano Zampini Collective on TSTrajectory 936fe8322adSStefano Zampini 937d8d19677SJose E. Roman Input Parameters: 938fe8322adSStefano Zampini + tj - the TS trajectory context 939fe8322adSStefano Zampini . ts - the TS solver context 940fe8322adSStefano Zampini - time - the requested time 941fe8322adSStefano Zampini 942d8d19677SJose E. Roman Output Parameters: 943fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 944fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 945fe8322adSStefano Zampini 946fe8322adSStefano Zampini Level: developer 947fe8322adSStefano Zampini 948fe8322adSStefano 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. 949fe8322adSStefano Zampini This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by 950fe8322adSStefano Zampini calling TSTrajectoryRestoreUpdatedHistoryVecs(). 951fe8322adSStefano Zampini 952db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()` 953fe8322adSStefano Zampini @*/ 954*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 955*d71ae5a4SJacob Faibussowitsch { 956fe8322adSStefano Zampini PetscFunctionBegin; 957fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 958fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2); 959fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 3); 960fe8322adSStefano Zampini if (U) PetscValidPointer(U, 4); 961fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot, 5); 962fe8322adSStefano Zampini if (U && !tj->U) { 963fe8322adSStefano Zampini DM dm; 964fe8322adSStefano Zampini 9659566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9669566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->U)); 967fe8322adSStefano Zampini } 968fe8322adSStefano Zampini if (Udot && !tj->Udot) { 969fe8322adSStefano Zampini DM dm; 970fe8322adSStefano Zampini 9719566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 9729566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->Udot)); 973fe8322adSStefano Zampini } 9749566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL)); 975fe8322adSStefano Zampini if (U) { 9769566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->U)); 977fe8322adSStefano Zampini *U = tj->U; 978fe8322adSStefano Zampini } 979fe8322adSStefano Zampini if (Udot) { 9809566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->Udot)); 981fe8322adSStefano Zampini *Udot = tj->Udot; 982fe8322adSStefano Zampini } 983fe8322adSStefano Zampini PetscFunctionReturn(0); 984fe8322adSStefano Zampini } 985fe8322adSStefano Zampini 986fe8322adSStefano Zampini /*@ 987fe8322adSStefano Zampini TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs(). 988fe8322adSStefano Zampini 989fe8322adSStefano Zampini Collective on TSTrajectory 990fe8322adSStefano Zampini 991d8d19677SJose E. Roman Input Parameters: 992fe8322adSStefano Zampini + tj - the TS trajectory context 993fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 994fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 995fe8322adSStefano Zampini 996fe8322adSStefano Zampini Level: developer 997fe8322adSStefano Zampini 998db781477SPatrick Sanan .seealso: `TSTrajectoryGetUpdatedHistoryVecs()` 999fe8322adSStefano Zampini @*/ 1000*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1001*d71ae5a4SJacob Faibussowitsch { 1002fe8322adSStefano Zampini PetscFunctionBegin; 1003fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1); 1004fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2); 1005fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3); 10063c633725SBarry Smith PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 10073c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1008fe8322adSStefano Zampini if (U) { 10099566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->U)); 1010fe8322adSStefano Zampini *U = NULL; 1011fe8322adSStefano Zampini } 1012fe8322adSStefano Zampini if (Udot) { 10139566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->Udot)); 1014fe8322adSStefano Zampini *Udot = NULL; 1015fe8322adSStefano Zampini } 1016fe8322adSStefano Zampini PetscFunctionReturn(0); 1017fe8322adSStefano Zampini } 1018