xref: /petsc/src/ts/impls/explicit/ssp/ssp.c (revision 8ab3e0fce4c9387396cdc9240e12079161ef2de0)
1ef7bb5aaSJed Brown #define PETSCTS_DLL
2ef7bb5aaSJed Brown 
3ef7bb5aaSJed Brown /*
4ef7bb5aaSJed Brown        Code for Timestepping with explicit SSP.
5ef7bb5aaSJed Brown */
6ef7bb5aaSJed Brown #include "private/tsimpl.h"                /*I   "petscts.h"   I*/
7ef7bb5aaSJed Brown 
8ef7bb5aaSJed Brown PetscFList TSSSPList = 0;
9ef7bb5aaSJed Brown #define TSSSPType char*
10ef7bb5aaSJed Brown 
11ef7bb5aaSJed Brown #define TSSSPRKS2  "rks2"
12ef7bb5aaSJed Brown #define TSSSPRKS3  "rks3"
13ef7bb5aaSJed Brown #define TSSSPRK104 "rk104"
14ef7bb5aaSJed Brown 
15ef7bb5aaSJed Brown typedef struct {
16ef7bb5aaSJed Brown   PetscErrorCode (*onestep)(TS,PetscReal,PetscReal,Vec);
17ef7bb5aaSJed Brown   PetscInt nstages;
18ef7bb5aaSJed Brown   Vec xdot;
19ef7bb5aaSJed Brown   Vec *work;
20ef7bb5aaSJed Brown   PetscInt nwork;
21ef7bb5aaSJed Brown   PetscTruth workout;
22ef7bb5aaSJed Brown } TS_SSP;
23ef7bb5aaSJed Brown 
24ef7bb5aaSJed Brown 
25ef7bb5aaSJed Brown #undef __FUNCT__
26ef7bb5aaSJed Brown #define __FUNCT__ "SSPGetWorkVectors"
27ef7bb5aaSJed Brown static PetscErrorCode SSPGetWorkVectors(TS ts,PetscInt n,Vec **work)
28ef7bb5aaSJed Brown {
29ef7bb5aaSJed Brown   TS_SSP *ssp = (TS_SSP*)ts->data;
30ef7bb5aaSJed Brown   PetscErrorCode ierr;
31ef7bb5aaSJed Brown 
32ef7bb5aaSJed Brown   PetscFunctionBegin;
33ef7bb5aaSJed Brown   if (ssp->workout) SETERRQ(PETSC_ERR_PLIB,"Work vectors already gotten");
34ef7bb5aaSJed Brown   if (ssp->nwork < n) {
35ef7bb5aaSJed Brown     if (ssp->nwork > 0) {
36ef7bb5aaSJed Brown       ierr = VecDestroyVecs(ssp->work,ssp->nwork);CHKERRQ(ierr);
37ef7bb5aaSJed Brown     }
38ef7bb5aaSJed Brown     ierr = VecDuplicateVecs(ts->vec_sol,n,&ssp->work);CHKERRQ(ierr);
39ef7bb5aaSJed Brown     ssp->nwork = n;
40ef7bb5aaSJed Brown   }
41ef7bb5aaSJed Brown   *work = ssp->work;
42ef7bb5aaSJed Brown   ssp->workout = PETSC_TRUE;
43ef7bb5aaSJed Brown   PetscFunctionReturn(0);
44ef7bb5aaSJed Brown }
45ef7bb5aaSJed Brown 
46ef7bb5aaSJed Brown #undef __FUNCT__
47ef7bb5aaSJed Brown #define __FUNCT__ "SSPRestoreWorkVectors"
48ef7bb5aaSJed Brown static PetscErrorCode SSPRestoreWorkVectors(TS ts,PetscInt n,Vec **work)
49ef7bb5aaSJed Brown {
50ef7bb5aaSJed Brown   TS_SSP *ssp = (TS_SSP*)ts->data;
51ef7bb5aaSJed Brown 
52ef7bb5aaSJed Brown   PetscFunctionBegin;
53ef7bb5aaSJed Brown   if (!ssp->workout) SETERRQ(PETSC_ERR_ORDER,"Work vectors have not been gotten");
54ef7bb5aaSJed Brown   if (*work != ssp->work) SETERRQ(PETSC_ERR_PLIB,"Wrong work vectors checked out");
55ef7bb5aaSJed Brown   ssp->workout = PETSC_FALSE;
56ef7bb5aaSJed Brown   *work = PETSC_NULL;
57ef7bb5aaSJed Brown   PetscFunctionReturn(0);
58ef7bb5aaSJed Brown }
59ef7bb5aaSJed Brown 
60ef7bb5aaSJed Brown 
61ef7bb5aaSJed Brown #undef __FUNCT__
62ef7bb5aaSJed Brown #define __FUNCT__ "SSPStep_RK_2"
63ef7bb5aaSJed Brown /* Optimal second order SSP Runge-Kutta, low-storage, c_eff=(s-1)/s */
64ef7bb5aaSJed Brown /* Pseudocode 2 of Ketcheson 2008 */
65ef7bb5aaSJed Brown static PetscErrorCode SSPStep_RK_2(TS ts,PetscReal t0,PetscReal dt,Vec sol)
66ef7bb5aaSJed Brown {
67ef7bb5aaSJed Brown   TS_SSP *ssp = (TS_SSP*)ts->data;
68ef7bb5aaSJed Brown   Vec *work,F;
69ef7bb5aaSJed Brown   PetscInt i,s;
70ef7bb5aaSJed Brown   PetscErrorCode ierr;
71ef7bb5aaSJed Brown 
72ef7bb5aaSJed Brown   PetscFunctionBegin;
73ef7bb5aaSJed Brown   s = ssp->nstages;
74ef7bb5aaSJed Brown   ierr = SSPGetWorkVectors(ts,2,&work);CHKERRQ(ierr);
75ef7bb5aaSJed Brown   F = work[1];
76ef7bb5aaSJed Brown   ierr = VecCopy(sol,work[0]);CHKERRQ(ierr);
77ef7bb5aaSJed Brown   for (i=0; i<s-1; i++) {
78ef7bb5aaSJed Brown     ierr = TSComputeRHSFunction(ts,t0+dt*(i/(s-1.)),work[0],F);CHKERRQ(ierr);
79ef7bb5aaSJed Brown     ierr = VecAXPY(work[0],dt/(s-1.),F);CHKERRQ(ierr);
80ef7bb5aaSJed Brown   }
81ef7bb5aaSJed Brown   ierr = TSComputeRHSFunction(ts,t0+dt,work[0],F);CHKERRQ(ierr);
82ef7bb5aaSJed Brown   ierr = VecAXPBYPCZ(sol,(s-1.)/s,dt/s,1./s,work[0],F);CHKERRQ(ierr);
83ef7bb5aaSJed Brown   ierr = SSPRestoreWorkVectors(ts,2,&work);CHKERRQ(ierr);
84ef7bb5aaSJed Brown   PetscFunctionReturn(0);
85ef7bb5aaSJed Brown }
86ef7bb5aaSJed Brown 
87ef7bb5aaSJed Brown #undef __FUNCT__
88ef7bb5aaSJed Brown #define __FUNCT__ "SSPStep_RK_3"
89ef7bb5aaSJed Brown /* Optimal third order SSP Runge-Kutta, low-storage, c_eff=(sqrt(s)-1)/sqrt(s), where sqrt(s) is an integer */
90ef7bb5aaSJed Brown /* Pseudocode 2 of Ketcheson 2008 */
91ef7bb5aaSJed Brown static PetscErrorCode SSPStep_RK_3(TS ts,PetscReal t0,PetscReal dt,Vec sol)
92ef7bb5aaSJed Brown {
93ef7bb5aaSJed Brown   TS_SSP *ssp = (TS_SSP*)ts->data;
94ef7bb5aaSJed Brown   Vec *work,F;
95ef7bb5aaSJed Brown   PetscInt i,s,n,r;
96ef7bb5aaSJed Brown   PetscReal c;
97ef7bb5aaSJed Brown   PetscErrorCode ierr;
98ef7bb5aaSJed Brown 
99ef7bb5aaSJed Brown   PetscFunctionBegin;
100ef7bb5aaSJed Brown   s = ssp->nstages;
101ef7bb5aaSJed Brown   n = floor(sqrt(s));
102ef7bb5aaSJed Brown   r = s-n;
103ef7bb5aaSJed Brown   if (n*n != s) SETERRQ1(PETSC_ERR_SUP,"No support for optimal third order schemes with %d stages, must be a square number at least 4",s);
104ef7bb5aaSJed Brown   ierr = SSPGetWorkVectors(ts,3,&work);CHKERRQ(ierr);
105ef7bb5aaSJed Brown   F = work[2];
106ef7bb5aaSJed Brown   ierr = VecCopy(sol,work[0]);CHKERRQ(ierr);
107ef7bb5aaSJed Brown   for (i=0; i<(n-1)*(n-2)/2; i++) {
108ef7bb5aaSJed Brown     c = (i<n*(n+1)/2) ? 1.*i/(s-n) : (1.*i-n)/(s-n);
109ef7bb5aaSJed Brown     ierr = TSComputeRHSFunction(ts,t0+c*dt,work[0],F);CHKERRQ(ierr);
110ef7bb5aaSJed Brown     ierr = VecAXPY(work[0],dt/r,F);CHKERRQ(ierr);
111ef7bb5aaSJed Brown   }
112ef7bb5aaSJed Brown   ierr = VecCopy(work[0],work[1]);CHKERRQ(ierr);
113ef7bb5aaSJed Brown   for ( ; i<n*(n+1)/2-1; i++) {
114ef7bb5aaSJed Brown     c = (i<n*(n+1)/2) ? 1.*i/(s-n) : (1.*i-n)/(s-n);
115ef7bb5aaSJed Brown     ierr = TSComputeRHSFunction(ts,t0+c*dt,work[0],F);CHKERRQ(ierr);
116ef7bb5aaSJed Brown     ierr = VecAXPY(work[0],dt/r,F);CHKERRQ(ierr);
117ef7bb5aaSJed Brown   }
118ef7bb5aaSJed Brown   {
119ef7bb5aaSJed Brown     c = (i<n*(n+1)/2) ? 1.*i/(s-n) : (1.*i-n)/(s-n);
120ef7bb5aaSJed Brown     ierr = TSComputeRHSFunction(ts,t0+c*dt,work[0],F);CHKERRQ(ierr);
121ef7bb5aaSJed Brown     ierr = VecAXPBYPCZ(work[0],1.*n/(2*n-1.),(n-1.)*dt/(r*(2*n-1)),(n-1.)/(2*n-1.),work[1],F);CHKERRQ(ierr);
122ef7bb5aaSJed Brown     i++;
123ef7bb5aaSJed Brown   }
124ef7bb5aaSJed Brown   for ( ; i<s; i++) {
125ef7bb5aaSJed Brown     c = (i<n*(n+1)/2) ? 1.*i/(s-n) : (1.*i-n)/(s-n);
126ef7bb5aaSJed Brown     ierr = TSComputeRHSFunction(ts,t0+c*dt,work[0],F);CHKERRQ(ierr);
127ef7bb5aaSJed Brown     ierr = VecAXPY(work[0],dt/r,F);CHKERRQ(ierr);
128ef7bb5aaSJed Brown   }
129ef7bb5aaSJed Brown   ierr = VecCopy(work[0],sol);CHKERRQ(ierr);
130ef7bb5aaSJed Brown   ierr = SSPRestoreWorkVectors(ts,3,&work);CHKERRQ(ierr);
131ef7bb5aaSJed Brown   PetscFunctionReturn(0);
132ef7bb5aaSJed Brown }
133ef7bb5aaSJed Brown 
134ef7bb5aaSJed Brown #undef __FUNCT__
135ef7bb5aaSJed Brown #define __FUNCT__ "SSPStep_RK_10_4"
136ef7bb5aaSJed Brown /* Optimal fourth order SSP Runge-Kutta, low-storage (2N), c_eff=0.6 */
137ef7bb5aaSJed Brown /* SSPRK(10,4), Pseudocode 3 of Ketcheson 2008 */
138ef7bb5aaSJed Brown static PetscErrorCode SSPStep_RK_10_4(TS ts,PetscReal t0,PetscReal dt,Vec sol)
139ef7bb5aaSJed Brown {
140ef7bb5aaSJed Brown   TS_SSP *ssp = (TS_SSP*)ts->data;
141ef7bb5aaSJed Brown   const PetscReal c[10] = {0, 1./6, 2./6, 3./6, 4./6, 2./6, 3./6, 4./6, 5./6, 1};
142ef7bb5aaSJed Brown   Vec *work,F;
143ef7bb5aaSJed Brown   PetscInt i,s;
144ef7bb5aaSJed Brown   PetscErrorCode ierr;
145ef7bb5aaSJed Brown 
146ef7bb5aaSJed Brown   PetscFunctionBegin;
147ef7bb5aaSJed Brown   s = ssp->nstages;
148ef7bb5aaSJed Brown   ierr = SSPGetWorkVectors(ts,3,&work);CHKERRQ(ierr);
149ef7bb5aaSJed Brown   F = work[2];
150ef7bb5aaSJed Brown   ierr = VecCopy(sol,work[0]);CHKERRQ(ierr);
151ef7bb5aaSJed Brown   for (i=0; i<5; i++) {
152ef7bb5aaSJed Brown     ierr = TSComputeRHSFunction(ts,t0+c[i],work[0],F);CHKERRQ(ierr);
153ef7bb5aaSJed Brown     ierr = VecAXPY(work[0],dt/6,F);CHKERRQ(ierr);
154ef7bb5aaSJed Brown   }
155ef7bb5aaSJed Brown   ierr = VecAXPBYPCZ(work[1],1./25,9./25,0,sol,work[0]);CHKERRQ(ierr);
156ef7bb5aaSJed Brown   ierr = VecAXPBY(work[0],15,-5,work[1]);CHKERRQ(ierr);
157ef7bb5aaSJed Brown   for ( ; i<9; i++) {
158ef7bb5aaSJed Brown     ierr = TSComputeRHSFunction(ts,t0+c[i],work[0],F);CHKERRQ(ierr);
159ef7bb5aaSJed Brown     ierr = VecAXPY(work[0],dt/6,F);CHKERRQ(ierr);
160ef7bb5aaSJed Brown   }
161ef7bb5aaSJed Brown   ierr = TSComputeRHSFunction(ts,t0+dt,work[0],F);CHKERRQ(ierr);
162ef7bb5aaSJed Brown   ierr = VecAXPBYPCZ(work[1],3./5,dt/10,1,work[0],F);CHKERRQ(ierr);
163ef7bb5aaSJed Brown   ierr = VecCopy(work[1],sol);CHKERRQ(ierr);
164ef7bb5aaSJed Brown   ierr = SSPRestoreWorkVectors(ts,3,&work);CHKERRQ(ierr);
165ef7bb5aaSJed Brown   PetscFunctionReturn(0);
166ef7bb5aaSJed Brown }
167ef7bb5aaSJed Brown 
168ef7bb5aaSJed Brown 
169ef7bb5aaSJed Brown #undef __FUNCT__
170ef7bb5aaSJed Brown #define __FUNCT__ "TSSetUp_SSP"
171ef7bb5aaSJed Brown static PetscErrorCode TSSetUp_SSP(TS ts)
172ef7bb5aaSJed Brown {
173ef7bb5aaSJed Brown   /* TS_SSP       *ssp = (TS_SSP*)ts->data; */
174ef7bb5aaSJed Brown   /* PetscErrorCode ierr; */
175ef7bb5aaSJed Brown 
176ef7bb5aaSJed Brown   PetscFunctionBegin;
177ef7bb5aaSJed Brown   PetscFunctionReturn(0);
178ef7bb5aaSJed Brown }
179ef7bb5aaSJed Brown 
180ef7bb5aaSJed Brown #undef __FUNCT__
181ef7bb5aaSJed Brown #define __FUNCT__ "TSStep_SSP"
182ef7bb5aaSJed Brown static PetscErrorCode TSStep_SSP(TS ts,PetscInt *steps,PetscReal *ptime)
183ef7bb5aaSJed Brown {
184ef7bb5aaSJed Brown   TS_SSP        *ssp = (TS_SSP*)ts->data;
185ef7bb5aaSJed Brown   Vec            sol = ts->vec_sol;
186ef7bb5aaSJed Brown   PetscErrorCode ierr;
187ef7bb5aaSJed Brown   PetscInt       i,max_steps = ts->max_steps;
188ef7bb5aaSJed Brown 
189ef7bb5aaSJed Brown   PetscFunctionBegin;
190ef7bb5aaSJed Brown   *steps = -ts->steps;
191ef7bb5aaSJed Brown   ierr = TSMonitor(ts,ts->steps,ts->ptime,sol);CHKERRQ(ierr);
192ef7bb5aaSJed Brown 
193ef7bb5aaSJed Brown   for (i=0; i<max_steps; i++) {
194ef7bb5aaSJed Brown     PetscReal dt = ts->time_step;
195ef7bb5aaSJed Brown 
196ef7bb5aaSJed Brown     ts->ptime += dt;
197ef7bb5aaSJed Brown     ierr = (*ssp->onestep)(ts,ts->ptime-dt,dt,sol);CHKERRQ(ierr);
198ef7bb5aaSJed Brown     ts->steps++;
199ef7bb5aaSJed Brown     ierr = TSMonitor(ts,ts->steps,ts->ptime,sol);CHKERRQ(ierr);
200ef7bb5aaSJed Brown     if (ts->ptime > ts->max_time) break;
201ef7bb5aaSJed Brown   }
202ef7bb5aaSJed Brown 
203ef7bb5aaSJed Brown   *steps += ts->steps;
204ef7bb5aaSJed Brown   *ptime  = ts->ptime;
205ef7bb5aaSJed Brown   PetscFunctionReturn(0);
206ef7bb5aaSJed Brown }
207ef7bb5aaSJed Brown /*------------------------------------------------------------*/
208ef7bb5aaSJed Brown #undef __FUNCT__
209ef7bb5aaSJed Brown #define __FUNCT__ "TSDestroy_SSP"
210ef7bb5aaSJed Brown static PetscErrorCode TSDestroy_SSP(TS ts)
211ef7bb5aaSJed Brown {
212ef7bb5aaSJed Brown   TS_SSP       *ssp = (TS_SSP*)ts->data;
213ef7bb5aaSJed Brown   PetscErrorCode ierr;
214ef7bb5aaSJed Brown 
215ef7bb5aaSJed Brown   PetscFunctionBegin;
216ef7bb5aaSJed Brown   if (ssp->work) {ierr = VecDestroyVecs(ssp->work,ssp->nwork);CHKERRQ(ierr);}
217ef7bb5aaSJed Brown   ierr = PetscFree(ssp);CHKERRQ(ierr);
218ef7bb5aaSJed Brown   PetscFunctionReturn(0);
219ef7bb5aaSJed Brown }
220ef7bb5aaSJed Brown /*------------------------------------------------------------*/
221ef7bb5aaSJed Brown 
222ef7bb5aaSJed Brown #undef __FUNCT__
223ef7bb5aaSJed Brown #define __FUNCT__ "TSSSPSetType"
224ef7bb5aaSJed Brown static PetscErrorCode TSSSPSetType(TS ts,const TSSSPType type)
225ef7bb5aaSJed Brown {
226ef7bb5aaSJed Brown   PetscErrorCode ierr,(*r)(TS,PetscReal,PetscReal,Vec);
227ef7bb5aaSJed Brown   TS_SSP *ssp = (TS_SSP*)ts->data;
228ef7bb5aaSJed Brown 
229ef7bb5aaSJed Brown   PetscFunctionBegin;
230ef7bb5aaSJed Brown   ierr = PetscFListFind(TSSSPList,((PetscObject)ts)->comm,type,(void(**)(void))&r);CHKERRQ(ierr);
231ef7bb5aaSJed Brown   if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TS_SSP type %s given",type);
232ef7bb5aaSJed Brown   ssp->onestep = r;
233ef7bb5aaSJed Brown   PetscFunctionReturn(0);
234ef7bb5aaSJed Brown }
235ef7bb5aaSJed Brown 
236ef7bb5aaSJed Brown #undef __FUNCT__
237ef7bb5aaSJed Brown #define __FUNCT__ "TSSetFromOptions_SSP"
238ef7bb5aaSJed Brown static PetscErrorCode TSSetFromOptions_SSP(TS ts)
239ef7bb5aaSJed Brown {
240ef7bb5aaSJed Brown   char tname[256] = TSSSPRKS2;
241ef7bb5aaSJed Brown   TS_SSP *ssp = (TS_SSP*)ts->data;
242ef7bb5aaSJed Brown   PetscErrorCode ierr;
243ef7bb5aaSJed Brown   PetscTruth flg;
244ef7bb5aaSJed Brown 
245ef7bb5aaSJed Brown   PetscFunctionBegin;
246ef7bb5aaSJed Brown   ierr = PetscOptionsHead("SSP ODE solver options");CHKERRQ(ierr);
247ef7bb5aaSJed Brown   {
248ef7bb5aaSJed Brown     ierr = PetscOptionsList("-ts_ssp_type","Type of SSP method","TSSSPSetType",TSSSPList,tname,tname,sizeof(tname),&flg);CHKERRQ(ierr);
249ef7bb5aaSJed Brown     if (flg) {
250ef7bb5aaSJed Brown       ierr = TSSSPSetType(ts,tname);CHKERRQ(ierr);
251ef7bb5aaSJed Brown     }
252ef7bb5aaSJed Brown     ierr = PetscOptionsInt("-ts_ssp_nstages","Number of stages","TSSSPSetNumStages",ssp->nstages,&ssp->nstages,PETSC_NULL);CHKERRQ(ierr);
253ef7bb5aaSJed Brown   }
254ef7bb5aaSJed Brown   ierr = PetscOptionsTail();CHKERRQ(ierr);
255ef7bb5aaSJed Brown   PetscFunctionReturn(0);
256ef7bb5aaSJed Brown }
257ef7bb5aaSJed Brown 
258ef7bb5aaSJed Brown #undef __FUNCT__
259ef7bb5aaSJed Brown #define __FUNCT__ "TSView_SSP"
260ef7bb5aaSJed Brown static PetscErrorCode TSView_SSP(TS ts,PetscViewer viewer)
261ef7bb5aaSJed Brown {
262ef7bb5aaSJed Brown   PetscFunctionBegin;
263ef7bb5aaSJed Brown   PetscFunctionReturn(0);
264ef7bb5aaSJed Brown }
265ef7bb5aaSJed Brown 
266ef7bb5aaSJed Brown /* ------------------------------------------------------------ */
267ef7bb5aaSJed Brown 
268ef7bb5aaSJed Brown /*MC
269*8ab3e0fcSJed Brown       TSSSP - Explicit strong stability preserving ODE solver
270*8ab3e0fcSJed Brown 
271*8ab3e0fcSJed Brown   Most hyperbolic conservation laws have exact solutions that are total variation diminishing (TVD) or total variation
272*8ab3e0fcSJed Brown   bounded (TVB) although these solutions often contain discontinuities.  Spatial discretizations such as Godunov's
273*8ab3e0fcSJed Brown   scheme and high-resolution finite volume methods (TVD limiters, ENO/WENO) are designed to preserve these properties,
274*8ab3e0fcSJed Brown   but they are usually formulated using a forward Euler time discretization or by coupling the space and time
275*8ab3e0fcSJed Brown   discretization as in the classical Lax-Wendroff scheme.  When the space and time discretization is coupled, it is very
276*8ab3e0fcSJed Brown   difficult to produce schemes with high temporal accuracy while preserving TVD properties.  An alternative is the
277*8ab3e0fcSJed Brown   semidiscrete formulation where we choose a spatial discretization that is TVD with forward Euler and then choose a
278*8ab3e0fcSJed Brown   time discretization that preserves the TVD property.  Such integrators are called strong stability preserving (SSP).
279*8ab3e0fcSJed Brown 
280*8ab3e0fcSJed Brown   Let c_eff be the minimum number of function evaluations required to step as far as one step of forward Euler while
281*8ab3e0fcSJed Brown   still being SSP.  Some theoretical bounds
282*8ab3e0fcSJed Brown 
283*8ab3e0fcSJed Brown   1. There are no explicit methods with c_eff > 1.
284*8ab3e0fcSJed Brown   2. There are no explicit methods beyond order 4 (for nonlinear problems) and c_eff > 0.
285*8ab3e0fcSJed Brown   3. There are no implicit methods with order greater than 1 and c_eff > 2.
286*8ab3e0fcSJed Brown 
287*8ab3e0fcSJed Brown   This integrator provides Runge-Kutta methods of order 2, 3, and 4 with maximal values of c_eff.  More stages allows
288*8ab3e0fcSJed Brown   for larger values of c_eff which improves efficiency.  These implementations are low-memory and only use 2 or 3 work
289*8ab3e0fcSJed Brown   vectors regardless of the total number of stages, so e.g. 25-stage 3rd order methods may be an excellent choice.
290*8ab3e0fcSJed Brown 
291*8ab3e0fcSJed Brown   Methods can be chosen with -ts_ssp_type {rks2,rks3,rk104}
292*8ab3e0fcSJed Brown 
293*8ab3e0fcSJed Brown   rks2: Second order methods with any number s>1 of stages.  c_eff = (s-1)/s
294*8ab3e0fcSJed Brown 
295*8ab3e0fcSJed Brown   rks3: Third order methods with s=n^2 stages, n>1.  c_eff = (s-n)/s
296*8ab3e0fcSJed Brown 
297*8ab3e0fcSJed Brown   rk104: A 10-stage fourth order method.  c_eff = 0.6
298ef7bb5aaSJed Brown 
299ef7bb5aaSJed Brown   Level: beginner
300ef7bb5aaSJed Brown 
301ef7bb5aaSJed Brown .seealso:  TSCreate(), TS, TSSetType()
302ef7bb5aaSJed Brown 
303ef7bb5aaSJed Brown M*/
304ef7bb5aaSJed Brown EXTERN_C_BEGIN
305ef7bb5aaSJed Brown #undef __FUNCT__
306ef7bb5aaSJed Brown #define __FUNCT__ "TSCreate_SSP"
307ef7bb5aaSJed Brown PetscErrorCode PETSCTS_DLLEXPORT TSCreate_SSP(TS ts)
308ef7bb5aaSJed Brown {
309ef7bb5aaSJed Brown   TS_SSP       *ssp;
310ef7bb5aaSJed Brown   PetscErrorCode ierr;
311ef7bb5aaSJed Brown 
312ef7bb5aaSJed Brown   PetscFunctionBegin;
313ef7bb5aaSJed Brown   if (!TSSSPList) {
314ef7bb5aaSJed Brown     ierr = PetscFListAdd(&TSSSPList,TSSSPRKS2,  "SSPStep_RK_2",   (void(*)(void))SSPStep_RK_2);CHKERRQ(ierr);
315ef7bb5aaSJed Brown     ierr = PetscFListAdd(&TSSSPList,TSSSPRKS3,  "SSPStep_RK_3",   (void(*)(void))SSPStep_RK_3);CHKERRQ(ierr);
316ef7bb5aaSJed Brown     ierr = PetscFListAdd(&TSSSPList,TSSSPRK104, "SSPStep_RK_10_4",(void(*)(void))SSPStep_RK_10_4);CHKERRQ(ierr);
317ef7bb5aaSJed Brown   }
318ef7bb5aaSJed Brown 
319ef7bb5aaSJed Brown   ts->ops->setup           = TSSetUp_SSP;
320ef7bb5aaSJed Brown   ts->ops->step            = TSStep_SSP;
321ef7bb5aaSJed Brown   ts->ops->destroy         = TSDestroy_SSP;
322ef7bb5aaSJed Brown   ts->ops->setfromoptions  = TSSetFromOptions_SSP;
323ef7bb5aaSJed Brown   ts->ops->view            = TSView_SSP;
324ef7bb5aaSJed Brown 
325ef7bb5aaSJed Brown   ierr = PetscNewLog(ts,TS_SSP,&ssp);CHKERRQ(ierr);
326ef7bb5aaSJed Brown   ts->data = (void*)ssp;
327ef7bb5aaSJed Brown 
328ef7bb5aaSJed Brown   ierr = TSSSPSetType(ts,TSSSPRKS2);CHKERRQ(ierr);
329ef7bb5aaSJed Brown   ssp->nstages = 5;
330ef7bb5aaSJed Brown   PetscFunctionReturn(0);
331ef7bb5aaSJed Brown }
332ef7bb5aaSJed Brown EXTERN_C_END
333ef7bb5aaSJed Brown 
334ef7bb5aaSJed Brown 
335ef7bb5aaSJed Brown 
336ef7bb5aaSJed Brown 
337