xref: /petsc/src/ts/impls/implicit/theta/theta.c (revision cd6526761e44e2ac7b4afaaf511785e78693abcc)
1316643e7SJed Brown /*
2316643e7SJed Brown   Code for timestepping with implicit Theta method
3316643e7SJed Brown 
4316643e7SJed Brown   Notes:
5316643e7SJed Brown   This method can be applied to DAE.
6316643e7SJed Brown 
7316643e7SJed Brown   This method is cast as a 1-stage implicit Runge-Kutta method.
8316643e7SJed Brown 
9316643e7SJed Brown   Theta | Theta
10316643e7SJed Brown   -------------
11316643e7SJed Brown         |  1
12316643e7SJed Brown 
13316643e7SJed Brown   To apply a diagonally implicit RK method to DAE, the stage formula
14316643e7SJed Brown 
15316643e7SJed Brown   X_i = x + h sum_j a_ij X'_j
16316643e7SJed Brown 
17316643e7SJed Brown   is interpreted as a formula for X'_i in terms of X_i and known stuff (X'_j, j<i)
18316643e7SJed Brown */
19c6db04a5SJed Brown #include <private/tsimpl.h>                /*I   "petscts.h"   I*/
20316643e7SJed Brown 
21316643e7SJed Brown typedef struct {
22316643e7SJed Brown   Vec       X,Xdot;                   /* Storage for one stage */
23ace3abfcSBarry Smith   PetscBool extrapolate;
24316643e7SJed Brown   PetscReal Theta;
25316643e7SJed Brown   PetscReal shift;
26316643e7SJed Brown   PetscReal stage_time;
27316643e7SJed Brown } TS_Theta;
28316643e7SJed Brown 
29316643e7SJed Brown #undef __FUNCT__
30316643e7SJed Brown #define __FUNCT__ "TSStep_Theta"
31193ac0bcSJed Brown static PetscErrorCode TSStep_Theta(TS ts)
32316643e7SJed Brown {
33316643e7SJed Brown   TS_Theta       *th = (TS_Theta*)ts->data;
34b70ae86eSJed Brown   PetscInt       its,lits;
352b5a38e1SLisandro Dalcin   PetscErrorCode ierr;
36316643e7SJed Brown 
37316643e7SJed Brown   PetscFunctionBegin;
38193ac0bcSJed Brown   ts->time_step = ts->next_time_step;
39316643e7SJed Brown   th->stage_time = ts->ptime + th->Theta*ts->time_step;
40316643e7SJed Brown   th->shift = 1./(th->Theta*ts->time_step);
41316643e7SJed Brown 
42ace68cafSJed Brown   if (th->extrapolate) {
432b5a38e1SLisandro Dalcin     ierr = VecWAXPY(th->X,1./th->shift,th->Xdot,ts->vec_sol);CHKERRQ(ierr);
44ace68cafSJed Brown   } else {
452b5a38e1SLisandro Dalcin     ierr = VecCopy(ts->vec_sol,th->X);CHKERRQ(ierr);
46ace68cafSJed Brown   }
47316643e7SJed Brown   ierr = SNESSolve(ts->snes,PETSC_NULL,th->X);CHKERRQ(ierr);
48316643e7SJed Brown   ierr = SNESGetIterationNumber(ts->snes,&its);CHKERRQ(ierr);
49316643e7SJed Brown   ierr = SNESGetLinearSolveIterations(ts->snes,&lits);CHKERRQ(ierr);
50316643e7SJed Brown   ts->nonlinear_its += its; ts->linear_its += lits;
512b5a38e1SLisandro Dalcin 
522b5a38e1SLisandro Dalcin   ierr = VecAXPBYPCZ(th->Xdot,-th->shift,th->shift,0,ts->vec_sol,th->X);CHKERRQ(ierr);
532b5a38e1SLisandro Dalcin   ierr = VecAXPY(ts->vec_sol,ts->time_step,th->Xdot);CHKERRQ(ierr);
542b5a38e1SLisandro Dalcin   ts->ptime          += ts->time_step;
55193ac0bcSJed Brown   ts->next_time_step  = ts->time_step;
56316643e7SJed Brown   ts->steps++;
57316643e7SJed Brown   PetscFunctionReturn(0);
58316643e7SJed Brown }
59316643e7SJed Brown 
60*cd652676SJed Brown #undef __FUNCT__
61*cd652676SJed Brown #define __FUNCT__ "TSInterpolate_Theta"
62*cd652676SJed Brown static PetscErrorCode TSInterpolate_Theta(TS ts,PetscReal t,Vec X)
63*cd652676SJed Brown {
64*cd652676SJed Brown   TS_Theta       *th = (TS_Theta*)ts->data;
65*cd652676SJed Brown   PetscErrorCode ierr;
66*cd652676SJed Brown 
67*cd652676SJed Brown   PetscFunctionBegin;
68*cd652676SJed Brown   ierr = VecWAXPY(X,t-ts->ptime,ts->vec_sol,th->Xdot);CHKERRQ(ierr);
69*cd652676SJed Brown   PetscFunctionReturn(0);
70*cd652676SJed Brown }
71*cd652676SJed Brown 
72316643e7SJed Brown /*------------------------------------------------------------*/
73316643e7SJed Brown #undef __FUNCT__
74277b19d0SLisandro Dalcin #define __FUNCT__ "TSReset_Theta"
75277b19d0SLisandro Dalcin static PetscErrorCode TSReset_Theta(TS ts)
76316643e7SJed Brown {
77316643e7SJed Brown   TS_Theta       *th = (TS_Theta*)ts->data;
78316643e7SJed Brown   PetscErrorCode  ierr;
79316643e7SJed Brown 
80316643e7SJed Brown   PetscFunctionBegin;
816bf464f9SBarry Smith   ierr = VecDestroy(&th->X);CHKERRQ(ierr);
826bf464f9SBarry Smith   ierr = VecDestroy(&th->Xdot);CHKERRQ(ierr);
83277b19d0SLisandro Dalcin   PetscFunctionReturn(0);
84277b19d0SLisandro Dalcin }
85277b19d0SLisandro Dalcin 
86277b19d0SLisandro Dalcin #undef __FUNCT__
87277b19d0SLisandro Dalcin #define __FUNCT__ "TSDestroy_Theta"
88277b19d0SLisandro Dalcin static PetscErrorCode TSDestroy_Theta(TS ts)
89277b19d0SLisandro Dalcin {
90277b19d0SLisandro Dalcin   PetscErrorCode  ierr;
91277b19d0SLisandro Dalcin 
92277b19d0SLisandro Dalcin   PetscFunctionBegin;
93277b19d0SLisandro Dalcin   ierr = TSReset_Theta(ts);CHKERRQ(ierr);
94277b19d0SLisandro Dalcin   ierr = PetscFree(ts->data);CHKERRQ(ierr);
95335f802eSJed Brown   ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSThetaGetTheta_C","",PETSC_NULL);CHKERRQ(ierr);
96335f802eSJed Brown   ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSThetaSetTheta_C","",PETSC_NULL);CHKERRQ(ierr);
97316643e7SJed Brown   PetscFunctionReturn(0);
98316643e7SJed Brown }
99316643e7SJed Brown 
100316643e7SJed Brown /*
101316643e7SJed Brown   This defines the nonlinear equation that is to be solved with SNES
1022b5a38e1SLisandro Dalcin   G(U) = F[t0+Theta*dt, U, (U-U0)*shift] = 0
103316643e7SJed Brown */
104316643e7SJed Brown #undef __FUNCT__
1050f5c6efeSJed Brown #define __FUNCT__ "SNESTSFormFunction_Theta"
1060f5c6efeSJed Brown static PetscErrorCode SNESTSFormFunction_Theta(SNES snes,Vec x,Vec y,TS ts)
107316643e7SJed Brown {
108316643e7SJed Brown   TS_Theta       *th = (TS_Theta*)ts->data;
109316643e7SJed Brown   PetscErrorCode ierr;
110316643e7SJed Brown 
111316643e7SJed Brown   PetscFunctionBegin;
1122b5a38e1SLisandro Dalcin   ierr = VecAXPBYPCZ(th->Xdot,-th->shift,th->shift,0,ts->vec_sol,x);CHKERRQ(ierr);
113214bc6a2SJed Brown   ierr = TSComputeIFunction(ts,th->stage_time,x,th->Xdot,y,PETSC_FALSE);CHKERRQ(ierr);
114316643e7SJed Brown   PetscFunctionReturn(0);
115316643e7SJed Brown }
116316643e7SJed Brown 
117316643e7SJed Brown #undef __FUNCT__
1180f5c6efeSJed Brown #define __FUNCT__ "SNESTSFormJacobian_Theta"
1190f5c6efeSJed Brown static PetscErrorCode SNESTSFormJacobian_Theta(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *str,TS ts)
120316643e7SJed Brown {
121316643e7SJed Brown   TS_Theta       *th = (TS_Theta*)ts->data;
122316643e7SJed Brown   PetscErrorCode ierr;
123316643e7SJed Brown 
124316643e7SJed Brown   PetscFunctionBegin;
1250f5c6efeSJed Brown   /* th->Xdot has already been computed in SNESTSFormFunction_Theta (SNES guarantees this) */
126214bc6a2SJed Brown   ierr = TSComputeIJacobian(ts,th->stage_time,x,th->Xdot,th->shift,A,B,str,PETSC_FALSE);CHKERRQ(ierr);
127316643e7SJed Brown   PetscFunctionReturn(0);
128316643e7SJed Brown }
129316643e7SJed Brown 
130316643e7SJed Brown 
131316643e7SJed Brown #undef __FUNCT__
132316643e7SJed Brown #define __FUNCT__ "TSSetUp_Theta"
133316643e7SJed Brown static PetscErrorCode TSSetUp_Theta(TS ts)
134316643e7SJed Brown {
135316643e7SJed Brown   TS_Theta       *th = (TS_Theta*)ts->data;
136316643e7SJed Brown   PetscErrorCode ierr;
137316643e7SJed Brown 
138316643e7SJed Brown   PetscFunctionBegin;
139316643e7SJed Brown   ierr = VecDuplicate(ts->vec_sol,&th->X);CHKERRQ(ierr);
140316643e7SJed Brown   ierr = VecDuplicate(ts->vec_sol,&th->Xdot);CHKERRQ(ierr);
141316643e7SJed Brown   PetscFunctionReturn(0);
142316643e7SJed Brown }
143316643e7SJed Brown /*------------------------------------------------------------*/
144316643e7SJed Brown 
145316643e7SJed Brown #undef __FUNCT__
146316643e7SJed Brown #define __FUNCT__ "TSSetFromOptions_Theta"
147316643e7SJed Brown static PetscErrorCode TSSetFromOptions_Theta(TS ts)
148316643e7SJed Brown {
149316643e7SJed Brown   TS_Theta       *th = (TS_Theta*)ts->data;
150316643e7SJed Brown   PetscErrorCode ierr;
151316643e7SJed Brown 
152316643e7SJed Brown   PetscFunctionBegin;
153d73342a9SJed Brown   ierr = PetscOptionsHead("Theta ODE solver options");CHKERRQ(ierr);
154316643e7SJed Brown   {
155316643e7SJed Brown     ierr = PetscOptionsReal("-ts_theta_theta","Location of stage (0<Theta<=1)","TSThetaSetTheta",th->Theta,&th->Theta,PETSC_NULL);CHKERRQ(ierr);
156acfcf0e5SJed Brown     ierr = PetscOptionsBool("-ts_theta_extrapolate","Extrapolate stage solution from previous solution (sometimes unstable)","TSThetaSetExtrapolate",th->extrapolate,&th->extrapolate,PETSC_NULL);CHKERRQ(ierr);
157316643e7SJed Brown   }
158316643e7SJed Brown   ierr = PetscOptionsTail();CHKERRQ(ierr);
159316643e7SJed Brown   PetscFunctionReturn(0);
160316643e7SJed Brown }
161316643e7SJed Brown 
162316643e7SJed Brown #undef __FUNCT__
163316643e7SJed Brown #define __FUNCT__ "TSView_Theta"
164316643e7SJed Brown static PetscErrorCode TSView_Theta(TS ts,PetscViewer viewer)
165316643e7SJed Brown {
166316643e7SJed Brown   TS_Theta       *th = (TS_Theta*)ts->data;
167ace3abfcSBarry Smith   PetscBool       iascii;
168316643e7SJed Brown   PetscErrorCode  ierr;
169316643e7SJed Brown 
170316643e7SJed Brown   PetscFunctionBegin;
1712692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
172316643e7SJed Brown   if (iascii) {
173316643e7SJed Brown     ierr = PetscViewerASCIIPrintf(viewer,"  Theta=%G\n",th->Theta);CHKERRQ(ierr);
174ace68cafSJed Brown     ierr = PetscViewerASCIIPrintf(viewer,"  Extrapolation=%s\n",th->extrapolate?"yes":"no");CHKERRQ(ierr);
175316643e7SJed Brown   }
176316643e7SJed Brown   PetscFunctionReturn(0);
177316643e7SJed Brown }
178316643e7SJed Brown 
1790de4c49aSJed Brown EXTERN_C_BEGIN
1800de4c49aSJed Brown #undef __FUNCT__
1810de4c49aSJed Brown #define __FUNCT__ "TSThetaGetTheta_Theta"
1827087cfbeSBarry Smith PetscErrorCode  TSThetaGetTheta_Theta(TS ts,PetscReal *theta)
1830de4c49aSJed Brown {
1840de4c49aSJed Brown   TS_Theta *th = (TS_Theta*)ts->data;
1850de4c49aSJed Brown 
1860de4c49aSJed Brown   PetscFunctionBegin;
1870de4c49aSJed Brown   *theta = th->Theta;
1880de4c49aSJed Brown   PetscFunctionReturn(0);
1890de4c49aSJed Brown }
1900de4c49aSJed Brown 
1910de4c49aSJed Brown #undef __FUNCT__
1920de4c49aSJed Brown #define __FUNCT__ "TSThetaSetTheta_Theta"
1937087cfbeSBarry Smith PetscErrorCode  TSThetaSetTheta_Theta(TS ts,PetscReal theta)
1940de4c49aSJed Brown {
1950de4c49aSJed Brown   TS_Theta *th = (TS_Theta*)ts->data;
1960de4c49aSJed Brown 
1970de4c49aSJed Brown   PetscFunctionBegin;
198e7be1afaSJed Brown   if (theta <= 0 || 1 < theta) SETERRQ1(((PetscObject)ts)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Theta %G not in range (0,1]",theta);
1990de4c49aSJed Brown   th->Theta = theta;
2000de4c49aSJed Brown   PetscFunctionReturn(0);
2010de4c49aSJed Brown }
2020de4c49aSJed Brown EXTERN_C_END
2030de4c49aSJed Brown 
204316643e7SJed Brown /* ------------------------------------------------------------ */
205316643e7SJed Brown /*MC
20696f5712cSJed Brown       TSTHETA - DAE solver using the implicit Theta method
207316643e7SJed Brown 
208316643e7SJed Brown   Level: beginner
209316643e7SJed Brown 
210316643e7SJed Brown .seealso:  TSCreate(), TS, TSSetType()
211316643e7SJed Brown 
212316643e7SJed Brown M*/
213316643e7SJed Brown EXTERN_C_BEGIN
214316643e7SJed Brown #undef __FUNCT__
215316643e7SJed Brown #define __FUNCT__ "TSCreate_Theta"
2167087cfbeSBarry Smith PetscErrorCode  TSCreate_Theta(TS ts)
217316643e7SJed Brown {
218316643e7SJed Brown   TS_Theta       *th;
219316643e7SJed Brown   PetscErrorCode ierr;
220316643e7SJed Brown 
221316643e7SJed Brown   PetscFunctionBegin;
222277b19d0SLisandro Dalcin   ts->ops->reset          = TSReset_Theta;
223316643e7SJed Brown   ts->ops->destroy        = TSDestroy_Theta;
224316643e7SJed Brown   ts->ops->view           = TSView_Theta;
225316643e7SJed Brown   ts->ops->setup          = TSSetUp_Theta;
226316643e7SJed Brown   ts->ops->step           = TSStep_Theta;
227*cd652676SJed Brown   ts->ops->interpolate    = TSInterpolate_Theta;
228316643e7SJed Brown   ts->ops->setfromoptions = TSSetFromOptions_Theta;
2290f5c6efeSJed Brown   ts->ops->snesfunction   = SNESTSFormFunction_Theta;
2300f5c6efeSJed Brown   ts->ops->snesjacobian   = SNESTSFormJacobian_Theta;
231316643e7SJed Brown 
232316643e7SJed Brown   ierr = PetscNewLog(ts,TS_Theta,&th);CHKERRQ(ierr);
233316643e7SJed Brown   ts->data = (void*)th;
234316643e7SJed Brown 
2356f700aefSJed Brown   th->extrapolate = PETSC_FALSE;
236316643e7SJed Brown   th->Theta       = 0.5;
237316643e7SJed Brown 
2380de4c49aSJed Brown   ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSThetaGetTheta_C","TSThetaGetTheta_Theta",TSThetaGetTheta_Theta);CHKERRQ(ierr);
2390de4c49aSJed Brown   ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSThetaSetTheta_C","TSThetaSetTheta_Theta",TSThetaSetTheta_Theta);CHKERRQ(ierr);
240316643e7SJed Brown   PetscFunctionReturn(0);
241316643e7SJed Brown }
242316643e7SJed Brown EXTERN_C_END
2430de4c49aSJed Brown 
2440de4c49aSJed Brown #undef __FUNCT__
2450de4c49aSJed Brown #define __FUNCT__ "TSThetaGetTheta"
2460de4c49aSJed Brown /*@
2470de4c49aSJed Brown   TSThetaGetTheta - Get the abscissa of the stage in (0,1].
2480de4c49aSJed Brown 
2490de4c49aSJed Brown   Not Collective
2500de4c49aSJed Brown 
2510de4c49aSJed Brown   Input Parameter:
2520de4c49aSJed Brown .  ts - timestepping context
2530de4c49aSJed Brown 
2540de4c49aSJed Brown   Output Parameter:
2550de4c49aSJed Brown .  theta - stage abscissa
2560de4c49aSJed Brown 
2570de4c49aSJed Brown   Note:
2580de4c49aSJed Brown   Use of this function is normally only required to hack TSTHETA to use a modified integration scheme.
2590de4c49aSJed Brown 
2600de4c49aSJed Brown   Level: Advanced
2610de4c49aSJed Brown 
2620de4c49aSJed Brown .seealso: TSThetaSetTheta()
2630de4c49aSJed Brown @*/
2647087cfbeSBarry Smith PetscErrorCode  TSThetaGetTheta(TS ts,PetscReal *theta)
2650de4c49aSJed Brown {
2664ac538c5SBarry Smith   PetscErrorCode ierr;
2670de4c49aSJed Brown 
2680de4c49aSJed Brown   PetscFunctionBegin;
269afb20b64SJed Brown   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
2700de4c49aSJed Brown   PetscValidPointer(theta,2);
2714ac538c5SBarry Smith   ierr = PetscUseMethod(ts,"TSThetaGetTheta_C",(TS,PetscReal*),(ts,theta));CHKERRQ(ierr);
2720de4c49aSJed Brown   PetscFunctionReturn(0);
2730de4c49aSJed Brown }
2740de4c49aSJed Brown 
2750de4c49aSJed Brown #undef __FUNCT__
2760de4c49aSJed Brown #define __FUNCT__ "TSThetaSetTheta"
2770de4c49aSJed Brown /*@
2780de4c49aSJed Brown   TSThetaSetTheta - Set the abscissa of the stage in (0,1].
2790de4c49aSJed Brown 
2800de4c49aSJed Brown   Not Collective
2810de4c49aSJed Brown 
2820de4c49aSJed Brown   Input Parameter:
2830de4c49aSJed Brown +  ts - timestepping context
2840de4c49aSJed Brown -  theta - stage abscissa
2850de4c49aSJed Brown 
2860de4c49aSJed Brown   Options Database:
2870de4c49aSJed Brown .  -ts_theta_theta <theta>
2880de4c49aSJed Brown 
2890de4c49aSJed Brown   Level: Intermediate
2900de4c49aSJed Brown 
2910de4c49aSJed Brown .seealso: TSThetaGetTheta()
2920de4c49aSJed Brown @*/
2937087cfbeSBarry Smith PetscErrorCode  TSThetaSetTheta(TS ts,PetscReal theta)
2940de4c49aSJed Brown {
2954ac538c5SBarry Smith   PetscErrorCode ierr;
2960de4c49aSJed Brown 
2970de4c49aSJed Brown   PetscFunctionBegin;
298afb20b64SJed Brown   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
2994ac538c5SBarry Smith   ierr = PetscTryMethod(ts,"TSThetaSetTheta_C",(TS,PetscReal),(ts,theta));CHKERRQ(ierr);
3000de4c49aSJed Brown   PetscFunctionReturn(0);
3010de4c49aSJed Brown }
302f33bbcb6SJed Brown 
303f33bbcb6SJed Brown /*
304f33bbcb6SJed Brown  * TSBEULER and TSCN are straightforward specializations of TSTHETA.
305f33bbcb6SJed Brown  * The creation functions for these specializations are below.
306f33bbcb6SJed Brown  */
307f33bbcb6SJed Brown 
308f33bbcb6SJed Brown #undef __FUNCT__
309f33bbcb6SJed Brown #define __FUNCT__ "TSView_BEuler"
310f33bbcb6SJed Brown static PetscErrorCode TSView_BEuler(TS ts,PetscViewer viewer)
311f33bbcb6SJed Brown {
312f33bbcb6SJed Brown   PetscFunctionBegin;
313f33bbcb6SJed Brown   PetscFunctionReturn(0);
314f33bbcb6SJed Brown }
315f33bbcb6SJed Brown 
316f33bbcb6SJed Brown /*MC
317f33bbcb6SJed Brown       TSBEULER - ODE solver using the implicit backward Euler method
318f33bbcb6SJed Brown 
319f33bbcb6SJed Brown   Level: beginner
320f33bbcb6SJed Brown 
321f33bbcb6SJed Brown .seealso:  TSCreate(), TS, TSSetType(), TSEULER, TSCN, TSTHETA
322f33bbcb6SJed Brown 
323f33bbcb6SJed Brown M*/
324f33bbcb6SJed Brown EXTERN_C_BEGIN
325f33bbcb6SJed Brown #undef __FUNCT__
326f33bbcb6SJed Brown #define __FUNCT__ "TSCreate_BEuler"
327f33bbcb6SJed Brown PetscErrorCode  TSCreate_BEuler(TS ts)
328f33bbcb6SJed Brown {
329f33bbcb6SJed Brown   PetscErrorCode ierr;
330f33bbcb6SJed Brown 
331f33bbcb6SJed Brown   PetscFunctionBegin;
332f33bbcb6SJed Brown   ierr = TSCreate_Theta(ts);CHKERRQ(ierr);
333f33bbcb6SJed Brown   ierr = TSThetaSetTheta(ts,1.0);CHKERRQ(ierr);
334f33bbcb6SJed Brown   ts->ops->view = TSView_BEuler;
335f33bbcb6SJed Brown   PetscFunctionReturn(0);
336f33bbcb6SJed Brown }
337f33bbcb6SJed Brown EXTERN_C_END
338f33bbcb6SJed Brown 
339f33bbcb6SJed Brown #undef __FUNCT__
340f33bbcb6SJed Brown #define __FUNCT__ "TSView_CN"
341f33bbcb6SJed Brown static PetscErrorCode TSView_CN(TS ts,PetscViewer viewer)
342f33bbcb6SJed Brown {
343f33bbcb6SJed Brown   PetscFunctionBegin;
344f33bbcb6SJed Brown   PetscFunctionReturn(0);
345f33bbcb6SJed Brown }
346f33bbcb6SJed Brown 
347f33bbcb6SJed Brown /*MC
348f33bbcb6SJed Brown       TSCN - ODE solver using the implicit Crank-Nicolson method.
349f33bbcb6SJed Brown 
350f33bbcb6SJed Brown   Level: beginner
351f33bbcb6SJed Brown 
352f33bbcb6SJed Brown   Notes:
353f33bbcb6SJed Brown   TSCN is equivalent to TSTHETA with Theta=0.5
354f33bbcb6SJed Brown 
355f33bbcb6SJed Brown .seealso:  TSCreate(), TS, TSSetType(), TSBEULER, TSTHETA
356f33bbcb6SJed Brown 
357f33bbcb6SJed Brown M*/
358f33bbcb6SJed Brown EXTERN_C_BEGIN
359f33bbcb6SJed Brown #undef __FUNCT__
360f33bbcb6SJed Brown #define __FUNCT__ "TSCreate_CN"
361f33bbcb6SJed Brown PetscErrorCode  TSCreate_CN(TS ts)
362f33bbcb6SJed Brown {
363f33bbcb6SJed Brown   PetscErrorCode ierr;
364f33bbcb6SJed Brown 
365f33bbcb6SJed Brown   PetscFunctionBegin;
366f33bbcb6SJed Brown   ierr = TSCreate_Theta(ts);CHKERRQ(ierr);
367f33bbcb6SJed Brown   ierr = TSThetaSetTheta(ts,0.5);CHKERRQ(ierr);
368f33bbcb6SJed Brown   ts->ops->view = TSView_CN;
369f33bbcb6SJed Brown   PetscFunctionReturn(0);
370f33bbcb6SJed Brown }
371f33bbcb6SJed Brown EXTERN_C_END
372