xref: /petsc/src/ts/impls/explicit/ssp/ssp.c (revision 5a586d828132823a7f656d0d7f79985f923612fa)
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;
33e32f2f54SBarry Smith   if (ssp->workout) SETERRQ(PETSC_COMM_SELF,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;
53e32f2f54SBarry Smith   if (!ssp->workout) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Work vectors have not been gotten");
54e32f2f54SBarry Smith   if (*work != ssp->work) SETERRQ(PETSC_COMM_SELF,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;
101fad8df86SSatish Balay   n = (PetscInt)(sqrt((PetscReal)s)+0.001);
102ef7bb5aaSJed Brown   r = s-n;
103e32f2f54SBarry Smith   if (n*n != s) SETERRQ1(PETSC_COMM_SELF,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   const PetscReal c[10] = {0, 1./6, 2./6, 3./6, 4./6, 2./6, 3./6, 4./6, 5./6, 1};
141ef7bb5aaSJed Brown   Vec *work,F;
142*5a586d82SBarry Smith   PetscInt i;
143ef7bb5aaSJed Brown   PetscErrorCode ierr;
144ef7bb5aaSJed Brown 
145ef7bb5aaSJed Brown   PetscFunctionBegin;
146ef7bb5aaSJed Brown   ierr = SSPGetWorkVectors(ts,3,&work);CHKERRQ(ierr);
147ef7bb5aaSJed Brown   F = work[2];
148ef7bb5aaSJed Brown   ierr = VecCopy(sol,work[0]);CHKERRQ(ierr);
149ef7bb5aaSJed Brown   for (i=0; i<5; i++) {
150ef7bb5aaSJed Brown     ierr = TSComputeRHSFunction(ts,t0+c[i],work[0],F);CHKERRQ(ierr);
151ef7bb5aaSJed Brown     ierr = VecAXPY(work[0],dt/6,F);CHKERRQ(ierr);
152ef7bb5aaSJed Brown   }
153ef7bb5aaSJed Brown   ierr = VecAXPBYPCZ(work[1],1./25,9./25,0,sol,work[0]);CHKERRQ(ierr);
154ef7bb5aaSJed Brown   ierr = VecAXPBY(work[0],15,-5,work[1]);CHKERRQ(ierr);
155ef7bb5aaSJed Brown   for ( ; i<9; i++) {
156ef7bb5aaSJed Brown     ierr = TSComputeRHSFunction(ts,t0+c[i],work[0],F);CHKERRQ(ierr);
157ef7bb5aaSJed Brown     ierr = VecAXPY(work[0],dt/6,F);CHKERRQ(ierr);
158ef7bb5aaSJed Brown   }
159ef7bb5aaSJed Brown   ierr = TSComputeRHSFunction(ts,t0+dt,work[0],F);CHKERRQ(ierr);
160ef7bb5aaSJed Brown   ierr = VecAXPBYPCZ(work[1],3./5,dt/10,1,work[0],F);CHKERRQ(ierr);
161ef7bb5aaSJed Brown   ierr = VecCopy(work[1],sol);CHKERRQ(ierr);
162ef7bb5aaSJed Brown   ierr = SSPRestoreWorkVectors(ts,3,&work);CHKERRQ(ierr);
163ef7bb5aaSJed Brown   PetscFunctionReturn(0);
164ef7bb5aaSJed Brown }
165ef7bb5aaSJed Brown 
166ef7bb5aaSJed Brown 
167ef7bb5aaSJed Brown #undef __FUNCT__
168ef7bb5aaSJed Brown #define __FUNCT__ "TSSetUp_SSP"
169ef7bb5aaSJed Brown static PetscErrorCode TSSetUp_SSP(TS ts)
170ef7bb5aaSJed Brown {
171ef7bb5aaSJed Brown   /* TS_SSP       *ssp = (TS_SSP*)ts->data; */
172ef7bb5aaSJed Brown   /* PetscErrorCode ierr; */
173ef7bb5aaSJed Brown 
174ef7bb5aaSJed Brown   PetscFunctionBegin;
175ef7bb5aaSJed Brown   PetscFunctionReturn(0);
176ef7bb5aaSJed Brown }
177ef7bb5aaSJed Brown 
178ef7bb5aaSJed Brown #undef __FUNCT__
179ef7bb5aaSJed Brown #define __FUNCT__ "TSStep_SSP"
180ef7bb5aaSJed Brown static PetscErrorCode TSStep_SSP(TS ts,PetscInt *steps,PetscReal *ptime)
181ef7bb5aaSJed Brown {
182ef7bb5aaSJed Brown   TS_SSP        *ssp = (TS_SSP*)ts->data;
183ef7bb5aaSJed Brown   Vec            sol = ts->vec_sol;
184ef7bb5aaSJed Brown   PetscErrorCode ierr;
185ef7bb5aaSJed Brown   PetscInt       i,max_steps = ts->max_steps;
186ef7bb5aaSJed Brown 
187ef7bb5aaSJed Brown   PetscFunctionBegin;
188ef7bb5aaSJed Brown   *steps = -ts->steps;
189ef7bb5aaSJed Brown   ierr = TSMonitor(ts,ts->steps,ts->ptime,sol);CHKERRQ(ierr);
190ef7bb5aaSJed Brown 
191ef7bb5aaSJed Brown   for (i=0; i<max_steps; i++) {
192ef7bb5aaSJed Brown     PetscReal dt = ts->time_step;
193ef7bb5aaSJed Brown 
1943f2090d5SJed Brown     ierr = TSPreStep(ts);CHKERRQ(ierr);
195ef7bb5aaSJed Brown     ts->ptime += dt;
196ef7bb5aaSJed Brown     ierr = (*ssp->onestep)(ts,ts->ptime-dt,dt,sol);CHKERRQ(ierr);
197ef7bb5aaSJed Brown     ts->steps++;
1983f2090d5SJed Brown     ierr = TSPostStep(ts);CHKERRQ(ierr);
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);
231e32f2f54SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,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
2698ab3e0fcSJed Brown       TSSSP - Explicit strong stability preserving ODE solver
2708ab3e0fcSJed Brown 
2718ab3e0fcSJed Brown   Most hyperbolic conservation laws have exact solutions that are total variation diminishing (TVD) or total variation
2728ab3e0fcSJed Brown   bounded (TVB) although these solutions often contain discontinuities.  Spatial discretizations such as Godunov's
2738ab3e0fcSJed Brown   scheme and high-resolution finite volume methods (TVD limiters, ENO/WENO) are designed to preserve these properties,
2748ab3e0fcSJed Brown   but they are usually formulated using a forward Euler time discretization or by coupling the space and time
2758ab3e0fcSJed Brown   discretization as in the classical Lax-Wendroff scheme.  When the space and time discretization is coupled, it is very
2768ab3e0fcSJed Brown   difficult to produce schemes with high temporal accuracy while preserving TVD properties.  An alternative is the
2778ab3e0fcSJed Brown   semidiscrete formulation where we choose a spatial discretization that is TVD with forward Euler and then choose a
2788ab3e0fcSJed Brown   time discretization that preserves the TVD property.  Such integrators are called strong stability preserving (SSP).
2798ab3e0fcSJed Brown 
2808ab3e0fcSJed Brown   Let c_eff be the minimum number of function evaluations required to step as far as one step of forward Euler while
2818ab3e0fcSJed Brown   still being SSP.  Some theoretical bounds
2828ab3e0fcSJed Brown 
2838ab3e0fcSJed Brown   1. There are no explicit methods with c_eff > 1.
2840085e20eSJed Brown 
2858ab3e0fcSJed Brown   2. There are no explicit methods beyond order 4 (for nonlinear problems) and c_eff > 0.
2860085e20eSJed Brown 
2878ab3e0fcSJed Brown   3. There are no implicit methods with order greater than 1 and c_eff > 2.
2888ab3e0fcSJed Brown 
2898ab3e0fcSJed Brown   This integrator provides Runge-Kutta methods of order 2, 3, and 4 with maximal values of c_eff.  More stages allows
2908ab3e0fcSJed Brown   for larger values of c_eff which improves efficiency.  These implementations are low-memory and only use 2 or 3 work
2918ab3e0fcSJed Brown   vectors regardless of the total number of stages, so e.g. 25-stage 3rd order methods may be an excellent choice.
2928ab3e0fcSJed Brown 
2938ab3e0fcSJed Brown   Methods can be chosen with -ts_ssp_type {rks2,rks3,rk104}
2948ab3e0fcSJed Brown 
2958ab3e0fcSJed Brown   rks2: Second order methods with any number s>1 of stages.  c_eff = (s-1)/s
2968ab3e0fcSJed Brown 
2978ab3e0fcSJed Brown   rks3: Third order methods with s=n^2 stages, n>1.  c_eff = (s-n)/s
2988ab3e0fcSJed Brown 
2998ab3e0fcSJed Brown   rk104: A 10-stage fourth order method.  c_eff = 0.6
300ef7bb5aaSJed Brown 
301ef7bb5aaSJed Brown   Level: beginner
302ef7bb5aaSJed Brown 
303ef7bb5aaSJed Brown .seealso:  TSCreate(), TS, TSSetType()
304ef7bb5aaSJed Brown 
305ef7bb5aaSJed Brown M*/
306ef7bb5aaSJed Brown EXTERN_C_BEGIN
307ef7bb5aaSJed Brown #undef __FUNCT__
308ef7bb5aaSJed Brown #define __FUNCT__ "TSCreate_SSP"
309ef7bb5aaSJed Brown PetscErrorCode PETSCTS_DLLEXPORT TSCreate_SSP(TS ts)
310ef7bb5aaSJed Brown {
311ef7bb5aaSJed Brown   TS_SSP       *ssp;
312ef7bb5aaSJed Brown   PetscErrorCode ierr;
313ef7bb5aaSJed Brown 
314ef7bb5aaSJed Brown   PetscFunctionBegin;
315ef7bb5aaSJed Brown   if (!TSSSPList) {
316ef7bb5aaSJed Brown     ierr = PetscFListAdd(&TSSSPList,TSSSPRKS2,  "SSPStep_RK_2",   (void(*)(void))SSPStep_RK_2);CHKERRQ(ierr);
317ef7bb5aaSJed Brown     ierr = PetscFListAdd(&TSSSPList,TSSSPRKS3,  "SSPStep_RK_3",   (void(*)(void))SSPStep_RK_3);CHKERRQ(ierr);
318ef7bb5aaSJed Brown     ierr = PetscFListAdd(&TSSSPList,TSSSPRK104, "SSPStep_RK_10_4",(void(*)(void))SSPStep_RK_10_4);CHKERRQ(ierr);
319ef7bb5aaSJed Brown   }
320ef7bb5aaSJed Brown 
321ef7bb5aaSJed Brown   ts->ops->setup           = TSSetUp_SSP;
322ef7bb5aaSJed Brown   ts->ops->step            = TSStep_SSP;
323ef7bb5aaSJed Brown   ts->ops->destroy         = TSDestroy_SSP;
324ef7bb5aaSJed Brown   ts->ops->setfromoptions  = TSSetFromOptions_SSP;
325ef7bb5aaSJed Brown   ts->ops->view            = TSView_SSP;
326ef7bb5aaSJed Brown 
327ef7bb5aaSJed Brown   ierr = PetscNewLog(ts,TS_SSP,&ssp);CHKERRQ(ierr);
328ef7bb5aaSJed Brown   ts->data = (void*)ssp;
329ef7bb5aaSJed Brown 
330ef7bb5aaSJed Brown   ierr = TSSSPSetType(ts,TSSSPRKS2);CHKERRQ(ierr);
331ef7bb5aaSJed Brown   ssp->nstages = 5;
332ef7bb5aaSJed Brown   PetscFunctionReturn(0);
333ef7bb5aaSJed Brown }
334ef7bb5aaSJed Brown EXTERN_C_END
335ef7bb5aaSJed Brown 
336ef7bb5aaSJed Brown 
337ef7bb5aaSJed Brown 
338ef7bb5aaSJed Brown 
339