xref: /petsc/src/ts/interface/tsmon.c (revision 07eaae0c9d61213e885567e42fa218a39f71d188)
1d0c080abSJoseph Pusztay #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
2d0c080abSJoseph Pusztay #include <petscdm.h>
3*07eaae0cSMatthew G. Knepley #include <petscds.h>
4ab43fcacSJoe Pusztay #include <petscdmswarm.h>
5d0c080abSJoseph Pusztay #include <petscdraw.h>
6d0c080abSJoseph Pusztay 
7d0c080abSJoseph Pusztay /*@C
8d0c080abSJoseph Pusztay    TSMonitor - Runs all user-provided monitor routines set using TSMonitorSet()
9d0c080abSJoseph Pusztay 
10d0c080abSJoseph Pusztay    Collective on TS
11d0c080abSJoseph Pusztay 
12d0c080abSJoseph Pusztay    Input Parameters:
13d0c080abSJoseph Pusztay +  ts - time stepping context obtained from TSCreate()
14d0c080abSJoseph Pusztay .  step - step number that has just completed
15d0c080abSJoseph Pusztay .  ptime - model time of the state
16d0c080abSJoseph Pusztay -  u - state at the current model time
17d0c080abSJoseph Pusztay 
18d0c080abSJoseph Pusztay    Notes:
19d0c080abSJoseph Pusztay    TSMonitor() is typically used automatically within the time stepping implementations.
20d0c080abSJoseph Pusztay    Users would almost never call this routine directly.
21d0c080abSJoseph Pusztay 
22d0c080abSJoseph Pusztay    A step of -1 indicates that the monitor is being called on a solution obtained by interpolating from computed solutions
23d0c080abSJoseph Pusztay 
24d0c080abSJoseph Pusztay    Level: developer
25d0c080abSJoseph Pusztay 
26d0c080abSJoseph Pusztay @*/
27d0c080abSJoseph Pusztay PetscErrorCode TSMonitor(TS ts,PetscInt step,PetscReal ptime,Vec u)
28d0c080abSJoseph Pusztay {
29d0c080abSJoseph Pusztay   DM             dm;
30d0c080abSJoseph Pusztay   PetscInt       i,n = ts->numbermonitors;
31d0c080abSJoseph Pusztay   PetscErrorCode ierr;
32d0c080abSJoseph Pusztay 
33d0c080abSJoseph Pusztay   PetscFunctionBegin;
34d0c080abSJoseph Pusztay   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
35d0c080abSJoseph Pusztay   PetscValidHeaderSpecific(u,VEC_CLASSID,4);
36d0c080abSJoseph Pusztay 
37d0c080abSJoseph Pusztay   ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
38d0c080abSJoseph Pusztay   ierr = DMSetOutputSequenceNumber(dm,step,ptime);CHKERRQ(ierr);
39d0c080abSJoseph Pusztay 
40d0c080abSJoseph Pusztay   ierr = VecLockReadPush(u);CHKERRQ(ierr);
41d0c080abSJoseph Pusztay   for (i=0; i<n; i++) {
42d0c080abSJoseph Pusztay     ierr = (*ts->monitor[i])(ts,step,ptime,u,ts->monitorcontext[i]);CHKERRQ(ierr);
43d0c080abSJoseph Pusztay   }
44d0c080abSJoseph Pusztay   ierr = VecLockReadPop(u);CHKERRQ(ierr);
45d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
46d0c080abSJoseph Pusztay }
47d0c080abSJoseph Pusztay 
48d0c080abSJoseph Pusztay /*@C
49d0c080abSJoseph Pusztay    TSMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type indicated by the user
50d0c080abSJoseph Pusztay 
51d0c080abSJoseph Pusztay    Collective on TS
52d0c080abSJoseph Pusztay 
53d0c080abSJoseph Pusztay    Input Parameters:
54d0c080abSJoseph Pusztay +  ts - TS object you wish to monitor
55d0c080abSJoseph Pusztay .  name - the monitor type one is seeking
56d0c080abSJoseph Pusztay .  help - message indicating what monitoring is done
57d0c080abSJoseph Pusztay .  manual - manual page for the monitor
58d0c080abSJoseph Pusztay .  monitor - the monitor function
59d0c080abSJoseph Pusztay -  monitorsetup - a function that is called once ONLY if the user selected this monitor that may set additional features of the TS or PetscViewer objects
60d0c080abSJoseph Pusztay 
61d0c080abSJoseph Pusztay    Level: developer
62d0c080abSJoseph Pusztay 
63d0c080abSJoseph Pusztay .seealso: PetscOptionsGetViewer(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
64d0c080abSJoseph Pusztay           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
65d0c080abSJoseph Pusztay           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
66d0c080abSJoseph Pusztay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
67d0c080abSJoseph Pusztay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
68d0c080abSJoseph Pusztay           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
69d0c080abSJoseph Pusztay           PetscOptionsFList(), PetscOptionsEList()
70d0c080abSJoseph Pusztay @*/
71d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorSetFromOptions(TS ts,const char name[],const char help[], const char manual[],PetscErrorCode (*monitor)(TS,PetscInt,PetscReal,Vec,PetscViewerAndFormat*),PetscErrorCode (*monitorsetup)(TS,PetscViewerAndFormat*))
72d0c080abSJoseph Pusztay {
73d0c080abSJoseph Pusztay   PetscErrorCode    ierr;
74d0c080abSJoseph Pusztay   PetscViewer       viewer;
75d0c080abSJoseph Pusztay   PetscViewerFormat format;
76d0c080abSJoseph Pusztay   PetscBool         flg;
77d0c080abSJoseph Pusztay 
78d0c080abSJoseph Pusztay   PetscFunctionBegin;
79d0c080abSJoseph Pusztay   ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)ts),((PetscObject) ts)->options,((PetscObject)ts)->prefix,name,&viewer,&format,&flg);CHKERRQ(ierr);
80d0c080abSJoseph Pusztay   if (flg) {
81d0c080abSJoseph Pusztay     PetscViewerAndFormat *vf;
82d0c080abSJoseph Pusztay     ierr = PetscViewerAndFormatCreate(viewer,format,&vf);CHKERRQ(ierr);
83d0c080abSJoseph Pusztay     ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr);
84d0c080abSJoseph Pusztay     if (monitorsetup) {
85d0c080abSJoseph Pusztay       ierr = (*monitorsetup)(ts,vf);CHKERRQ(ierr);
86d0c080abSJoseph Pusztay     }
87d0c080abSJoseph Pusztay     ierr = TSMonitorSet(ts,(PetscErrorCode (*)(TS,PetscInt,PetscReal,Vec,void*))monitor,vf,(PetscErrorCode (*)(void**))PetscViewerAndFormatDestroy);CHKERRQ(ierr);
88d0c080abSJoseph Pusztay   }
89d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
90d0c080abSJoseph Pusztay }
91d0c080abSJoseph Pusztay 
92d0c080abSJoseph Pusztay /*@C
93d0c080abSJoseph Pusztay    TSMonitorSet - Sets an ADDITIONAL function that is to be used at every
94d0c080abSJoseph Pusztay    timestep to display the iteration's  progress.
95d0c080abSJoseph Pusztay 
96d0c080abSJoseph Pusztay    Logically Collective on TS
97d0c080abSJoseph Pusztay 
98d0c080abSJoseph Pusztay    Input Parameters:
99d0c080abSJoseph Pusztay +  ts - the TS context obtained from TSCreate()
100d0c080abSJoseph Pusztay .  monitor - monitoring routine
101d0c080abSJoseph Pusztay .  mctx - [optional] user-defined context for private data for the
102d0c080abSJoseph Pusztay              monitor routine (use NULL if no context is desired)
103d0c080abSJoseph Pusztay -  monitordestroy - [optional] routine that frees monitor context
104d0c080abSJoseph Pusztay           (may be NULL)
105d0c080abSJoseph Pusztay 
106d0c080abSJoseph Pusztay    Calling sequence of monitor:
107d0c080abSJoseph Pusztay $    PetscErrorCode monitor(TS ts,PetscInt steps,PetscReal time,Vec u,void *mctx)
108d0c080abSJoseph Pusztay 
109d0c080abSJoseph Pusztay +    ts - the TS context
110d0c080abSJoseph Pusztay .    steps - iteration number (after the final time step the monitor routine may be called with a step of -1, this indicates the solution has been interpolated to this time)
111d0c080abSJoseph Pusztay .    time - current time
112d0c080abSJoseph Pusztay .    u - current iterate
113d0c080abSJoseph Pusztay -    mctx - [optional] monitoring context
114d0c080abSJoseph Pusztay 
115d0c080abSJoseph Pusztay    Notes:
116d0c080abSJoseph Pusztay    This routine adds an additional monitor to the list of monitors that
117d0c080abSJoseph Pusztay    already has been loaded.
118d0c080abSJoseph Pusztay 
119d0c080abSJoseph Pusztay    Fortran Notes:
120d0c080abSJoseph Pusztay     Only a single monitor function can be set for each TS object
121d0c080abSJoseph Pusztay 
122d0c080abSJoseph Pusztay    Level: intermediate
123d0c080abSJoseph Pusztay 
124d0c080abSJoseph Pusztay .seealso: TSMonitorDefault(), TSMonitorCancel()
125d0c080abSJoseph Pusztay @*/
126d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorSet(TS ts,PetscErrorCode (*monitor)(TS,PetscInt,PetscReal,Vec,void*),void *mctx,PetscErrorCode (*mdestroy)(void**))
127d0c080abSJoseph Pusztay {
128d0c080abSJoseph Pusztay   PetscErrorCode ierr;
129d0c080abSJoseph Pusztay   PetscInt       i;
130d0c080abSJoseph Pusztay   PetscBool      identical;
131d0c080abSJoseph Pusztay 
132d0c080abSJoseph Pusztay   PetscFunctionBegin;
133d0c080abSJoseph Pusztay   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
134d0c080abSJoseph Pusztay   for (i=0; i<ts->numbermonitors;i++) {
135d0c080abSJoseph Pusztay     ierr = PetscMonitorCompare((PetscErrorCode (*)(void))monitor,mctx,mdestroy,(PetscErrorCode (*)(void))ts->monitor[i],ts->monitorcontext[i],ts->monitordestroy[i],&identical);CHKERRQ(ierr);
136d0c080abSJoseph Pusztay     if (identical) PetscFunctionReturn(0);
137d0c080abSJoseph Pusztay   }
138d0c080abSJoseph Pusztay   if (ts->numbermonitors >= MAXTSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
139d0c080abSJoseph Pusztay   ts->monitor[ts->numbermonitors]          = monitor;
140d0c080abSJoseph Pusztay   ts->monitordestroy[ts->numbermonitors]   = mdestroy;
141d0c080abSJoseph Pusztay   ts->monitorcontext[ts->numbermonitors++] = (void*)mctx;
142d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
143d0c080abSJoseph Pusztay }
144d0c080abSJoseph Pusztay 
145d0c080abSJoseph Pusztay /*@C
146d0c080abSJoseph Pusztay    TSMonitorCancel - Clears all the monitors that have been set on a time-step object.
147d0c080abSJoseph Pusztay 
148d0c080abSJoseph Pusztay    Logically Collective on TS
149d0c080abSJoseph Pusztay 
150d0c080abSJoseph Pusztay    Input Parameters:
151d0c080abSJoseph Pusztay .  ts - the TS context obtained from TSCreate()
152d0c080abSJoseph Pusztay 
153d0c080abSJoseph Pusztay    Notes:
154d0c080abSJoseph Pusztay    There is no way to remove a single, specific monitor.
155d0c080abSJoseph Pusztay 
156d0c080abSJoseph Pusztay    Level: intermediate
157d0c080abSJoseph Pusztay 
158d0c080abSJoseph Pusztay .seealso: TSMonitorDefault(), TSMonitorSet()
159d0c080abSJoseph Pusztay @*/
160d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorCancel(TS ts)
161d0c080abSJoseph Pusztay {
162d0c080abSJoseph Pusztay   PetscErrorCode ierr;
163d0c080abSJoseph Pusztay   PetscInt       i;
164d0c080abSJoseph Pusztay 
165d0c080abSJoseph Pusztay   PetscFunctionBegin;
166d0c080abSJoseph Pusztay   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
167d0c080abSJoseph Pusztay   for (i=0; i<ts->numbermonitors; i++) {
168d0c080abSJoseph Pusztay     if (ts->monitordestroy[i]) {
169d0c080abSJoseph Pusztay       ierr = (*ts->monitordestroy[i])(&ts->monitorcontext[i]);CHKERRQ(ierr);
170d0c080abSJoseph Pusztay     }
171d0c080abSJoseph Pusztay   }
172d0c080abSJoseph Pusztay   ts->numbermonitors = 0;
173d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
174d0c080abSJoseph Pusztay }
175d0c080abSJoseph Pusztay 
176d0c080abSJoseph Pusztay /*@C
177d0c080abSJoseph Pusztay    TSMonitorDefault - The Default monitor, prints the timestep and time for each step
178d0c080abSJoseph Pusztay 
179d0c080abSJoseph Pusztay    Level: intermediate
180d0c080abSJoseph Pusztay 
181d0c080abSJoseph Pusztay .seealso:  TSMonitorSet()
182d0c080abSJoseph Pusztay @*/
183d0c080abSJoseph Pusztay PetscErrorCode TSMonitorDefault(TS ts,PetscInt step,PetscReal ptime,Vec v,PetscViewerAndFormat *vf)
184d0c080abSJoseph Pusztay {
185d0c080abSJoseph Pusztay   PetscErrorCode ierr;
186d0c080abSJoseph Pusztay   PetscViewer    viewer =  vf->viewer;
187d0c080abSJoseph Pusztay   PetscBool      iascii,ibinary;
188d0c080abSJoseph Pusztay 
189d0c080abSJoseph Pusztay   PetscFunctionBegin;
190064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,5);
191d0c080abSJoseph Pusztay   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
192d0c080abSJoseph Pusztay   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&ibinary);CHKERRQ(ierr);
193d0c080abSJoseph Pusztay   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
194d0c080abSJoseph Pusztay   if (iascii) {
195d0c080abSJoseph Pusztay     ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ts)->tablevel);CHKERRQ(ierr);
196d0c080abSJoseph Pusztay     if (step == -1) { /* this indicates it is an interpolated solution */
197d0c080abSJoseph Pusztay       ierr = PetscViewerASCIIPrintf(viewer,"Interpolated solution at time %g between steps %D and %D\n",(double)ptime,ts->steps-1,ts->steps);CHKERRQ(ierr);
198d0c080abSJoseph Pusztay     } else {
199d0c080abSJoseph Pusztay       ierr = PetscViewerASCIIPrintf(viewer,"%D TS dt %g time %g%s",step,(double)ts->time_step,(double)ptime,ts->steprollback ? " (r)\n" : "\n");CHKERRQ(ierr);
200d0c080abSJoseph Pusztay     }
201d0c080abSJoseph Pusztay     ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ts)->tablevel);CHKERRQ(ierr);
202d0c080abSJoseph Pusztay   } else if (ibinary) {
203d0c080abSJoseph Pusztay     PetscMPIInt rank;
204d0c080abSJoseph Pusztay     ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRMPI(ierr);
205d0c080abSJoseph Pusztay     if (!rank) {
206d0c080abSJoseph Pusztay       PetscBool skipHeader;
207d0c080abSJoseph Pusztay       PetscInt  classid = REAL_FILE_CLASSID;
208d0c080abSJoseph Pusztay 
209d0c080abSJoseph Pusztay       ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr);
210d0c080abSJoseph Pusztay       if (!skipHeader) {
211d0c080abSJoseph Pusztay          ierr = PetscViewerBinaryWrite(viewer,&classid,1,PETSC_INT);CHKERRQ(ierr);
212d0c080abSJoseph Pusztay        }
213d0c080abSJoseph Pusztay       ierr = PetscRealView(1,&ptime,viewer);CHKERRQ(ierr);
214d0c080abSJoseph Pusztay     } else {
215d0c080abSJoseph Pusztay       ierr = PetscRealView(0,&ptime,viewer);CHKERRQ(ierr);
216d0c080abSJoseph Pusztay     }
217d0c080abSJoseph Pusztay   }
218d0c080abSJoseph Pusztay   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
219d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
220d0c080abSJoseph Pusztay }
221d0c080abSJoseph Pusztay 
222d0c080abSJoseph Pusztay /*@C
223d0c080abSJoseph Pusztay    TSMonitorExtreme - Prints the extreme values of the solution at each timestep
224d0c080abSJoseph Pusztay 
225d0c080abSJoseph Pusztay    Level: intermediate
226d0c080abSJoseph Pusztay 
227d0c080abSJoseph Pusztay .seealso:  TSMonitorSet()
228d0c080abSJoseph Pusztay @*/
229d0c080abSJoseph Pusztay PetscErrorCode TSMonitorExtreme(TS ts,PetscInt step,PetscReal ptime,Vec v,PetscViewerAndFormat *vf)
230d0c080abSJoseph Pusztay {
231d0c080abSJoseph Pusztay   PetscErrorCode ierr;
232d0c080abSJoseph Pusztay   PetscViewer    viewer =  vf->viewer;
233d0c080abSJoseph Pusztay   PetscBool      iascii;
234d0c080abSJoseph Pusztay   PetscReal      max,min;
235d0c080abSJoseph Pusztay 
236d0c080abSJoseph Pusztay   PetscFunctionBegin;
237064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,5);
238d0c080abSJoseph Pusztay   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
239d0c080abSJoseph Pusztay   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
240d0c080abSJoseph Pusztay   if (iascii) {
241d0c080abSJoseph Pusztay     ierr = VecMax(v,NULL,&max);CHKERRQ(ierr);
242d0c080abSJoseph Pusztay     ierr = VecMin(v,NULL,&min);CHKERRQ(ierr);
243d0c080abSJoseph Pusztay     ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ts)->tablevel);CHKERRQ(ierr);
244d0c080abSJoseph Pusztay     ierr = PetscViewerASCIIPrintf(viewer,"%D TS dt %g time %g%s max %g min %g\n",step,(double)ts->time_step,(double)ptime,ts->steprollback ? " (r)" : "",(double)max,(double)min);CHKERRQ(ierr);
245d0c080abSJoseph Pusztay     ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ts)->tablevel);CHKERRQ(ierr);
246d0c080abSJoseph Pusztay   }
247d0c080abSJoseph Pusztay   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
248d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
249d0c080abSJoseph Pusztay }
250d0c080abSJoseph Pusztay 
251d0c080abSJoseph Pusztay /*@C
252d0c080abSJoseph Pusztay    TSMonitorLGCtxCreate - Creates a TSMonitorLGCtx context for use with
253d0c080abSJoseph Pusztay    TS to monitor the solution process graphically in various ways
254d0c080abSJoseph Pusztay 
255d0c080abSJoseph Pusztay    Collective on TS
256d0c080abSJoseph Pusztay 
257d0c080abSJoseph Pusztay    Input Parameters:
258d0c080abSJoseph Pusztay +  host - the X display to open, or null for the local machine
259d0c080abSJoseph Pusztay .  label - the title to put in the title bar
260d0c080abSJoseph Pusztay .  x, y - the screen coordinates of the upper left coordinate of the window
261d0c080abSJoseph Pusztay .  m, n - the screen width and height in pixels
262d0c080abSJoseph Pusztay -  howoften - if positive then determines the frequency of the plotting, if -1 then only at the final time
263d0c080abSJoseph Pusztay 
264d0c080abSJoseph Pusztay    Output Parameter:
265d0c080abSJoseph Pusztay .  ctx - the context
266d0c080abSJoseph Pusztay 
267d0c080abSJoseph Pusztay    Options Database Key:
268d0c080abSJoseph Pusztay +  -ts_monitor_lg_timestep - automatically sets line graph monitor
269d0c080abSJoseph Pusztay +  -ts_monitor_lg_timestep_log - automatically sets line graph monitor
270d0c080abSJoseph Pusztay .  -ts_monitor_lg_solution - monitor the solution (or certain values of the solution by calling TSMonitorLGSetDisplayVariables() or TSMonitorLGCtxSetDisplayVariables())
271d0c080abSJoseph Pusztay .  -ts_monitor_lg_error -  monitor the error
272d0c080abSJoseph Pusztay .  -ts_monitor_lg_ksp_iterations - monitor the number of KSP iterations needed for each timestep
273d0c080abSJoseph Pusztay .  -ts_monitor_lg_snes_iterations - monitor the number of SNES iterations needed for each timestep
274d0c080abSJoseph Pusztay -  -lg_use_markers <true,false> - mark the data points (at each time step) on the plot; default is true
275d0c080abSJoseph Pusztay 
276d0c080abSJoseph Pusztay    Notes:
277d0c080abSJoseph Pusztay    Use TSMonitorLGCtxDestroy() to destroy.
278d0c080abSJoseph Pusztay 
279d0c080abSJoseph Pusztay    One can provide a function that transforms the solution before plotting it with TSMonitorLGCtxSetTransform() or TSMonitorLGSetTransform()
280d0c080abSJoseph Pusztay 
281d0c080abSJoseph Pusztay    Many of the functions that control the monitoring have two forms: TSMonitorLGSet/GetXXXX() and TSMonitorLGCtxSet/GetXXXX() the first take a TS object as the
282d0c080abSJoseph Pusztay    first argument (if that TS object does not have a TSMonitorLGCtx associated with it the function call is ignored) and the second takes a TSMonitorLGCtx object
283d0c080abSJoseph Pusztay    as the first argument.
284d0c080abSJoseph Pusztay 
285d0c080abSJoseph Pusztay    One can control the names displayed for each solution or error variable with TSMonitorLGCtxSetVariableNames() or TSMonitorLGSetVariableNames()
286d0c080abSJoseph Pusztay 
287d0c080abSJoseph Pusztay    Level: intermediate
288d0c080abSJoseph Pusztay 
289d0c080abSJoseph Pusztay .seealso: TSMonitorLGTimeStep(), TSMonitorSet(), TSMonitorLGSolution(), TSMonitorLGError(), TSMonitorDefault(), VecView(),
290d0c080abSJoseph Pusztay            TSMonitorLGCtxCreate(), TSMonitorLGCtxSetVariableNames(), TSMonitorLGCtxGetVariableNames(),
291d0c080abSJoseph Pusztay            TSMonitorLGSetVariableNames(), TSMonitorLGGetVariableNames(), TSMonitorLGSetDisplayVariables(), TSMonitorLGCtxSetDisplayVariables(),
292d0c080abSJoseph Pusztay            TSMonitorLGCtxSetTransform(), TSMonitorLGSetTransform(), TSMonitorLGError(), TSMonitorLGSNESIterations(), TSMonitorLGKSPIterations(),
293d0c080abSJoseph Pusztay            TSMonitorEnvelopeCtxCreate(), TSMonitorEnvelopeGetBounds(), TSMonitorEnvelopeCtxDestroy(), TSMonitorEnvelop()
294d0c080abSJoseph Pusztay 
295d0c080abSJoseph Pusztay @*/
296d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGCtxCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscInt howoften,TSMonitorLGCtx *ctx)
297d0c080abSJoseph Pusztay {
298d0c080abSJoseph Pusztay   PetscDraw      draw;
299d0c080abSJoseph Pusztay   PetscErrorCode ierr;
300d0c080abSJoseph Pusztay 
301d0c080abSJoseph Pusztay   PetscFunctionBegin;
302d0c080abSJoseph Pusztay   ierr = PetscNew(ctx);CHKERRQ(ierr);
303d0c080abSJoseph Pusztay   ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr);
304d0c080abSJoseph Pusztay   ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr);
305d0c080abSJoseph Pusztay   ierr = PetscDrawLGCreate(draw,1,&(*ctx)->lg);CHKERRQ(ierr);
306d0c080abSJoseph Pusztay   ierr = PetscDrawLGSetFromOptions((*ctx)->lg);CHKERRQ(ierr);
307d0c080abSJoseph Pusztay   ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr);
308d0c080abSJoseph Pusztay   (*ctx)->howoften = howoften;
309d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
310d0c080abSJoseph Pusztay }
311d0c080abSJoseph Pusztay 
312d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGTimeStep(TS ts,PetscInt step,PetscReal ptime,Vec v,void *monctx)
313d0c080abSJoseph Pusztay {
314d0c080abSJoseph Pusztay   TSMonitorLGCtx ctx = (TSMonitorLGCtx) monctx;
315d0c080abSJoseph Pusztay   PetscReal      x   = ptime,y;
316d0c080abSJoseph Pusztay   PetscErrorCode ierr;
317d0c080abSJoseph Pusztay 
318d0c080abSJoseph Pusztay   PetscFunctionBegin;
319d0c080abSJoseph Pusztay   if (step < 0) PetscFunctionReturn(0); /* -1 indicates an interpolated solution */
320d0c080abSJoseph Pusztay   if (!step) {
321d0c080abSJoseph Pusztay     PetscDrawAxis axis;
322d0c080abSJoseph Pusztay     const char *ylabel = ctx->semilogy ? "Log Time Step" : "Time Step";
323d0c080abSJoseph Pusztay     ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr);
324d0c080abSJoseph Pusztay     ierr = PetscDrawAxisSetLabels(axis,"Timestep as function of time","Time",ylabel);CHKERRQ(ierr);
325d0c080abSJoseph Pusztay     ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr);
326d0c080abSJoseph Pusztay   }
327d0c080abSJoseph Pusztay   ierr = TSGetTimeStep(ts,&y);CHKERRQ(ierr);
328d0c080abSJoseph Pusztay   if (ctx->semilogy) y = PetscLog10Real(y);
329d0c080abSJoseph Pusztay   ierr = PetscDrawLGAddPoint(ctx->lg,&x,&y);CHKERRQ(ierr);
330d0c080abSJoseph Pusztay   if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) {
331d0c080abSJoseph Pusztay     ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr);
332d0c080abSJoseph Pusztay     ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr);
333d0c080abSJoseph Pusztay   }
334d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
335d0c080abSJoseph Pusztay }
336d0c080abSJoseph Pusztay 
337d0c080abSJoseph Pusztay /*@C
338d0c080abSJoseph Pusztay    TSMonitorLGCtxDestroy - Destroys a line graph context that was created
339d0c080abSJoseph Pusztay    with TSMonitorLGCtxCreate().
340d0c080abSJoseph Pusztay 
341d0c080abSJoseph Pusztay    Collective on TSMonitorLGCtx
342d0c080abSJoseph Pusztay 
343d0c080abSJoseph Pusztay    Input Parameter:
344d0c080abSJoseph Pusztay .  ctx - the monitor context
345d0c080abSJoseph Pusztay 
346d0c080abSJoseph Pusztay    Level: intermediate
347d0c080abSJoseph Pusztay 
348d0c080abSJoseph Pusztay .seealso: TSMonitorLGCtxCreate(),  TSMonitorSet(), TSMonitorLGTimeStep();
349d0c080abSJoseph Pusztay @*/
350d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGCtxDestroy(TSMonitorLGCtx *ctx)
351d0c080abSJoseph Pusztay {
352d0c080abSJoseph Pusztay   PetscErrorCode ierr;
353d0c080abSJoseph Pusztay 
354d0c080abSJoseph Pusztay   PetscFunctionBegin;
355d0c080abSJoseph Pusztay   if ((*ctx)->transformdestroy) {
356d0c080abSJoseph Pusztay     ierr = ((*ctx)->transformdestroy)((*ctx)->transformctx);CHKERRQ(ierr);
357d0c080abSJoseph Pusztay   }
358d0c080abSJoseph Pusztay   ierr = PetscDrawLGDestroy(&(*ctx)->lg);CHKERRQ(ierr);
359d0c080abSJoseph Pusztay   ierr = PetscStrArrayDestroy(&(*ctx)->names);CHKERRQ(ierr);
360d0c080abSJoseph Pusztay   ierr = PetscStrArrayDestroy(&(*ctx)->displaynames);CHKERRQ(ierr);
361d0c080abSJoseph Pusztay   ierr = PetscFree((*ctx)->displayvariables);CHKERRQ(ierr);
362d0c080abSJoseph Pusztay   ierr = PetscFree((*ctx)->displayvalues);CHKERRQ(ierr);
363d0c080abSJoseph Pusztay   ierr = PetscFree(*ctx);CHKERRQ(ierr);
364d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
365d0c080abSJoseph Pusztay }
366d0c080abSJoseph Pusztay 
367d7462660SMatthew Knepley /* Creates a TS Monitor SPCtx for use with DMSwarm particle visualizations */
368d7462660SMatthew Knepley PetscErrorCode TSMonitorSPCtxCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscInt howoften,PetscInt retain,PetscBool phase,TSMonitorSPCtx *ctx)
369d0c080abSJoseph Pusztay {
370d0c080abSJoseph Pusztay   PetscDraw      draw;
371d0c080abSJoseph Pusztay   PetscErrorCode ierr;
372d0c080abSJoseph Pusztay 
373d0c080abSJoseph Pusztay   PetscFunctionBegin;
374d0c080abSJoseph Pusztay   ierr = PetscNew(ctx);CHKERRQ(ierr);
375d0c080abSJoseph Pusztay   ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr);
376d0c080abSJoseph Pusztay   ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr);
377d0c080abSJoseph Pusztay   ierr = PetscDrawSPCreate(draw,1,&(*ctx)->sp);CHKERRQ(ierr);
378d0c080abSJoseph Pusztay   ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr);
379d0c080abSJoseph Pusztay   (*ctx)->howoften = howoften;
380d7462660SMatthew Knepley   (*ctx)->retain   = retain;
381d7462660SMatthew Knepley   (*ctx)->phase    = phase;
382d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
383d0c080abSJoseph Pusztay }
384d0c080abSJoseph Pusztay 
385d0c080abSJoseph Pusztay /*
386d0c080abSJoseph Pusztay   Destroys a TSMonitorSPCtx that was created with TSMonitorSPCtxCreate
387d0c080abSJoseph Pusztay */
388d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSPCtxDestroy(TSMonitorSPCtx *ctx)
389d0c080abSJoseph Pusztay {
390d0c080abSJoseph Pusztay   PetscErrorCode ierr;
391d0c080abSJoseph Pusztay 
392d0c080abSJoseph Pusztay   PetscFunctionBegin;
393d0c080abSJoseph Pusztay 
394d0c080abSJoseph Pusztay   ierr = PetscDrawSPDestroy(&(*ctx)->sp);CHKERRQ(ierr);
395d0c080abSJoseph Pusztay   ierr = PetscFree(*ctx);CHKERRQ(ierr);
396d0c080abSJoseph Pusztay 
397d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
398d0c080abSJoseph Pusztay 
399d0c080abSJoseph Pusztay }
400d0c080abSJoseph Pusztay 
401d0c080abSJoseph Pusztay /*@C
402d0c080abSJoseph Pusztay    TSMonitorDrawSolution - Monitors progress of the TS solvers by calling
403d0c080abSJoseph Pusztay    VecView() for the solution at each timestep
404d0c080abSJoseph Pusztay 
405d0c080abSJoseph Pusztay    Collective on TS
406d0c080abSJoseph Pusztay 
407d0c080abSJoseph Pusztay    Input Parameters:
408d0c080abSJoseph Pusztay +  ts - the TS context
409d0c080abSJoseph Pusztay .  step - current time-step
410d0c080abSJoseph Pusztay .  ptime - current time
411d0c080abSJoseph Pusztay -  dummy - either a viewer or NULL
412d0c080abSJoseph Pusztay 
413d0c080abSJoseph Pusztay    Options Database:
414d0c080abSJoseph Pusztay .   -ts_monitor_draw_solution_initial - show initial solution as well as current solution
415d0c080abSJoseph Pusztay 
416d0c080abSJoseph Pusztay    Notes:
417d0c080abSJoseph Pusztay     the initial solution and current solution are not display with a common axis scaling so generally the option -ts_monitor_draw_solution_initial
418d0c080abSJoseph Pusztay        will look bad
419d0c080abSJoseph Pusztay 
420d0c080abSJoseph Pusztay    Level: intermediate
421d0c080abSJoseph Pusztay 
422d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView()
423d0c080abSJoseph Pusztay @*/
424d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorDrawSolution(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy)
425d0c080abSJoseph Pusztay {
426d0c080abSJoseph Pusztay   PetscErrorCode   ierr;
427d0c080abSJoseph Pusztay   TSMonitorDrawCtx ictx = (TSMonitorDrawCtx)dummy;
428d0c080abSJoseph Pusztay   PetscDraw        draw;
429d0c080abSJoseph Pusztay 
430d0c080abSJoseph Pusztay   PetscFunctionBegin;
431d0c080abSJoseph Pusztay   if (!step && ictx->showinitial) {
432d0c080abSJoseph Pusztay     if (!ictx->initialsolution) {
433d0c080abSJoseph Pusztay       ierr = VecDuplicate(u,&ictx->initialsolution);CHKERRQ(ierr);
434d0c080abSJoseph Pusztay     }
435d0c080abSJoseph Pusztay     ierr = VecCopy(u,ictx->initialsolution);CHKERRQ(ierr);
436d0c080abSJoseph Pusztay   }
437d0c080abSJoseph Pusztay   if (!(((ictx->howoften > 0) && (!(step % ictx->howoften))) || ((ictx->howoften == -1) && ts->reason))) PetscFunctionReturn(0);
438d0c080abSJoseph Pusztay 
439d0c080abSJoseph Pusztay   if (ictx->showinitial) {
440d0c080abSJoseph Pusztay     PetscReal pause;
441d0c080abSJoseph Pusztay     ierr = PetscViewerDrawGetPause(ictx->viewer,&pause);CHKERRQ(ierr);
442d0c080abSJoseph Pusztay     ierr = PetscViewerDrawSetPause(ictx->viewer,0.0);CHKERRQ(ierr);
443d0c080abSJoseph Pusztay     ierr = VecView(ictx->initialsolution,ictx->viewer);CHKERRQ(ierr);
444d0c080abSJoseph Pusztay     ierr = PetscViewerDrawSetPause(ictx->viewer,pause);CHKERRQ(ierr);
445d0c080abSJoseph Pusztay     ierr = PetscViewerDrawSetHold(ictx->viewer,PETSC_TRUE);CHKERRQ(ierr);
446d0c080abSJoseph Pusztay   }
447d0c080abSJoseph Pusztay   ierr = VecView(u,ictx->viewer);CHKERRQ(ierr);
448d0c080abSJoseph Pusztay   if (ictx->showtimestepandtime) {
449d0c080abSJoseph Pusztay     PetscReal xl,yl,xr,yr,h;
450d0c080abSJoseph Pusztay     char      time[32];
451d0c080abSJoseph Pusztay 
452d0c080abSJoseph Pusztay     ierr = PetscViewerDrawGetDraw(ictx->viewer,0,&draw);CHKERRQ(ierr);
453d0c080abSJoseph Pusztay     ierr = PetscSNPrintf(time,32,"Timestep %d Time %g",(int)step,(double)ptime);CHKERRQ(ierr);
454d0c080abSJoseph Pusztay     ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
455d0c080abSJoseph Pusztay     h    = yl + .95*(yr - yl);
456d0c080abSJoseph Pusztay     ierr = PetscDrawStringCentered(draw,.5*(xl+xr),h,PETSC_DRAW_BLACK,time);CHKERRQ(ierr);
457d0c080abSJoseph Pusztay     ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
458d0c080abSJoseph Pusztay   }
459d0c080abSJoseph Pusztay 
460d0c080abSJoseph Pusztay   if (ictx->showinitial) {
461d0c080abSJoseph Pusztay     ierr = PetscViewerDrawSetHold(ictx->viewer,PETSC_FALSE);CHKERRQ(ierr);
462d0c080abSJoseph Pusztay   }
463d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
464d0c080abSJoseph Pusztay }
465d0c080abSJoseph Pusztay 
466d0c080abSJoseph Pusztay /*@C
467d0c080abSJoseph Pusztay    TSMonitorDrawSolutionPhase - Monitors progress of the TS solvers by plotting the solution as a phase diagram
468d0c080abSJoseph Pusztay 
469d0c080abSJoseph Pusztay    Collective on TS
470d0c080abSJoseph Pusztay 
471d0c080abSJoseph Pusztay    Input Parameters:
472d0c080abSJoseph Pusztay +  ts - the TS context
473d0c080abSJoseph Pusztay .  step - current time-step
474d0c080abSJoseph Pusztay .  ptime - current time
475d0c080abSJoseph Pusztay -  dummy - either a viewer or NULL
476d0c080abSJoseph Pusztay 
477d0c080abSJoseph Pusztay    Level: intermediate
478d0c080abSJoseph Pusztay 
479d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView()
480d0c080abSJoseph Pusztay @*/
481d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorDrawSolutionPhase(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy)
482d0c080abSJoseph Pusztay {
483d0c080abSJoseph Pusztay   PetscErrorCode    ierr;
484d0c080abSJoseph Pusztay   TSMonitorDrawCtx  ictx = (TSMonitorDrawCtx)dummy;
485d0c080abSJoseph Pusztay   PetscDraw         draw;
486d0c080abSJoseph Pusztay   PetscDrawAxis     axis;
487d0c080abSJoseph Pusztay   PetscInt          n;
488d0c080abSJoseph Pusztay   PetscMPIInt       size;
489d0c080abSJoseph Pusztay   PetscReal         U0,U1,xl,yl,xr,yr,h;
490d0c080abSJoseph Pusztay   char              time[32];
491d0c080abSJoseph Pusztay   const PetscScalar *U;
492d0c080abSJoseph Pusztay 
493d0c080abSJoseph Pusztay   PetscFunctionBegin;
494d0c080abSJoseph Pusztay   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)ts),&size);CHKERRMPI(ierr);
495d0c080abSJoseph Pusztay   if (size != 1) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"Only allowed for sequential runs");
496d0c080abSJoseph Pusztay   ierr = VecGetSize(u,&n);CHKERRQ(ierr);
497d0c080abSJoseph Pusztay   if (n != 2) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"Only for ODEs with two unknowns");
498d0c080abSJoseph Pusztay 
499d0c080abSJoseph Pusztay   ierr = PetscViewerDrawGetDraw(ictx->viewer,0,&draw);CHKERRQ(ierr);
500d0c080abSJoseph Pusztay   ierr = PetscViewerDrawGetDrawAxis(ictx->viewer,0,&axis);CHKERRQ(ierr);
501d0c080abSJoseph Pusztay   ierr = PetscDrawAxisGetLimits(axis,&xl,&xr,&yl,&yr);CHKERRQ(ierr);
502d0c080abSJoseph Pusztay   if (!step) {
503d0c080abSJoseph Pusztay     ierr = PetscDrawClear(draw);CHKERRQ(ierr);
504d0c080abSJoseph Pusztay     ierr = PetscDrawAxisDraw(axis);CHKERRQ(ierr);
505d0c080abSJoseph Pusztay   }
506d0c080abSJoseph Pusztay 
507d0c080abSJoseph Pusztay   ierr = VecGetArrayRead(u,&U);CHKERRQ(ierr);
508d0c080abSJoseph Pusztay   U0 = PetscRealPart(U[0]);
509d0c080abSJoseph Pusztay   U1 = PetscRealPart(U[1]);
510d0c080abSJoseph Pusztay   ierr = VecRestoreArrayRead(u,&U);CHKERRQ(ierr);
511d0c080abSJoseph Pusztay   if ((U0 < xl) || (U1 < yl) || (U0 > xr) || (U1 > yr)) PetscFunctionReturn(0);
512d0c080abSJoseph Pusztay 
513d0c080abSJoseph Pusztay   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
514d0c080abSJoseph Pusztay   ierr = PetscDrawPoint(draw,U0,U1,PETSC_DRAW_BLACK);CHKERRQ(ierr);
515d0c080abSJoseph Pusztay   if (ictx->showtimestepandtime) {
516d0c080abSJoseph Pusztay     ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
517d0c080abSJoseph Pusztay     ierr = PetscSNPrintf(time,32,"Timestep %d Time %g",(int)step,(double)ptime);CHKERRQ(ierr);
518d0c080abSJoseph Pusztay     h    = yl + .95*(yr - yl);
519d0c080abSJoseph Pusztay     ierr = PetscDrawStringCentered(draw,.5*(xl+xr),h,PETSC_DRAW_BLACK,time);CHKERRQ(ierr);
520d0c080abSJoseph Pusztay   }
521d0c080abSJoseph Pusztay   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
522d0c080abSJoseph Pusztay   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
523d0c080abSJoseph Pusztay   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
524d0c080abSJoseph Pusztay   ierr = PetscDrawSave(draw);CHKERRQ(ierr);
525d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
526d0c080abSJoseph Pusztay }
527d0c080abSJoseph Pusztay 
528d0c080abSJoseph Pusztay /*@C
529d0c080abSJoseph Pusztay    TSMonitorDrawCtxDestroy - Destroys the monitor context for TSMonitorDrawSolution()
530d0c080abSJoseph Pusztay 
531d0c080abSJoseph Pusztay    Collective on TS
532d0c080abSJoseph Pusztay 
533d0c080abSJoseph Pusztay    Input Parameters:
534d0c080abSJoseph Pusztay .    ctx - the monitor context
535d0c080abSJoseph Pusztay 
536d0c080abSJoseph Pusztay    Level: intermediate
537d0c080abSJoseph Pusztay 
538d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorDrawSolution(), TSMonitorDrawError()
539d0c080abSJoseph Pusztay @*/
540d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorDrawCtxDestroy(TSMonitorDrawCtx *ictx)
541d0c080abSJoseph Pusztay {
542d0c080abSJoseph Pusztay   PetscErrorCode ierr;
543d0c080abSJoseph Pusztay 
544d0c080abSJoseph Pusztay   PetscFunctionBegin;
545d0c080abSJoseph Pusztay   ierr = PetscViewerDestroy(&(*ictx)->viewer);CHKERRQ(ierr);
546d0c080abSJoseph Pusztay   ierr = VecDestroy(&(*ictx)->initialsolution);CHKERRQ(ierr);
547d0c080abSJoseph Pusztay   ierr = PetscFree(*ictx);CHKERRQ(ierr);
548d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
549d0c080abSJoseph Pusztay }
550d0c080abSJoseph Pusztay 
551d0c080abSJoseph Pusztay /*@C
552d0c080abSJoseph Pusztay    TSMonitorDrawCtxCreate - Creates the monitor context for TSMonitorDrawCtx
553d0c080abSJoseph Pusztay 
554d0c080abSJoseph Pusztay    Collective on TS
555d0c080abSJoseph Pusztay 
556d0c080abSJoseph Pusztay    Input Parameter:
557d0c080abSJoseph Pusztay .    ts - time-step context
558d0c080abSJoseph Pusztay 
559d0c080abSJoseph Pusztay    Output Patameter:
560d0c080abSJoseph Pusztay .    ctx - the monitor context
561d0c080abSJoseph Pusztay 
562d0c080abSJoseph Pusztay    Options Database:
563d0c080abSJoseph Pusztay .   -ts_monitor_draw_solution_initial - show initial solution as well as current solution
564d0c080abSJoseph Pusztay 
565d0c080abSJoseph Pusztay    Level: intermediate
566d0c080abSJoseph Pusztay 
567d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorDrawCtx()
568d0c080abSJoseph Pusztay @*/
569d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorDrawCtxCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscInt howoften,TSMonitorDrawCtx *ctx)
570d0c080abSJoseph Pusztay {
571d0c080abSJoseph Pusztay   PetscErrorCode   ierr;
572d0c080abSJoseph Pusztay 
573d0c080abSJoseph Pusztay   PetscFunctionBegin;
574d0c080abSJoseph Pusztay   ierr = PetscNew(ctx);CHKERRQ(ierr);
575d0c080abSJoseph Pusztay   ierr = PetscViewerDrawOpen(comm,host,label,x,y,m,n,&(*ctx)->viewer);CHKERRQ(ierr);
576d0c080abSJoseph Pusztay   ierr = PetscViewerSetFromOptions((*ctx)->viewer);CHKERRQ(ierr);
577d0c080abSJoseph Pusztay 
578d0c080abSJoseph Pusztay   (*ctx)->howoften    = howoften;
579d0c080abSJoseph Pusztay   (*ctx)->showinitial = PETSC_FALSE;
580d0c080abSJoseph Pusztay   ierr = PetscOptionsGetBool(NULL,NULL,"-ts_monitor_draw_solution_initial",&(*ctx)->showinitial,NULL);CHKERRQ(ierr);
581d0c080abSJoseph Pusztay 
582d0c080abSJoseph Pusztay   (*ctx)->showtimestepandtime = PETSC_FALSE;
583d0c080abSJoseph Pusztay   ierr = PetscOptionsGetBool(NULL,NULL,"-ts_monitor_draw_solution_show_time",&(*ctx)->showtimestepandtime,NULL);CHKERRQ(ierr);
584d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
585d0c080abSJoseph Pusztay }
586d0c080abSJoseph Pusztay 
587d0c080abSJoseph Pusztay /*@C
588d0c080abSJoseph Pusztay    TSMonitorDrawSolutionFunction - Monitors progress of the TS solvers by calling
589d0c080abSJoseph Pusztay    VecView() for the solution provided by TSSetSolutionFunction() at each timestep
590d0c080abSJoseph Pusztay 
591d0c080abSJoseph Pusztay    Collective on TS
592d0c080abSJoseph Pusztay 
593d0c080abSJoseph Pusztay    Input Parameters:
594d0c080abSJoseph Pusztay +  ts - the TS context
595d0c080abSJoseph Pusztay .  step - current time-step
596d0c080abSJoseph Pusztay .  ptime - current time
597d0c080abSJoseph Pusztay -  dummy - either a viewer or NULL
598d0c080abSJoseph Pusztay 
599d0c080abSJoseph Pusztay    Options Database:
600d0c080abSJoseph Pusztay .  -ts_monitor_draw_solution_function - Monitor error graphically, requires user to have provided TSSetSolutionFunction()
601d0c080abSJoseph Pusztay 
602d0c080abSJoseph Pusztay    Level: intermediate
603d0c080abSJoseph Pusztay 
604d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSSetSolutionFunction()
605d0c080abSJoseph Pusztay @*/
606d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorDrawSolutionFunction(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy)
607d0c080abSJoseph Pusztay {
608d0c080abSJoseph Pusztay   PetscErrorCode   ierr;
609d0c080abSJoseph Pusztay   TSMonitorDrawCtx ctx    = (TSMonitorDrawCtx)dummy;
610d0c080abSJoseph Pusztay   PetscViewer      viewer = ctx->viewer;
611d0c080abSJoseph Pusztay   Vec              work;
612d0c080abSJoseph Pusztay 
613d0c080abSJoseph Pusztay   PetscFunctionBegin;
614d0c080abSJoseph Pusztay   if (!(((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason))) PetscFunctionReturn(0);
615d0c080abSJoseph Pusztay   ierr = VecDuplicate(u,&work);CHKERRQ(ierr);
616d0c080abSJoseph Pusztay   ierr = TSComputeSolutionFunction(ts,ptime,work);CHKERRQ(ierr);
617d0c080abSJoseph Pusztay   ierr = VecView(work,viewer);CHKERRQ(ierr);
618d0c080abSJoseph Pusztay   ierr = VecDestroy(&work);CHKERRQ(ierr);
619d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
620d0c080abSJoseph Pusztay }
621d0c080abSJoseph Pusztay 
622d0c080abSJoseph Pusztay /*@C
623d0c080abSJoseph Pusztay    TSMonitorDrawError - Monitors progress of the TS solvers by calling
624d0c080abSJoseph Pusztay    VecView() for the error at each timestep
625d0c080abSJoseph Pusztay 
626d0c080abSJoseph Pusztay    Collective on TS
627d0c080abSJoseph Pusztay 
628d0c080abSJoseph Pusztay    Input Parameters:
629d0c080abSJoseph Pusztay +  ts - the TS context
630d0c080abSJoseph Pusztay .  step - current time-step
631d0c080abSJoseph Pusztay .  ptime - current time
632d0c080abSJoseph Pusztay -  dummy - either a viewer or NULL
633d0c080abSJoseph Pusztay 
634d0c080abSJoseph Pusztay    Options Database:
635d0c080abSJoseph Pusztay .  -ts_monitor_draw_error - Monitor error graphically, requires user to have provided TSSetSolutionFunction()
636d0c080abSJoseph Pusztay 
637d0c080abSJoseph Pusztay    Level: intermediate
638d0c080abSJoseph Pusztay 
639d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSSetSolutionFunction()
640d0c080abSJoseph Pusztay @*/
641d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorDrawError(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy)
642d0c080abSJoseph Pusztay {
643d0c080abSJoseph Pusztay   PetscErrorCode   ierr;
644d0c080abSJoseph Pusztay   TSMonitorDrawCtx ctx    = (TSMonitorDrawCtx)dummy;
645d0c080abSJoseph Pusztay   PetscViewer      viewer = ctx->viewer;
646d0c080abSJoseph Pusztay   Vec              work;
647d0c080abSJoseph Pusztay 
648d0c080abSJoseph Pusztay   PetscFunctionBegin;
649d0c080abSJoseph Pusztay   if (!(((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason))) PetscFunctionReturn(0);
650d0c080abSJoseph Pusztay   ierr = VecDuplicate(u,&work);CHKERRQ(ierr);
651d0c080abSJoseph Pusztay   ierr = TSComputeSolutionFunction(ts,ptime,work);CHKERRQ(ierr);
652d0c080abSJoseph Pusztay   ierr = VecAXPY(work,-1.0,u);CHKERRQ(ierr);
653d0c080abSJoseph Pusztay   ierr = VecView(work,viewer);CHKERRQ(ierr);
654d0c080abSJoseph Pusztay   ierr = VecDestroy(&work);CHKERRQ(ierr);
655d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
656d0c080abSJoseph Pusztay }
657d0c080abSJoseph Pusztay 
658d0c080abSJoseph Pusztay /*@C
659d0c080abSJoseph Pusztay    TSMonitorSolution - Monitors progress of the TS solvers by VecView() for the solution at each timestep. Normally the viewer is a binary file or a PetscDraw object
660d0c080abSJoseph Pusztay 
661d0c080abSJoseph Pusztay    Collective on TS
662d0c080abSJoseph Pusztay 
663d0c080abSJoseph Pusztay    Input Parameters:
664d0c080abSJoseph Pusztay +  ts - the TS context
665d0c080abSJoseph Pusztay .  step - current time-step
666d0c080abSJoseph Pusztay .  ptime - current time
667d0c080abSJoseph Pusztay .  u - current state
668d0c080abSJoseph Pusztay -  vf - viewer and its format
669d0c080abSJoseph Pusztay 
670d0c080abSJoseph Pusztay    Level: intermediate
671d0c080abSJoseph Pusztay 
672d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView()
673d0c080abSJoseph Pusztay @*/
674d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorSolution(TS ts,PetscInt step,PetscReal ptime,Vec u,PetscViewerAndFormat *vf)
675d0c080abSJoseph Pusztay {
676d0c080abSJoseph Pusztay   PetscErrorCode ierr;
677d0c080abSJoseph Pusztay 
678d0c080abSJoseph Pusztay   PetscFunctionBegin;
679d0c080abSJoseph Pusztay   ierr = PetscViewerPushFormat(vf->viewer,vf->format);CHKERRQ(ierr);
680d0c080abSJoseph Pusztay   ierr = VecView(u,vf->viewer);CHKERRQ(ierr);
681d0c080abSJoseph Pusztay   ierr = PetscViewerPopFormat(vf->viewer);CHKERRQ(ierr);
682d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
683d0c080abSJoseph Pusztay }
684d0c080abSJoseph Pusztay 
685d0c080abSJoseph Pusztay /*@C
686d0c080abSJoseph Pusztay    TSMonitorSolutionVTK - Monitors progress of the TS solvers by VecView() for the solution at each timestep.
687d0c080abSJoseph Pusztay 
688d0c080abSJoseph Pusztay    Collective on TS
689d0c080abSJoseph Pusztay 
690d0c080abSJoseph Pusztay    Input Parameters:
691d0c080abSJoseph Pusztay +  ts - the TS context
692d0c080abSJoseph Pusztay .  step - current time-step
693d0c080abSJoseph Pusztay .  ptime - current time
694d0c080abSJoseph Pusztay .  u - current state
695d0c080abSJoseph Pusztay -  filenametemplate - string containing a format specifier for the integer time step (e.g. %03D)
696d0c080abSJoseph Pusztay 
697d0c080abSJoseph Pusztay    Level: intermediate
698d0c080abSJoseph Pusztay 
699d0c080abSJoseph Pusztay    Notes:
700d0c080abSJoseph Pusztay    The VTK format does not allow writing multiple time steps in the same file, therefore a different file will be written for each time step.
701d0c080abSJoseph Pusztay    These are named according to the file name template.
702d0c080abSJoseph Pusztay 
703d0c080abSJoseph Pusztay    This function is normally passed as an argument to TSMonitorSet() along with TSMonitorSolutionVTKDestroy().
704d0c080abSJoseph Pusztay 
705d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView()
706d0c080abSJoseph Pusztay @*/
707d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSolutionVTK(TS ts,PetscInt step,PetscReal ptime,Vec u,void *filenametemplate)
708d0c080abSJoseph Pusztay {
709d0c080abSJoseph Pusztay   PetscErrorCode ierr;
710d0c080abSJoseph Pusztay   char           filename[PETSC_MAX_PATH_LEN];
711d0c080abSJoseph Pusztay   PetscViewer    viewer;
712d0c080abSJoseph Pusztay 
713d0c080abSJoseph Pusztay   PetscFunctionBegin;
714d0c080abSJoseph Pusztay   if (step < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */
715d0c080abSJoseph Pusztay   ierr = PetscSNPrintf(filename,sizeof(filename),(const char*)filenametemplate,step);CHKERRQ(ierr);
716d0c080abSJoseph Pusztay   ierr = PetscViewerVTKOpen(PetscObjectComm((PetscObject)ts),filename,FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
717d0c080abSJoseph Pusztay   ierr = VecView(u,viewer);CHKERRQ(ierr);
718d0c080abSJoseph Pusztay   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
719d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
720d0c080abSJoseph Pusztay }
721d0c080abSJoseph Pusztay 
722d0c080abSJoseph Pusztay /*@C
723d0c080abSJoseph Pusztay    TSMonitorSolutionVTKDestroy - Destroy context for monitoring
724d0c080abSJoseph Pusztay 
725d0c080abSJoseph Pusztay    Collective on TS
726d0c080abSJoseph Pusztay 
727d0c080abSJoseph Pusztay    Input Parameters:
728d0c080abSJoseph Pusztay .  filenametemplate - string containing a format specifier for the integer time step (e.g. %03D)
729d0c080abSJoseph Pusztay 
730d0c080abSJoseph Pusztay    Level: intermediate
731d0c080abSJoseph Pusztay 
732d0c080abSJoseph Pusztay    Note:
733d0c080abSJoseph Pusztay    This function is normally passed to TSMonitorSet() along with TSMonitorSolutionVTK().
734d0c080abSJoseph Pusztay 
735d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorSolutionVTK()
736d0c080abSJoseph Pusztay @*/
737d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSolutionVTKDestroy(void *filenametemplate)
738d0c080abSJoseph Pusztay {
739d0c080abSJoseph Pusztay   PetscErrorCode ierr;
740d0c080abSJoseph Pusztay 
741d0c080abSJoseph Pusztay   PetscFunctionBegin;
742d0c080abSJoseph Pusztay   ierr = PetscFree(*(char**)filenametemplate);CHKERRQ(ierr);
743d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
744d0c080abSJoseph Pusztay }
745d0c080abSJoseph Pusztay 
746d0c080abSJoseph Pusztay /*@C
747d0c080abSJoseph Pusztay    TSMonitorLGSolution - Monitors progress of the TS solvers by plotting each component of the solution vector
748d0c080abSJoseph Pusztay        in a time based line graph
749d0c080abSJoseph Pusztay 
750d0c080abSJoseph Pusztay    Collective on TS
751d0c080abSJoseph Pusztay 
752d0c080abSJoseph Pusztay    Input Parameters:
753d0c080abSJoseph Pusztay +  ts - the TS context
754d0c080abSJoseph Pusztay .  step - current time-step
755d0c080abSJoseph Pusztay .  ptime - current time
756d0c080abSJoseph Pusztay .  u - current solution
757d0c080abSJoseph Pusztay -  dctx - the TSMonitorLGCtx object that contains all the options for the monitoring, this is created with TSMonitorLGCtxCreate()
758d0c080abSJoseph Pusztay 
759d0c080abSJoseph Pusztay    Options Database:
760d0c080abSJoseph Pusztay .   -ts_monitor_lg_solution_variables
761d0c080abSJoseph Pusztay 
762d0c080abSJoseph Pusztay    Level: intermediate
763d0c080abSJoseph Pusztay 
764d0c080abSJoseph Pusztay    Notes:
765d0c080abSJoseph Pusztay     Each process in a parallel run displays its component solutions in a separate window
766d0c080abSJoseph Pusztay 
767d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGCtxCreate(), TSMonitorLGCtxSetVariableNames(), TSMonitorLGCtxGetVariableNames(),
768d0c080abSJoseph Pusztay            TSMonitorLGSetVariableNames(), TSMonitorLGGetVariableNames(), TSMonitorLGSetDisplayVariables(), TSMonitorLGCtxSetDisplayVariables(),
769d0c080abSJoseph Pusztay            TSMonitorLGCtxSetTransform(), TSMonitorLGSetTransform(), TSMonitorLGError(), TSMonitorLGSNESIterations(), TSMonitorLGKSPIterations(),
770d0c080abSJoseph Pusztay            TSMonitorEnvelopeCtxCreate(), TSMonitorEnvelopeGetBounds(), TSMonitorEnvelopeCtxDestroy(), TSMonitorEnvelop()
771d0c080abSJoseph Pusztay @*/
772d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGSolution(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dctx)
773d0c080abSJoseph Pusztay {
774d0c080abSJoseph Pusztay   PetscErrorCode    ierr;
775d0c080abSJoseph Pusztay   TSMonitorLGCtx    ctx = (TSMonitorLGCtx)dctx;
776d0c080abSJoseph Pusztay   const PetscScalar *yy;
777d0c080abSJoseph Pusztay   Vec               v;
778d0c080abSJoseph Pusztay 
779d0c080abSJoseph Pusztay   PetscFunctionBegin;
780d0c080abSJoseph Pusztay   if (step < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */
781d0c080abSJoseph Pusztay   if (!step) {
782d0c080abSJoseph Pusztay     PetscDrawAxis axis;
783d0c080abSJoseph Pusztay     PetscInt      dim;
784d0c080abSJoseph Pusztay     ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr);
785d0c080abSJoseph Pusztay     ierr = PetscDrawAxisSetLabels(axis,"Solution as function of time","Time","Solution");CHKERRQ(ierr);
786d0c080abSJoseph Pusztay     if (!ctx->names) {
787d0c080abSJoseph Pusztay       PetscBool flg;
788d0c080abSJoseph Pusztay       /* user provides names of variables to plot but no names has been set so assume names are integer values */
789d0c080abSJoseph Pusztay       ierr = PetscOptionsHasName(((PetscObject)ts)->options,((PetscObject)ts)->prefix,"-ts_monitor_lg_solution_variables",&flg);CHKERRQ(ierr);
790d0c080abSJoseph Pusztay       if (flg) {
791d0c080abSJoseph Pusztay         PetscInt i,n;
792d0c080abSJoseph Pusztay         char     **names;
793d0c080abSJoseph Pusztay         ierr = VecGetSize(u,&n);CHKERRQ(ierr);
794d0c080abSJoseph Pusztay         ierr = PetscMalloc1(n+1,&names);CHKERRQ(ierr);
795d0c080abSJoseph Pusztay         for (i=0; i<n; i++) {
796d0c080abSJoseph Pusztay           ierr = PetscMalloc1(5,&names[i]);CHKERRQ(ierr);
797d0c080abSJoseph Pusztay           ierr = PetscSNPrintf(names[i],5,"%D",i);CHKERRQ(ierr);
798d0c080abSJoseph Pusztay         }
799d0c080abSJoseph Pusztay         names[n] = NULL;
800d0c080abSJoseph Pusztay         ctx->names = names;
801d0c080abSJoseph Pusztay       }
802d0c080abSJoseph Pusztay     }
803d0c080abSJoseph Pusztay     if (ctx->names && !ctx->displaynames) {
804d0c080abSJoseph Pusztay       char      **displaynames;
805d0c080abSJoseph Pusztay       PetscBool flg;
806d0c080abSJoseph Pusztay       ierr = VecGetLocalSize(u,&dim);CHKERRQ(ierr);
807d0c080abSJoseph Pusztay       ierr = PetscCalloc1(dim+1,&displaynames);CHKERRQ(ierr);
808d0c080abSJoseph Pusztay       ierr = PetscOptionsGetStringArray(((PetscObject)ts)->options,((PetscObject)ts)->prefix,"-ts_monitor_lg_solution_variables",displaynames,&dim,&flg);CHKERRQ(ierr);
809d0c080abSJoseph Pusztay       if (flg) {
810d0c080abSJoseph Pusztay         ierr = TSMonitorLGCtxSetDisplayVariables(ctx,(const char *const *)displaynames);CHKERRQ(ierr);
811d0c080abSJoseph Pusztay       }
812d0c080abSJoseph Pusztay       ierr = PetscStrArrayDestroy(&displaynames);CHKERRQ(ierr);
813d0c080abSJoseph Pusztay     }
814d0c080abSJoseph Pusztay     if (ctx->displaynames) {
815d0c080abSJoseph Pusztay       ierr = PetscDrawLGSetDimension(ctx->lg,ctx->ndisplayvariables);CHKERRQ(ierr);
816d0c080abSJoseph Pusztay       ierr = PetscDrawLGSetLegend(ctx->lg,(const char *const *)ctx->displaynames);CHKERRQ(ierr);
817d0c080abSJoseph Pusztay     } else if (ctx->names) {
818d0c080abSJoseph Pusztay       ierr = VecGetLocalSize(u,&dim);CHKERRQ(ierr);
819d0c080abSJoseph Pusztay       ierr = PetscDrawLGSetDimension(ctx->lg,dim);CHKERRQ(ierr);
820d0c080abSJoseph Pusztay       ierr = PetscDrawLGSetLegend(ctx->lg,(const char *const *)ctx->names);CHKERRQ(ierr);
821d0c080abSJoseph Pusztay     } else {
822d0c080abSJoseph Pusztay       ierr = VecGetLocalSize(u,&dim);CHKERRQ(ierr);
823d0c080abSJoseph Pusztay       ierr = PetscDrawLGSetDimension(ctx->lg,dim);CHKERRQ(ierr);
824d0c080abSJoseph Pusztay     }
825d0c080abSJoseph Pusztay     ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr);
826d0c080abSJoseph Pusztay   }
827d0c080abSJoseph Pusztay 
828d0c080abSJoseph Pusztay   if (!ctx->transform) v = u;
829d0c080abSJoseph Pusztay   else {ierr = (*ctx->transform)(ctx->transformctx,u,&v);CHKERRQ(ierr);}
830d0c080abSJoseph Pusztay   ierr = VecGetArrayRead(v,&yy);CHKERRQ(ierr);
831d0c080abSJoseph Pusztay   if (ctx->displaynames) {
832d0c080abSJoseph Pusztay     PetscInt i;
833d0c080abSJoseph Pusztay     for (i=0; i<ctx->ndisplayvariables; i++)
834d0c080abSJoseph Pusztay       ctx->displayvalues[i] = PetscRealPart(yy[ctx->displayvariables[i]]);
835d0c080abSJoseph Pusztay     ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,ctx->displayvalues);CHKERRQ(ierr);
836d0c080abSJoseph Pusztay   } else {
837d0c080abSJoseph Pusztay #if defined(PETSC_USE_COMPLEX)
838d0c080abSJoseph Pusztay     PetscInt  i,n;
839d0c080abSJoseph Pusztay     PetscReal *yreal;
840d0c080abSJoseph Pusztay     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
841d0c080abSJoseph Pusztay     ierr = PetscMalloc1(n,&yreal);CHKERRQ(ierr);
842d0c080abSJoseph Pusztay     for (i=0; i<n; i++) yreal[i] = PetscRealPart(yy[i]);
843d0c080abSJoseph Pusztay     ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,yreal);CHKERRQ(ierr);
844d0c080abSJoseph Pusztay     ierr = PetscFree(yreal);CHKERRQ(ierr);
845d0c080abSJoseph Pusztay #else
846d0c080abSJoseph Pusztay     ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,yy);CHKERRQ(ierr);
847d0c080abSJoseph Pusztay #endif
848d0c080abSJoseph Pusztay   }
849d0c080abSJoseph Pusztay   ierr = VecRestoreArrayRead(v,&yy);CHKERRQ(ierr);
850d0c080abSJoseph Pusztay   if (ctx->transform) {ierr = VecDestroy(&v);CHKERRQ(ierr);}
851d0c080abSJoseph Pusztay 
852d0c080abSJoseph Pusztay   if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) {
853d0c080abSJoseph Pusztay     ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr);
854d0c080abSJoseph Pusztay     ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr);
855d0c080abSJoseph Pusztay   }
856d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
857d0c080abSJoseph Pusztay }
858d0c080abSJoseph Pusztay 
859d0c080abSJoseph Pusztay /*@C
860d0c080abSJoseph Pusztay    TSMonitorLGSetVariableNames - Sets the name of each component in the solution vector so that it may be displayed in the plot
861d0c080abSJoseph Pusztay 
862d0c080abSJoseph Pusztay    Collective on TS
863d0c080abSJoseph Pusztay 
864d0c080abSJoseph Pusztay    Input Parameters:
865d0c080abSJoseph Pusztay +  ts - the TS context
866d0c080abSJoseph Pusztay -  names - the names of the components, final string must be NULL
867d0c080abSJoseph Pusztay 
868d0c080abSJoseph Pusztay    Level: intermediate
869d0c080abSJoseph Pusztay 
870d0c080abSJoseph Pusztay    Notes:
871d0c080abSJoseph Pusztay     If the TS object does not have a TSMonitorLGCtx associated with it then this function is ignored
872d0c080abSJoseph Pusztay 
873d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetDisplayVariables(), TSMonitorLGCtxSetVariableNames()
874d0c080abSJoseph Pusztay @*/
875d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGSetVariableNames(TS ts,const char * const *names)
876d0c080abSJoseph Pusztay {
877d0c080abSJoseph Pusztay   PetscErrorCode    ierr;
878d0c080abSJoseph Pusztay   PetscInt          i;
879d0c080abSJoseph Pusztay 
880d0c080abSJoseph Pusztay   PetscFunctionBegin;
881d0c080abSJoseph Pusztay   for (i=0; i<ts->numbermonitors; i++) {
882d0c080abSJoseph Pusztay     if (ts->monitor[i] == TSMonitorLGSolution) {
883d0c080abSJoseph Pusztay       ierr = TSMonitorLGCtxSetVariableNames((TSMonitorLGCtx)ts->monitorcontext[i],names);CHKERRQ(ierr);
884d0c080abSJoseph Pusztay       break;
885d0c080abSJoseph Pusztay     }
886d0c080abSJoseph Pusztay   }
887d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
888d0c080abSJoseph Pusztay }
889d0c080abSJoseph Pusztay 
890d0c080abSJoseph Pusztay /*@C
891d0c080abSJoseph Pusztay    TSMonitorLGCtxSetVariableNames - Sets the name of each component in the solution vector so that it may be displayed in the plot
892d0c080abSJoseph Pusztay 
893d0c080abSJoseph Pusztay    Collective on TS
894d0c080abSJoseph Pusztay 
895d0c080abSJoseph Pusztay    Input Parameters:
896d0c080abSJoseph Pusztay +  ts - the TS context
897d0c080abSJoseph Pusztay -  names - the names of the components, final string must be NULL
898d0c080abSJoseph Pusztay 
899d0c080abSJoseph Pusztay    Level: intermediate
900d0c080abSJoseph Pusztay 
901d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetDisplayVariables(), TSMonitorLGSetVariableNames()
902d0c080abSJoseph Pusztay @*/
903d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGCtxSetVariableNames(TSMonitorLGCtx ctx,const char * const *names)
904d0c080abSJoseph Pusztay {
905d0c080abSJoseph Pusztay   PetscErrorCode    ierr;
906d0c080abSJoseph Pusztay 
907d0c080abSJoseph Pusztay   PetscFunctionBegin;
908d0c080abSJoseph Pusztay   ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr);
909d0c080abSJoseph Pusztay   ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr);
910d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
911d0c080abSJoseph Pusztay }
912d0c080abSJoseph Pusztay 
913d0c080abSJoseph Pusztay /*@C
914d0c080abSJoseph Pusztay    TSMonitorLGGetVariableNames - Gets the name of each component in the solution vector so that it may be displayed in the plot
915d0c080abSJoseph Pusztay 
916d0c080abSJoseph Pusztay    Collective on TS
917d0c080abSJoseph Pusztay 
918d0c080abSJoseph Pusztay    Input Parameter:
919d0c080abSJoseph Pusztay .  ts - the TS context
920d0c080abSJoseph Pusztay 
921d0c080abSJoseph Pusztay    Output Parameter:
922d0c080abSJoseph Pusztay .  names - the names of the components, final string must be NULL
923d0c080abSJoseph Pusztay 
924d0c080abSJoseph Pusztay    Level: intermediate
925d0c080abSJoseph Pusztay 
926d0c080abSJoseph Pusztay    Notes:
927d0c080abSJoseph Pusztay     If the TS object does not have a TSMonitorLGCtx associated with it then this function is ignored
928d0c080abSJoseph Pusztay 
929d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetDisplayVariables()
930d0c080abSJoseph Pusztay @*/
931d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGGetVariableNames(TS ts,const char *const **names)
932d0c080abSJoseph Pusztay {
933d0c080abSJoseph Pusztay   PetscInt       i;
934d0c080abSJoseph Pusztay 
935d0c080abSJoseph Pusztay   PetscFunctionBegin;
936d0c080abSJoseph Pusztay   *names = NULL;
937d0c080abSJoseph Pusztay   for (i=0; i<ts->numbermonitors; i++) {
938d0c080abSJoseph Pusztay     if (ts->monitor[i] == TSMonitorLGSolution) {
939d0c080abSJoseph Pusztay       TSMonitorLGCtx  ctx = (TSMonitorLGCtx) ts->monitorcontext[i];
940d0c080abSJoseph Pusztay       *names = (const char *const *)ctx->names;
941d0c080abSJoseph Pusztay       break;
942d0c080abSJoseph Pusztay     }
943d0c080abSJoseph Pusztay   }
944d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
945d0c080abSJoseph Pusztay }
946d0c080abSJoseph Pusztay 
947d0c080abSJoseph Pusztay /*@C
948d0c080abSJoseph Pusztay    TSMonitorLGCtxSetDisplayVariables - Sets the variables that are to be display in the monitor
949d0c080abSJoseph Pusztay 
950d0c080abSJoseph Pusztay    Collective on TS
951d0c080abSJoseph Pusztay 
952d0c080abSJoseph Pusztay    Input Parameters:
953d0c080abSJoseph Pusztay +  ctx - the TSMonitorLG context
954d0c080abSJoseph Pusztay -  displaynames - the names of the components, final string must be NULL
955d0c080abSJoseph Pusztay 
956d0c080abSJoseph Pusztay    Level: intermediate
957d0c080abSJoseph Pusztay 
958d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetVariableNames()
959d0c080abSJoseph Pusztay @*/
960d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGCtxSetDisplayVariables(TSMonitorLGCtx ctx,const char * const *displaynames)
961d0c080abSJoseph Pusztay {
962d0c080abSJoseph Pusztay   PetscInt          j = 0,k;
963d0c080abSJoseph Pusztay   PetscErrorCode    ierr;
964d0c080abSJoseph Pusztay 
965d0c080abSJoseph Pusztay   PetscFunctionBegin;
966d0c080abSJoseph Pusztay   if (!ctx->names) PetscFunctionReturn(0);
967d0c080abSJoseph Pusztay   ierr = PetscStrArrayDestroy(&ctx->displaynames);CHKERRQ(ierr);
968d0c080abSJoseph Pusztay   ierr = PetscStrArrayallocpy(displaynames,&ctx->displaynames);CHKERRQ(ierr);
969d0c080abSJoseph Pusztay   while (displaynames[j]) j++;
970d0c080abSJoseph Pusztay   ctx->ndisplayvariables = j;
971d0c080abSJoseph Pusztay   ierr = PetscMalloc1(ctx->ndisplayvariables,&ctx->displayvariables);CHKERRQ(ierr);
972d0c080abSJoseph Pusztay   ierr = PetscMalloc1(ctx->ndisplayvariables,&ctx->displayvalues);CHKERRQ(ierr);
973d0c080abSJoseph Pusztay   j = 0;
974d0c080abSJoseph Pusztay   while (displaynames[j]) {
975d0c080abSJoseph Pusztay     k = 0;
976d0c080abSJoseph Pusztay     while (ctx->names[k]) {
977d0c080abSJoseph Pusztay       PetscBool flg;
978d0c080abSJoseph Pusztay       ierr = PetscStrcmp(displaynames[j],ctx->names[k],&flg);CHKERRQ(ierr);
979d0c080abSJoseph Pusztay       if (flg) {
980d0c080abSJoseph Pusztay         ctx->displayvariables[j] = k;
981d0c080abSJoseph Pusztay         break;
982d0c080abSJoseph Pusztay       }
983d0c080abSJoseph Pusztay       k++;
984d0c080abSJoseph Pusztay     }
985d0c080abSJoseph Pusztay     j++;
986d0c080abSJoseph Pusztay   }
987d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
988d0c080abSJoseph Pusztay }
989d0c080abSJoseph Pusztay 
990d0c080abSJoseph Pusztay /*@C
991d0c080abSJoseph Pusztay    TSMonitorLGSetDisplayVariables - Sets the variables that are to be display in the monitor
992d0c080abSJoseph Pusztay 
993d0c080abSJoseph Pusztay    Collective on TS
994d0c080abSJoseph Pusztay 
995d0c080abSJoseph Pusztay    Input Parameters:
996d0c080abSJoseph Pusztay +  ts - the TS context
997d0c080abSJoseph Pusztay -  displaynames - the names of the components, final string must be NULL
998d0c080abSJoseph Pusztay 
999d0c080abSJoseph Pusztay    Notes:
1000d0c080abSJoseph Pusztay     If the TS object does not have a TSMonitorLGCtx associated with it then this function is ignored
1001d0c080abSJoseph Pusztay 
1002d0c080abSJoseph Pusztay    Level: intermediate
1003d0c080abSJoseph Pusztay 
1004d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetVariableNames()
1005d0c080abSJoseph Pusztay @*/
1006d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGSetDisplayVariables(TS ts,const char * const *displaynames)
1007d0c080abSJoseph Pusztay {
1008d0c080abSJoseph Pusztay   PetscInt          i;
1009d0c080abSJoseph Pusztay   PetscErrorCode    ierr;
1010d0c080abSJoseph Pusztay 
1011d0c080abSJoseph Pusztay   PetscFunctionBegin;
1012d0c080abSJoseph Pusztay   for (i=0; i<ts->numbermonitors; i++) {
1013d0c080abSJoseph Pusztay     if (ts->monitor[i] == TSMonitorLGSolution) {
1014d0c080abSJoseph Pusztay       ierr = TSMonitorLGCtxSetDisplayVariables((TSMonitorLGCtx)ts->monitorcontext[i],displaynames);CHKERRQ(ierr);
1015d0c080abSJoseph Pusztay       break;
1016d0c080abSJoseph Pusztay     }
1017d0c080abSJoseph Pusztay   }
1018d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1019d0c080abSJoseph Pusztay }
1020d0c080abSJoseph Pusztay 
1021d0c080abSJoseph Pusztay /*@C
1022d0c080abSJoseph Pusztay    TSMonitorLGSetTransform - Solution vector will be transformed by provided function before being displayed
1023d0c080abSJoseph Pusztay 
1024d0c080abSJoseph Pusztay    Collective on TS
1025d0c080abSJoseph Pusztay 
1026d0c080abSJoseph Pusztay    Input Parameters:
1027d0c080abSJoseph Pusztay +  ts - the TS context
1028d0c080abSJoseph Pusztay .  transform - the transform function
1029d0c080abSJoseph Pusztay .  destroy - function to destroy the optional context
1030d0c080abSJoseph Pusztay -  ctx - optional context used by transform function
1031d0c080abSJoseph Pusztay 
1032d0c080abSJoseph Pusztay    Notes:
1033d0c080abSJoseph Pusztay     If the TS object does not have a TSMonitorLGCtx associated with it then this function is ignored
1034d0c080abSJoseph Pusztay 
1035d0c080abSJoseph Pusztay    Level: intermediate
1036d0c080abSJoseph Pusztay 
1037d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetVariableNames(), TSMonitorLGCtxSetTransform()
1038d0c080abSJoseph Pusztay @*/
1039d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGSetTransform(TS ts,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
1040d0c080abSJoseph Pusztay {
1041d0c080abSJoseph Pusztay   PetscInt          i;
1042d0c080abSJoseph Pusztay   PetscErrorCode    ierr;
1043d0c080abSJoseph Pusztay 
1044d0c080abSJoseph Pusztay   PetscFunctionBegin;
1045d0c080abSJoseph Pusztay   for (i=0; i<ts->numbermonitors; i++) {
1046d0c080abSJoseph Pusztay     if (ts->monitor[i] == TSMonitorLGSolution) {
1047d0c080abSJoseph Pusztay       ierr = TSMonitorLGCtxSetTransform((TSMonitorLGCtx)ts->monitorcontext[i],transform,destroy,tctx);CHKERRQ(ierr);
1048d0c080abSJoseph Pusztay     }
1049d0c080abSJoseph Pusztay   }
1050d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1051d0c080abSJoseph Pusztay }
1052d0c080abSJoseph Pusztay 
1053d0c080abSJoseph Pusztay /*@C
1054d0c080abSJoseph Pusztay    TSMonitorLGCtxSetTransform - Solution vector will be transformed by provided function before being displayed
1055d0c080abSJoseph Pusztay 
1056d0c080abSJoseph Pusztay    Collective on TSLGCtx
1057d0c080abSJoseph Pusztay 
1058d0c080abSJoseph Pusztay    Input Parameters:
1059d0c080abSJoseph Pusztay +  ts - the TS context
1060d0c080abSJoseph Pusztay .  transform - the transform function
1061d0c080abSJoseph Pusztay .  destroy - function to destroy the optional context
1062d0c080abSJoseph Pusztay -  ctx - optional context used by transform function
1063d0c080abSJoseph Pusztay 
1064d0c080abSJoseph Pusztay    Level: intermediate
1065d0c080abSJoseph Pusztay 
1066d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetVariableNames(), TSMonitorLGSetTransform()
1067d0c080abSJoseph Pusztay @*/
1068d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGCtxSetTransform(TSMonitorLGCtx ctx,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
1069d0c080abSJoseph Pusztay {
1070d0c080abSJoseph Pusztay   PetscFunctionBegin;
1071d0c080abSJoseph Pusztay   ctx->transform    = transform;
1072d0c080abSJoseph Pusztay   ctx->transformdestroy = destroy;
1073d0c080abSJoseph Pusztay   ctx->transformctx = tctx;
1074d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1075d0c080abSJoseph Pusztay }
1076d0c080abSJoseph Pusztay 
1077d0c080abSJoseph Pusztay /*@C
1078d0c080abSJoseph Pusztay    TSMonitorLGError - Monitors progress of the TS solvers by plotting each component of the error
1079d0c080abSJoseph Pusztay        in a time based line graph
1080d0c080abSJoseph Pusztay 
1081d0c080abSJoseph Pusztay    Collective on TS
1082d0c080abSJoseph Pusztay 
1083d0c080abSJoseph Pusztay    Input Parameters:
1084d0c080abSJoseph Pusztay +  ts - the TS context
1085d0c080abSJoseph Pusztay .  step - current time-step
1086d0c080abSJoseph Pusztay .  ptime - current time
1087d0c080abSJoseph Pusztay .  u - current solution
1088d0c080abSJoseph Pusztay -  dctx - TSMonitorLGCtx object created with TSMonitorLGCtxCreate()
1089d0c080abSJoseph Pusztay 
1090d0c080abSJoseph Pusztay    Level: intermediate
1091d0c080abSJoseph Pusztay 
1092d0c080abSJoseph Pusztay    Notes:
1093d0c080abSJoseph Pusztay     Each process in a parallel run displays its component errors in a separate window
1094d0c080abSJoseph Pusztay 
1095d0c080abSJoseph Pusztay    The user must provide the solution using TSSetSolutionFunction() to use this monitor.
1096d0c080abSJoseph Pusztay 
1097d0c080abSJoseph Pusztay    Options Database Keys:
1098d0c080abSJoseph Pusztay .  -ts_monitor_lg_error - create a graphical monitor of error history
1099d0c080abSJoseph Pusztay 
1100d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSSetSolutionFunction()
1101d0c080abSJoseph Pusztay @*/
1102d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorLGError(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy)
1103d0c080abSJoseph Pusztay {
1104d0c080abSJoseph Pusztay   PetscErrorCode    ierr;
1105d0c080abSJoseph Pusztay   TSMonitorLGCtx    ctx = (TSMonitorLGCtx)dummy;
1106d0c080abSJoseph Pusztay   const PetscScalar *yy;
1107d0c080abSJoseph Pusztay   Vec               y;
1108d0c080abSJoseph Pusztay 
1109d0c080abSJoseph Pusztay   PetscFunctionBegin;
1110d0c080abSJoseph Pusztay   if (!step) {
1111d0c080abSJoseph Pusztay     PetscDrawAxis axis;
1112d0c080abSJoseph Pusztay     PetscInt      dim;
1113d0c080abSJoseph Pusztay     ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr);
1114d0c080abSJoseph Pusztay     ierr = PetscDrawAxisSetLabels(axis,"Error in solution as function of time","Time","Error");CHKERRQ(ierr);
1115d0c080abSJoseph Pusztay     ierr = VecGetLocalSize(u,&dim);CHKERRQ(ierr);
1116d0c080abSJoseph Pusztay     ierr = PetscDrawLGSetDimension(ctx->lg,dim);CHKERRQ(ierr);
1117d0c080abSJoseph Pusztay     ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr);
1118d0c080abSJoseph Pusztay   }
1119d0c080abSJoseph Pusztay   ierr = VecDuplicate(u,&y);CHKERRQ(ierr);
1120d0c080abSJoseph Pusztay   ierr = TSComputeSolutionFunction(ts,ptime,y);CHKERRQ(ierr);
1121d0c080abSJoseph Pusztay   ierr = VecAXPY(y,-1.0,u);CHKERRQ(ierr);
1122d0c080abSJoseph Pusztay   ierr = VecGetArrayRead(y,&yy);CHKERRQ(ierr);
1123d0c080abSJoseph Pusztay #if defined(PETSC_USE_COMPLEX)
1124d0c080abSJoseph Pusztay   {
1125d0c080abSJoseph Pusztay     PetscReal *yreal;
1126d0c080abSJoseph Pusztay     PetscInt  i,n;
1127d0c080abSJoseph Pusztay     ierr = VecGetLocalSize(y,&n);CHKERRQ(ierr);
1128d0c080abSJoseph Pusztay     ierr = PetscMalloc1(n,&yreal);CHKERRQ(ierr);
1129d0c080abSJoseph Pusztay     for (i=0; i<n; i++) yreal[i] = PetscRealPart(yy[i]);
1130d0c080abSJoseph Pusztay     ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,yreal);CHKERRQ(ierr);
1131d0c080abSJoseph Pusztay     ierr = PetscFree(yreal);CHKERRQ(ierr);
1132d0c080abSJoseph Pusztay   }
1133d0c080abSJoseph Pusztay #else
1134d0c080abSJoseph Pusztay   ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,yy);CHKERRQ(ierr);
1135d0c080abSJoseph Pusztay #endif
1136d0c080abSJoseph Pusztay   ierr = VecRestoreArrayRead(y,&yy);CHKERRQ(ierr);
1137d0c080abSJoseph Pusztay   ierr = VecDestroy(&y);CHKERRQ(ierr);
1138d0c080abSJoseph Pusztay   if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) {
1139d0c080abSJoseph Pusztay     ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr);
1140d0c080abSJoseph Pusztay     ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr);
1141d0c080abSJoseph Pusztay   }
1142d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1143d0c080abSJoseph Pusztay }
1144d0c080abSJoseph Pusztay 
1145d0c080abSJoseph Pusztay /*@C
1146d0c080abSJoseph Pusztay    TSMonitorSPSwarmSolution - Graphically displays phase plots of DMSwarm particles on a scatter plot
1147d0c080abSJoseph Pusztay 
1148d0c080abSJoseph Pusztay    Input Parameters:
1149d0c080abSJoseph Pusztay +  ts - the TS context
1150d0c080abSJoseph Pusztay .  step - current time-step
1151d0c080abSJoseph Pusztay .  ptime - current time
1152d0c080abSJoseph Pusztay .  u - current solution
1153d0c080abSJoseph Pusztay -  dctx - the TSMonitorSPCtx object that contains all the options for the monitoring, this is created with TSMonitorSPCtxCreate()
1154d0c080abSJoseph Pusztay 
1155d0c080abSJoseph Pusztay    Options Database:
1156d7462660SMatthew Knepley + -ts_monitor_sp_swarm <n>          - Monitor the solution every n steps, or -1 for plotting only the final solution
1157d7462660SMatthew Knepley . -ts_monitor_sp_swarm_retain <n>   - Retain n old points so we can see the history, or -1 for all points
1158d7462660SMatthew Knepley - -ts_monitor_sp_swarm_phase <bool> - Plot in phase space, as opposed to coordinate space
1159d0c080abSJoseph Pusztay 
1160d0c080abSJoseph Pusztay    Level: intermediate
1161d0c080abSJoseph Pusztay 
1162d7462660SMatthew Knepley .seealso: TSMonitoSet()
1163d0c080abSJoseph Pusztay @*/
1164d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSPSwarmSolution(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dctx)
1165d0c080abSJoseph Pusztay {
1166d0c080abSJoseph Pusztay   TSMonitorSPCtx     ctx = (TSMonitorSPCtx) dctx;
1167d7462660SMatthew Knepley   DM                 dm, cdm;
1168d0c080abSJoseph Pusztay   const PetscScalar *yy;
1169d0c080abSJoseph Pusztay   PetscReal         *y, *x;
1170d0c080abSJoseph Pusztay   PetscInt           Np, p, dim = 2;
1171d7462660SMatthew Knepley   PetscErrorCode     ierr;
1172d0c080abSJoseph Pusztay 
1173d0c080abSJoseph Pusztay   PetscFunctionBegin;
1174d0c080abSJoseph Pusztay   if (step < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */
1175d0c080abSJoseph Pusztay   if (!step) {
1176d0c080abSJoseph Pusztay     PetscDrawAxis axis;
1177ab43fcacSJoe Pusztay     PetscReal     dmboxlower[2], dmboxupper[2];
1178d0c080abSJoseph Pusztay     ierr = TSGetDM(ts, &dm);CHKERRQ(ierr);
1179d8185827SBarry Smith     ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr);
1180d7462660SMatthew Knepley     if (dim != 2) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Monitor only supports two dimensional fields");
1181ab43fcacSJoe Pusztay     ierr = DMSwarmGetCellDM(dm, &cdm);CHKERRQ(ierr);
1182ab43fcacSJoe Pusztay     ierr = DMGetBoundingBox(cdm, dmboxlower, dmboxupper);CHKERRQ(ierr);
1183d0c080abSJoseph Pusztay     ierr = VecGetLocalSize(u, &Np);CHKERRQ(ierr);
1184d7462660SMatthew Knepley     Np /= dim*2;
1185ab43fcacSJoe Pusztay     ierr = PetscDrawSPGetAxis(ctx->sp,&axis);CHKERRQ(ierr);
1186ab43fcacSJoe Pusztay     ierr = PetscDrawAxisSetLabels(axis,"Particles","X","V");CHKERRQ(ierr);
1187ab43fcacSJoe Pusztay     ierr = PetscDrawAxisSetLimits(axis, dmboxlower[0], dmboxupper[0], -5, 5);CHKERRQ(ierr);
1188ab43fcacSJoe Pusztay     ierr = PetscDrawAxisSetHoldLimits(axis, PETSC_TRUE);CHKERRQ(ierr);
1189d0c080abSJoseph Pusztay     ierr = PetscDrawSPSetDimension(ctx->sp, Np);CHKERRQ(ierr);
1190d0c080abSJoseph Pusztay     ierr = PetscDrawSPReset(ctx->sp);CHKERRQ(ierr);
1191d0c080abSJoseph Pusztay   }
1192d0c080abSJoseph Pusztay   ierr = VecGetLocalSize(u, &Np);CHKERRQ(ierr);
1193d7462660SMatthew Knepley   Np /= dim*2;
1194d0c080abSJoseph Pusztay   ierr = VecGetArrayRead(u,&yy);CHKERRQ(ierr);
1195d0c080abSJoseph Pusztay   ierr = PetscMalloc2(Np, &x, Np, &y);CHKERRQ(ierr);
1196d0c080abSJoseph Pusztay   /* get points from solution vector */
1197d0c080abSJoseph Pusztay   for (p = 0; p < Np; ++p) {
1198d7462660SMatthew Knepley     if (ctx->phase) {
1199d7462660SMatthew Knepley       x[p] = PetscRealPart(yy[p*dim*2]);
1200d7462660SMatthew Knepley       y[p] = PetscRealPart(yy[p*dim*2 + dim]);
1201d7462660SMatthew Knepley     } else {
1202d7462660SMatthew Knepley       x[p] = PetscRealPart(yy[p*dim*2]);
1203d7462660SMatthew Knepley       y[p] = PetscRealPart(yy[p*dim*2 + 1]);
1204d7462660SMatthew Knepley     }
1205d0c080abSJoseph Pusztay   }
1206d0c080abSJoseph Pusztay   ierr = VecRestoreArrayRead(u,&yy);CHKERRQ(ierr);
1207d0c080abSJoseph Pusztay   if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) {
1208ab43fcacSJoe Pusztay     PetscDraw draw;
1209ab43fcacSJoe Pusztay     ierr = PetscDrawSPGetDraw(ctx->sp, &draw);CHKERRQ(ierr);
1210d7462660SMatthew Knepley     if ((ctx->retain == 0) || (ctx->retain > 0 && !(step % ctx->retain))) {
1211ab43fcacSJoe Pusztay       ierr = PetscDrawClear(draw);CHKERRQ(ierr);
1212d7462660SMatthew Knepley     }
1213ab43fcacSJoe Pusztay     ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1214ab43fcacSJoe Pusztay     ierr = PetscDrawSPReset(ctx->sp);CHKERRQ(ierr);
1215d0c080abSJoseph Pusztay     ierr = PetscDrawSPAddPoint(ctx->sp, x, y);CHKERRQ(ierr);
1216d0c080abSJoseph Pusztay     ierr = PetscDrawSPDraw(ctx->sp, PETSC_FALSE);CHKERRQ(ierr);
1217d0c080abSJoseph Pusztay     ierr = PetscDrawSPSave(ctx->sp);CHKERRQ(ierr);
1218d0c080abSJoseph Pusztay   }
1219d0c080abSJoseph Pusztay   ierr = PetscFree2(x, y);CHKERRQ(ierr);
1220d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1221d0c080abSJoseph Pusztay }
1222d0c080abSJoseph Pusztay 
1223d0c080abSJoseph Pusztay /*@C
1224d0c080abSJoseph Pusztay    TSMonitorError - Monitors progress of the TS solvers by printing the 2 norm of the error at each timestep
1225d0c080abSJoseph Pusztay 
1226d0c080abSJoseph Pusztay    Collective on TS
1227d0c080abSJoseph Pusztay 
1228d0c080abSJoseph Pusztay    Input Parameters:
1229d0c080abSJoseph Pusztay +  ts - the TS context
1230d0c080abSJoseph Pusztay .  step - current time-step
1231d0c080abSJoseph Pusztay .  ptime - current time
1232d0c080abSJoseph Pusztay .  u - current solution
1233d0c080abSJoseph Pusztay -  dctx - unused context
1234d0c080abSJoseph Pusztay 
1235d0c080abSJoseph Pusztay    Level: intermediate
1236d0c080abSJoseph Pusztay 
1237d0c080abSJoseph Pusztay    The user must provide the solution using TSSetSolutionFunction() to use this monitor.
1238d0c080abSJoseph Pusztay 
1239d0c080abSJoseph Pusztay    Options Database Keys:
1240d0c080abSJoseph Pusztay .  -ts_monitor_error - create a graphical monitor of error history
1241d0c080abSJoseph Pusztay 
1242d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSSetSolutionFunction()
1243d0c080abSJoseph Pusztay @*/
1244d0c080abSJoseph Pusztay PetscErrorCode TSMonitorError(TS ts,PetscInt step,PetscReal ptime,Vec u,PetscViewerAndFormat *vf)
1245d0c080abSJoseph Pusztay {
1246*07eaae0cSMatthew G. Knepley   DM             dm;
1247*07eaae0cSMatthew G. Knepley   PetscDS        ds = NULL;
1248*07eaae0cSMatthew G. Knepley   PetscInt       Nf = -1, f;
1249d0c080abSJoseph Pusztay   PetscBool      flg;
1250*07eaae0cSMatthew G. Knepley   PetscErrorCode ierr;
1251d0c080abSJoseph Pusztay 
1252d0c080abSJoseph Pusztay   PetscFunctionBegin;
1253*07eaae0cSMatthew G. Knepley   ierr = TSGetDM(ts, &dm);CHKERRQ(ierr);
1254*07eaae0cSMatthew G. Knepley   if (dm) {ierr = DMGetDS(dm, &ds);CHKERRQ(ierr);}
1255*07eaae0cSMatthew G. Knepley   if (ds) {ierr = PetscDSGetNumFields(ds, &Nf);CHKERRQ(ierr);}
1256*07eaae0cSMatthew G. Knepley   if (Nf <= 0) {
1257*07eaae0cSMatthew G. Knepley     Vec       y;
1258*07eaae0cSMatthew G. Knepley     PetscReal nrm;
1259*07eaae0cSMatthew G. Knepley 
1260d0c080abSJoseph Pusztay     ierr = VecDuplicate(u,&y);CHKERRQ(ierr);
1261d0c080abSJoseph Pusztay     ierr = TSComputeSolutionFunction(ts,ptime,y);CHKERRQ(ierr);
1262d0c080abSJoseph Pusztay     ierr = VecAXPY(y,-1.0,u);CHKERRQ(ierr);
1263d0c080abSJoseph Pusztay     ierr = PetscObjectTypeCompare((PetscObject)vf->viewer,PETSCVIEWERASCII,&flg);CHKERRQ(ierr);
1264d0c080abSJoseph Pusztay     if (flg) {
1265d0c080abSJoseph Pusztay       ierr = VecNorm(y,NORM_2,&nrm);CHKERRQ(ierr);
1266d0c080abSJoseph Pusztay       ierr = PetscViewerASCIIPrintf(vf->viewer,"2-norm of error %g\n",(double)nrm);CHKERRQ(ierr);
1267d0c080abSJoseph Pusztay     }
1268d0c080abSJoseph Pusztay     ierr = PetscObjectTypeCompare((PetscObject)vf->viewer,PETSCVIEWERDRAW,&flg);CHKERRQ(ierr);
1269d0c080abSJoseph Pusztay     if (flg) {
1270d0c080abSJoseph Pusztay       ierr = VecView(y,vf->viewer);CHKERRQ(ierr);
1271d0c080abSJoseph Pusztay     }
1272d0c080abSJoseph Pusztay     ierr = VecDestroy(&y);CHKERRQ(ierr);
1273*07eaae0cSMatthew G. Knepley   } else {
1274*07eaae0cSMatthew G. Knepley     PetscErrorCode (**exactFuncs)(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nf, PetscScalar *u, void *ctx);
1275*07eaae0cSMatthew G. Knepley     void            **ctxs;
1276*07eaae0cSMatthew G. Knepley     Vec               v;
1277*07eaae0cSMatthew G. Knepley     PetscReal         ferrors[1];
1278*07eaae0cSMatthew G. Knepley 
1279*07eaae0cSMatthew G. Knepley     ierr = PetscMalloc2(Nf, &exactFuncs, Nf, &ctxs);CHKERRQ(ierr);
1280*07eaae0cSMatthew G. Knepley     for (f = 0; f < Nf; ++f) {ierr = PetscDSGetExactSolution(ds, f, &exactFuncs[f], &ctxs[f]);CHKERRQ(ierr);}
1281*07eaae0cSMatthew G. Knepley     ierr = DMComputeL2FieldDiff(dm, ptime, exactFuncs, ctxs, u, ferrors);CHKERRQ(ierr);
1282*07eaae0cSMatthew G. Knepley     ierr = PetscPrintf(PETSC_COMM_WORLD, "Timestep: %04d time = %-8.4g \t L_2 Error: [", (int) step, (double) ptime);CHKERRQ(ierr);
1283*07eaae0cSMatthew G. Knepley     for (f = 0; f < Nf; ++f) {
1284*07eaae0cSMatthew G. Knepley       if (f > 0) {ierr = PetscPrintf(PETSC_COMM_WORLD, ", ");CHKERRQ(ierr);}
1285*07eaae0cSMatthew G. Knepley       ierr = PetscPrintf(PETSC_COMM_WORLD, "%2.3g", (double) ferrors[f]);CHKERRQ(ierr);
1286*07eaae0cSMatthew G. Knepley     }
1287*07eaae0cSMatthew G. Knepley     ierr = PetscPrintf(PETSC_COMM_WORLD, "]\n");CHKERRQ(ierr);
1288*07eaae0cSMatthew G. Knepley 
1289*07eaae0cSMatthew G. Knepley     ierr = VecViewFromOptions(u, NULL, "-sol_vec_view");CHKERRQ(ierr);
1290*07eaae0cSMatthew G. Knepley 
1291*07eaae0cSMatthew G. Knepley     ierr = PetscOptionsHasName(NULL, NULL, "-exact_vec_view", &flg);CHKERRQ(ierr);
1292*07eaae0cSMatthew G. Knepley     if (flg) {
1293*07eaae0cSMatthew G. Knepley       ierr = DMGetGlobalVector(dm, &v);CHKERRQ(ierr);
1294*07eaae0cSMatthew G. Knepley       ierr = DMProjectFunction(dm, ptime, exactFuncs, ctxs, INSERT_ALL_VALUES, v);CHKERRQ(ierr);
1295*07eaae0cSMatthew G. Knepley       ierr = PetscObjectSetName((PetscObject) v, "Exact Solution");CHKERRQ(ierr);
1296*07eaae0cSMatthew G. Knepley       ierr = VecViewFromOptions(v, NULL, "-exact_vec_view");CHKERRQ(ierr);
1297*07eaae0cSMatthew G. Knepley       ierr = DMRestoreGlobalVector(dm, &v);CHKERRQ(ierr);
1298*07eaae0cSMatthew G. Knepley     }
1299*07eaae0cSMatthew G. Knepley     ierr = PetscFree2(exactFuncs, ctxs);CHKERRQ(ierr);
1300*07eaae0cSMatthew G. Knepley   }
1301d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1302d0c080abSJoseph Pusztay }
1303d0c080abSJoseph Pusztay 
1304d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGSNESIterations(TS ts,PetscInt n,PetscReal ptime,Vec v,void *monctx)
1305d0c080abSJoseph Pusztay {
1306d0c080abSJoseph Pusztay   TSMonitorLGCtx ctx = (TSMonitorLGCtx) monctx;
1307d0c080abSJoseph Pusztay   PetscReal      x   = ptime,y;
1308d0c080abSJoseph Pusztay   PetscErrorCode ierr;
1309d0c080abSJoseph Pusztay   PetscInt       its;
1310d0c080abSJoseph Pusztay 
1311d0c080abSJoseph Pusztay   PetscFunctionBegin;
1312d0c080abSJoseph Pusztay   if (n < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */
1313d0c080abSJoseph Pusztay   if (!n) {
1314d0c080abSJoseph Pusztay     PetscDrawAxis axis;
1315d0c080abSJoseph Pusztay     ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr);
1316d0c080abSJoseph Pusztay     ierr = PetscDrawAxisSetLabels(axis,"Nonlinear iterations as function of time","Time","SNES Iterations");CHKERRQ(ierr);
1317d0c080abSJoseph Pusztay     ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr);
1318d0c080abSJoseph Pusztay     ctx->snes_its = 0;
1319d0c080abSJoseph Pusztay   }
1320d0c080abSJoseph Pusztay   ierr = TSGetSNESIterations(ts,&its);CHKERRQ(ierr);
1321d0c080abSJoseph Pusztay   y    = its - ctx->snes_its;
1322d0c080abSJoseph Pusztay   ierr = PetscDrawLGAddPoint(ctx->lg,&x,&y);CHKERRQ(ierr);
1323d0c080abSJoseph Pusztay   if (((ctx->howoften > 0) && (!(n % ctx->howoften)) && (n > -1)) || ((ctx->howoften == -1) && (n == -1))) {
1324d0c080abSJoseph Pusztay     ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr);
1325d0c080abSJoseph Pusztay     ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr);
1326d0c080abSJoseph Pusztay   }
1327d0c080abSJoseph Pusztay   ctx->snes_its = its;
1328d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1329d0c080abSJoseph Pusztay }
1330d0c080abSJoseph Pusztay 
1331d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGKSPIterations(TS ts,PetscInt n,PetscReal ptime,Vec v,void *monctx)
1332d0c080abSJoseph Pusztay {
1333d0c080abSJoseph Pusztay   TSMonitorLGCtx ctx = (TSMonitorLGCtx) monctx;
1334d0c080abSJoseph Pusztay   PetscReal      x   = ptime,y;
1335d0c080abSJoseph Pusztay   PetscErrorCode ierr;
1336d0c080abSJoseph Pusztay   PetscInt       its;
1337d0c080abSJoseph Pusztay 
1338d0c080abSJoseph Pusztay   PetscFunctionBegin;
1339d0c080abSJoseph Pusztay   if (n < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */
1340d0c080abSJoseph Pusztay   if (!n) {
1341d0c080abSJoseph Pusztay     PetscDrawAxis axis;
1342d0c080abSJoseph Pusztay     ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr);
1343d0c080abSJoseph Pusztay     ierr = PetscDrawAxisSetLabels(axis,"Linear iterations as function of time","Time","KSP Iterations");CHKERRQ(ierr);
1344d0c080abSJoseph Pusztay     ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr);
1345d0c080abSJoseph Pusztay     ctx->ksp_its = 0;
1346d0c080abSJoseph Pusztay   }
1347d0c080abSJoseph Pusztay   ierr = TSGetKSPIterations(ts,&its);CHKERRQ(ierr);
1348d0c080abSJoseph Pusztay   y    = its - ctx->ksp_its;
1349d0c080abSJoseph Pusztay   ierr = PetscDrawLGAddPoint(ctx->lg,&x,&y);CHKERRQ(ierr);
1350d0c080abSJoseph Pusztay   if (((ctx->howoften > 0) && (!(n % ctx->howoften)) && (n > -1)) || ((ctx->howoften == -1) && (n == -1))) {
1351d0c080abSJoseph Pusztay     ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr);
1352d0c080abSJoseph Pusztay     ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr);
1353d0c080abSJoseph Pusztay   }
1354d0c080abSJoseph Pusztay   ctx->ksp_its = its;
1355d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1356d0c080abSJoseph Pusztay }
1357d0c080abSJoseph Pusztay 
1358d0c080abSJoseph Pusztay /*@C
1359d0c080abSJoseph Pusztay    TSMonitorEnvelopeCtxCreate - Creates a context for use with TSMonitorEnvelope()
1360d0c080abSJoseph Pusztay 
1361d0c080abSJoseph Pusztay    Collective on TS
1362d0c080abSJoseph Pusztay 
1363d0c080abSJoseph Pusztay    Input Parameters:
1364d0c080abSJoseph Pusztay .  ts  - the ODE solver object
1365d0c080abSJoseph Pusztay 
1366d0c080abSJoseph Pusztay    Output Parameter:
1367d0c080abSJoseph Pusztay .  ctx - the context
1368d0c080abSJoseph Pusztay 
1369d0c080abSJoseph Pusztay    Level: intermediate
1370d0c080abSJoseph Pusztay 
1371d0c080abSJoseph Pusztay .seealso: TSMonitorLGTimeStep(), TSMonitorSet(), TSMonitorLGSolution(), TSMonitorLGError()
1372d0c080abSJoseph Pusztay 
1373d0c080abSJoseph Pusztay @*/
1374d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorEnvelopeCtxCreate(TS ts,TSMonitorEnvelopeCtx *ctx)
1375d0c080abSJoseph Pusztay {
1376d0c080abSJoseph Pusztay   PetscErrorCode ierr;
1377d0c080abSJoseph Pusztay 
1378d0c080abSJoseph Pusztay   PetscFunctionBegin;
1379d0c080abSJoseph Pusztay   ierr = PetscNew(ctx);CHKERRQ(ierr);
1380d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1381d0c080abSJoseph Pusztay }
1382d0c080abSJoseph Pusztay 
1383d0c080abSJoseph Pusztay /*@C
1384d0c080abSJoseph Pusztay    TSMonitorEnvelope - Monitors the maximum and minimum value of each component of the solution
1385d0c080abSJoseph Pusztay 
1386d0c080abSJoseph Pusztay    Collective on TS
1387d0c080abSJoseph Pusztay 
1388d0c080abSJoseph Pusztay    Input Parameters:
1389d0c080abSJoseph Pusztay +  ts - the TS context
1390d0c080abSJoseph Pusztay .  step - current time-step
1391d0c080abSJoseph Pusztay .  ptime - current time
1392d0c080abSJoseph Pusztay .  u  - current solution
1393d0c080abSJoseph Pusztay -  dctx - the envelope context
1394d0c080abSJoseph Pusztay 
1395d0c080abSJoseph Pusztay    Options Database:
1396d0c080abSJoseph Pusztay .  -ts_monitor_envelope
1397d0c080abSJoseph Pusztay 
1398d0c080abSJoseph Pusztay    Level: intermediate
1399d0c080abSJoseph Pusztay 
1400d0c080abSJoseph Pusztay    Notes:
1401d0c080abSJoseph Pusztay     after a solve you can use TSMonitorEnvelopeGetBounds() to access the envelope
1402d0c080abSJoseph Pusztay 
1403d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorEnvelopeGetBounds(), TSMonitorEnvelopeCtxCreate()
1404d0c080abSJoseph Pusztay @*/
1405d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorEnvelope(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dctx)
1406d0c080abSJoseph Pusztay {
1407d0c080abSJoseph Pusztay   PetscErrorCode       ierr;
1408d0c080abSJoseph Pusztay   TSMonitorEnvelopeCtx ctx = (TSMonitorEnvelopeCtx)dctx;
1409d0c080abSJoseph Pusztay 
1410d0c080abSJoseph Pusztay   PetscFunctionBegin;
1411d0c080abSJoseph Pusztay   if (!ctx->max) {
1412d0c080abSJoseph Pusztay     ierr = VecDuplicate(u,&ctx->max);CHKERRQ(ierr);
1413d0c080abSJoseph Pusztay     ierr = VecDuplicate(u,&ctx->min);CHKERRQ(ierr);
1414d0c080abSJoseph Pusztay     ierr = VecCopy(u,ctx->max);CHKERRQ(ierr);
1415d0c080abSJoseph Pusztay     ierr = VecCopy(u,ctx->min);CHKERRQ(ierr);
1416d0c080abSJoseph Pusztay   } else {
1417d0c080abSJoseph Pusztay     ierr = VecPointwiseMax(ctx->max,u,ctx->max);CHKERRQ(ierr);
1418d0c080abSJoseph Pusztay     ierr = VecPointwiseMin(ctx->min,u,ctx->min);CHKERRQ(ierr);
1419d0c080abSJoseph Pusztay   }
1420d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1421d0c080abSJoseph Pusztay }
1422d0c080abSJoseph Pusztay 
1423d0c080abSJoseph Pusztay /*@C
1424d0c080abSJoseph Pusztay    TSMonitorEnvelopeGetBounds - Gets the bounds for the components of the solution
1425d0c080abSJoseph Pusztay 
1426d0c080abSJoseph Pusztay    Collective on TS
1427d0c080abSJoseph Pusztay 
1428d0c080abSJoseph Pusztay    Input Parameter:
1429d0c080abSJoseph Pusztay .  ts - the TS context
1430d0c080abSJoseph Pusztay 
1431d8d19677SJose E. Roman    Output Parameters:
1432d0c080abSJoseph Pusztay +  max - the maximum values
1433d0c080abSJoseph Pusztay -  min - the minimum values
1434d0c080abSJoseph Pusztay 
1435d0c080abSJoseph Pusztay    Notes:
1436d0c080abSJoseph Pusztay     If the TS does not have a TSMonitorEnvelopeCtx associated with it then this function is ignored
1437d0c080abSJoseph Pusztay 
1438d0c080abSJoseph Pusztay    Level: intermediate
1439d0c080abSJoseph Pusztay 
1440d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetDisplayVariables()
1441d0c080abSJoseph Pusztay @*/
1442d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorEnvelopeGetBounds(TS ts,Vec *max,Vec *min)
1443d0c080abSJoseph Pusztay {
1444d0c080abSJoseph Pusztay   PetscInt i;
1445d0c080abSJoseph Pusztay 
1446d0c080abSJoseph Pusztay   PetscFunctionBegin;
1447d0c080abSJoseph Pusztay   if (max) *max = NULL;
1448d0c080abSJoseph Pusztay   if (min) *min = NULL;
1449d0c080abSJoseph Pusztay   for (i=0; i<ts->numbermonitors; i++) {
1450d0c080abSJoseph Pusztay     if (ts->monitor[i] == TSMonitorEnvelope) {
1451d0c080abSJoseph Pusztay       TSMonitorEnvelopeCtx  ctx = (TSMonitorEnvelopeCtx) ts->monitorcontext[i];
1452d0c080abSJoseph Pusztay       if (max) *max = ctx->max;
1453d0c080abSJoseph Pusztay       if (min) *min = ctx->min;
1454d0c080abSJoseph Pusztay       break;
1455d0c080abSJoseph Pusztay     }
1456d0c080abSJoseph Pusztay   }
1457d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1458d0c080abSJoseph Pusztay }
1459d0c080abSJoseph Pusztay 
1460d0c080abSJoseph Pusztay /*@C
1461d0c080abSJoseph Pusztay    TSMonitorEnvelopeCtxDestroy - Destroys a context that was created  with TSMonitorEnvelopeCtxCreate().
1462d0c080abSJoseph Pusztay 
1463d0c080abSJoseph Pusztay    Collective on TSMonitorEnvelopeCtx
1464d0c080abSJoseph Pusztay 
1465d0c080abSJoseph Pusztay    Input Parameter:
1466d0c080abSJoseph Pusztay .  ctx - the monitor context
1467d0c080abSJoseph Pusztay 
1468d0c080abSJoseph Pusztay    Level: intermediate
1469d0c080abSJoseph Pusztay 
1470d0c080abSJoseph Pusztay .seealso: TSMonitorLGCtxCreate(),  TSMonitorSet(), TSMonitorLGTimeStep()
1471d0c080abSJoseph Pusztay @*/
1472d0c080abSJoseph Pusztay PetscErrorCode  TSMonitorEnvelopeCtxDestroy(TSMonitorEnvelopeCtx *ctx)
1473d0c080abSJoseph Pusztay {
1474d0c080abSJoseph Pusztay   PetscErrorCode ierr;
1475d0c080abSJoseph Pusztay 
1476d0c080abSJoseph Pusztay   PetscFunctionBegin;
1477d0c080abSJoseph Pusztay   ierr = VecDestroy(&(*ctx)->min);CHKERRQ(ierr);
1478d0c080abSJoseph Pusztay   ierr = VecDestroy(&(*ctx)->max);CHKERRQ(ierr);
1479d0c080abSJoseph Pusztay   ierr = PetscFree(*ctx);CHKERRQ(ierr);
1480d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1481d0c080abSJoseph Pusztay }
1482d0c080abSJoseph Pusztay 
1483d0c080abSJoseph Pusztay /*@C
1484d0c080abSJoseph Pusztay   TSDMSwarmMonitorMoments - Monitors the first three moments of a DMSarm being evolved by the TS
1485d0c080abSJoseph Pusztay 
1486d0c080abSJoseph Pusztay   Not collective
1487d0c080abSJoseph Pusztay 
1488d0c080abSJoseph Pusztay   Input Parameters:
1489d0c080abSJoseph Pusztay + ts   - the TS context
1490d0c080abSJoseph Pusztay . step - current timestep
1491d0c080abSJoseph Pusztay . t    - current time
1492d0c080abSJoseph Pusztay . u    - current solution
1493d0c080abSJoseph Pusztay - ctx  - not used
1494d0c080abSJoseph Pusztay 
1495d0c080abSJoseph Pusztay   Options Database:
1496d0c080abSJoseph Pusztay . -ts_dmswarm_monitor_moments
1497d0c080abSJoseph Pusztay 
1498d0c080abSJoseph Pusztay   Level: intermediate
1499d0c080abSJoseph Pusztay 
1500d0c080abSJoseph Pusztay   Notes:
1501d0c080abSJoseph Pusztay   This requires a DMSwarm be attached to the TS.
1502d0c080abSJoseph Pusztay 
1503d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), DMSWARM
1504d0c080abSJoseph Pusztay @*/
1505d0c080abSJoseph Pusztay PetscErrorCode TSDMSwarmMonitorMoments(TS ts, PetscInt step, PetscReal t, Vec U, PetscViewerAndFormat *vf)
1506d0c080abSJoseph Pusztay {
1507d0c080abSJoseph Pusztay   DM                 sw;
1508d0c080abSJoseph Pusztay   const PetscScalar *u;
1509d0c080abSJoseph Pusztay   PetscReal          m = 1.0, totE = 0., totMom[3] = {0., 0., 0.};
1510d0c080abSJoseph Pusztay   PetscInt           dim, d, Np, p;
1511d0c080abSJoseph Pusztay   MPI_Comm           comm;
1512d0c080abSJoseph Pusztay   PetscErrorCode     ierr;
1513d0c080abSJoseph Pusztay 
1514d0c080abSJoseph Pusztay   PetscFunctionBeginUser;
1515d0c080abSJoseph Pusztay   ierr = TSGetDM(ts, &sw);CHKERRQ(ierr);
1516d0c080abSJoseph Pusztay   if (!sw || step%ts->monitorFrequency != 0) PetscFunctionReturn(0);
1517d0c080abSJoseph Pusztay   ierr = PetscObjectGetComm((PetscObject) ts, &comm);CHKERRQ(ierr);
1518d0c080abSJoseph Pusztay   ierr = DMGetDimension(sw, &dim);CHKERRQ(ierr);
1519d0c080abSJoseph Pusztay   ierr = VecGetLocalSize(U, &Np);CHKERRQ(ierr);
1520d0c080abSJoseph Pusztay   Np  /= dim;
1521d0c080abSJoseph Pusztay   ierr = VecGetArrayRead(U, &u);CHKERRQ(ierr);
1522d0c080abSJoseph Pusztay   for (p = 0; p < Np; ++p) {
1523d0c080abSJoseph Pusztay     for (d = 0; d < dim; ++d) {
1524d0c080abSJoseph Pusztay       totE      += PetscRealPart(u[p*dim+d]*u[p*dim+d]);
1525d0c080abSJoseph Pusztay       totMom[d] += PetscRealPart(u[p*dim+d]);
1526d0c080abSJoseph Pusztay     }
1527d0c080abSJoseph Pusztay   }
1528d0c080abSJoseph Pusztay   ierr = VecRestoreArrayRead(U, &u);CHKERRQ(ierr);
1529d0c080abSJoseph Pusztay   for (d = 0; d < dim; ++d) totMom[d] *= m;
1530d0c080abSJoseph Pusztay   totE *= 0.5*m;
1531d0c080abSJoseph Pusztay   ierr = PetscPrintf(comm, "Step %4D Total Energy: %10.8lf", step, (double) totE);CHKERRQ(ierr);
1532d0c080abSJoseph Pusztay   for (d = 0; d < dim; ++d) {ierr = PetscPrintf(comm, "    Total Momentum %c: %10.8lf", 'x'+d, (double) totMom[d]);CHKERRQ(ierr);}
1533d0c080abSJoseph Pusztay   ierr = PetscPrintf(comm, "\n");CHKERRQ(ierr);
1534d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
1535d0c080abSJoseph Pusztay }
1536