1ef7bb5aaSJed Brown /* 2ef7bb5aaSJed Brown Code for Timestepping with explicit SSP. 3ef7bb5aaSJed Brown */ 4c6db04a5SJed Brown #include <private/tsimpl.h> /*I "petscts.h" I*/ 5ef7bb5aaSJed Brown 6ef7bb5aaSJed Brown PetscFList TSSSPList = 0; 7ef7bb5aaSJed Brown 8ef7bb5aaSJed Brown typedef struct { 9ef7bb5aaSJed Brown PetscErrorCode (*onestep)(TS,PetscReal,PetscReal,Vec); 10*815f1ad5SJed Brown char *typename; 11ef7bb5aaSJed Brown PetscInt nstages; 12ef7bb5aaSJed Brown Vec *work; 13ef7bb5aaSJed Brown PetscInt nwork; 14ace3abfcSBarry Smith PetscBool workout; 15ef7bb5aaSJed Brown } TS_SSP; 16ef7bb5aaSJed Brown 17ef7bb5aaSJed Brown 18ef7bb5aaSJed Brown #undef __FUNCT__ 19ef7bb5aaSJed Brown #define __FUNCT__ "SSPGetWorkVectors" 20ef7bb5aaSJed Brown static PetscErrorCode SSPGetWorkVectors(TS ts,PetscInt n,Vec **work) 21ef7bb5aaSJed Brown { 22ef7bb5aaSJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 23ef7bb5aaSJed Brown PetscErrorCode ierr; 24ef7bb5aaSJed Brown 25ef7bb5aaSJed Brown PetscFunctionBegin; 26e32f2f54SBarry Smith if (ssp->workout) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Work vectors already gotten"); 27ef7bb5aaSJed Brown if (ssp->nwork < n) { 28ef7bb5aaSJed Brown if (ssp->nwork > 0) { 29574deadeSBarry Smith ierr = VecDestroyVecs(ssp->nwork,&ssp->work);CHKERRQ(ierr); 30ef7bb5aaSJed Brown } 31ef7bb5aaSJed Brown ierr = VecDuplicateVecs(ts->vec_sol,n,&ssp->work);CHKERRQ(ierr); 32ef7bb5aaSJed Brown ssp->nwork = n; 33ef7bb5aaSJed Brown } 34ef7bb5aaSJed Brown *work = ssp->work; 35ef7bb5aaSJed Brown ssp->workout = PETSC_TRUE; 36ef7bb5aaSJed Brown PetscFunctionReturn(0); 37ef7bb5aaSJed Brown } 38ef7bb5aaSJed Brown 39ef7bb5aaSJed Brown #undef __FUNCT__ 40ef7bb5aaSJed Brown #define __FUNCT__ "SSPRestoreWorkVectors" 41ef7bb5aaSJed Brown static PetscErrorCode SSPRestoreWorkVectors(TS ts,PetscInt n,Vec **work) 42ef7bb5aaSJed Brown { 43ef7bb5aaSJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 44ef7bb5aaSJed Brown 45ef7bb5aaSJed Brown PetscFunctionBegin; 46e32f2f54SBarry Smith if (!ssp->workout) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Work vectors have not been gotten"); 47e32f2f54SBarry Smith if (*work != ssp->work) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Wrong work vectors checked out"); 48ef7bb5aaSJed Brown ssp->workout = PETSC_FALSE; 49ef7bb5aaSJed Brown *work = PETSC_NULL; 50ef7bb5aaSJed Brown PetscFunctionReturn(0); 51ef7bb5aaSJed Brown } 52ef7bb5aaSJed Brown 53ef7bb5aaSJed Brown 54ef7bb5aaSJed Brown #undef __FUNCT__ 55ef7bb5aaSJed Brown #define __FUNCT__ "SSPStep_RK_2" 56*815f1ad5SJed Brown /*MC 57*815f1ad5SJed Brown TSSSPRKS2 - Optimal second order SSP Runge-Kutta method, low-storage, c_eff=(s-1)/s 58*815f1ad5SJed Brown 59*815f1ad5SJed Brown Pseudocode 2 of Ketcheson 2008 60*815f1ad5SJed Brown 61*815f1ad5SJed Brown .seealso: TSSSP, TSSSPSetType(), TSSSPSetNumStages() 62*815f1ad5SJed Brown M*/ 63ef7bb5aaSJed Brown static PetscErrorCode SSPStep_RK_2(TS ts,PetscReal t0,PetscReal dt,Vec sol) 64ef7bb5aaSJed Brown { 65ef7bb5aaSJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 66ef7bb5aaSJed Brown Vec *work,F; 67ef7bb5aaSJed Brown PetscInt i,s; 68ef7bb5aaSJed Brown PetscErrorCode ierr; 69ef7bb5aaSJed Brown 70ef7bb5aaSJed Brown PetscFunctionBegin; 71ef7bb5aaSJed Brown s = ssp->nstages; 72ef7bb5aaSJed Brown ierr = SSPGetWorkVectors(ts,2,&work);CHKERRQ(ierr); 73ef7bb5aaSJed Brown F = work[1]; 74ef7bb5aaSJed Brown ierr = VecCopy(sol,work[0]);CHKERRQ(ierr); 75ef7bb5aaSJed Brown for (i=0; i<s-1; i++) { 76ef7bb5aaSJed Brown ierr = TSComputeRHSFunction(ts,t0+dt*(i/(s-1.)),work[0],F);CHKERRQ(ierr); 77ef7bb5aaSJed Brown ierr = VecAXPY(work[0],dt/(s-1.),F);CHKERRQ(ierr); 78ef7bb5aaSJed Brown } 79ef7bb5aaSJed Brown ierr = TSComputeRHSFunction(ts,t0+dt,work[0],F);CHKERRQ(ierr); 80ef7bb5aaSJed Brown ierr = VecAXPBYPCZ(sol,(s-1.)/s,dt/s,1./s,work[0],F);CHKERRQ(ierr); 81ef7bb5aaSJed Brown ierr = SSPRestoreWorkVectors(ts,2,&work);CHKERRQ(ierr); 82ef7bb5aaSJed Brown PetscFunctionReturn(0); 83ef7bb5aaSJed Brown } 84ef7bb5aaSJed Brown 85ef7bb5aaSJed Brown #undef __FUNCT__ 86ef7bb5aaSJed Brown #define __FUNCT__ "SSPStep_RK_3" 87*815f1ad5SJed Brown /*MC 88*815f1ad5SJed Brown TSSSPRKS3 - Optimal third order SSP Runge-Kutta, low-storage, c_eff=(sqrt(s)-1)/sqrt(s), where sqrt(s) is an integer 89*815f1ad5SJed Brown 90*815f1ad5SJed Brown Pseudocode 2 of Ketcheson 2008 91*815f1ad5SJed Brown 92*815f1ad5SJed Brown .seealso: TSSSP, TSSSPSetType(), TSSSPSetNumStages() 93*815f1ad5SJed Brown M*/ 94ef7bb5aaSJed Brown static PetscErrorCode SSPStep_RK_3(TS ts,PetscReal t0,PetscReal dt,Vec sol) 95ef7bb5aaSJed Brown { 96ef7bb5aaSJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 97ef7bb5aaSJed Brown Vec *work,F; 98ef7bb5aaSJed Brown PetscInt i,s,n,r; 99ef7bb5aaSJed Brown PetscReal c; 100ef7bb5aaSJed Brown PetscErrorCode ierr; 101ef7bb5aaSJed Brown 102ef7bb5aaSJed Brown PetscFunctionBegin; 103ef7bb5aaSJed Brown s = ssp->nstages; 104fad8df86SSatish Balay n = (PetscInt)(sqrt((PetscReal)s)+0.001); 105ef7bb5aaSJed Brown r = s-n; 106e32f2f54SBarry 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); 107ef7bb5aaSJed Brown ierr = SSPGetWorkVectors(ts,3,&work);CHKERRQ(ierr); 108ef7bb5aaSJed Brown F = work[2]; 109ef7bb5aaSJed Brown ierr = VecCopy(sol,work[0]);CHKERRQ(ierr); 110ef7bb5aaSJed Brown for (i=0; i<(n-1)*(n-2)/2; i++) { 111ef7bb5aaSJed Brown c = (i<n*(n+1)/2) ? 1.*i/(s-n) : (1.*i-n)/(s-n); 112ef7bb5aaSJed Brown ierr = TSComputeRHSFunction(ts,t0+c*dt,work[0],F);CHKERRQ(ierr); 113ef7bb5aaSJed Brown ierr = VecAXPY(work[0],dt/r,F);CHKERRQ(ierr); 114ef7bb5aaSJed Brown } 115ef7bb5aaSJed Brown ierr = VecCopy(work[0],work[1]);CHKERRQ(ierr); 116ef7bb5aaSJed Brown for ( ; i<n*(n+1)/2-1; i++) { 117ef7bb5aaSJed Brown c = (i<n*(n+1)/2) ? 1.*i/(s-n) : (1.*i-n)/(s-n); 118ef7bb5aaSJed Brown ierr = TSComputeRHSFunction(ts,t0+c*dt,work[0],F);CHKERRQ(ierr); 119ef7bb5aaSJed Brown ierr = VecAXPY(work[0],dt/r,F);CHKERRQ(ierr); 120ef7bb5aaSJed Brown } 121ef7bb5aaSJed Brown { 122ef7bb5aaSJed Brown c = (i<n*(n+1)/2) ? 1.*i/(s-n) : (1.*i-n)/(s-n); 123ef7bb5aaSJed Brown ierr = TSComputeRHSFunction(ts,t0+c*dt,work[0],F);CHKERRQ(ierr); 124ef7bb5aaSJed 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); 125ef7bb5aaSJed Brown i++; 126ef7bb5aaSJed Brown } 127ef7bb5aaSJed Brown for ( ; i<s; i++) { 128ef7bb5aaSJed Brown c = (i<n*(n+1)/2) ? 1.*i/(s-n) : (1.*i-n)/(s-n); 129ef7bb5aaSJed Brown ierr = TSComputeRHSFunction(ts,t0+c*dt,work[0],F);CHKERRQ(ierr); 130ef7bb5aaSJed Brown ierr = VecAXPY(work[0],dt/r,F);CHKERRQ(ierr); 131ef7bb5aaSJed Brown } 132ef7bb5aaSJed Brown ierr = VecCopy(work[0],sol);CHKERRQ(ierr); 133ef7bb5aaSJed Brown ierr = SSPRestoreWorkVectors(ts,3,&work);CHKERRQ(ierr); 134ef7bb5aaSJed Brown PetscFunctionReturn(0); 135ef7bb5aaSJed Brown } 136ef7bb5aaSJed Brown 137ef7bb5aaSJed Brown #undef __FUNCT__ 138ef7bb5aaSJed Brown #define __FUNCT__ "SSPStep_RK_10_4" 139*815f1ad5SJed Brown /*MC 140*815f1ad5SJed Brown TSSSPRKS2 - Optimal fourth order SSP Runge-Kutta, low-storage (2N), c_eff=0.6 141*815f1ad5SJed Brown 142*815f1ad5SJed Brown SSPRK(10,4), Pseudocode 3 of Ketcheson 2008 143*815f1ad5SJed Brown 144*815f1ad5SJed Brown .seealso: TSSSP, TSSSPSetType() 145*815f1ad5SJed Brown M*/ 146ef7bb5aaSJed Brown static PetscErrorCode SSPStep_RK_10_4(TS ts,PetscReal t0,PetscReal dt,Vec sol) 147ef7bb5aaSJed Brown { 148ef7bb5aaSJed Brown const PetscReal c[10] = {0, 1./6, 2./6, 3./6, 4./6, 2./6, 3./6, 4./6, 5./6, 1}; 149ef7bb5aaSJed Brown Vec *work,F; 1505a586d82SBarry Smith PetscInt i; 151ef7bb5aaSJed Brown PetscErrorCode ierr; 152ef7bb5aaSJed Brown 153ef7bb5aaSJed Brown PetscFunctionBegin; 154ef7bb5aaSJed Brown ierr = SSPGetWorkVectors(ts,3,&work);CHKERRQ(ierr); 155ef7bb5aaSJed Brown F = work[2]; 156ef7bb5aaSJed Brown ierr = VecCopy(sol,work[0]);CHKERRQ(ierr); 157ef7bb5aaSJed Brown for (i=0; i<5; 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 = VecAXPBYPCZ(work[1],1./25,9./25,0,sol,work[0]);CHKERRQ(ierr); 162ef7bb5aaSJed Brown ierr = VecAXPBY(work[0],15,-5,work[1]);CHKERRQ(ierr); 163ef7bb5aaSJed Brown for ( ; i<9; i++) { 164ef7bb5aaSJed Brown ierr = TSComputeRHSFunction(ts,t0+c[i],work[0],F);CHKERRQ(ierr); 165ef7bb5aaSJed Brown ierr = VecAXPY(work[0],dt/6,F);CHKERRQ(ierr); 166ef7bb5aaSJed Brown } 167ef7bb5aaSJed Brown ierr = TSComputeRHSFunction(ts,t0+dt,work[0],F);CHKERRQ(ierr); 168ef7bb5aaSJed Brown ierr = VecAXPBYPCZ(work[1],3./5,dt/10,1,work[0],F);CHKERRQ(ierr); 169ef7bb5aaSJed Brown ierr = VecCopy(work[1],sol);CHKERRQ(ierr); 170ef7bb5aaSJed Brown ierr = SSPRestoreWorkVectors(ts,3,&work);CHKERRQ(ierr); 171ef7bb5aaSJed Brown PetscFunctionReturn(0); 172ef7bb5aaSJed Brown } 173ef7bb5aaSJed Brown 174ef7bb5aaSJed Brown 175ef7bb5aaSJed Brown #undef __FUNCT__ 176ef7bb5aaSJed Brown #define __FUNCT__ "TSSetUp_SSP" 177ef7bb5aaSJed Brown static PetscErrorCode TSSetUp_SSP(TS ts) 178ef7bb5aaSJed Brown { 179ef7bb5aaSJed Brown 180ef7bb5aaSJed Brown PetscFunctionBegin; 181ef7bb5aaSJed Brown PetscFunctionReturn(0); 182ef7bb5aaSJed Brown } 183ef7bb5aaSJed Brown 184ef7bb5aaSJed Brown #undef __FUNCT__ 185ef7bb5aaSJed Brown #define __FUNCT__ "TSStep_SSP" 186193ac0bcSJed Brown static PetscErrorCode TSStep_SSP(TS ts) 187ef7bb5aaSJed Brown { 188ef7bb5aaSJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 189ef7bb5aaSJed Brown Vec sol = ts->vec_sol; 190ef7bb5aaSJed Brown PetscErrorCode ierr; 191ef7bb5aaSJed Brown 192ef7bb5aaSJed Brown PetscFunctionBegin; 193186e87acSLisandro Dalcin ierr = (*ssp->onestep)(ts,ts->ptime,ts->time_step,sol);CHKERRQ(ierr); 194186e87acSLisandro Dalcin ts->ptime += ts->time_step; 195ef7bb5aaSJed Brown ts->steps++; 196ef7bb5aaSJed Brown PetscFunctionReturn(0); 197ef7bb5aaSJed Brown } 198ef7bb5aaSJed Brown /*------------------------------------------------------------*/ 199ef7bb5aaSJed Brown #undef __FUNCT__ 200277b19d0SLisandro Dalcin #define __FUNCT__ "TSReset_SSP" 201277b19d0SLisandro Dalcin static PetscErrorCode TSReset_SSP(TS ts) 202277b19d0SLisandro Dalcin { 203277b19d0SLisandro Dalcin TS_SSP *ssp = (TS_SSP*)ts->data; 204277b19d0SLisandro Dalcin PetscErrorCode ierr; 205277b19d0SLisandro Dalcin 206277b19d0SLisandro Dalcin PetscFunctionBegin; 207277b19d0SLisandro Dalcin if (ssp->work) {ierr = VecDestroyVecs(ssp->nwork,&ssp->work);CHKERRQ(ierr);} 208277b19d0SLisandro Dalcin ssp->nwork = 0; 209277b19d0SLisandro Dalcin ssp->workout = PETSC_FALSE; 210277b19d0SLisandro Dalcin PetscFunctionReturn(0); 211277b19d0SLisandro Dalcin } 212277b19d0SLisandro Dalcin 213277b19d0SLisandro Dalcin #undef __FUNCT__ 214ef7bb5aaSJed Brown #define __FUNCT__ "TSDestroy_SSP" 215ef7bb5aaSJed Brown static PetscErrorCode TSDestroy_SSP(TS ts) 216ef7bb5aaSJed Brown { 217*815f1ad5SJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 218ef7bb5aaSJed Brown PetscErrorCode ierr; 219ef7bb5aaSJed Brown 220ef7bb5aaSJed Brown PetscFunctionBegin; 221277b19d0SLisandro Dalcin ierr = TSReset_SSP(ts);CHKERRQ(ierr); 222*815f1ad5SJed Brown ierr = PetscFree(ssp->typename);CHKERRQ(ierr); 223c31cb41cSBarry Smith ierr = PetscFree(ts->data);CHKERRQ(ierr); 224*815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPGetType_C","",PETSC_NULL);CHKERRQ(ierr); 225*815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPSetType_C","",PETSC_NULL);CHKERRQ(ierr); 226*815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPGetNumStages_C","",PETSC_NULL);CHKERRQ(ierr); 227*815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPSetNumStages_C","",PETSC_NULL);CHKERRQ(ierr); 228ef7bb5aaSJed Brown PetscFunctionReturn(0); 229ef7bb5aaSJed Brown } 230ef7bb5aaSJed Brown /*------------------------------------------------------------*/ 231ef7bb5aaSJed Brown 232ef7bb5aaSJed Brown #undef __FUNCT__ 233ef7bb5aaSJed Brown #define __FUNCT__ "TSSSPSetType" 234*815f1ad5SJed Brown /*@C 235*815f1ad5SJed Brown TSSSPSetType - set the SSP time integration scheme to use 236*815f1ad5SJed Brown 237*815f1ad5SJed Brown Logically Collective 238*815f1ad5SJed Brown 239*815f1ad5SJed Brown Input Arguments: 240*815f1ad5SJed Brown ts - time stepping object 241*815f1ad5SJed Brown type - type of scheme to use 242*815f1ad5SJed Brown 243*815f1ad5SJed Brown Options Database Keys: 244*815f1ad5SJed Brown -ts_ssp_type <rks2>: Type of SSP method (one of) rks2 rks3 rk104 245*815f1ad5SJed Brown -ts_ssp_nstages <5>: Number of stages 246*815f1ad5SJed Brown 247*815f1ad5SJed Brown Level: beginner 248*815f1ad5SJed Brown 249*815f1ad5SJed Brown .seealso: TSSSP, TSSSPGetType(), TSSSPSetNumStages(), TSSSPRKS2, TSSSPRKS3, TSSSPRK104 250*815f1ad5SJed Brown @*/ 251*815f1ad5SJed Brown PetscErrorCode TSSSPSetType(TS ts,const TSSSPType type) 252*815f1ad5SJed Brown { 253*815f1ad5SJed Brown PetscErrorCode ierr; 254*815f1ad5SJed Brown 255*815f1ad5SJed Brown PetscFunctionBegin; 256*815f1ad5SJed Brown PetscValidHeaderSpecific(ts,TS_CLASSID,1); 257*815f1ad5SJed Brown ierr = PetscTryMethod(ts,"TSSSPSetType_C",(TS,const TSSSPType),(ts,type));CHKERRQ(ierr); 258*815f1ad5SJed Brown PetscFunctionReturn(0); 259*815f1ad5SJed Brown } 260*815f1ad5SJed Brown 261*815f1ad5SJed Brown #undef __FUNCT__ 262*815f1ad5SJed Brown #define __FUNCT__ "TSSSPGetType" 263*815f1ad5SJed Brown /*@C 264*815f1ad5SJed Brown TSSSPGetType - get the SSP time integration scheme 265*815f1ad5SJed Brown 266*815f1ad5SJed Brown Logically Collective 267*815f1ad5SJed Brown 268*815f1ad5SJed Brown Input Argument: 269*815f1ad5SJed Brown ts - time stepping object 270*815f1ad5SJed Brown 271*815f1ad5SJed Brown Output Argument: 272*815f1ad5SJed Brown type - type of scheme being used 273*815f1ad5SJed Brown 274*815f1ad5SJed Brown Level: beginner 275*815f1ad5SJed Brown 276*815f1ad5SJed Brown .seealso: TSSSP, TSSSPSettype(), TSSSPSetNumStages(), TSSSPRKS2, TSSSPRKS3, TSSSPRK104 277*815f1ad5SJed Brown @*/ 278*815f1ad5SJed Brown PetscErrorCode TSSSPGetType(TS ts,const TSSSPType *type) 279*815f1ad5SJed Brown { 280*815f1ad5SJed Brown PetscErrorCode ierr; 281*815f1ad5SJed Brown 282*815f1ad5SJed Brown PetscFunctionBegin; 283*815f1ad5SJed Brown PetscValidHeaderSpecific(ts,TS_CLASSID,1); 284*815f1ad5SJed Brown ierr = PetscTryMethod(ts,"TSSSPGetType_C",(TS,const TSSSPType*),(ts,type));CHKERRQ(ierr); 285*815f1ad5SJed Brown PetscFunctionReturn(0); 286*815f1ad5SJed Brown } 287*815f1ad5SJed Brown 288*815f1ad5SJed Brown #undef __FUNCT__ 289*815f1ad5SJed Brown #define __FUNCT__ "TSSSPSetNumStages" 290*815f1ad5SJed Brown /*@ 291*815f1ad5SJed Brown TSSSPSetNumStages - set the number of stages to use with the SSP method 292*815f1ad5SJed Brown 293*815f1ad5SJed Brown Logically Collective 294*815f1ad5SJed Brown 295*815f1ad5SJed Brown Input Arguments: 296*815f1ad5SJed Brown ts - time stepping object 297*815f1ad5SJed Brown nstages - number of stages 298*815f1ad5SJed Brown 299*815f1ad5SJed Brown Options Database Keys: 300*815f1ad5SJed Brown -ts_ssp_type <rks2>: NumStages of SSP method (one of) rks2 rks3 rk104 301*815f1ad5SJed Brown -ts_ssp_nstages <5>: Number of stages 302*815f1ad5SJed Brown 303*815f1ad5SJed Brown Level: beginner 304*815f1ad5SJed Brown 305*815f1ad5SJed Brown .seealso: TSSSP, TSSSPGetNumStages(), TSSSPSetNumStages(), TSSSPRKS2, TSSSPRKS3, TSSSPRK104 306*815f1ad5SJed Brown @*/ 307*815f1ad5SJed Brown PetscErrorCode TSSSPSetNumStages(TS ts,PetscInt nstages) 308*815f1ad5SJed Brown { 309*815f1ad5SJed Brown PetscErrorCode ierr; 310*815f1ad5SJed Brown 311*815f1ad5SJed Brown PetscFunctionBegin; 312*815f1ad5SJed Brown PetscValidHeaderSpecific(ts,TS_CLASSID,1); 313*815f1ad5SJed Brown ierr = PetscTryMethod(ts,"TSSSPSetNumStages_C",(TS,PetscInt),(ts,nstages));CHKERRQ(ierr); 314*815f1ad5SJed Brown PetscFunctionReturn(0); 315*815f1ad5SJed Brown } 316*815f1ad5SJed Brown 317*815f1ad5SJed Brown #undef __FUNCT__ 318*815f1ad5SJed Brown #define __FUNCT__ "TSSSPGetNumStages" 319*815f1ad5SJed Brown /*@ 320*815f1ad5SJed Brown TSSSPGetNumStages - get the number of stages in the SSP time integration scheme 321*815f1ad5SJed Brown 322*815f1ad5SJed Brown Logically Collective 323*815f1ad5SJed Brown 324*815f1ad5SJed Brown Input Argument: 325*815f1ad5SJed Brown ts - time stepping object 326*815f1ad5SJed Brown 327*815f1ad5SJed Brown Output Argument: 328*815f1ad5SJed Brown nstages - number of stages 329*815f1ad5SJed Brown 330*815f1ad5SJed Brown Level: beginner 331*815f1ad5SJed Brown 332*815f1ad5SJed Brown .seealso: TSSSP, TSSSPGetType(), TSSSPSetNumStages(), TSSSPRKS2, TSSSPRKS3, TSSSPRK104 333*815f1ad5SJed Brown @*/ 334*815f1ad5SJed Brown PetscErrorCode TSSSPGetNumStages(TS ts,PetscInt *nstages) 335*815f1ad5SJed Brown { 336*815f1ad5SJed Brown PetscErrorCode ierr; 337*815f1ad5SJed Brown 338*815f1ad5SJed Brown PetscFunctionBegin; 339*815f1ad5SJed Brown PetscValidHeaderSpecific(ts,TS_CLASSID,1); 340*815f1ad5SJed Brown ierr = PetscTryMethod(ts,"TSSSPGetNumStages_C",(TS,PetscInt*),(ts,nstages));CHKERRQ(ierr); 341*815f1ad5SJed Brown PetscFunctionReturn(0); 342*815f1ad5SJed Brown } 343*815f1ad5SJed Brown 344*815f1ad5SJed Brown EXTERN_C_BEGIN 345*815f1ad5SJed Brown #undef __FUNCT__ 346*815f1ad5SJed Brown #define __FUNCT__ "TSSSPSetType_SSP" 347*815f1ad5SJed Brown PetscErrorCode TSSSPSetType_SSP(TS ts,const TSSSPType type) 348ef7bb5aaSJed Brown { 349ef7bb5aaSJed Brown PetscErrorCode ierr,(*r)(TS,PetscReal,PetscReal,Vec); 350ef7bb5aaSJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 351ef7bb5aaSJed Brown 352ef7bb5aaSJed Brown PetscFunctionBegin; 3534b91b6eaSBarry Smith ierr = PetscFListFind(TSSSPList,((PetscObject)ts)->comm,type,PETSC_TRUE,(void(**)(void))&r);CHKERRQ(ierr); 354e32f2f54SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TS_SSP type %s given",type); 355ef7bb5aaSJed Brown ssp->onestep = r; 356*815f1ad5SJed Brown ierr = PetscFree(ssp->typename);CHKERRQ(ierr); 357*815f1ad5SJed Brown ierr = PetscStrallocpy(type,&ssp->typename);CHKERRQ(ierr); 358ef7bb5aaSJed Brown PetscFunctionReturn(0); 359ef7bb5aaSJed Brown } 360*815f1ad5SJed Brown #undef __FUNCT__ 361*815f1ad5SJed Brown #define __FUNCT__ "TSSSPGetType_SSP" 362*815f1ad5SJed Brown PetscErrorCode TSSSPGetType_SSP(TS ts,const TSSSPType *type) 363*815f1ad5SJed Brown { 364*815f1ad5SJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 365*815f1ad5SJed Brown 366*815f1ad5SJed Brown PetscFunctionBegin; 367*815f1ad5SJed Brown *type = ssp->typename; 368*815f1ad5SJed Brown PetscFunctionReturn(0); 369*815f1ad5SJed Brown } 370*815f1ad5SJed Brown #undef __FUNCT__ 371*815f1ad5SJed Brown #define __FUNCT__ "TSSSPSetNumStages_SSP" 372*815f1ad5SJed Brown PetscErrorCode TSSSPSetNumStages_SSP(TS ts,PetscInt nstages) 373*815f1ad5SJed Brown { 374*815f1ad5SJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 375*815f1ad5SJed Brown 376*815f1ad5SJed Brown PetscFunctionBegin; 377*815f1ad5SJed Brown ssp->nstages = nstages; 378*815f1ad5SJed Brown PetscFunctionReturn(0); 379*815f1ad5SJed Brown } 380*815f1ad5SJed Brown #undef __FUNCT__ 381*815f1ad5SJed Brown #define __FUNCT__ "TSSSPGetNumStages_SSP" 382*815f1ad5SJed Brown PetscErrorCode TSSSPGetNumStages_SSP(TS ts,PetscInt *nstages) 383*815f1ad5SJed Brown { 384*815f1ad5SJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 385*815f1ad5SJed Brown 386*815f1ad5SJed Brown PetscFunctionBegin; 387*815f1ad5SJed Brown *nstages = ssp->nstages; 388*815f1ad5SJed Brown PetscFunctionReturn(0); 389*815f1ad5SJed Brown } 390*815f1ad5SJed Brown EXTERN_C_BEGIN 391ef7bb5aaSJed Brown 392ef7bb5aaSJed Brown #undef __FUNCT__ 393ef7bb5aaSJed Brown #define __FUNCT__ "TSSetFromOptions_SSP" 394ef7bb5aaSJed Brown static PetscErrorCode TSSetFromOptions_SSP(TS ts) 395ef7bb5aaSJed Brown { 396ef7bb5aaSJed Brown char tname[256] = TSSSPRKS2; 397ef7bb5aaSJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 398ef7bb5aaSJed Brown PetscErrorCode ierr; 399ace3abfcSBarry Smith PetscBool flg; 400ef7bb5aaSJed Brown 401ef7bb5aaSJed Brown PetscFunctionBegin; 402ef7bb5aaSJed Brown ierr = PetscOptionsHead("SSP ODE solver options");CHKERRQ(ierr); 403ef7bb5aaSJed Brown { 404ef7bb5aaSJed Brown ierr = PetscOptionsList("-ts_ssp_type","Type of SSP method","TSSSPSetType",TSSSPList,tname,tname,sizeof(tname),&flg);CHKERRQ(ierr); 405ef7bb5aaSJed Brown if (flg) { 406ef7bb5aaSJed Brown ierr = TSSSPSetType(ts,tname);CHKERRQ(ierr); 407ef7bb5aaSJed Brown } 408ef7bb5aaSJed Brown ierr = PetscOptionsInt("-ts_ssp_nstages","Number of stages","TSSSPSetNumStages",ssp->nstages,&ssp->nstages,PETSC_NULL);CHKERRQ(ierr); 409ef7bb5aaSJed Brown } 410ef7bb5aaSJed Brown ierr = PetscOptionsTail();CHKERRQ(ierr); 411ef7bb5aaSJed Brown PetscFunctionReturn(0); 412ef7bb5aaSJed Brown } 413ef7bb5aaSJed Brown 414ef7bb5aaSJed Brown #undef __FUNCT__ 415ef7bb5aaSJed Brown #define __FUNCT__ "TSView_SSP" 416ef7bb5aaSJed Brown static PetscErrorCode TSView_SSP(TS ts,PetscViewer viewer) 417ef7bb5aaSJed Brown { 418ef7bb5aaSJed Brown PetscFunctionBegin; 419ef7bb5aaSJed Brown PetscFunctionReturn(0); 420ef7bb5aaSJed Brown } 421ef7bb5aaSJed Brown 422ef7bb5aaSJed Brown /* ------------------------------------------------------------ */ 423ef7bb5aaSJed Brown 424ef7bb5aaSJed Brown /*MC 4258ab3e0fcSJed Brown TSSSP - Explicit strong stability preserving ODE solver 4268ab3e0fcSJed Brown 4278ab3e0fcSJed Brown Most hyperbolic conservation laws have exact solutions that are total variation diminishing (TVD) or total variation 4288ab3e0fcSJed Brown bounded (TVB) although these solutions often contain discontinuities. Spatial discretizations such as Godunov's 4298ab3e0fcSJed Brown scheme and high-resolution finite volume methods (TVD limiters, ENO/WENO) are designed to preserve these properties, 4308ab3e0fcSJed Brown but they are usually formulated using a forward Euler time discretization or by coupling the space and time 4318ab3e0fcSJed Brown discretization as in the classical Lax-Wendroff scheme. When the space and time discretization is coupled, it is very 4328ab3e0fcSJed Brown difficult to produce schemes with high temporal accuracy while preserving TVD properties. An alternative is the 4338ab3e0fcSJed Brown semidiscrete formulation where we choose a spatial discretization that is TVD with forward Euler and then choose a 4348ab3e0fcSJed Brown time discretization that preserves the TVD property. Such integrators are called strong stability preserving (SSP). 4358ab3e0fcSJed Brown 4368ab3e0fcSJed Brown Let c_eff be the minimum number of function evaluations required to step as far as one step of forward Euler while 4378ab3e0fcSJed Brown still being SSP. Some theoretical bounds 4388ab3e0fcSJed Brown 4398ab3e0fcSJed Brown 1. There are no explicit methods with c_eff > 1. 4400085e20eSJed Brown 4418ab3e0fcSJed Brown 2. There are no explicit methods beyond order 4 (for nonlinear problems) and c_eff > 0. 4420085e20eSJed Brown 4438ab3e0fcSJed Brown 3. There are no implicit methods with order greater than 1 and c_eff > 2. 4448ab3e0fcSJed Brown 4458ab3e0fcSJed Brown This integrator provides Runge-Kutta methods of order 2, 3, and 4 with maximal values of c_eff. More stages allows 4468ab3e0fcSJed Brown for larger values of c_eff which improves efficiency. These implementations are low-memory and only use 2 or 3 work 4478ab3e0fcSJed Brown vectors regardless of the total number of stages, so e.g. 25-stage 3rd order methods may be an excellent choice. 4488ab3e0fcSJed Brown 4498ab3e0fcSJed Brown Methods can be chosen with -ts_ssp_type {rks2,rks3,rk104} 4508ab3e0fcSJed Brown 4518ab3e0fcSJed Brown rks2: Second order methods with any number s>1 of stages. c_eff = (s-1)/s 4528ab3e0fcSJed Brown 4538ab3e0fcSJed Brown rks3: Third order methods with s=n^2 stages, n>1. c_eff = (s-n)/s 4548ab3e0fcSJed Brown 4558ab3e0fcSJed Brown rk104: A 10-stage fourth order method. c_eff = 0.6 456ef7bb5aaSJed Brown 457ef7bb5aaSJed Brown Level: beginner 458ef7bb5aaSJed Brown 4597b6bb2c6SJed Brown References: 4607b6bb2c6SJed Brown Ketcheson, Highly efficient strong stability preserving Runge-Kutta methods with low-storage implementations, SISC, 2008. 4617b6bb2c6SJed Brown 4627b6bb2c6SJed Brown Gottlieb, Ketcheson, and Shu, High order strong stability preserving time discretizations, J Scientific Computing, 2009. 4637b6bb2c6SJed Brown 464ef7bb5aaSJed Brown .seealso: TSCreate(), TS, TSSetType() 465ef7bb5aaSJed Brown 466ef7bb5aaSJed Brown M*/ 467ef7bb5aaSJed Brown EXTERN_C_BEGIN 468ef7bb5aaSJed Brown #undef __FUNCT__ 469ef7bb5aaSJed Brown #define __FUNCT__ "TSCreate_SSP" 4707087cfbeSBarry Smith PetscErrorCode TSCreate_SSP(TS ts) 471ef7bb5aaSJed Brown { 472ef7bb5aaSJed Brown TS_SSP *ssp; 473ef7bb5aaSJed Brown PetscErrorCode ierr; 474ef7bb5aaSJed Brown 475ef7bb5aaSJed Brown PetscFunctionBegin; 476ef7bb5aaSJed Brown if (!TSSSPList) { 477ef7bb5aaSJed Brown ierr = PetscFListAdd(&TSSSPList,TSSSPRKS2, "SSPStep_RK_2", (void(*)(void))SSPStep_RK_2);CHKERRQ(ierr); 478ef7bb5aaSJed Brown ierr = PetscFListAdd(&TSSSPList,TSSSPRKS3, "SSPStep_RK_3", (void(*)(void))SSPStep_RK_3);CHKERRQ(ierr); 479ef7bb5aaSJed Brown ierr = PetscFListAdd(&TSSSPList,TSSSPRK104, "SSPStep_RK_10_4",(void(*)(void))SSPStep_RK_10_4);CHKERRQ(ierr); 480ef7bb5aaSJed Brown } 481ef7bb5aaSJed Brown 482ef7bb5aaSJed Brown ts->ops->setup = TSSetUp_SSP; 483ef7bb5aaSJed Brown ts->ops->step = TSStep_SSP; 484277b19d0SLisandro Dalcin ts->ops->reset = TSReset_SSP; 485ef7bb5aaSJed Brown ts->ops->destroy = TSDestroy_SSP; 486ef7bb5aaSJed Brown ts->ops->setfromoptions = TSSetFromOptions_SSP; 487ef7bb5aaSJed Brown ts->ops->view = TSView_SSP; 488ef7bb5aaSJed Brown 489ef7bb5aaSJed Brown ierr = PetscNewLog(ts,TS_SSP,&ssp);CHKERRQ(ierr); 490ef7bb5aaSJed Brown ts->data = (void*)ssp; 491ef7bb5aaSJed Brown 492*815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPGetType_C","TSSSPGetType_SSP",TSSSPGetType_SSP);CHKERRQ(ierr); 493*815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPSetType_C","TSSSPSetType_SSP",TSSSPSetType_SSP);CHKERRQ(ierr); 494*815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPGetNumStages_C","TSSSPGetNumStages_SSP",TSSSPGetNumStages_SSP);CHKERRQ(ierr); 495*815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPSetNumStages_C","TSSSPSetNumStages_SSP",TSSSPSetNumStages_SSP);CHKERRQ(ierr); 496*815f1ad5SJed Brown 497ef7bb5aaSJed Brown ierr = TSSSPSetType(ts,TSSSPRKS2);CHKERRQ(ierr); 498ef7bb5aaSJed Brown ssp->nstages = 5; 499ef7bb5aaSJed Brown PetscFunctionReturn(0); 500ef7bb5aaSJed Brown } 501ef7bb5aaSJed Brown EXTERN_C_END 502