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