1af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/
2fe8322adSStefano Zampini #include <petsc/private/tshistoryimpl.h>
3fe8322adSStefano Zampini #include <petscdm.h>
4bc952696SBarry Smith
5bc952696SBarry Smith PetscFunctionList TSTrajectoryList = NULL;
6bc952696SBarry Smith PetscBool TSTrajectoryRegisterAllCalled = PETSC_FALSE;
7bc952696SBarry Smith PetscClassId TSTRAJECTORY_CLASSID;
82bf6d308SHong Zhang PetscLogEvent TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs, TSTrajectory_SetUp;
9bc952696SBarry Smith
10bc952696SBarry Smith /*@C
11bcf0153eSBarry Smith TSTrajectoryRegister - Adds a way of storing trajectories to the `TS` package
12bc952696SBarry Smith
13cc4c1da9SBarry Smith Not Collective, No Fortran Support
14bc952696SBarry Smith
15bc952696SBarry Smith Input Parameters:
162fe279fdSBarry Smith + sname - the name of a new user-defined creation routine
172fe279fdSBarry Smith - function - the creation routine itself
18bc952696SBarry Smith
19df5474d8SHong Zhang Level: developer
20bc952696SBarry Smith
21bcf0153eSBarry Smith Note:
22bcf0153eSBarry Smith `TSTrajectoryRegister()` may be called multiple times to add several user-defined tses.
23bcf0153eSBarry Smith
241cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryRegisterAll()`
25bc952696SBarry Smith @*/
TSTrajectoryRegister(const char sname[],PetscErrorCode (* function)(TSTrajectory,TS))26d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegister(const char sname[], PetscErrorCode (*function)(TSTrajectory, TS))
27d71ae5a4SJacob Faibussowitsch {
28bc952696SBarry Smith PetscFunctionBegin;
299566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&TSTrajectoryList, sname, function));
303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
31bc952696SBarry Smith }
32bc952696SBarry Smith
33fe8322adSStefano Zampini /*@
34fe8322adSStefano Zampini TSTrajectorySet - Sets a vector of state in the trajectory object
35fe8322adSStefano Zampini
36c3339decSBarry Smith Collective
37fe8322adSStefano Zampini
38fe8322adSStefano Zampini Input Parameters:
39fe8322adSStefano Zampini + tj - the trajectory object
40fe8322adSStefano Zampini . ts - the time stepper object (optional)
41fe8322adSStefano Zampini . stepnum - the step number
42fe8322adSStefano Zampini . time - the current time
43fe8322adSStefano Zampini - X - the current solution
44fe8322adSStefano Zampini
45fe8322adSStefano Zampini Level: developer
46fe8322adSStefano Zampini
47bcf0153eSBarry Smith Note:
48bcf0153eSBarry Smith Usually one does not call this routine, it is called automatically during `TSSolve()`
49fe8322adSStefano Zampini
501cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()`
51fe8322adSStefano Zampini @*/
TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)52d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X)
53d71ae5a4SJacob Faibussowitsch {
54bc952696SBarry Smith PetscFunctionBegin;
553ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
56fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
57fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
58fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3);
59fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 4);
60fe8322adSStefano Zampini PetscValidHeaderSpecific(X, VEC_CLASSID, 5);
613c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
6248a46eb9SPierre Jolivet if (tj->monitor) PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectorySet: stepnum %" PetscInt_FMT ", time %g (stages %" PetscInt_FMT ")\n", stepnum, (double)time, (PetscInt)!tj->solution_only));
639566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Set, tj, ts, 0, 0));
64dbbe0bcdSBarry Smith PetscUseTypeMethod(tj, set, ts, stepnum, time, X);
659566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Set, tj, ts, 0, 0));
661baa6e33SBarry Smith if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh, stepnum, time));
67fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
69bc952696SBarry Smith }
70bc952696SBarry Smith
71fe8322adSStefano Zampini /*@
72bcf0153eSBarry Smith TSTrajectoryGetNumSteps - Return the number of steps registered in the `TSTrajectory` via `TSTrajectorySet()`.
73fe8322adSStefano Zampini
7420f4b53cSBarry Smith Not Collective.
75fe8322adSStefano Zampini
762fe279fdSBarry Smith Input Parameter:
77fe8322adSStefano Zampini . tj - the trajectory object
78fe8322adSStefano Zampini
79fe8322adSStefano Zampini Output Parameter:
80fe8322adSStefano Zampini . steps - the number of steps
81fe8322adSStefano Zampini
82fe8322adSStefano Zampini Level: developer
83fe8322adSStefano Zampini
841cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectorySet()`
85fe8322adSStefano Zampini @*/
TSTrajectoryGetNumSteps(TSTrajectory tj,PetscInt * steps)86d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
87d71ae5a4SJacob Faibussowitsch {
88fe8322adSStefano Zampini PetscFunctionBegin;
89fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
904f572ea9SToby Isaac PetscAssertPointer(steps, 2);
919566063dSJacob Faibussowitsch PetscCall(TSHistoryGetNumSteps(tj->tsh, steps));
923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
93fe8322adSStefano Zampini }
94fe8322adSStefano Zampini
95fe8322adSStefano Zampini /*@
96bcf0153eSBarry Smith TSTrajectoryGet - Updates the solution vector of a time stepper object by querying the `TSTrajectory`
97fe8322adSStefano Zampini
98c3339decSBarry Smith Collective
99fe8322adSStefano Zampini
100fe8322adSStefano Zampini Input Parameters:
101fe8322adSStefano Zampini + tj - the trajectory object
102fe8322adSStefano Zampini . ts - the time stepper object
103fe8322adSStefano Zampini - stepnum - the step number
104fe8322adSStefano Zampini
105fe8322adSStefano Zampini Output Parameter:
106fe8322adSStefano Zampini . time - the time associated with the step number
107fe8322adSStefano Zampini
108fe8322adSStefano Zampini Level: developer
109fe8322adSStefano Zampini
110bcf0153eSBarry Smith Note:
111bcf0153eSBarry Smith Usually one does not call this routine, it is called automatically during `TSSolve()`
112fe8322adSStefano Zampini
1131cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSSolve()`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()`
114fe8322adSStefano Zampini @*/
TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal * time)115d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time)
116d71ae5a4SJacob Faibussowitsch {
117bc952696SBarry Smith PetscFunctionBegin;
1183c633725SBarry Smith PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
119fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
120fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
121fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3);
1224f572ea9SToby Isaac PetscAssertPointer(time, 4);
1233c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1243c633725SBarry Smith PetscCheck(stepnum >= 0, PetscObjectComm((PetscObject)tj), PETSC_ERR_PLIB, "Requesting negative step number");
125fe8322adSStefano Zampini if (tj->monitor) {
12663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n", stepnum, (PetscInt)!tj->solution_only));
1279566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor));
128fe8322adSStefano Zampini }
1299566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Get, tj, ts, 0, 0));
130dbbe0bcdSBarry Smith PetscUseTypeMethod(tj, get, ts, stepnum, time);
1319566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Get, tj, ts, 0, 0));
1323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
133bc952696SBarry Smith }
134bc952696SBarry Smith
135fe8322adSStefano Zampini /*@
136bcf0153eSBarry Smith TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the `TSTrajectory` and, possibly, from the `TS`
137fe8322adSStefano Zampini
138c3339decSBarry Smith Collective
139fe8322adSStefano Zampini
140fe8322adSStefano Zampini Input Parameters:
141fe8322adSStefano Zampini + tj - the trajectory object
142fe8322adSStefano Zampini . ts - the time stepper object (optional)
143fe8322adSStefano Zampini - stepnum - the requested step number
144fe8322adSStefano Zampini
145fe8322adSStefano Zampini Output Parameters:
146bcf0153eSBarry Smith + time - On input time for the step if step number is `PETSC_DECIDE`, on output the time associated with the step number
1472fe279fdSBarry Smith . U - state vector (can be `NULL`)
1482fe279fdSBarry Smith - Udot - time derivative of state vector (can be `NULL`)
149fe8322adSStefano Zampini
150fe8322adSStefano Zampini Level: developer
151fe8322adSStefano Zampini
152bcf0153eSBarry Smith Notes:
153bcf0153eSBarry Smith If the step number is `PETSC_DECIDE`, the time argument is used to inquire the trajectory.
154fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
155fe8322adSStefano Zampini
1561cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()`
157fe8322adSStefano Zampini @*/
TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal * time,Vec U,Vec Udot)158d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot)
159d71ae5a4SJacob Faibussowitsch {
160fe8322adSStefano Zampini PetscFunctionBegin;
1613c633725SBarry Smith PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
162fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
163fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
164fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj, stepnum, 3);
1654f572ea9SToby Isaac PetscAssertPointer(time, 4);
166fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5);
167fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6);
1683ba16761SJacob Faibussowitsch if (!U && !Udot) PetscFunctionReturn(PETSC_SUCCESS);
1693c633725SBarry Smith PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1709566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0));
171fe8322adSStefano Zampini if (tj->monitor) {
172fe8322adSStefano Zampini PetscInt pU, pUdot;
173fe8322adSStefano Zampini pU = U ? 1 : 0;
174fe8322adSStefano Zampini pUdot = Udot ? 1 : 0;
17563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time));
1769566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor));
177fe8322adSStefano Zampini }
178fe8322adSStefano Zampini if (U && tj->lag.caching) {
179fe8322adSStefano Zampini PetscObjectId id;
180fe8322adSStefano Zampini PetscObjectState state;
181fe8322adSStefano Zampini
1829566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &state));
1839566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &id));
184fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) {
185fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
186fe8322adSStefano Zampini } else {
187fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
188fe8322adSStefano Zampini }
189fe8322adSStefano Zampini if (tj->monitor && !U) {
1909566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor));
1919566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n"));
1929566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor));
1939566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor));
194fe8322adSStefano Zampini }
195fe8322adSStefano Zampini }
196fe8322adSStefano Zampini if (Udot && tj->lag.caching) {
197fe8322adSStefano Zampini PetscObjectId id;
198fe8322adSStefano Zampini PetscObjectState state;
199fe8322adSStefano Zampini
2009566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)Udot, &state));
2019566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)Udot, &id));
202fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) {
203fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
204fe8322adSStefano Zampini } else {
205fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
206fe8322adSStefano Zampini }
207fe8322adSStefano Zampini if (tj->monitor && !Udot) {
2089566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor));
2099566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n"));
2109566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2119566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor));
212fe8322adSStefano Zampini }
213fe8322adSStefano Zampini }
214fe8322adSStefano Zampini if (!U && !Udot) {
2159566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
2163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
217fe8322adSStefano Zampini }
218fe8322adSStefano Zampini
219fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
2201baa6e33SBarry Smith if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor));
221fe8322adSStefano Zampini /* cached states will be updated in the function */
2229566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot));
223fe8322adSStefano Zampini if (tj->monitor) {
2249566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2259566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor));
226fe8322adSStefano Zampini }
227fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
228fe8322adSStefano Zampini TS fakets = ts;
229fe8322adSStefano Zampini Vec U2;
230fe8322adSStefano Zampini
231fe8322adSStefano Zampini /* use a fake TS if ts is missing */
232fe8322adSStefano Zampini if (!ts) {
2339566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets));
234fe8322adSStefano Zampini if (!fakets) {
2359566063dSJacob Faibussowitsch PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets));
2369566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets));
2379566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)fakets));
2389566063dSJacob Faibussowitsch PetscCall(VecDuplicate(U, &U2));
2399566063dSJacob Faibussowitsch PetscCall(TSSetSolution(fakets, U2));
2409566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)U2));
241fe8322adSStefano Zampini }
242fe8322adSStefano Zampini }
2439566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time));
2449566063dSJacob Faibussowitsch PetscCall(TSGetSolution(fakets, &U2));
2459566063dSJacob Faibussowitsch PetscCall(VecCopy(U2, U));
2469566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state));
2479566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id));
248fe8322adSStefano Zampini tj->lag.Ucached.time = *time;
249fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum;
250fe8322adSStefano Zampini }
2519566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
2523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
253fe8322adSStefano Zampini }
254fe8322adSStefano Zampini
255ffeef943SBarry Smith /*@
256bcf0153eSBarry Smith TSTrajectoryViewFromOptions - View a `TSTrajectory` based on values in the options database
257fe2efc57SMark
258c3339decSBarry Smith Collective
259fe2efc57SMark
260fe2efc57SMark Input Parameters:
261bcf0153eSBarry Smith + A - the `TSTrajectory` context
262bcf0153eSBarry Smith . obj - Optional object that provides prefix used for option name
263736c3998SJose E. Roman - name - command line option
264fe2efc57SMark
265fe2efc57SMark Level: intermediate
266bcf0153eSBarry Smith
2671cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()`
268fe2efc57SMark @*/
TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[])269d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[])
270d71ae5a4SJacob Faibussowitsch {
271fe2efc57SMark PetscFunctionBegin;
272fe2efc57SMark PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1);
2739566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
2743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
275fe2efc57SMark }
276fe2efc57SMark
277ffeef943SBarry Smith /*@
278bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object
279bc952696SBarry Smith
280c3339decSBarry Smith Collective
281bc952696SBarry Smith
282bc952696SBarry Smith Input Parameters:
283bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()`
284bc952696SBarry Smith - viewer - visualization context
285bc952696SBarry Smith
286bc952696SBarry Smith Options Database Key:
287bcf0153eSBarry Smith . -ts_trajectory_view - calls `TSTrajectoryView()` at end of `TSAdjointStep()`
288bcf0153eSBarry Smith
289bcf0153eSBarry Smith Level: developer
290bc952696SBarry Smith
291bc952696SBarry Smith Notes:
292bc952696SBarry Smith The available visualization contexts include
293bcf0153eSBarry Smith + `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
294bcf0153eSBarry Smith - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard
295bc952696SBarry Smith output where only the first processor opens
296bc952696SBarry Smith the file. All other processors send their
297bc952696SBarry Smith data to the first processor to print.
298bc952696SBarry Smith
299bc952696SBarry Smith The user can open an alternative visualization context with
300bcf0153eSBarry Smith `PetscViewerASCIIOpen()` - output to a specified file.
301bc952696SBarry Smith
3021cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `PetscViewer`, `PetscViewerASCIIOpen()`
303bc952696SBarry Smith @*/
TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)304d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer)
305d71ae5a4SJacob Faibussowitsch {
3069f196a02SMartin Diehl PetscBool isascii;
307bc952696SBarry Smith
308bc952696SBarry Smith PetscFunctionBegin;
3091a5a771fSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
31048a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer));
311bc952696SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
312b1d74d50SHong Zhang PetscCheckSameComm(tj, 1, viewer, 2);
313bc952696SBarry Smith
3149f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
3159f196a02SMartin Diehl if (isascii) {
3169566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer));
31763a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps));
31863a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads));
31963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites));
3209566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
321dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, view, viewer);
3229566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
323bc952696SBarry Smith }
3243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
325bc952696SBarry Smith }
326bc952696SBarry Smith
327bc952696SBarry Smith /*@C
32878fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
32978fbdcc8SBarry Smith
330c3339decSBarry Smith Collective
33178fbdcc8SBarry Smith
33278fbdcc8SBarry Smith Input Parameters:
333b43aa488SJacob Faibussowitsch + ctx - the trajectory context
334dc9a610eSPierre Jolivet - names - the names of the components, final string must be `NULL`
33578fbdcc8SBarry Smith
33678fbdcc8SBarry Smith Level: intermediate
33778fbdcc8SBarry Smith
338b43aa488SJacob Faibussowitsch Fortran Notes:
339bcf0153eSBarry Smith Fortran interface is not possible because of the string array argument
340db901c5bSHong Zhang
3411cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSGetTrajectory()`
34278fbdcc8SBarry Smith @*/
TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const * names)343d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names)
344d71ae5a4SJacob Faibussowitsch {
34578fbdcc8SBarry Smith PetscFunctionBegin;
346fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1);
3474f572ea9SToby Isaac PetscAssertPointer(names, 2);
3489566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&ctx->names));
3499566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(names, &ctx->names));
3503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
35178fbdcc8SBarry Smith }
35278fbdcc8SBarry Smith
35378fbdcc8SBarry Smith /*@C
354fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
35508347785SBarry Smith
356c3339decSBarry Smith Collective
35708347785SBarry Smith
35808347785SBarry Smith Input Parameters:
359bcf0153eSBarry Smith + tj - the `TSTrajectory` context
36008347785SBarry Smith . transform - the transform function
36108347785SBarry Smith . destroy - function to destroy the optional context
362b43aa488SJacob Faibussowitsch - tctx - optional context used by transform function
36308347785SBarry Smith
36408347785SBarry Smith Level: intermediate
36508347785SBarry Smith
3661cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()`
36708347785SBarry Smith @*/
TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (* transform)(void *,Vec,Vec *),PetscCtxDestroyFn * destroy,void * tctx)368*98cba041SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscCtxDestroyFn *destroy, void *tctx)
369d71ae5a4SJacob Faibussowitsch {
37008347785SBarry Smith PetscFunctionBegin;
371fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
37208347785SBarry Smith tj->transform = transform;
37308347785SBarry Smith tj->transformdestroy = destroy;
37408347785SBarry Smith tj->transformctx = tctx;
3753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
37608347785SBarry Smith }
37708347785SBarry Smith
378db901c5bSHong Zhang /*@
379bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
380bc952696SBarry Smith
381d083f849SBarry Smith Collective
382bc952696SBarry Smith
383bc952696SBarry Smith Input Parameter:
3843c0fce88SHong Zhang . comm - the communicator
385bc952696SBarry Smith
386bc952696SBarry Smith Output Parameter:
3873c0fce88SHong Zhang . tj - the trajectory object
388bc952696SBarry Smith
389df5474d8SHong Zhang Level: developer
390bc952696SBarry Smith
39195452b02SPatrick Sanan Notes:
392bcf0153eSBarry Smith Usually one does not call this routine, it is called automatically when one calls `TSSetSaveTrajectory()`.
393bc952696SBarry Smith
3941cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()`
395bc952696SBarry Smith @*/
TSTrajectoryCreate(MPI_Comm comm,TSTrajectory * tj)396d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj)
397d71ae5a4SJacob Faibussowitsch {
398bc952696SBarry Smith TSTrajectory t;
399bc952696SBarry Smith
400bc952696SBarry Smith PetscFunctionBegin;
4014f572ea9SToby Isaac PetscAssertPointer(tj, 2);
4029566063dSJacob Faibussowitsch PetscCall(TSInitializePackage());
403bc952696SBarry Smith
4049566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView));
40568bece0bSHong Zhang t->setupcalled = PETSC_FALSE;
4069566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(comm, &t->tsh));
407fe8322adSStefano Zampini t->lag.order = 1;
408fe8322adSStefano Zampini t->lag.L = NULL;
409fe8322adSStefano Zampini t->lag.T = NULL;
410fe8322adSStefano Zampini t->lag.W = NULL;
411fe8322adSStefano Zampini t->lag.WW = NULL;
412fe8322adSStefano Zampini t->lag.TW = NULL;
413fe8322adSStefano Zampini t->lag.TT = NULL;
414fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE;
415fe8322adSStefano Zampini t->lag.Ucached.id = 0;
416fe8322adSStefano Zampini t->lag.Ucached.state = -1;
417fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL;
4181690c2aeSBarry Smith t->lag.Ucached.step = PETSC_INT_MAX;
419fe8322adSStefano Zampini t->lag.Udotcached.id = 0;
420fe8322adSStefano Zampini t->lag.Udotcached.state = -1;
421fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL;
4221690c2aeSBarry Smith t->lag.Udotcached.step = PETSC_INT_MAX;
423fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE;
424fe8322adSStefano Zampini t->solution_only = PETSC_FALSE;
425fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE;
426ac1a7491SHong Zhang t->usehistory = PETSC_TRUE;
427b1d74d50SHong Zhang *tj = t;
42863a3b9bcSJacob Faibussowitsch PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin"));
4293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
430bc952696SBarry Smith }
431bc952696SBarry Smith
432cc4c1da9SBarry Smith /*@
433bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory
434bc952696SBarry Smith
435c3339decSBarry Smith Collective
436bc952696SBarry Smith
437bc952696SBarry Smith Input Parameters:
438bcf0153eSBarry Smith + tj - the `TSTrajectory` context
439bcf0153eSBarry Smith . ts - the `TS` context
4403c0fce88SHong Zhang - type - a known method
441bc952696SBarry Smith
442bcf0153eSBarry Smith Options Database Key:
443e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
444bc952696SBarry Smith
445df5474d8SHong Zhang Level: developer
446bc952696SBarry Smith
447b43aa488SJacob Faibussowitsch Developer Notes:
448bcf0153eSBarry Smith Why does this option require access to the `TS`
449bc952696SBarry Smith
4501cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
451bc952696SBarry Smith @*/
TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)452d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type)
453d71ae5a4SJacob Faibussowitsch {
454972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory, TS);
455bc952696SBarry Smith PetscBool match;
456bc952696SBarry Smith
457bc952696SBarry Smith PetscFunctionBegin;
458972caf09SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
4599566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match));
4603ba16761SJacob Faibussowitsch if (match) PetscFunctionReturn(PETSC_SUCCESS);
461bc952696SBarry Smith
4629566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r));
4636adde796SStefano Zampini PetscCheck(r, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type);
4649927e4dfSBarry Smith PetscTryTypeMethod(tj, destroy);
465972caf09SHong Zhang tj->ops->destroy = NULL;
4669566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops)));
467bc952696SBarry Smith
4689566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type));
4699566063dSJacob Faibussowitsch PetscCall((*r)(tj, ts));
4703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
471bc952696SBarry Smith }
472bc952696SBarry Smith
473cc4c1da9SBarry Smith /*@
474881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type
475881c1a9bSHong Zhang
476c3339decSBarry Smith Collective
477881c1a9bSHong Zhang
478881c1a9bSHong Zhang Input Parameters:
479bcf0153eSBarry Smith + tj - the `TSTrajectory` context
480bcf0153eSBarry Smith - ts - the `TS` context
481881c1a9bSHong Zhang
4822fe279fdSBarry Smith Output Parameter:
483881c1a9bSHong Zhang . type - a known method
484881c1a9bSHong Zhang
485881c1a9bSHong Zhang Level: developer
486881c1a9bSHong Zhang
4871cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
488881c1a9bSHong Zhang @*/
TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType * type)489d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type)
490d71ae5a4SJacob Faibussowitsch {
491881c1a9bSHong Zhang PetscFunctionBegin;
492881c1a9bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
493881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name;
4943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
495881c1a9bSHong Zhang }
496881c1a9bSHong Zhang
497972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS);
498972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS);
4999a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS);
5002b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS);
501bc952696SBarry Smith
502bc952696SBarry Smith /*@C
503bcf0153eSBarry Smith TSTrajectoryRegisterAll - Registers all of the `TSTrajectory` storage schecmes in the `TS` package.
504bc952696SBarry Smith
505bc952696SBarry Smith Not Collective
506bc952696SBarry Smith
507df5474d8SHong Zhang Level: developer
508bc952696SBarry Smith
5091cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryRegister()`
510bc952696SBarry Smith @*/
TSTrajectoryRegisterAll(void)511d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void)
512d71ae5a4SJacob Faibussowitsch {
513bc952696SBarry Smith PetscFunctionBegin;
5143ba16761SJacob Faibussowitsch if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
515bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE;
516bc952696SBarry Smith
5179566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic));
5189566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile));
5199566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory));
5209566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization));
5213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
522bc952696SBarry Smith }
523bc952696SBarry Smith
524bc952696SBarry Smith /*@
5251550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context
5261550c9b9SHong Zhang
527c3339decSBarry Smith Collective
5281550c9b9SHong Zhang
5291550c9b9SHong Zhang Input Parameter:
530bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
5311550c9b9SHong Zhang
5321550c9b9SHong Zhang Level: developer
5331550c9b9SHong Zhang
5341cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5351550c9b9SHong Zhang @*/
TSTrajectoryReset(TSTrajectory tj)536d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
537d71ae5a4SJacob Faibussowitsch {
5381550c9b9SHong Zhang PetscFunctionBegin;
5393ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
5409a992471SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
541dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, reset);
5429566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate));
5439566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&tj->tsh));
5449566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh));
545fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE;
5463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
5471550c9b9SHong Zhang }
5481550c9b9SHong Zhang
5491550c9b9SHong Zhang /*@
550bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context
551bc952696SBarry Smith
552c3339decSBarry Smith Collective
553bc952696SBarry Smith
554bc952696SBarry Smith Input Parameter:
555bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()`
556bc952696SBarry Smith
557df5474d8SHong Zhang Level: developer
558bc952696SBarry Smith
5591cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
560bc952696SBarry Smith @*/
TSTrajectoryDestroy(TSTrajectory * tj)561d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
562d71ae5a4SJacob Faibussowitsch {
563bc952696SBarry Smith PetscFunctionBegin;
5643ba16761SJacob Faibussowitsch if (!*tj) PetscFunctionReturn(PETSC_SUCCESS);
565f4f49eeaSPierre Jolivet PetscValidHeaderSpecific(*tj, TSTRAJECTORY_CLASSID, 1);
566f4f49eeaSPierre Jolivet if (--((PetscObject)*tj)->refct > 0) {
5679371c9d4SSatish Balay *tj = NULL;
5683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
5699371c9d4SSatish Balay }
570bc952696SBarry Smith
5719566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReset(*tj));
5729566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5739566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W));
5749566063dSJacob Faibussowitsch PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW));
5759566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->U));
5769566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->Udot));
5779a992471SHong Zhang
578*98cba041SBarry Smith if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)(&(*tj)->transformctx));
579f4f49eeaSPierre Jolivet PetscTryTypeMethod(*tj, destroy);
580fe8322adSStefano Zampini if (!((*tj)->keepfiles)) {
581fe8322adSStefano Zampini PetscMPIInt rank;
582fe8322adSStefano Zampini MPI_Comm comm;
583fe8322adSStefano Zampini
584f4f49eeaSPierre Jolivet PetscCall(PetscObjectGetComm((PetscObject)*tj, &comm));
5859566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank));
586dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5879566063dSJacob Faibussowitsch PetscCall(PetscRMTree((*tj)->dirname));
588fe8322adSStefano Zampini }
589fe8322adSStefano Zampini }
5909566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*tj)->names));
5919566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->dirname));
5929566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->filetemplate));
5939566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tj));
5943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
595bc952696SBarry Smith }
596bc952696SBarry Smith
597bc952696SBarry Smith /*
598bcf0153eSBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of `TSTrajectory` from user options.
599bc952696SBarry Smith
600c3339decSBarry Smith Collective
601bc952696SBarry Smith
602bc952696SBarry Smith Input Parameter:
603bcf0153eSBarry Smith + tj - the `TSTrajectory` context
6043c0fce88SHong Zhang - ts - the TS context
6053c0fce88SHong Zhang
606bcf0153eSBarry Smith Options Database Key:
6073c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
608bc952696SBarry Smith
609df5474d8SHong Zhang Level: developer
610bc952696SBarry Smith
6111cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryType`, `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
612bc952696SBarry Smith */
TSTrajectorySetTypeFromOptions_Private(PetscOptionItems PetscOptionsObject,TSTrajectory tj,TS ts)613ce78bad3SBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems PetscOptionsObject, TSTrajectory tj, TS ts)
614d71ae5a4SJacob Faibussowitsch {
615bc952696SBarry Smith PetscBool opt;
616bc952696SBarry Smith const char *defaultType;
617bc952696SBarry Smith char typeName[256];
618bc952696SBarry Smith
619bc952696SBarry Smith PetscFunctionBegin;
620b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
621bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC;
622bc952696SBarry Smith
6239566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegisterAll());
6249566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt));
625bc952696SBarry Smith if (opt) {
6269566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, typeName));
627bc952696SBarry Smith } else {
6289566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj, ts, defaultType));
629bc952696SBarry Smith }
6303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
631bc952696SBarry Smith }
632bc952696SBarry Smith
633ed695a29SHong Zhang /*@
634bcf0153eSBarry Smith TSTrajectorySetUseHistory - Use `TSHistory` in `TSTrajectory`
6359ffb3502SHong Zhang
636c3339decSBarry Smith Collective
6379ffb3502SHong Zhang
6384165533cSJose E. Roman Input Parameters:
639bcf0153eSBarry Smith + tj - the `TSTrajectory` context
640bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
6419ffb3502SHong Zhang
642bcf0153eSBarry Smith Options Database Key:
643bcf0153eSBarry Smith . -ts_trajectory_use_history - have it use `TSHistory`
6449ffb3502SHong Zhang
6459ffb3502SHong Zhang Level: advanced
6469ffb3502SHong Zhang
6471cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6489ffb3502SHong Zhang @*/
TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg)649d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg)
650d71ae5a4SJacob Faibussowitsch {
6519ffb3502SHong Zhang PetscFunctionBegin;
6529ffb3502SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
6539ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2);
6549ffb3502SHong Zhang tj->usehistory = flg;
6553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
6569ffb3502SHong Zhang }
6579ffb3502SHong Zhang
6589ffb3502SHong Zhang /*@
659bcf0153eSBarry Smith TSTrajectorySetMonitor - Monitor the schedules generated by the `TSTrajectory` checkpointing controller
660ed695a29SHong Zhang
661c3339decSBarry Smith Collective
662ed695a29SHong Zhang
6634165533cSJose E. Roman Input Parameters:
664bcf0153eSBarry Smith + tj - the `TSTrajectory` context
665bcf0153eSBarry Smith - flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable
666ed695a29SHong Zhang
667bcf0153eSBarry Smith Options Database Key:
668bcf0153eSBarry Smith . -ts_trajectory_monitor - print `TSTrajectory` information
6693c0fce88SHong Zhang
670df5474d8SHong Zhang Level: developer
671ed695a29SHong Zhang
6721cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
673ed695a29SHong Zhang @*/
TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)674d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg)
675d71ae5a4SJacob Faibussowitsch {
676ed695a29SHong Zhang PetscFunctionBegin;
677ed695a29SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
678ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj, flg, 2);
679fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
680fe8322adSStefano Zampini else tj->monitor = NULL;
6813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
682ed695a29SHong Zhang }
683ed695a29SHong Zhang
684bc952696SBarry Smith /*@
685bcf0153eSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the `TSTrajectory` once the program is done
68664fc91eeSBarry Smith
687c3339decSBarry Smith Collective
68864fc91eeSBarry Smith
6894165533cSJose E. Roman Input Parameters:
690bcf0153eSBarry Smith + tj - the `TSTrajectory` context
691bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
69264fc91eeSBarry Smith
693bcf0153eSBarry Smith Options Database Key:
69464fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files
69564fc91eeSBarry Smith
69664fc91eeSBarry Smith Level: advanced
69764fc91eeSBarry Smith
698bcf0153eSBarry Smith Note:
699bcf0153eSBarry Smith By default the `TSTrajectory` used for adjoint computations, `TSTRAJECTORYBASIC`, removes the files it generates at the end of the run. This causes the files to be kept.
700bcf0153eSBarry Smith
7011cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
70264fc91eeSBarry Smith @*/
TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)703d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg)
704d71ae5a4SJacob Faibussowitsch {
70564fc91eeSBarry Smith PetscFunctionBegin;
70664fc91eeSBarry Smith PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
70764fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj, flg, 2);
70864fc91eeSBarry Smith tj->keepfiles = flg;
7093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
71064fc91eeSBarry Smith }
71164fc91eeSBarry Smith
712cc4c1da9SBarry Smith /*@
713bcf0153eSBarry Smith TSTrajectorySetDirname - Specify the name of the directory where `TSTrajectory` disk checkpoints are stored.
71464e38db7SHong Zhang
715c3339decSBarry Smith Collective
71664e38db7SHong Zhang
7174165533cSJose E. Roman Input Parameters:
718bcf0153eSBarry Smith + tj - the `TSTrajectory` context
71964e38db7SHong Zhang - dirname - the directory name
72064e38db7SHong Zhang
721bcf0153eSBarry Smith Options Database Key:
72264e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name
72364e38db7SHong Zhang
72464e38db7SHong Zhang Level: developer
72564e38db7SHong Zhang
726bcf0153eSBarry Smith Notes:
727bcf0153eSBarry Smith The final location of the files is determined by dirname/filetemplate where filetemplate was provided by `TSTrajectorySetFiletemplate()`
728bcf0153eSBarry Smith
729bcf0153eSBarry Smith If this is not called `TSTrajectory` selects a unique new name for the directory
730bcf0153eSBarry Smith
7311cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
73264e38db7SHong Zhang @*/
TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])733d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[])
734d71ae5a4SJacob Faibussowitsch {
735a17281aeSStefano Zampini PetscBool flg;
736a17281aeSStefano Zampini
73764e38db7SHong Zhang PetscFunctionBegin;
73864e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7399566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(tj->dirname, dirname, &flg));
740049d1499SBarry Smith PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup");
7419566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirname));
7429566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(dirname, &tj->dirname));
7433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
74464e38db7SHong Zhang }
74564e38db7SHong Zhang
746cc4c1da9SBarry Smith /*@
747bcf0153eSBarry Smith TSTrajectorySetFiletemplate - Specify the name template for the files storing `TSTrajectory` checkpoints.
74864e38db7SHong Zhang
749c3339decSBarry Smith Collective
75064e38db7SHong Zhang
7514165533cSJose E. Roman Input Parameters:
752bcf0153eSBarry Smith + tj - the `TSTrajectory` context
7531585b412SBarry Smith - filetemplate - the template
75464e38db7SHong Zhang
755bcf0153eSBarry Smith Options Database Key:
7561585b412SBarry Smith . -ts_trajectory_file_template - set the file name template
7571585b412SBarry Smith
758bcf0153eSBarry Smith Level: developer
759bcf0153eSBarry Smith
76095452b02SPatrick Sanan Notes:
76163a3b9bcSJacob Faibussowitsch The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7621585b412SBarry Smith
763bcf0153eSBarry Smith The final location of the files is determined by dirname/filetemplate where dirname was provided by `TSTrajectorySetDirname()`. The %06" PetscInt_FMT " is replaced by the
7641585b412SBarry Smith timestep counter
76564e38db7SHong Zhang
7661cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
76764e38db7SHong Zhang @*/
TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])768d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[])
769d71ae5a4SJacob Faibussowitsch {
770bbcf679cSJacob Faibussowitsch const char *ptr = NULL, *ptr2 = NULL;
7719afe7f3eSBarry Smith
77264e38db7SHong Zhang PetscFunctionBegin;
77364e38db7SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7744f572ea9SToby Isaac PetscAssertPointer(filetemplate, 2);
7753c633725SBarry Smith PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup");
7769afe7f3eSBarry Smith
77763a3b9bcSJacob 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");
7789afe7f3eSBarry Smith /* Do some cursory validation of the input. */
7799566063dSJacob Faibussowitsch PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr));
78063a3b9bcSJacob 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");
7819afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) {
78263a3b9bcSJacob Faibussowitsch PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2));
78363a3b9bcSJacob 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");
7849afe7f3eSBarry Smith if (ptr2) break;
7859afe7f3eSBarry Smith }
7869566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->filetemplate));
7879566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate));
7883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
78964e38db7SHong Zhang }
79064e38db7SHong Zhang
79164e38db7SHong Zhang /*@
792bcf0153eSBarry Smith TSTrajectorySetFromOptions - Sets various `TSTrajectory` parameters from user options.
793bc952696SBarry Smith
794c3339decSBarry Smith Collective
795bc952696SBarry Smith
796d8d19677SJose E. Roman Input Parameters:
797bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
798bcf0153eSBarry Smith - ts - the `TS` context
799bc952696SBarry Smith
800bc952696SBarry Smith Options Database Keys:
801bcf0153eSBarry Smith + -ts_trajectory_type <type> - basic, memory, singlefile, visualization
802bcf0153eSBarry Smith . -ts_trajectory_keep_files <true,false> - keep the files generated by the code after the program ends. This is true by default for singlefile and visualization
803bcf0153eSBarry Smith - -ts_trajectory_monitor - print `TSTrajectory` information
804bc952696SBarry Smith
805df5474d8SHong Zhang Level: developer
806bc952696SBarry Smith
807bcf0153eSBarry Smith Note:
80895452b02SPatrick Sanan This is not normally called directly by users
809bc952696SBarry Smith
8101cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
811bc952696SBarry Smith @*/
TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)812d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts)
813d71ae5a4SJacob Faibussowitsch {
814ed695a29SHong Zhang PetscBool set, flg;
81564e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN];
816bc952696SBarry Smith
817bc952696SBarry Smith PetscFunctionBegin;
818b1d74d50SHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
819fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
820d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tj);
8219566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts));
8229566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL));
8239566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set));
8249566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetMonitor(tj, flg));
8259566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL));
8269566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL));
8279566063dSJacob 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));
8289566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL));
8299566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set));
8309566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg));
83164e38db7SHong Zhang
8329566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set));
8331baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetDirname(tj, dirname));
83464e38db7SHong Zhang
83563a3b9bcSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set));
8361baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate));
83764e38db7SHong Zhang
83864e38db7SHong Zhang /* Handle specific TSTrajectory options */
839dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject);
840d0609cedSBarry Smith PetscOptionsEnd();
8413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
842bc952696SBarry Smith }
84368bece0bSHong Zhang
84468bece0bSHong Zhang /*@
84568bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
846bcf0153eSBarry Smith of a `TS` `TSTrajectory`.
84768bece0bSHong Zhang
848c3339decSBarry Smith Collective
84968bece0bSHong Zhang
850d8d19677SJose E. Roman Input Parameters:
851bcf0153eSBarry Smith + tj - the `TSTrajectory` context
852bcf0153eSBarry Smith - ts - the TS context obtained from `TSCreate()`
85368bece0bSHong Zhang
854df5474d8SHong Zhang Level: developer
85568bece0bSHong Zhang
8561cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
85768bece0bSHong Zhang @*/
TSTrajectorySetUp(TSTrajectory tj,TS ts)858d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts)
859d71ae5a4SJacob Faibussowitsch {
8609afe7f3eSBarry Smith size_t s1, s2;
86168bece0bSHong Zhang
86268bece0bSHong Zhang PetscFunctionBegin;
8633ba16761SJacob Faibussowitsch if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
86468bece0bSHong Zhang PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
865fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
8663ba16761SJacob Faibussowitsch if (tj->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
86768bece0bSHong Zhang
8689566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0));
86948a46eb9SPierre Jolivet if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC));
870dbbe0bcdSBarry Smith PetscTryTypeMethod(tj, setup, ts);
87168bece0bSHong Zhang
87268bece0bSHong Zhang tj->setupcalled = PETSC_TRUE;
87353b27ddbSHong Zhang
87453b27ddbSHong Zhang /* Set the counters to zero */
8751a5a771fSHong Zhang tj->recomps = 0;
87653b27ddbSHong Zhang tj->diskreads = 0;
87753b27ddbSHong Zhang tj->diskwrites = 0;
8789566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->dirname, &s1));
8799566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->filetemplate, &s2));
8809566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate));
8819566063dSJacob Faibussowitsch PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate));
8829566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate));
8839566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0));
8843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
88568bece0bSHong Zhang }
886fe8322adSStefano Zampini
887fe8322adSStefano Zampini /*@
888bcf0153eSBarry Smith TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage information
889fe8322adSStefano Zampini
890c3339decSBarry Smith Collective
891fe8322adSStefano Zampini
892d8d19677SJose E. Roman Input Parameters:
893bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained with `TSGetTrajectory()`
894b43aa488SJacob Faibussowitsch - solution_only - the boolean flag
895fe8322adSStefano Zampini
896fe8322adSStefano Zampini Level: developer
897fe8322adSStefano Zampini
8981cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
899fe8322adSStefano Zampini @*/
TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)900d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only)
901d71ae5a4SJacob Faibussowitsch {
902fe8322adSStefano Zampini PetscFunctionBegin;
903fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
904fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj, solution_only, 2);
905fe8322adSStefano Zampini tj->solution_only = solution_only;
9063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
907fe8322adSStefano Zampini }
908fe8322adSStefano Zampini
909fe8322adSStefano Zampini /*@
910bcf0153eSBarry Smith TSTrajectoryGetSolutionOnly - Gets the value set with `TSTrajectorySetSolutionOnly()`.
911fe8322adSStefano Zampini
91220f4b53cSBarry Smith Logically Collective
913fe8322adSStefano Zampini
914fe8322adSStefano Zampini Input Parameter:
915bcf0153eSBarry Smith . tj - the `TSTrajectory` context
916fe8322adSStefano Zampini
917fe8322adSStefano Zampini Output Parameter:
918b43aa488SJacob Faibussowitsch . solution_only - the boolean flag
919fe8322adSStefano Zampini
920fe8322adSStefano Zampini Level: developer
921fe8322adSStefano Zampini
9221cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
923fe8322adSStefano Zampini @*/
TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool * solution_only)924d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only)
925d71ae5a4SJacob Faibussowitsch {
926fe8322adSStefano Zampini PetscFunctionBegin;
927fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
9284f572ea9SToby Isaac PetscAssertPointer(solution_only, 2);
929fe8322adSStefano Zampini *solution_only = tj->solution_only;
9303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
931fe8322adSStefano Zampini }
932fe8322adSStefano Zampini
933fe8322adSStefano Zampini /*@
934fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
935fe8322adSStefano Zampini
936c3339decSBarry Smith Collective
937fe8322adSStefano Zampini
938d8d19677SJose E. Roman Input Parameters:
939bcf0153eSBarry Smith + tj - the `TSTrajectory` context
940bcf0153eSBarry Smith . ts - the `TS` solver context
941fe8322adSStefano Zampini - time - the requested time
942fe8322adSStefano Zampini
943d8d19677SJose E. Roman Output Parameters:
944fe8322adSStefano Zampini + U - state vector at given time (can be interpolated)
945fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated)
946fe8322adSStefano Zampini
947fe8322adSStefano Zampini Level: developer
948fe8322adSStefano Zampini
949bcf0153eSBarry Smith Notes:
950bcf0153eSBarry Smith The vectors are interpolated if time does not match any time step stored in the `TSTrajectory()`. Pass NULL to not request a vector.
951fe8322adSStefano Zampini
952bcf0153eSBarry Smith This function differs from `TSTrajectoryGetVecs()` since the vectors obtained cannot be modified, and they need to be returned by
953bcf0153eSBarry Smith calling `TSTrajectoryRestoreUpdatedHistoryVecs()`.
954bcf0153eSBarry Smith
9551cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
956fe8322adSStefano Zampini @*/
TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj,TS ts,PetscReal time,Vec * U,Vec * Udot)957d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
958d71ae5a4SJacob Faibussowitsch {
959fe8322adSStefano Zampini PetscFunctionBegin;
960fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
961fe8322adSStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
962fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj, time, 3);
9634f572ea9SToby Isaac if (U) PetscAssertPointer(U, 4);
9644f572ea9SToby Isaac if (Udot) PetscAssertPointer(Udot, 5);
965fe8322adSStefano Zampini if (U && !tj->U) {
966fe8322adSStefano Zampini DM dm;
967fe8322adSStefano Zampini
9689566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm));
9699566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->U));
970fe8322adSStefano Zampini }
971fe8322adSStefano Zampini if (Udot && !tj->Udot) {
972fe8322adSStefano Zampini DM dm;
973fe8322adSStefano Zampini
9749566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm));
9759566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &tj->Udot));
976fe8322adSStefano Zampini }
9779566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL));
978fe8322adSStefano Zampini if (U) {
9799566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->U));
980fe8322adSStefano Zampini *U = tj->U;
981fe8322adSStefano Zampini }
982fe8322adSStefano Zampini if (Udot) {
9839566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->Udot));
984fe8322adSStefano Zampini *Udot = tj->Udot;
985fe8322adSStefano Zampini }
9863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
987fe8322adSStefano Zampini }
988fe8322adSStefano Zampini
989fe8322adSStefano Zampini /*@
990bcf0153eSBarry Smith TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with `TSTrajectoryGetUpdatedHistoryVecs()`.
991fe8322adSStefano Zampini
992c3339decSBarry Smith Collective
993fe8322adSStefano Zampini
994d8d19677SJose E. Roman Input Parameters:
995bcf0153eSBarry Smith + tj - the `TSTrajectory` context
996fe8322adSStefano Zampini . U - state vector at given time (can be interpolated)
997fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated)
998fe8322adSStefano Zampini
999fe8322adSStefano Zampini Level: developer
1000fe8322adSStefano Zampini
10011cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryGetUpdatedHistoryVecs()`
1002fe8322adSStefano Zampini @*/
TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj,Vec * U,Vec * Udot)1003d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1004d71ae5a4SJacob Faibussowitsch {
1005fe8322adSStefano Zampini PetscFunctionBegin;
1006fe8322adSStefano Zampini PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
1007fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2);
1008fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3);
10093c633725SBarry Smith PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
10103c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1011fe8322adSStefano Zampini if (U) {
10129566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->U));
1013fe8322adSStefano Zampini *U = NULL;
1014fe8322adSStefano Zampini }
1015fe8322adSStefano Zampini if (Udot) {
10169566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->Udot));
1017fe8322adSStefano Zampini *Udot = NULL;
1018fe8322adSStefano Zampini }
10193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1020fe8322adSStefano Zampini }
1021