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