xref: /petsc/src/ts/interface/ts.c (revision 0700a8246d308f50502909ba325e6169d3ee27eb)
1 #define PETSCTS_DLL
2 
3 #include "private/tsimpl.h"        /*I "petscts.h"  I*/
4 
5 /* Logging support */
6 PetscClassId PETSCTS_DLLEXPORT TS_CLASSID;
7 PetscLogEvent  TS_Step, TS_PseudoComputeTimeStep, TS_FunctionEval, TS_JacobianEval;
8 
9 #undef __FUNCT__
10 #define __FUNCT__ "TSSetTypeFromOptions"
11 /*
12   TSSetTypeFromOptions - Sets the type of ts from user options.
13 
14   Collective on TS
15 
16   Input Parameter:
17 . ts - The ts
18 
19   Level: intermediate
20 
21 .keywords: TS, set, options, database, type
22 .seealso: TSSetFromOptions(), TSSetType()
23 */
24 static PetscErrorCode TSSetTypeFromOptions(TS ts)
25 {
26   PetscTruth     opt;
27   const char     *defaultType;
28   char           typeName[256];
29   PetscErrorCode ierr;
30 
31   PetscFunctionBegin;
32   if (((PetscObject)ts)->type_name) {
33     defaultType = ((PetscObject)ts)->type_name;
34   } else {
35     defaultType = TSEULER;
36   }
37 
38   if (!TSRegisterAllCalled) {ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
39   ierr = PetscOptionsList("-ts_type", "TS method"," TSSetType", TSList, defaultType, typeName, 256, &opt);CHKERRQ(ierr);
40   if (opt) {
41     ierr = TSSetType(ts, typeName);CHKERRQ(ierr);
42   } else {
43     ierr = TSSetType(ts, defaultType);CHKERRQ(ierr);
44   }
45   PetscFunctionReturn(0);
46 }
47 
48 #undef __FUNCT__
49 #define __FUNCT__ "TSSetFromOptions"
50 /*@
51    TSSetFromOptions - Sets various TS parameters from user options.
52 
53    Collective on TS
54 
55    Input Parameter:
56 .  ts - the TS context obtained from TSCreate()
57 
58    Options Database Keys:
59 +  -ts_type <type> - TSEULER, TSBEULER, TSSUNDIALS, TSPSEUDO, TSCRANK_NICHOLSON
60 .  -ts_max_steps maxsteps - maximum number of time-steps to take
61 .  -ts_max_time time - maximum time to compute to
62 .  -ts_dt dt - initial time step
63 .  -ts_monitor - print information at each timestep
64 -  -ts_monitor_draw - plot information at each timestep
65 
66    Level: beginner
67 
68 .keywords: TS, timestep, set, options, database
69 
70 .seealso: TSGetType()
71 @*/
72 PetscErrorCode PETSCTS_DLLEXPORT TSSetFromOptions(TS ts)
73 {
74   PetscReal               dt;
75   PetscTruth              opt,flg;
76   PetscErrorCode          ierr;
77   PetscViewerASCIIMonitor monviewer;
78   char                    monfilename[PETSC_MAX_PATH_LEN];
79 
80   PetscFunctionBegin;
81   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
82   ierr = PetscOptionsBegin(((PetscObject)ts)->comm, ((PetscObject)ts)->prefix, "Time step options", "TS");CHKERRQ(ierr);
83 
84     /* Handle generic TS options */
85     ierr = PetscOptionsInt("-ts_max_steps","Maximum number of time steps","TSSetDuration",ts->max_steps,&ts->max_steps,PETSC_NULL);CHKERRQ(ierr);
86     ierr = PetscOptionsReal("-ts_max_time","Time to run to","TSSetDuration",ts->max_time,&ts->max_time,PETSC_NULL);CHKERRQ(ierr);
87     ierr = PetscOptionsReal("-ts_init_time","Initial time","TSSetInitialTime", ts->ptime, &ts->ptime, PETSC_NULL);CHKERRQ(ierr);
88     ierr = PetscOptionsReal("-ts_dt","Initial time step","TSSetInitialTimeStep",ts->initial_time_step,&dt,&opt);CHKERRQ(ierr);
89     if (opt) {
90       ts->initial_time_step = ts->time_step = dt;
91     }
92 
93     /* Monitor options */
94     ierr = PetscOptionsString("-ts_monitor","Monitor timestep size","TSMonitorDefault","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
95     if (flg) {
96       ierr = PetscViewerASCIIMonitorCreate(((PetscObject)ts)->comm,monfilename,((PetscObject)ts)->tablevel,&monviewer);CHKERRQ(ierr);
97       ierr = TSMonitorSet(ts,TSMonitorDefault,monviewer,(PetscErrorCode (*)(void*))PetscViewerASCIIMonitorDestroy);CHKERRQ(ierr);
98     }
99     opt  = PETSC_FALSE;
100     ierr = PetscOptionsTruth("-ts_monitor_draw","Monitor timestep size graphically","TSMonitorLG",opt,&opt,PETSC_NULL);CHKERRQ(ierr);
101     if (opt) {
102       ierr = TSMonitorSet(ts,TSMonitorLG,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
103     }
104     opt  = PETSC_FALSE;
105     ierr = PetscOptionsTruth("-ts_monitor_solution","Monitor solution graphically","TSMonitorSolution",opt,&opt,PETSC_NULL);CHKERRQ(ierr);
106     if (opt) {
107       ierr = TSMonitorSet(ts,TSMonitorSolution,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
108     }
109 
110     /* Handle TS type options */
111     ierr = TSSetTypeFromOptions(ts);CHKERRQ(ierr);
112 
113     /* Handle specific TS options */
114     if (ts->ops->setfromoptions) {
115       ierr = (*ts->ops->setfromoptions)(ts);CHKERRQ(ierr);
116     }
117   ierr = PetscOptionsEnd();CHKERRQ(ierr);
118 
119   /* Handle subobject options */
120   switch(ts->problem_type) {
121     /* Should check for implicit/explicit */
122   case TS_LINEAR:
123     if (ts->ksp) {
124       ierr = KSPSetOperators(ts->ksp,ts->Arhs,ts->B,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
125       ierr = KSPSetFromOptions(ts->ksp);CHKERRQ(ierr);
126     }
127     break;
128   case TS_NONLINEAR:
129     if (ts->snes) {
130       /* this is a bit of a hack, but it gets the matrix information into SNES earlier
131          so that SNES and KSP have more information to pick reasonable defaults
132          before they allow users to set options
133        * If ts->A has been set at this point, we are probably using the implicit form
134          and Arhs will never be used. */
135       ierr = SNESSetJacobian(ts->snes,ts->A?ts->A:ts->Arhs,ts->B,0,ts);CHKERRQ(ierr);
136       ierr = SNESSetFromOptions(ts->snes);CHKERRQ(ierr);
137     }
138     break;
139   default:
140     SETERRQ1(PETSC_ERR_ARG_WRONG, "Invalid problem type: %d", (int)ts->problem_type);
141   }
142 
143   PetscFunctionReturn(0);
144 }
145 
146 #undef  __FUNCT__
147 #define __FUNCT__ "TSViewFromOptions"
148 /*@
149   TSViewFromOptions - This function visualizes the ts based upon user options.
150 
151   Collective on TS
152 
153   Input Parameter:
154 . ts - The ts
155 
156   Level: intermediate
157 
158 .keywords: TS, view, options, database
159 .seealso: TSSetFromOptions(), TSView()
160 @*/
161 PetscErrorCode PETSCTS_DLLEXPORT TSViewFromOptions(TS ts,const char title[])
162 {
163   PetscViewer    viewer;
164   PetscDraw      draw;
165   PetscTruth     opt = PETSC_FALSE;
166   char           fileName[PETSC_MAX_PATH_LEN];
167   PetscErrorCode ierr;
168 
169   PetscFunctionBegin;
170   ierr = PetscOptionsGetString(((PetscObject)ts)->prefix, "-ts_view", fileName, PETSC_MAX_PATH_LEN, &opt);CHKERRQ(ierr);
171   if (opt && !PetscPreLoadingOn) {
172     ierr = PetscViewerASCIIOpen(((PetscObject)ts)->comm,fileName,&viewer);CHKERRQ(ierr);
173     ierr = TSView(ts, viewer);CHKERRQ(ierr);
174     ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr);
175   }
176   opt = PETSC_FALSE;
177   ierr = PetscOptionsGetTruth(((PetscObject)ts)->prefix, "-ts_view_draw", &opt,PETSC_NULL);CHKERRQ(ierr);
178   if (opt) {
179     ierr = PetscViewerDrawOpen(((PetscObject)ts)->comm, 0, 0, 0, 0, 300, 300, &viewer);CHKERRQ(ierr);
180     ierr = PetscViewerDrawGetDraw(viewer, 0, &draw);CHKERRQ(ierr);
181     if (title) {
182       ierr = PetscDrawSetTitle(draw, (char *)title);CHKERRQ(ierr);
183     } else {
184       ierr = PetscObjectName((PetscObject)ts);CHKERRQ(ierr);
185       ierr = PetscDrawSetTitle(draw, ((PetscObject)ts)->name);CHKERRQ(ierr);
186     }
187     ierr = TSView(ts, viewer);CHKERRQ(ierr);
188     ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
189     ierr = PetscDrawPause(draw);CHKERRQ(ierr);
190     ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr);
191   }
192   PetscFunctionReturn(0);
193 }
194 
195 #undef __FUNCT__
196 #define __FUNCT__ "TSComputeRHSJacobian"
197 /*@
198    TSComputeRHSJacobian - Computes the Jacobian matrix that has been
199       set with TSSetRHSJacobian().
200 
201    Collective on TS and Vec
202 
203    Input Parameters:
204 +  ts - the TS context
205 .  t - current timestep
206 -  x - input vector
207 
208    Output Parameters:
209 +  A - Jacobian matrix
210 .  B - optional preconditioning matrix
211 -  flag - flag indicating matrix structure
212 
213    Notes:
214    Most users should not need to explicitly call this routine, as it
215    is used internally within the nonlinear solvers.
216 
217    See KSPSetOperators() for important information about setting the
218    flag parameter.
219 
220    TSComputeJacobian() is valid only for TS_NONLINEAR
221 
222    Level: developer
223 
224 .keywords: SNES, compute, Jacobian, matrix
225 
226 .seealso:  TSSetRHSJacobian(), KSPSetOperators()
227 @*/
228 PetscErrorCode PETSCTS_DLLEXPORT TSComputeRHSJacobian(TS ts,PetscReal t,Vec X,Mat *A,Mat *B,MatStructure *flg)
229 {
230   PetscErrorCode ierr;
231 
232   PetscFunctionBegin;
233   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
234   PetscValidHeaderSpecific(X,VEC_CLASSID,3);
235   PetscCheckSameComm(ts,1,X,3);
236   if (ts->problem_type != TS_NONLINEAR) {
237     SETERRQ(PETSC_ERR_ARG_WRONG,"For TS_NONLINEAR only");
238   }
239   if (ts->ops->rhsjacobian) {
240     ierr = PetscLogEventBegin(TS_JacobianEval,ts,X,*A,*B);CHKERRQ(ierr);
241     *flg = DIFFERENT_NONZERO_PATTERN;
242     PetscStackPush("TS user Jacobian function");
243     ierr = (*ts->ops->rhsjacobian)(ts,t,X,A,B,flg,ts->jacP);CHKERRQ(ierr);
244     PetscStackPop;
245     ierr = PetscLogEventEnd(TS_JacobianEval,ts,X,*A,*B);CHKERRQ(ierr);
246     /* make sure user returned a correct Jacobian and preconditioner */
247     PetscValidHeaderSpecific(*A,MAT_CLASSID,4);
248     PetscValidHeaderSpecific(*B,MAT_CLASSID,5);
249   } else {
250     ierr = MatAssemblyBegin(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
251     ierr = MatAssemblyEnd(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
252     if (*A != *B) {
253       ierr = MatAssemblyBegin(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
254       ierr = MatAssemblyEnd(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
255     }
256   }
257   PetscFunctionReturn(0);
258 }
259 
260 #undef __FUNCT__
261 #define __FUNCT__ "TSComputeRHSFunction"
262 /*@
263    TSComputeRHSFunction - Evaluates the right-hand-side function.
264 
265    Collective on TS and Vec
266 
267    Input Parameters:
268 +  ts - the TS context
269 .  t - current time
270 -  x - state vector
271 
272    Output Parameter:
273 .  y - right hand side
274 
275    Note:
276    Most users should not need to explicitly call this routine, as it
277    is used internally within the nonlinear solvers.
278 
279    If the user did not provide a function but merely a matrix,
280    this routine applies the matrix.
281 
282    Level: developer
283 
284 .keywords: TS, compute
285 
286 .seealso: TSSetRHSFunction(), TSComputeIFunction()
287 @*/
288 PetscErrorCode TSComputeRHSFunction(TS ts,PetscReal t,Vec x,Vec y)
289 {
290   PetscErrorCode ierr;
291 
292   PetscFunctionBegin;
293   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
294   PetscValidHeaderSpecific(x,VEC_CLASSID,3);
295   PetscValidHeaderSpecific(y,VEC_CLASSID,4);
296 
297   ierr = PetscLogEventBegin(TS_FunctionEval,ts,x,y,0);CHKERRQ(ierr);
298   if (ts->ops->rhsfunction) {
299     PetscStackPush("TS user right-hand-side function");
300     ierr = (*ts->ops->rhsfunction)(ts,t,x,y,ts->funP);CHKERRQ(ierr);
301     PetscStackPop;
302   } else {
303     if (ts->ops->rhsmatrix) { /* assemble matrix for this timestep */
304       MatStructure flg;
305       PetscStackPush("TS user right-hand-side matrix function");
306       ierr = (*ts->ops->rhsmatrix)(ts,t,&ts->Arhs,&ts->B,&flg,ts->jacP);CHKERRQ(ierr);
307       PetscStackPop;
308     }
309     ierr = MatMult(ts->Arhs,x,y);CHKERRQ(ierr);
310   }
311 
312   ierr = PetscLogEventEnd(TS_FunctionEval,ts,x,y,0);CHKERRQ(ierr);
313 
314   PetscFunctionReturn(0);
315 }
316 
317 #undef __FUNCT__
318 #define __FUNCT__ "TSComputeIFunction"
319 /*@
320    TSComputeIFunction - Evaluates the DAE residual written in implicit form F(t,X,Xdot)=0
321 
322    Collective on TS and Vec
323 
324    Input Parameters:
325 +  ts - the TS context
326 .  t - current time
327 .  X - state vector
328 -  Xdot - time derivative of state vector
329 
330    Output Parameter:
331 .  Y - right hand side
332 
333    Note:
334    Most users should not need to explicitly call this routine, as it
335    is used internally within the nonlinear solvers.
336 
337    If the user did did not write their equations in implicit form, this
338    function recasts them in implicit form.
339 
340    Level: developer
341 
342 .keywords: TS, compute
343 
344 .seealso: TSSetIFunction(), TSComputeRHSFunction()
345 @*/
346 PetscErrorCode TSComputeIFunction(TS ts,PetscReal t,Vec X,Vec Xdot,Vec Y)
347 {
348   PetscErrorCode ierr;
349 
350   PetscFunctionBegin;
351   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
352   PetscValidHeaderSpecific(X,VEC_CLASSID,3);
353   PetscValidHeaderSpecific(Xdot,VEC_CLASSID,4);
354   PetscValidHeaderSpecific(Y,VEC_CLASSID,5);
355 
356   ierr = PetscLogEventBegin(TS_FunctionEval,ts,X,Xdot,Y);CHKERRQ(ierr);
357   if (ts->ops->ifunction) {
358     PetscStackPush("TS user implicit function");
359     ierr = (*ts->ops->ifunction)(ts,t,X,Xdot,Y,ts->funP);CHKERRQ(ierr);
360     PetscStackPop;
361   } else {
362     if (ts->ops->rhsfunction) {
363       PetscStackPush("TS user right-hand-side function");
364       ierr = (*ts->ops->rhsfunction)(ts,t,X,Y,ts->funP);CHKERRQ(ierr);
365       PetscStackPop;
366     } else {
367       if (ts->ops->rhsmatrix) { /* assemble matrix for this timestep */
368         MatStructure flg;
369         /* Note: flg is not being used.
370            For it to be useful, we'd have to cache it and then apply it in TSComputeIJacobian.
371         */
372         PetscStackPush("TS user right-hand-side matrix function");
373         ierr = (*ts->ops->rhsmatrix)(ts,t,&ts->Arhs,&ts->B,&flg,ts->jacP);CHKERRQ(ierr);
374         PetscStackPop;
375       }
376       ierr = MatMult(ts->Arhs,X,Y);CHKERRQ(ierr);
377     }
378 
379     /* Convert to implicit form: F(X,Xdot) = Alhs * Xdot - Frhs(X) */
380     if (ts->Alhs) {
381       if (ts->ops->lhsmatrix) {
382         MatStructure flg;
383         PetscStackPush("TS user left-hand-side matrix function");
384         ierr = (*ts->ops->lhsmatrix)(ts,t,&ts->Alhs,PETSC_NULL,&flg,ts->jacP);CHKERRQ(ierr);
385         PetscStackPop;
386       }
387       ierr = VecScale(Y,-1.);CHKERRQ(ierr);
388       ierr = MatMultAdd(ts->Alhs,Xdot,Y,Y);CHKERRQ(ierr);
389     } else {
390       ierr = VecAYPX(Y,-1,Xdot);CHKERRQ(ierr);
391     }
392   }
393   ierr = PetscLogEventEnd(TS_FunctionEval,ts,X,Xdot,Y);CHKERRQ(ierr);
394   PetscFunctionReturn(0);
395 }
396 
397 #undef __FUNCT__
398 #define __FUNCT__ "TSComputeIJacobian"
399 /*@
400    TSComputeIJacobian - Evaluates the Jacobian of the DAE
401 
402    Collective on TS and Vec
403 
404    Input
405       Input Parameters:
406 +  ts - the TS context
407 .  t - current timestep
408 .  X - state vector
409 .  Xdot - time derivative of state vector
410 -  shift - shift to apply, see note below
411 
412    Output Parameters:
413 +  A - Jacobian matrix
414 .  B - optional preconditioning matrix
415 -  flag - flag indicating matrix structure
416 
417    Notes:
418    If F(t,X,Xdot)=0 is the DAE, the required Jacobian is
419 
420    dF/dX + shift*dF/dXdot
421 
422    Most users should not need to explicitly call this routine, as it
423    is used internally within the nonlinear solvers.
424 
425    TSComputeIJacobian() is valid only for TS_NONLINEAR
426 
427    Level: developer
428 
429 .keywords: TS, compute, Jacobian, matrix
430 
431 .seealso:  TSSetIJacobian()
432 @*/
433 PetscErrorCode PETSCTS_DLLEXPORT TSComputeIJacobian(TS ts,PetscReal t,Vec X,Vec Xdot,PetscReal shift,Mat *A,Mat *B,MatStructure *flg)
434 {
435   PetscErrorCode ierr;
436 
437   PetscFunctionBegin;
438   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
439   PetscValidHeaderSpecific(X,VEC_CLASSID,3);
440   PetscValidHeaderSpecific(Xdot,VEC_CLASSID,4);
441   PetscValidPointer(A,6);
442   PetscValidHeaderSpecific(*A,MAT_CLASSID,6);
443   PetscValidPointer(B,7);
444   PetscValidHeaderSpecific(*B,MAT_CLASSID,7);
445   PetscValidPointer(flg,8);
446 
447   *flg = SAME_NONZERO_PATTERN;  /* In case it we're solving a linear problem in which case it wouldn't get initialized below. */
448   ierr = PetscLogEventBegin(TS_JacobianEval,ts,X,*A,*B);CHKERRQ(ierr);
449   if (ts->ops->ijacobian) {
450     PetscStackPush("TS user implicit Jacobian");
451     ierr = (*ts->ops->ijacobian)(ts,t,X,Xdot,shift,A,B,flg,ts->jacP);CHKERRQ(ierr);
452     PetscStackPop;
453   } else {
454     if (ts->ops->rhsjacobian) {
455       PetscStackPush("TS user right-hand-side Jacobian");
456       ierr = (*ts->ops->rhsjacobian)(ts,t,X,A,B,flg,ts->jacP);CHKERRQ(ierr);
457       PetscStackPop;
458     } else {
459       ierr = MatAssemblyBegin(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
460       ierr = MatAssemblyEnd(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
461       if (*A != *B) {
462         ierr = MatAssemblyBegin(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
463         ierr = MatAssemblyEnd(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
464       }
465     }
466 
467     /* Convert to implicit form */
468     /* inefficient because these operations will normally traverse all matrix elements twice */
469     ierr = MatScale(*A,-1);CHKERRQ(ierr);
470     if (ts->Alhs) {
471       ierr = MatAXPY(*A,shift,ts->Alhs,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
472     } else {
473       ierr = MatShift(*A,shift);CHKERRQ(ierr);
474     }
475     if (*A != *B) {
476       ierr = MatScale(*B,-1);CHKERRQ(ierr);
477       ierr = MatShift(*B,shift);CHKERRQ(ierr);
478     }
479   }
480   ierr = PetscLogEventEnd(TS_JacobianEval,ts,X,*A,*B);CHKERRQ(ierr);
481   PetscFunctionReturn(0);
482 }
483 
484 #undef __FUNCT__
485 #define __FUNCT__ "TSSetRHSFunction"
486 /*@C
487     TSSetRHSFunction - Sets the routine for evaluating the function,
488     F(t,u), where U_t = F(t,u).
489 
490     Collective on TS
491 
492     Input Parameters:
493 +   ts - the TS context obtained from TSCreate()
494 .   f - routine for evaluating the right-hand-side function
495 -   ctx - [optional] user-defined context for private data for the
496           function evaluation routine (may be PETSC_NULL)
497 
498     Calling sequence of func:
499 $     func (TS ts,PetscReal t,Vec u,Vec F,void *ctx);
500 
501 +   t - current timestep
502 .   u - input vector
503 .   F - function vector
504 -   ctx - [optional] user-defined function context
505 
506     Important:
507     The user MUST call either this routine or TSSetMatrices().
508 
509     Level: beginner
510 
511 .keywords: TS, timestep, set, right-hand-side, function
512 
513 .seealso: TSSetMatrices()
514 @*/
515 PetscErrorCode PETSCTS_DLLEXPORT TSSetRHSFunction(TS ts,PetscErrorCode (*f)(TS,PetscReal,Vec,Vec,void*),void *ctx)
516 {
517   PetscFunctionBegin;
518 
519   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
520   if (ts->problem_type == TS_LINEAR) {
521     SETERRQ(PETSC_ERR_ARG_WRONG,"Cannot set function for linear problem");
522   }
523   ts->ops->rhsfunction = f;
524   ts->funP             = ctx;
525   PetscFunctionReturn(0);
526 }
527 
528 #undef __FUNCT__
529 #define __FUNCT__ "TSSetMatrices"
530 /*@C
531    TSSetMatrices - Sets the functions to compute the matrices Alhs and Arhs,
532    where Alhs(t) U_t = Arhs(t) U.
533 
534    Collective on TS
535 
536    Input Parameters:
537 +  ts   - the TS context obtained from TSCreate()
538 .  Arhs - matrix
539 .  frhs - the matrix evaluation routine for Arhs; use PETSC_NULL (PETSC_NULL_FUNCTION in fortran)
540           if Arhs is not a function of t.
541 .  Alhs - matrix or PETSC_NULL if Alhs is an indentity matrix.
542 .  flhs - the matrix evaluation routine for Alhs; use PETSC_NULL (PETSC_NULL_FUNCTION in fortran)
543           if Alhs is not a function of t.
544 .  flag - flag indicating information about the matrix structure of Arhs and Alhs.
545           The available options are
546             SAME_NONZERO_PATTERN - Alhs has the same nonzero structure as Arhs
547             DIFFERENT_NONZERO_PATTERN - Alhs has different nonzero structure as Arhs
548 -  ctx  - [optional] user-defined context for private data for the
549           matrix evaluation routine (may be PETSC_NULL)
550 
551    Calling sequence of func:
552 $     func(TS ts,PetscReal t,Mat *A,Mat *B,PetscInt *flag,void *ctx);
553 
554 +  t - current timestep
555 .  A - matrix A, where U_t = A(t) U
556 .  B - preconditioner matrix, usually the same as A
557 .  flag - flag indicating information about the preconditioner matrix
558           structure (same as flag in KSPSetOperators())
559 -  ctx - [optional] user-defined context for matrix evaluation routine
560 
561    Notes:
562    The routine func() takes Mat* as the matrix arguments rather than Mat.
563    This allows the matrix evaluation routine to replace Arhs or Alhs with a
564    completely new new matrix structure (not just different matrix elements)
565    when appropriate, for instance, if the nonzero structure is changing
566    throughout the global iterations.
567 
568    Important:
569    The user MUST call either this routine or TSSetRHSFunction().
570 
571    Level: beginner
572 
573 .keywords: TS, timestep, set, matrix
574 
575 .seealso: TSSetRHSFunction()
576 @*/
577 PetscErrorCode PETSCTS_DLLEXPORT TSSetMatrices(TS ts,Mat Arhs,PetscErrorCode (*frhs)(TS,PetscReal,Mat*,Mat*,MatStructure*,void*),Mat Alhs,PetscErrorCode (*flhs)(TS,PetscReal,Mat*,Mat*,MatStructure*,void*),MatStructure flag,void *ctx)
578 {
579   PetscFunctionBegin;
580   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
581   if (Arhs){
582     PetscValidHeaderSpecific(Arhs,MAT_CLASSID,2);
583     PetscCheckSameComm(ts,1,Arhs,2);
584     ts->Arhs           = Arhs;
585     ts->ops->rhsmatrix = frhs;
586   }
587   if (Alhs){
588     PetscValidHeaderSpecific(Alhs,MAT_CLASSID,4);
589     PetscCheckSameComm(ts,1,Alhs,4);
590     ts->Alhs           = Alhs;
591     ts->ops->lhsmatrix = flhs;
592   }
593 
594   ts->jacP           = ctx;
595   ts->matflg         = flag;
596   PetscFunctionReturn(0);
597 }
598 
599 #undef __FUNCT__
600 #define __FUNCT__ "TSGetMatrices"
601 /*@C
602    TSGetMatrices - Returns the matrices Arhs and Alhs at the present timestep,
603    where Alhs(t) U_t = Arhs(t) U.
604 
605    Not Collective, but parallel objects are returned if TS is parallel
606 
607    Input Parameter:
608 .  ts  - The TS context obtained from TSCreate()
609 
610    Output Parameters:
611 +  Arhs - The right-hand side matrix
612 .  Alhs - The left-hand side matrix
613 -  ctx - User-defined context for matrix evaluation routine
614 
615    Notes: You can pass in PETSC_NULL for any return argument you do not need.
616 
617    Level: intermediate
618 
619 .seealso: TSSetMatrices(), TSGetTimeStep(), TSGetTime(), TSGetTimeStepNumber(), TSGetRHSJacobian()
620 
621 .keywords: TS, timestep, get, matrix
622 
623 @*/
624 PetscErrorCode PETSCTS_DLLEXPORT TSGetMatrices(TS ts,Mat *Arhs,Mat *Alhs,void **ctx)
625 {
626   PetscFunctionBegin;
627   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
628   if (Arhs) *Arhs = ts->Arhs;
629   if (Alhs) *Alhs = ts->Alhs;
630   if (ctx)  *ctx = ts->jacP;
631   PetscFunctionReturn(0);
632 }
633 
634 #undef __FUNCT__
635 #define __FUNCT__ "TSSetRHSJacobian"
636 /*@C
637    TSSetRHSJacobian - Sets the function to compute the Jacobian of F,
638    where U_t = F(U,t), as well as the location to store the matrix.
639    Use TSSetMatrices() for linear problems.
640 
641    Collective on TS
642 
643    Input Parameters:
644 +  ts  - the TS context obtained from TSCreate()
645 .  A   - Jacobian matrix
646 .  B   - preconditioner matrix (usually same as A)
647 .  f   - the Jacobian evaluation routine
648 -  ctx - [optional] user-defined context for private data for the
649          Jacobian evaluation routine (may be PETSC_NULL)
650 
651    Calling sequence of func:
652 $     func (TS ts,PetscReal t,Vec u,Mat *A,Mat *B,MatStructure *flag,void *ctx);
653 
654 +  t - current timestep
655 .  u - input vector
656 .  A - matrix A, where U_t = A(t)u
657 .  B - preconditioner matrix, usually the same as A
658 .  flag - flag indicating information about the preconditioner matrix
659           structure (same as flag in KSPSetOperators())
660 -  ctx - [optional] user-defined context for matrix evaluation routine
661 
662    Notes:
663    See KSPSetOperators() for important information about setting the flag
664    output parameter in the routine func().  Be sure to read this information!
665 
666    The routine func() takes Mat * as the matrix arguments rather than Mat.
667    This allows the matrix evaluation routine to replace A and/or B with a
668    completely new matrix structure (not just different matrix elements)
669    when appropriate, for instance, if the nonzero structure is changing
670    throughout the global iterations.
671 
672    Level: beginner
673 
674 .keywords: TS, timestep, set, right-hand-side, Jacobian
675 
676 .seealso: TSDefaultComputeJacobianColor(),
677           SNESDefaultComputeJacobianColor(), TSSetRHSFunction(), TSSetMatrices()
678 
679 @*/
680 PetscErrorCode PETSCTS_DLLEXPORT TSSetRHSJacobian(TS ts,Mat A,Mat B,PetscErrorCode (*f)(TS,PetscReal,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
681 {
682   PetscFunctionBegin;
683   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
684   PetscValidHeaderSpecific(A,MAT_CLASSID,2);
685   PetscValidHeaderSpecific(B,MAT_CLASSID,3);
686   PetscCheckSameComm(ts,1,A,2);
687   PetscCheckSameComm(ts,1,B,3);
688   if (ts->problem_type != TS_NONLINEAR) {
689     SETERRQ(PETSC_ERR_ARG_WRONG,"Not for linear problems; use TSSetMatrices()");
690   }
691 
692   ts->ops->rhsjacobian = f;
693   ts->jacP             = ctx;
694   ts->Arhs             = A;
695   ts->B                = B;
696   PetscFunctionReturn(0);
697 }
698 
699 
700 #undef __FUNCT__
701 #define __FUNCT__ "TSSetIFunction"
702 /*@C
703    TSSetIFunction - Set the function to compute F(t,U,U_t) where F = 0 is the DAE to be solved.
704 
705    Collective on TS
706 
707    Input Parameters:
708 +  ts  - the TS context obtained from TSCreate()
709 .  f   - the function evaluation routine
710 -  ctx - user-defined context for private data for the function evaluation routine (may be PETSC_NULL)
711 
712    Calling sequence of f:
713 $  f(TS ts,PetscReal t,Vec u,Vec u_t,Vec F,ctx);
714 
715 +  t   - time at step/stage being solved
716 .  u   - state vector
717 .  u_t - time derivative of state vector
718 .  F   - function vector
719 -  ctx - [optional] user-defined context for matrix evaluation routine
720 
721    Important:
722    The user MUST call either this routine, TSSetRHSFunction(), or TSSetMatrices().  This routine must be used when not solving an ODE.
723 
724    Level: beginner
725 
726 .keywords: TS, timestep, set, DAE, Jacobian
727 
728 .seealso: TSSetMatrices(), TSSetRHSFunction(), TSSetIJacobian()
729 @*/
730 PetscErrorCode PETSCTS_DLLEXPORT TSSetIFunction(TS ts,TSIFunction f,void *ctx)
731 {
732 
733   PetscFunctionBegin;
734   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
735   ts->ops->ifunction = f;
736   ts->funP           = ctx;
737   PetscFunctionReturn(0);
738 }
739 
740 #undef __FUNCT__
741 #define __FUNCT__ "TSSetIJacobian"
742 /*@C
743    TSSetIJacobian - Set the function to compute the Jacobian of
744    G(U) = F(t,U,U0+a*U) where F(t,U,U_t) = 0 is the DAE to be solved.
745 
746    Collective on TS
747 
748    Input Parameters:
749 +  ts  - the TS context obtained from TSCreate()
750 .  A   - Jacobian matrix
751 .  B   - preconditioning matrix for A (may be same as A)
752 .  f   - the Jacobian evaluation routine
753 -  ctx - user-defined context for private data for the Jacobian evaluation routine (may be PETSC_NULL)
754 
755    Calling sequence of f:
756 $  f(TS ts,PetscReal t,Vec u,Vec u_t,PetscReal a,Mat *A,Mat *B,MatStructure *flag,void *ctx);
757 
758 +  t    - time at step/stage being solved
759 .  u    - state vector
760 .  u_t  - time derivative of state vector
761 .  a    - shift
762 .  A    - Jacobian of G(U) = F(t,U,U0+a*U), equivalent to dF/dU + a*dF/dU_t
763 .  B    - preconditioning matrix for A, may be same as A
764 .  flag - flag indicating information about the preconditioner matrix
765           structure (same as flag in KSPSetOperators())
766 -  ctx  - [optional] user-defined context for matrix evaluation routine
767 
768    Notes:
769    The matrices A and B are exactly the matrices that are used by SNES for the nonlinear solve.
770 
771    Level: beginner
772 
773 .keywords: TS, timestep, DAE, Jacobian
774 
775 .seealso: TSSetIFunction(), TSSetRHSJacobian()
776 
777 @*/
778 PetscErrorCode PETSCTS_DLLEXPORT TSSetIJacobian(TS ts,Mat A,Mat B,TSIJacobian f,void *ctx)
779 {
780   PetscErrorCode ierr;
781 
782   PetscFunctionBegin;
783   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
784   if (A) PetscValidHeaderSpecific(A,MAT_CLASSID,2);
785   if (B) PetscValidHeaderSpecific(B,MAT_CLASSID,3);
786   if (A) PetscCheckSameComm(ts,1,A,2);
787   if (B) PetscCheckSameComm(ts,1,B,3);
788   if (f)   ts->ops->ijacobian = f;
789   if (ctx) ts->jacP             = ctx;
790   if (A) {
791     ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
792     if (ts->A) {ierr = MatDestroy(ts->A);CHKERRQ(ierr);}
793     ts->A = A;
794   }
795 #if 0
796   /* The sane and consistent alternative */
797   if (B) {
798     ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr);
799     if (ts->B) {ierr = MatDestroy(ts->B);CHKERRQ(ierr);}
800     ts->B = B;
801   }
802 #else
803   /* Don't reference B because TSDestroy() doesn't destroy it.  These ownership semantics are awkward and inconsistent. */
804   if (B) ts->B = B;
805 #endif
806   PetscFunctionReturn(0);
807 }
808 
809 #undef __FUNCT__
810 #define __FUNCT__ "TSView"
811 /*@C
812     TSView - Prints the TS data structure.
813 
814     Collective on TS
815 
816     Input Parameters:
817 +   ts - the TS context obtained from TSCreate()
818 -   viewer - visualization context
819 
820     Options Database Key:
821 .   -ts_view - calls TSView() at end of TSStep()
822 
823     Notes:
824     The available visualization contexts include
825 +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
826 -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
827          output where only the first processor opens
828          the file.  All other processors send their
829          data to the first processor to print.
830 
831     The user can open an alternative visualization context with
832     PetscViewerASCIIOpen() - output to a specified file.
833 
834     Level: beginner
835 
836 .keywords: TS, timestep, view
837 
838 .seealso: PetscViewerASCIIOpen()
839 @*/
840 PetscErrorCode PETSCTS_DLLEXPORT TSView(TS ts,PetscViewer viewer)
841 {
842   PetscErrorCode ierr;
843   const TSType   type;
844   PetscTruth     iascii,isstring;
845 
846   PetscFunctionBegin;
847   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
848   if (!viewer) {
849     ierr = PetscViewerASCIIGetStdout(((PetscObject)ts)->comm,&viewer);CHKERRQ(ierr);
850   }
851   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
852   PetscCheckSameComm(ts,1,viewer,2);
853 
854   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
855   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr);
856   if (iascii) {
857     ierr = PetscViewerASCIIPrintf(viewer,"TS Object:\n");CHKERRQ(ierr);
858     ierr = TSGetType(ts,&type);CHKERRQ(ierr);
859     if (type) {
860       ierr = PetscViewerASCIIPrintf(viewer,"  type: %s\n",type);CHKERRQ(ierr);
861     } else {
862       ierr = PetscViewerASCIIPrintf(viewer,"  type: not yet set\n");CHKERRQ(ierr);
863     }
864     if (ts->ops->view) {
865       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
866       ierr = (*ts->ops->view)(ts,viewer);CHKERRQ(ierr);
867       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
868     }
869     ierr = PetscViewerASCIIPrintf(viewer,"  maximum steps=%D\n",ts->max_steps);CHKERRQ(ierr);
870     ierr = PetscViewerASCIIPrintf(viewer,"  maximum time=%G\n",ts->max_time);CHKERRQ(ierr);
871     if (ts->problem_type == TS_NONLINEAR) {
872       ierr = PetscViewerASCIIPrintf(viewer,"  total number of nonlinear solver iterations=%D\n",ts->nonlinear_its);CHKERRQ(ierr);
873     }
874     ierr = PetscViewerASCIIPrintf(viewer,"  total number of linear solver iterations=%D\n",ts->linear_its);CHKERRQ(ierr);
875   } else if (isstring) {
876     ierr = TSGetType(ts,&type);CHKERRQ(ierr);
877     ierr = PetscViewerStringSPrintf(viewer," %-7.7s",type);CHKERRQ(ierr);
878   }
879   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
880   if (ts->ksp) {ierr = KSPView(ts->ksp,viewer);CHKERRQ(ierr);}
881   if (ts->snes) {ierr = SNESView(ts->snes,viewer);CHKERRQ(ierr);}
882   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
883   PetscFunctionReturn(0);
884 }
885 
886 
887 #undef __FUNCT__
888 #define __FUNCT__ "TSSetApplicationContext"
889 /*@C
890    TSSetApplicationContext - Sets an optional user-defined context for
891    the timesteppers.
892 
893    Collective on TS
894 
895    Input Parameters:
896 +  ts - the TS context obtained from TSCreate()
897 -  usrP - optional user context
898 
899    Level: intermediate
900 
901 .keywords: TS, timestep, set, application, context
902 
903 .seealso: TSGetApplicationContext()
904 @*/
905 PetscErrorCode PETSCTS_DLLEXPORT TSSetApplicationContext(TS ts,void *usrP)
906 {
907   PetscFunctionBegin;
908   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
909   ts->user = usrP;
910   PetscFunctionReturn(0);
911 }
912 
913 #undef __FUNCT__
914 #define __FUNCT__ "TSGetApplicationContext"
915 /*@C
916     TSGetApplicationContext - Gets the user-defined context for the
917     timestepper.
918 
919     Not Collective
920 
921     Input Parameter:
922 .   ts - the TS context obtained from TSCreate()
923 
924     Output Parameter:
925 .   usrP - user context
926 
927     Level: intermediate
928 
929 .keywords: TS, timestep, get, application, context
930 
931 .seealso: TSSetApplicationContext()
932 @*/
933 PetscErrorCode PETSCTS_DLLEXPORT TSGetApplicationContext(TS ts,void **usrP)
934 {
935   PetscFunctionBegin;
936   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
937   *usrP = ts->user;
938   PetscFunctionReturn(0);
939 }
940 
941 #undef __FUNCT__
942 #define __FUNCT__ "TSGetTimeStepNumber"
943 /*@
944    TSGetTimeStepNumber - Gets the current number of timesteps.
945 
946    Not Collective
947 
948    Input Parameter:
949 .  ts - the TS context obtained from TSCreate()
950 
951    Output Parameter:
952 .  iter - number steps so far
953 
954    Level: intermediate
955 
956 .keywords: TS, timestep, get, iteration, number
957 @*/
958 PetscErrorCode PETSCTS_DLLEXPORT TSGetTimeStepNumber(TS ts,PetscInt* iter)
959 {
960   PetscFunctionBegin;
961   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
962   PetscValidIntPointer(iter,2);
963   *iter = ts->steps;
964   PetscFunctionReturn(0);
965 }
966 
967 #undef __FUNCT__
968 #define __FUNCT__ "TSSetInitialTimeStep"
969 /*@
970    TSSetInitialTimeStep - Sets the initial timestep to be used,
971    as well as the initial time.
972 
973    Collective on TS
974 
975    Input Parameters:
976 +  ts - the TS context obtained from TSCreate()
977 .  initial_time - the initial time
978 -  time_step - the size of the timestep
979 
980    Level: intermediate
981 
982 .seealso: TSSetTimeStep(), TSGetTimeStep()
983 
984 .keywords: TS, set, initial, timestep
985 @*/
986 PetscErrorCode PETSCTS_DLLEXPORT TSSetInitialTimeStep(TS ts,PetscReal initial_time,PetscReal time_step)
987 {
988   PetscFunctionBegin;
989   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
990   ts->time_step         = time_step;
991   ts->initial_time_step = time_step;
992   ts->ptime             = initial_time;
993   PetscFunctionReturn(0);
994 }
995 
996 #undef __FUNCT__
997 #define __FUNCT__ "TSSetTimeStep"
998 /*@
999    TSSetTimeStep - Allows one to reset the timestep at any time,
1000    useful for simple pseudo-timestepping codes.
1001 
1002    Collective on TS
1003 
1004    Input Parameters:
1005 +  ts - the TS context obtained from TSCreate()
1006 -  time_step - the size of the timestep
1007 
1008    Level: intermediate
1009 
1010 .seealso: TSSetInitialTimeStep(), TSGetTimeStep()
1011 
1012 .keywords: TS, set, timestep
1013 @*/
1014 PetscErrorCode PETSCTS_DLLEXPORT TSSetTimeStep(TS ts,PetscReal time_step)
1015 {
1016   PetscFunctionBegin;
1017   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1018   ts->time_step = time_step;
1019   PetscFunctionReturn(0);
1020 }
1021 
1022 #undef __FUNCT__
1023 #define __FUNCT__ "TSGetTimeStep"
1024 /*@
1025    TSGetTimeStep - Gets the current timestep size.
1026 
1027    Not Collective
1028 
1029    Input Parameter:
1030 .  ts - the TS context obtained from TSCreate()
1031 
1032    Output Parameter:
1033 .  dt - the current timestep size
1034 
1035    Level: intermediate
1036 
1037 .seealso: TSSetInitialTimeStep(), TSGetTimeStep()
1038 
1039 .keywords: TS, get, timestep
1040 @*/
1041 PetscErrorCode PETSCTS_DLLEXPORT TSGetTimeStep(TS ts,PetscReal* dt)
1042 {
1043   PetscFunctionBegin;
1044   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1045   PetscValidDoublePointer(dt,2);
1046   *dt = ts->time_step;
1047   PetscFunctionReturn(0);
1048 }
1049 
1050 #undef __FUNCT__
1051 #define __FUNCT__ "TSGetSolution"
1052 /*@
1053    TSGetSolution - Returns the solution at the present timestep. It
1054    is valid to call this routine inside the function that you are evaluating
1055    in order to move to the new timestep. This vector not changed until
1056    the solution at the next timestep has been calculated.
1057 
1058    Not Collective, but Vec returned is parallel if TS is parallel
1059 
1060    Input Parameter:
1061 .  ts - the TS context obtained from TSCreate()
1062 
1063    Output Parameter:
1064 .  v - the vector containing the solution
1065 
1066    Level: intermediate
1067 
1068 .seealso: TSGetTimeStep()
1069 
1070 .keywords: TS, timestep, get, solution
1071 @*/
1072 PetscErrorCode PETSCTS_DLLEXPORT TSGetSolution(TS ts,Vec *v)
1073 {
1074   PetscFunctionBegin;
1075   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1076   PetscValidPointer(v,2);
1077   *v = ts->vec_sol_always;
1078   PetscFunctionReturn(0);
1079 }
1080 
1081 /* ----- Routines to initialize and destroy a timestepper ---- */
1082 #undef __FUNCT__
1083 #define __FUNCT__ "TSSetProblemType"
1084 /*@
1085   TSSetProblemType - Sets the type of problem to be solved.
1086 
1087   Not collective
1088 
1089   Input Parameters:
1090 + ts   - The TS
1091 - type - One of TS_LINEAR, TS_NONLINEAR where these types refer to problems of the forms
1092 .vb
1093          U_t = A U
1094          U_t = A(t) U
1095          U_t = F(t,U)
1096 .ve
1097 
1098    Level: beginner
1099 
1100 .keywords: TS, problem type
1101 .seealso: TSSetUp(), TSProblemType, TS
1102 @*/
1103 PetscErrorCode PETSCTS_DLLEXPORT TSSetProblemType(TS ts, TSProblemType type)
1104 {
1105   PetscFunctionBegin;
1106   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
1107   ts->problem_type = type;
1108   PetscFunctionReturn(0);
1109 }
1110 
1111 #undef __FUNCT__
1112 #define __FUNCT__ "TSGetProblemType"
1113 /*@C
1114   TSGetProblemType - Gets the type of problem to be solved.
1115 
1116   Not collective
1117 
1118   Input Parameter:
1119 . ts   - The TS
1120 
1121   Output Parameter:
1122 . type - One of TS_LINEAR, TS_NONLINEAR where these types refer to problems of the forms
1123 .vb
1124          U_t = A U
1125          U_t = A(t) U
1126          U_t = F(t,U)
1127 .ve
1128 
1129    Level: beginner
1130 
1131 .keywords: TS, problem type
1132 .seealso: TSSetUp(), TSProblemType, TS
1133 @*/
1134 PetscErrorCode PETSCTS_DLLEXPORT TSGetProblemType(TS ts, TSProblemType *type)
1135 {
1136   PetscFunctionBegin;
1137   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
1138   PetscValidIntPointer(type,2);
1139   *type = ts->problem_type;
1140   PetscFunctionReturn(0);
1141 }
1142 
1143 #undef __FUNCT__
1144 #define __FUNCT__ "TSSetUp"
1145 /*@
1146    TSSetUp - Sets up the internal data structures for the later use
1147    of a timestepper.
1148 
1149    Collective on TS
1150 
1151    Input Parameter:
1152 .  ts - the TS context obtained from TSCreate()
1153 
1154    Notes:
1155    For basic use of the TS solvers the user need not explicitly call
1156    TSSetUp(), since these actions will automatically occur during
1157    the call to TSStep().  However, if one wishes to control this
1158    phase separately, TSSetUp() should be called after TSCreate()
1159    and optional routines of the form TSSetXXX(), but before TSStep().
1160 
1161    Level: advanced
1162 
1163 .keywords: TS, timestep, setup
1164 
1165 .seealso: TSCreate(), TSStep(), TSDestroy()
1166 @*/
1167 PetscErrorCode PETSCTS_DLLEXPORT TSSetUp(TS ts)
1168 {
1169   PetscErrorCode ierr;
1170 
1171   PetscFunctionBegin;
1172   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1173   if (!ts->vec_sol) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call TSSetSolution() first");
1174   if (!((PetscObject)ts)->type_name) {
1175     ierr = TSSetType(ts,TSEULER);CHKERRQ(ierr);
1176   }
1177   ierr = (*ts->ops->setup)(ts);CHKERRQ(ierr);
1178   ts->setupcalled = 1;
1179   PetscFunctionReturn(0);
1180 }
1181 
1182 #undef __FUNCT__
1183 #define __FUNCT__ "TSDestroy"
1184 /*@
1185    TSDestroy - Destroys the timestepper context that was created
1186    with TSCreate().
1187 
1188    Collective on TS
1189 
1190    Input Parameter:
1191 .  ts - the TS context obtained from TSCreate()
1192 
1193    Level: beginner
1194 
1195 .keywords: TS, timestepper, destroy
1196 
1197 .seealso: TSCreate(), TSSetUp(), TSSolve()
1198 @*/
1199 PetscErrorCode PETSCTS_DLLEXPORT TSDestroy(TS ts)
1200 {
1201   PetscErrorCode ierr;
1202 
1203   PetscFunctionBegin;
1204   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1205   if (--((PetscObject)ts)->refct > 0) PetscFunctionReturn(0);
1206 
1207   /* if memory was published with AMS then destroy it */
1208   ierr = PetscObjectDepublish(ts);CHKERRQ(ierr);
1209 
1210   if (ts->dm) {ierr = DMDestroy(ts->dm);CHKERRQ(ierr);}
1211   if (ts->A) {ierr = MatDestroy(ts->A);CHKERRQ(ierr)}
1212   if (ts->ksp) {ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr);}
1213   if (ts->snes) {ierr = SNESDestroy(ts->snes);CHKERRQ(ierr);}
1214   if (ts->ops->destroy) {ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);}
1215   ierr = TSMonitorCancel(ts);CHKERRQ(ierr);
1216   ierr = PetscHeaderDestroy(ts);CHKERRQ(ierr);
1217   PetscFunctionReturn(0);
1218 }
1219 
1220 #undef __FUNCT__
1221 #define __FUNCT__ "TSGetSNES"
1222 /*@
1223    TSGetSNES - Returns the SNES (nonlinear solver) associated with
1224    a TS (timestepper) context. Valid only for nonlinear problems.
1225 
1226    Not Collective, but SNES is parallel if TS is parallel
1227 
1228    Input Parameter:
1229 .  ts - the TS context obtained from TSCreate()
1230 
1231    Output Parameter:
1232 .  snes - the nonlinear solver context
1233 
1234    Notes:
1235    The user can then directly manipulate the SNES context to set various
1236    options, etc.  Likewise, the user can then extract and manipulate the
1237    KSP, KSP, and PC contexts as well.
1238 
1239    TSGetSNES() does not work for integrators that do not use SNES; in
1240    this case TSGetSNES() returns PETSC_NULL in snes.
1241 
1242    Level: beginner
1243 
1244 .keywords: timestep, get, SNES
1245 @*/
1246 PetscErrorCode PETSCTS_DLLEXPORT TSGetSNES(TS ts,SNES *snes)
1247 {
1248   PetscFunctionBegin;
1249   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1250   PetscValidPointer(snes,2);
1251   if (((PetscObject)ts)->type_name == PETSC_NULL)
1252     SETERRQ(PETSC_ERR_ARG_NULL,"SNES is not created yet. Call TSSetType() first");
1253   if (ts->problem_type == TS_LINEAR) SETERRQ(PETSC_ERR_ARG_WRONG,"Nonlinear only; use TSGetKSP()");
1254   *snes = ts->snes;
1255   PetscFunctionReturn(0);
1256 }
1257 
1258 #undef __FUNCT__
1259 #define __FUNCT__ "TSGetKSP"
1260 /*@
1261    TSGetKSP - Returns the KSP (linear solver) associated with
1262    a TS (timestepper) context.
1263 
1264    Not Collective, but KSP is parallel if TS is parallel
1265 
1266    Input Parameter:
1267 .  ts - the TS context obtained from TSCreate()
1268 
1269    Output Parameter:
1270 .  ksp - the nonlinear solver context
1271 
1272    Notes:
1273    The user can then directly manipulate the KSP context to set various
1274    options, etc.  Likewise, the user can then extract and manipulate the
1275    KSP and PC contexts as well.
1276 
1277    TSGetKSP() does not work for integrators that do not use KSP;
1278    in this case TSGetKSP() returns PETSC_NULL in ksp.
1279 
1280    Level: beginner
1281 
1282 .keywords: timestep, get, KSP
1283 @*/
1284 PetscErrorCode PETSCTS_DLLEXPORT TSGetKSP(TS ts,KSP *ksp)
1285 {
1286   PetscFunctionBegin;
1287   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1288   PetscValidPointer(ksp,2);
1289   if (((PetscObject)ts)->type_name == PETSC_NULL)
1290     SETERRQ(PETSC_ERR_ARG_NULL,"KSP is not created yet. Call TSSetType() first");
1291   if (ts->problem_type != TS_LINEAR) SETERRQ(PETSC_ERR_ARG_WRONG,"Linear only; use TSGetSNES()");
1292   *ksp = ts->ksp;
1293   PetscFunctionReturn(0);
1294 }
1295 
1296 /* ----------- Routines to set solver parameters ---------- */
1297 
1298 #undef __FUNCT__
1299 #define __FUNCT__ "TSGetDuration"
1300 /*@
1301    TSGetDuration - Gets the maximum number of timesteps to use and
1302    maximum time for iteration.
1303 
1304    Collective on TS
1305 
1306    Input Parameters:
1307 +  ts       - the TS context obtained from TSCreate()
1308 .  maxsteps - maximum number of iterations to use, or PETSC_NULL
1309 -  maxtime  - final time to iterate to, or PETSC_NULL
1310 
1311    Level: intermediate
1312 
1313 .keywords: TS, timestep, get, maximum, iterations, time
1314 @*/
1315 PetscErrorCode PETSCTS_DLLEXPORT TSGetDuration(TS ts, PetscInt *maxsteps, PetscReal *maxtime)
1316 {
1317   PetscFunctionBegin;
1318   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
1319   if (maxsteps) {
1320     PetscValidIntPointer(maxsteps,2);
1321     *maxsteps = ts->max_steps;
1322   }
1323   if (maxtime ) {
1324     PetscValidScalarPointer(maxtime,3);
1325     *maxtime  = ts->max_time;
1326   }
1327   PetscFunctionReturn(0);
1328 }
1329 
1330 #undef __FUNCT__
1331 #define __FUNCT__ "TSSetDuration"
1332 /*@
1333    TSSetDuration - Sets the maximum number of timesteps to use and
1334    maximum time for iteration.
1335 
1336    Collective on TS
1337 
1338    Input Parameters:
1339 +  ts - the TS context obtained from TSCreate()
1340 .  maxsteps - maximum number of iterations to use
1341 -  maxtime - final time to iterate to
1342 
1343    Options Database Keys:
1344 .  -ts_max_steps <maxsteps> - Sets maxsteps
1345 .  -ts_max_time <maxtime> - Sets maxtime
1346 
1347    Notes:
1348    The default maximum number of iterations is 5000. Default time is 5.0
1349 
1350    Level: intermediate
1351 
1352 .keywords: TS, timestep, set, maximum, iterations
1353 @*/
1354 PetscErrorCode PETSCTS_DLLEXPORT TSSetDuration(TS ts,PetscInt maxsteps,PetscReal maxtime)
1355 {
1356   PetscFunctionBegin;
1357   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1358   ts->max_steps = maxsteps;
1359   ts->max_time  = maxtime;
1360   PetscFunctionReturn(0);
1361 }
1362 
1363 #undef __FUNCT__
1364 #define __FUNCT__ "TSSetSolution"
1365 /*@
1366    TSSetSolution - Sets the initial solution vector
1367    for use by the TS routines.
1368 
1369    Collective on TS and Vec
1370 
1371    Input Parameters:
1372 +  ts - the TS context obtained from TSCreate()
1373 -  x - the solution vector
1374 
1375    Level: beginner
1376 
1377 .keywords: TS, timestep, set, solution, initial conditions
1378 @*/
1379 PetscErrorCode PETSCTS_DLLEXPORT TSSetSolution(TS ts,Vec x)
1380 {
1381   PetscFunctionBegin;
1382   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1383   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
1384   ts->vec_sol        = ts->vec_sol_always = x;
1385   PetscFunctionReturn(0);
1386 }
1387 
1388 #undef __FUNCT__
1389 #define __FUNCT__ "TSSetPreStep"
1390 /*@C
1391   TSSetPreStep - Sets the general-purpose function
1392   called once at the beginning of each time step.
1393 
1394   Collective on TS
1395 
1396   Input Parameters:
1397 + ts   - The TS context obtained from TSCreate()
1398 - func - The function
1399 
1400   Calling sequence of func:
1401 . func (TS ts);
1402 
1403   Level: intermediate
1404 
1405 .keywords: TS, timestep
1406 @*/
1407 PetscErrorCode PETSCTS_DLLEXPORT TSSetPreStep(TS ts, PetscErrorCode (*func)(TS))
1408 {
1409   PetscFunctionBegin;
1410   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
1411   ts->ops->prestep = func;
1412   PetscFunctionReturn(0);
1413 }
1414 
1415 #undef __FUNCT__
1416 #define __FUNCT__ "TSPreStep"
1417 /*@C
1418   TSPreStep - Runs the user-defined pre-step function.
1419 
1420   Collective on TS
1421 
1422   Input Parameters:
1423 . ts   - The TS context obtained from TSCreate()
1424 
1425   Notes:
1426   TSPreStep() is typically used within time stepping implementations,
1427   so most users would not generally call this routine themselves.
1428 
1429   Level: developer
1430 
1431 .keywords: TS, timestep
1432 @*/
1433 PetscErrorCode PETSCTS_DLLEXPORT TSPreStep(TS ts)
1434 {
1435   PetscErrorCode ierr;
1436 
1437   PetscFunctionBegin;
1438   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1439   if (ts->ops->prestep) {
1440     PetscStackPush("TS PreStep function");
1441     CHKMEMQ;
1442     ierr = (*ts->ops->prestep)(ts);CHKERRQ(ierr);
1443     CHKMEMQ;
1444     PetscStackPop;
1445   }
1446   PetscFunctionReturn(0);
1447 }
1448 
1449 #undef __FUNCT__
1450 #define __FUNCT__ "TSDefaultPreStep"
1451 /*@
1452   TSDefaultPreStep - The default pre-stepping function which does nothing.
1453 
1454   Collective on TS
1455 
1456   Input Parameters:
1457 . ts  - The TS context obtained from TSCreate()
1458 
1459   Level: developer
1460 
1461 .keywords: TS, timestep
1462 @*/
1463 PetscErrorCode PETSCTS_DLLEXPORT TSDefaultPreStep(TS ts)
1464 {
1465   PetscFunctionBegin;
1466   PetscFunctionReturn(0);
1467 }
1468 
1469 #undef __FUNCT__
1470 #define __FUNCT__ "TSSetPostStep"
1471 /*@C
1472   TSSetPostStep - Sets the general-purpose function
1473   called once at the end of each time step.
1474 
1475   Collective on TS
1476 
1477   Input Parameters:
1478 + ts   - The TS context obtained from TSCreate()
1479 - func - The function
1480 
1481   Calling sequence of func:
1482 . func (TS ts);
1483 
1484   Level: intermediate
1485 
1486 .keywords: TS, timestep
1487 @*/
1488 PetscErrorCode PETSCTS_DLLEXPORT TSSetPostStep(TS ts, PetscErrorCode (*func)(TS))
1489 {
1490   PetscFunctionBegin;
1491   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
1492   ts->ops->poststep = func;
1493   PetscFunctionReturn(0);
1494 }
1495 
1496 #undef __FUNCT__
1497 #define __FUNCT__ "TSPostStep"
1498 /*@C
1499   TSPostStep - Runs the user-defined post-step function.
1500 
1501   Collective on TS
1502 
1503   Input Parameters:
1504 . ts   - The TS context obtained from TSCreate()
1505 
1506   Notes:
1507   TSPostStep() is typically used within time stepping implementations,
1508   so most users would not generally call this routine themselves.
1509 
1510   Level: developer
1511 
1512 .keywords: TS, timestep
1513 @*/
1514 PetscErrorCode PETSCTS_DLLEXPORT TSPostStep(TS ts)
1515 {
1516   PetscErrorCode ierr;
1517 
1518   PetscFunctionBegin;
1519   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1520   if (ts->ops->poststep) {
1521     PetscStackPush("TS PostStep function");
1522     CHKMEMQ;
1523     ierr = (*ts->ops->poststep)(ts);CHKERRQ(ierr);
1524     CHKMEMQ;
1525     PetscStackPop;
1526   }
1527   PetscFunctionReturn(0);
1528 }
1529 
1530 #undef __FUNCT__
1531 #define __FUNCT__ "TSDefaultPostStep"
1532 /*@
1533   TSDefaultPostStep - The default post-stepping function which does nothing.
1534 
1535   Collective on TS
1536 
1537   Input Parameters:
1538 . ts  - The TS context obtained from TSCreate()
1539 
1540   Level: developer
1541 
1542 .keywords: TS, timestep
1543 @*/
1544 PetscErrorCode PETSCTS_DLLEXPORT TSDefaultPostStep(TS ts)
1545 {
1546   PetscFunctionBegin;
1547   PetscFunctionReturn(0);
1548 }
1549 
1550 /* ------------ Routines to set performance monitoring options ----------- */
1551 
1552 #undef __FUNCT__
1553 #define __FUNCT__ "TSMonitorSet"
1554 /*@C
1555    TSMonitorSet - Sets an ADDITIONAL function that is to be used at every
1556    timestep to display the iteration's  progress.
1557 
1558    Collective on TS
1559 
1560    Input Parameters:
1561 +  ts - the TS context obtained from TSCreate()
1562 .  func - monitoring routine
1563 .  mctx - [optional] user-defined context for private data for the
1564              monitor routine (use PETSC_NULL if no context is desired)
1565 -  monitordestroy - [optional] routine that frees monitor context
1566           (may be PETSC_NULL)
1567 
1568    Calling sequence of func:
1569 $    int func(TS ts,PetscInt steps,PetscReal time,Vec x,void *mctx)
1570 
1571 +    ts - the TS context
1572 .    steps - iteration number
1573 .    time - current time
1574 .    x - current iterate
1575 -    mctx - [optional] monitoring context
1576 
1577    Notes:
1578    This routine adds an additional monitor to the list of monitors that
1579    already has been loaded.
1580 
1581    Fortran notes: Only a single monitor function can be set for each TS object
1582 
1583    Level: intermediate
1584 
1585 .keywords: TS, timestep, set, monitor
1586 
1587 .seealso: TSMonitorDefault(), TSMonitorCancel()
1588 @*/
1589 PetscErrorCode PETSCTS_DLLEXPORT TSMonitorSet(TS ts,PetscErrorCode (*monitor)(TS,PetscInt,PetscReal,Vec,void*),void *mctx,PetscErrorCode (*mdestroy)(void*))
1590 {
1591   PetscFunctionBegin;
1592   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1593   if (ts->numbermonitors >= MAXTSMONITORS) {
1594     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
1595   }
1596   ts->monitor[ts->numbermonitors]           = monitor;
1597   ts->mdestroy[ts->numbermonitors]          = mdestroy;
1598   ts->monitorcontext[ts->numbermonitors++]  = (void*)mctx;
1599   PetscFunctionReturn(0);
1600 }
1601 
1602 #undef __FUNCT__
1603 #define __FUNCT__ "TSMonitorCancel"
1604 /*@C
1605    TSMonitorCancel - Clears all the monitors that have been set on a time-step object.
1606 
1607    Collective on TS
1608 
1609    Input Parameters:
1610 .  ts - the TS context obtained from TSCreate()
1611 
1612    Notes:
1613    There is no way to remove a single, specific monitor.
1614 
1615    Level: intermediate
1616 
1617 .keywords: TS, timestep, set, monitor
1618 
1619 .seealso: TSMonitorDefault(), TSMonitorSet()
1620 @*/
1621 PetscErrorCode PETSCTS_DLLEXPORT TSMonitorCancel(TS ts)
1622 {
1623   PetscErrorCode ierr;
1624   PetscInt       i;
1625 
1626   PetscFunctionBegin;
1627   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1628   for (i=0; i<ts->numbermonitors; i++) {
1629     if (ts->mdestroy[i]) {
1630       ierr = (*ts->mdestroy[i])(ts->monitorcontext[i]);CHKERRQ(ierr);
1631     }
1632   }
1633   ts->numbermonitors = 0;
1634   PetscFunctionReturn(0);
1635 }
1636 
1637 #undef __FUNCT__
1638 #define __FUNCT__ "TSMonitorDefault"
1639 /*@
1640    TSMonitorDefault - Sets the Default monitor
1641 
1642    Level: intermediate
1643 
1644 .keywords: TS, set, monitor
1645 
1646 .seealso: TSMonitorDefault(), TSMonitorSet()
1647 @*/
1648 PetscErrorCode TSMonitorDefault(TS ts,PetscInt step,PetscReal ptime,Vec v,void *ctx)
1649 {
1650   PetscErrorCode          ierr;
1651   PetscViewerASCIIMonitor viewer = (PetscViewerASCIIMonitor)ctx;
1652 
1653   PetscFunctionBegin;
1654   if (!ctx) {
1655     ierr = PetscViewerASCIIMonitorCreate(((PetscObject)ts)->comm,"stdout",0,&viewer);CHKERRQ(ierr);
1656   }
1657   ierr = PetscViewerASCIIMonitorPrintf(viewer,"timestep %D dt %G time %G\n",step,ts->time_step,ptime);CHKERRQ(ierr);
1658   if (!ctx) {
1659     ierr = PetscViewerASCIIMonitorDestroy(viewer);CHKERRQ(ierr);
1660   }
1661   PetscFunctionReturn(0);
1662 }
1663 
1664 #undef __FUNCT__
1665 #define __FUNCT__ "TSStep"
1666 /*@
1667    TSStep - Steps the requested number of timesteps.
1668 
1669    Collective on TS
1670 
1671    Input Parameter:
1672 .  ts - the TS context obtained from TSCreate()
1673 
1674    Output Parameters:
1675 +  steps - number of iterations until termination
1676 -  ptime - time until termination
1677 
1678    Level: beginner
1679 
1680 .keywords: TS, timestep, solve
1681 
1682 .seealso: TSCreate(), TSSetUp(), TSDestroy()
1683 @*/
1684 PetscErrorCode PETSCTS_DLLEXPORT TSStep(TS ts,PetscInt *steps,PetscReal *ptime)
1685 {
1686   PetscErrorCode ierr;
1687 
1688   PetscFunctionBegin;
1689   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
1690   if (!ts->setupcalled) {
1691     ierr = TSSetUp(ts);CHKERRQ(ierr);
1692   }
1693 
1694   ierr = PetscLogEventBegin(TS_Step, ts, 0, 0, 0);CHKERRQ(ierr);
1695   ierr = (*ts->ops->step)(ts, steps, ptime);CHKERRQ(ierr);
1696   ierr = PetscLogEventEnd(TS_Step, ts, 0, 0, 0);CHKERRQ(ierr);
1697 
1698   if (!PetscPreLoadingOn) {
1699     ierr = TSViewFromOptions(ts,((PetscObject)ts)->name);CHKERRQ(ierr);
1700   }
1701   PetscFunctionReturn(0);
1702 }
1703 
1704 #undef __FUNCT__
1705 #define __FUNCT__ "TSSolve"
1706 /*@
1707    TSSolve - Steps the requested number of timesteps.
1708 
1709    Collective on TS
1710 
1711    Input Parameter:
1712 +  ts - the TS context obtained from TSCreate()
1713 -  x - the solution vector, or PETSC_NULL if it was set with TSSetSolution()
1714 
1715    Level: beginner
1716 
1717 .keywords: TS, timestep, solve
1718 
1719 .seealso: TSCreate(), TSSetSolution(), TSStep()
1720 @*/
1721 PetscErrorCode PETSCTS_DLLEXPORT TSSolve(TS ts, Vec x)
1722 {
1723   PetscInt       steps;
1724   PetscReal      ptime;
1725   PetscErrorCode ierr;
1726   PetscFunctionBegin;
1727   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1728   /* set solution vector if provided */
1729   if (x) { ierr = TSSetSolution(ts, x); CHKERRQ(ierr); }
1730   /* reset time step and iteration counters */
1731   ts->steps = 0; ts->linear_its = 0; ts->nonlinear_its = 0;
1732   /* steps the requested number of timesteps. */
1733   ierr = TSStep(ts, &steps, &ptime);CHKERRQ(ierr);
1734   PetscFunctionReturn(0);
1735 }
1736 
1737 #undef __FUNCT__
1738 #define __FUNCT__ "TSMonitor"
1739 /*
1740      Runs the user provided monitor routines, if they exists.
1741 */
1742 PetscErrorCode TSMonitor(TS ts,PetscInt step,PetscReal ptime,Vec x)
1743 {
1744   PetscErrorCode ierr;
1745   PetscInt i,n = ts->numbermonitors;
1746 
1747   PetscFunctionBegin;
1748   for (i=0; i<n; i++) {
1749     ierr = (*ts->monitor[i])(ts,step,ptime,x,ts->monitorcontext[i]);CHKERRQ(ierr);
1750   }
1751   PetscFunctionReturn(0);
1752 }
1753 
1754 /* ------------------------------------------------------------------------*/
1755 
1756 #undef __FUNCT__
1757 #define __FUNCT__ "TSMonitorLGCreate"
1758 /*@C
1759    TSMonitorLGCreate - Creates a line graph context for use with
1760    TS to monitor convergence of preconditioned residual norms.
1761 
1762    Collective on TS
1763 
1764    Input Parameters:
1765 +  host - the X display to open, or null for the local machine
1766 .  label - the title to put in the title bar
1767 .  x, y - the screen coordinates of the upper left coordinate of the window
1768 -  m, n - the screen width and height in pixels
1769 
1770    Output Parameter:
1771 .  draw - the drawing context
1772 
1773    Options Database Key:
1774 .  -ts_monitor_draw - automatically sets line graph monitor
1775 
1776    Notes:
1777    Use TSMonitorLGDestroy() to destroy this line graph, not PetscDrawLGDestroy().
1778 
1779    Level: intermediate
1780 
1781 .keywords: TS, monitor, line graph, residual, seealso
1782 
1783 .seealso: TSMonitorLGDestroy(), TSMonitorSet()
1784 
1785 @*/
1786 PetscErrorCode PETSCTS_DLLEXPORT TSMonitorLGCreate(const char host[],const char label[],int x,int y,int m,int n,PetscDrawLG *draw)
1787 {
1788   PetscDraw      win;
1789   PetscErrorCode ierr;
1790 
1791   PetscFunctionBegin;
1792   ierr = PetscDrawCreate(PETSC_COMM_SELF,host,label,x,y,m,n,&win);CHKERRQ(ierr);
1793   ierr = PetscDrawSetType(win,PETSC_DRAW_X);CHKERRQ(ierr);
1794   ierr = PetscDrawLGCreate(win,1,draw);CHKERRQ(ierr);
1795   ierr = PetscDrawLGIndicateDataPoints(*draw);CHKERRQ(ierr);
1796 
1797   ierr = PetscLogObjectParent(*draw,win);CHKERRQ(ierr);
1798   PetscFunctionReturn(0);
1799 }
1800 
1801 #undef __FUNCT__
1802 #define __FUNCT__ "TSMonitorLG"
1803 PetscErrorCode TSMonitorLG(TS ts,PetscInt n,PetscReal ptime,Vec v,void *monctx)
1804 {
1805   PetscDrawLG    lg = (PetscDrawLG) monctx;
1806   PetscReal      x,y = ptime;
1807   PetscErrorCode ierr;
1808 
1809   PetscFunctionBegin;
1810   if (!monctx) {
1811     MPI_Comm    comm;
1812     PetscViewer viewer;
1813 
1814     ierr   = PetscObjectGetComm((PetscObject)ts,&comm);CHKERRQ(ierr);
1815     viewer = PETSC_VIEWER_DRAW_(comm);
1816     ierr   = PetscViewerDrawGetDrawLG(viewer,0,&lg);CHKERRQ(ierr);
1817   }
1818 
1819   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
1820   x = (PetscReal)n;
1821   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
1822   if (n < 20 || (n % 5)) {
1823     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
1824   }
1825   PetscFunctionReturn(0);
1826 }
1827 
1828 #undef __FUNCT__
1829 #define __FUNCT__ "TSMonitorLGDestroy"
1830 /*@C
1831    TSMonitorLGDestroy - Destroys a line graph context that was created
1832    with TSMonitorLGCreate().
1833 
1834    Collective on PetscDrawLG
1835 
1836    Input Parameter:
1837 .  draw - the drawing context
1838 
1839    Level: intermediate
1840 
1841 .keywords: TS, monitor, line graph, destroy
1842 
1843 .seealso: TSMonitorLGCreate(),  TSMonitorSet(), TSMonitorLG();
1844 @*/
1845 PetscErrorCode PETSCTS_DLLEXPORT TSMonitorLGDestroy(PetscDrawLG drawlg)
1846 {
1847   PetscDraw      draw;
1848   PetscErrorCode ierr;
1849 
1850   PetscFunctionBegin;
1851   ierr = PetscDrawLGGetDraw(drawlg,&draw);CHKERRQ(ierr);
1852   ierr = PetscDrawDestroy(draw);CHKERRQ(ierr);
1853   ierr = PetscDrawLGDestroy(drawlg);CHKERRQ(ierr);
1854   PetscFunctionReturn(0);
1855 }
1856 
1857 #undef __FUNCT__
1858 #define __FUNCT__ "TSGetTime"
1859 /*@
1860    TSGetTime - Gets the current time.
1861 
1862    Not Collective
1863 
1864    Input Parameter:
1865 .  ts - the TS context obtained from TSCreate()
1866 
1867    Output Parameter:
1868 .  t  - the current time
1869 
1870    Level: beginner
1871 
1872 .seealso: TSSetInitialTimeStep(), TSGetTimeStep()
1873 
1874 .keywords: TS, get, time
1875 @*/
1876 PetscErrorCode PETSCTS_DLLEXPORT TSGetTime(TS ts,PetscReal* t)
1877 {
1878   PetscFunctionBegin;
1879   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1880   PetscValidDoublePointer(t,2);
1881   *t = ts->ptime;
1882   PetscFunctionReturn(0);
1883 }
1884 
1885 #undef __FUNCT__
1886 #define __FUNCT__ "TSSetTime"
1887 /*@
1888    TSSetTime - Allows one to reset the time.
1889 
1890    Collective on TS
1891 
1892    Input Parameters:
1893 +  ts - the TS context obtained from TSCreate()
1894 -  time - the time
1895 
1896    Level: intermediate
1897 
1898 .seealso: TSGetTime(), TSSetDuration()
1899 
1900 .keywords: TS, set, time
1901 @*/
1902 PetscErrorCode PETSCTS_DLLEXPORT TSSetTime(TS ts, PetscReal t)
1903 {
1904   PetscFunctionBegin;
1905   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1906   ts->ptime = t;
1907   PetscFunctionReturn(0);
1908 }
1909 
1910 #undef __FUNCT__
1911 #define __FUNCT__ "TSSetOptionsPrefix"
1912 /*@C
1913    TSSetOptionsPrefix - Sets the prefix used for searching for all
1914    TS options in the database.
1915 
1916    Collective on TS
1917 
1918    Input Parameter:
1919 +  ts     - The TS context
1920 -  prefix - The prefix to prepend to all option names
1921 
1922    Notes:
1923    A hyphen (-) must NOT be given at the beginning of the prefix name.
1924    The first character of all runtime options is AUTOMATICALLY the
1925    hyphen.
1926 
1927    Level: advanced
1928 
1929 .keywords: TS, set, options, prefix, database
1930 
1931 .seealso: TSSetFromOptions()
1932 
1933 @*/
1934 PetscErrorCode PETSCTS_DLLEXPORT TSSetOptionsPrefix(TS ts,const char prefix[])
1935 {
1936   PetscErrorCode ierr;
1937 
1938   PetscFunctionBegin;
1939   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1940   ierr = PetscObjectSetOptionsPrefix((PetscObject)ts,prefix);CHKERRQ(ierr);
1941   switch(ts->problem_type) {
1942     case TS_NONLINEAR:
1943       if (ts->snes) {
1944         ierr = SNESSetOptionsPrefix(ts->snes,prefix);CHKERRQ(ierr);
1945       }
1946       break;
1947     case TS_LINEAR:
1948       if (ts->ksp) {
1949         ierr = KSPSetOptionsPrefix(ts->ksp,prefix);CHKERRQ(ierr);
1950       }
1951       break;
1952   }
1953   PetscFunctionReturn(0);
1954 }
1955 
1956 
1957 #undef __FUNCT__
1958 #define __FUNCT__ "TSAppendOptionsPrefix"
1959 /*@C
1960    TSAppendOptionsPrefix - Appends to the prefix used for searching for all
1961    TS options in the database.
1962 
1963    Collective on TS
1964 
1965    Input Parameter:
1966 +  ts     - The TS context
1967 -  prefix - The prefix to prepend to all option names
1968 
1969    Notes:
1970    A hyphen (-) must NOT be given at the beginning of the prefix name.
1971    The first character of all runtime options is AUTOMATICALLY the
1972    hyphen.
1973 
1974    Level: advanced
1975 
1976 .keywords: TS, append, options, prefix, database
1977 
1978 .seealso: TSGetOptionsPrefix()
1979 
1980 @*/
1981 PetscErrorCode PETSCTS_DLLEXPORT TSAppendOptionsPrefix(TS ts,const char prefix[])
1982 {
1983   PetscErrorCode ierr;
1984 
1985   PetscFunctionBegin;
1986   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1987   ierr = PetscObjectAppendOptionsPrefix((PetscObject)ts,prefix);CHKERRQ(ierr);
1988   switch(ts->problem_type) {
1989     case TS_NONLINEAR:
1990       if (ts->snes) {
1991         ierr = SNESAppendOptionsPrefix(ts->snes,prefix);CHKERRQ(ierr);
1992       }
1993       break;
1994     case TS_LINEAR:
1995       if (ts->ksp) {
1996         ierr = KSPAppendOptionsPrefix(ts->ksp,prefix);CHKERRQ(ierr);
1997       }
1998       break;
1999   }
2000   PetscFunctionReturn(0);
2001 }
2002 
2003 #undef __FUNCT__
2004 #define __FUNCT__ "TSGetOptionsPrefix"
2005 /*@C
2006    TSGetOptionsPrefix - Sets the prefix used for searching for all
2007    TS options in the database.
2008 
2009    Not Collective
2010 
2011    Input Parameter:
2012 .  ts - The TS context
2013 
2014    Output Parameter:
2015 .  prefix - A pointer to the prefix string used
2016 
2017    Notes: On the fortran side, the user should pass in a string 'prifix' of
2018    sufficient length to hold the prefix.
2019 
2020    Level: intermediate
2021 
2022 .keywords: TS, get, options, prefix, database
2023 
2024 .seealso: TSAppendOptionsPrefix()
2025 @*/
2026 PetscErrorCode PETSCTS_DLLEXPORT TSGetOptionsPrefix(TS ts,const char *prefix[])
2027 {
2028   PetscErrorCode ierr;
2029 
2030   PetscFunctionBegin;
2031   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
2032   PetscValidPointer(prefix,2);
2033   ierr = PetscObjectGetOptionsPrefix((PetscObject)ts,prefix);CHKERRQ(ierr);
2034   PetscFunctionReturn(0);
2035 }
2036 
2037 #undef __FUNCT__
2038 #define __FUNCT__ "TSGetRHSJacobian"
2039 /*@C
2040    TSGetRHSJacobian - Returns the Jacobian J at the present timestep.
2041 
2042    Not Collective, but parallel objects are returned if TS is parallel
2043 
2044    Input Parameter:
2045 .  ts  - The TS context obtained from TSCreate()
2046 
2047    Output Parameters:
2048 +  J   - The Jacobian J of F, where U_t = F(U,t)
2049 .  M   - The preconditioner matrix, usually the same as J
2050 - ctx - User-defined context for Jacobian evaluation routine
2051 
2052    Notes: You can pass in PETSC_NULL for any return argument you do not need.
2053 
2054    Level: intermediate
2055 
2056 .seealso: TSGetTimeStep(), TSGetMatrices(), TSGetTime(), TSGetTimeStepNumber()
2057 
2058 .keywords: TS, timestep, get, matrix, Jacobian
2059 @*/
2060 PetscErrorCode PETSCTS_DLLEXPORT TSGetRHSJacobian(TS ts,Mat *J,Mat *M,void **ctx)
2061 {
2062   PetscFunctionBegin;
2063   if (J) *J = ts->Arhs;
2064   if (M) *M = ts->B;
2065   if (ctx) *ctx = ts->jacP;
2066   PetscFunctionReturn(0);
2067 }
2068 
2069 #undef __FUNCT__
2070 #define __FUNCT__ "TSGetIJacobian"
2071 /*@C
2072    TSGetIJacobian - Returns the implicit Jacobian at the present timestep.
2073 
2074    Not Collective, but parallel objects are returned if TS is parallel
2075 
2076    Input Parameter:
2077 .  ts  - The TS context obtained from TSCreate()
2078 
2079    Output Parameters:
2080 +  A   - The Jacobian of F(t,U,U_t)
2081 .  B   - The preconditioner matrix, often the same as A
2082 .  f   - The function to compute the matrices
2083 - ctx - User-defined context for Jacobian evaluation routine
2084 
2085    Notes: You can pass in PETSC_NULL for any return argument you do not need.
2086 
2087    Level: advanced
2088 
2089 .seealso: TSGetTimeStep(), TSGetRHSJacobian(), TSGetMatrices(), TSGetTime(), TSGetTimeStepNumber()
2090 
2091 .keywords: TS, timestep, get, matrix, Jacobian
2092 @*/
2093 PetscErrorCode PETSCTS_DLLEXPORT TSGetIJacobian(TS ts,Mat *A,Mat *B,TSIJacobian *f,void **ctx)
2094 {
2095   PetscFunctionBegin;
2096   if (A) *A = ts->A;
2097   if (B) *B = ts->B;
2098   if (f) *f = ts->ops->ijacobian;
2099   if (ctx) *ctx = ts->jacP;
2100   PetscFunctionReturn(0);
2101 }
2102 
2103 #undef __FUNCT__
2104 #define __FUNCT__ "TSMonitorSolution"
2105 /*@C
2106    TSMonitorSolution - Monitors progress of the TS solvers by calling
2107    VecView() for the solution at each timestep
2108 
2109    Collective on TS
2110 
2111    Input Parameters:
2112 +  ts - the TS context
2113 .  step - current time-step
2114 .  ptime - current time
2115 -  dummy - either a viewer or PETSC_NULL
2116 
2117    Level: intermediate
2118 
2119 .keywords: TS,  vector, monitor, view
2120 
2121 .seealso: TSMonitorSet(), TSMonitorDefault(), VecView()
2122 @*/
2123 PetscErrorCode PETSCTS_DLLEXPORT TSMonitorSolution(TS ts,PetscInt step,PetscReal ptime,Vec x,void *dummy)
2124 {
2125   PetscErrorCode ierr;
2126   PetscViewer    viewer = (PetscViewer) dummy;
2127 
2128   PetscFunctionBegin;
2129   if (!dummy) {
2130     viewer = PETSC_VIEWER_DRAW_(((PetscObject)ts)->comm);
2131   }
2132   ierr = VecView(x,viewer);CHKERRQ(ierr);
2133   PetscFunctionReturn(0);
2134 }
2135 
2136 
2137 #undef __FUNCT__
2138 #define __FUNCT__ "TSSetDM"
2139 /*@
2140    TSSetDM - Sets the DM that may be used by some preconditioners
2141 
2142    Collective on TS
2143 
2144    Input Parameters:
2145 +  ts - the preconditioner context
2146 -  dm - the dm
2147 
2148    Level: intermediate
2149 
2150 
2151 .seealso: TSGetDM(), SNESSetDM(), SNESGetDM()
2152 @*/
2153 PetscErrorCode PETSCTS_DLLEXPORT TSSetDM(TS ts,DM dm)
2154 {
2155   PetscErrorCode ierr;
2156 
2157   PetscFunctionBegin;
2158   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
2159   if (ts->dm) {ierr = DMDestroy(ts->dm);CHKERRQ(ierr);}
2160   ts->dm = dm;
2161   ierr = PetscObjectReference((PetscObject)ts->dm);CHKERRQ(ierr);
2162   if (ts->snes) {ierr = SNESSetDM(ts->snes,dm);CHKERRQ(ierr);}
2163   PetscFunctionReturn(0);
2164 }
2165 
2166 #undef __FUNCT__
2167 #define __FUNCT__ "TSGetDM"
2168 /*@
2169    TSGetDM - Gets the DM that may be used by some preconditioners
2170 
2171    Collective on TS
2172 
2173    Input Parameter:
2174 . ts - the preconditioner context
2175 
2176    Output Parameter:
2177 .  dm - the dm
2178 
2179    Level: intermediate
2180 
2181 
2182 .seealso: TSSetDM(), SNESSetDM(), SNESGetDM()
2183 @*/
2184 PetscErrorCode PETSCTS_DLLEXPORT TSGetDM(TS ts,DM *dm)
2185 {
2186   PetscFunctionBegin;
2187   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
2188   *dm = ts->dm;
2189   PetscFunctionReturn(0);
2190 }
2191 
2192