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*5164425aSJed Brown char *type_name; 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" 56815f1ad5SJed Brown /*MC 57815f1ad5SJed Brown TSSSPRKS2 - Optimal second order SSP Runge-Kutta method, low-storage, c_eff=(s-1)/s 58815f1ad5SJed Brown 59815f1ad5SJed Brown Pseudocode 2 of Ketcheson 2008 60815f1ad5SJed Brown 61815f1ad5SJed Brown .seealso: TSSSP, TSSSPSetType(), TSSSPSetNumStages() 62815f1ad5SJed 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" 87815f1ad5SJed Brown /*MC 88815f1ad5SJed Brown TSSSPRKS3 - Optimal third order SSP Runge-Kutta, low-storage, c_eff=(sqrt(s)-1)/sqrt(s), where sqrt(s) is an integer 89815f1ad5SJed Brown 90815f1ad5SJed Brown Pseudocode 2 of Ketcheson 2008 91815f1ad5SJed Brown 92815f1ad5SJed Brown .seealso: TSSSP, TSSSPSetType(), TSSSPSetNumStages() 93815f1ad5SJed 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" 139815f1ad5SJed Brown /*MC 140815f1ad5SJed Brown TSSSPRKS2 - Optimal fourth order SSP Runge-Kutta, low-storage (2N), c_eff=0.6 141815f1ad5SJed Brown 142815f1ad5SJed Brown SSPRK(10,4), Pseudocode 3 of Ketcheson 2008 143815f1ad5SJed Brown 144815f1ad5SJed Brown .seealso: TSSSP, TSSSPSetType() 145815f1ad5SJed 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 { 217815f1ad5SJed 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*5164425aSJed Brown ierr = PetscFree(ssp->type_name);CHKERRQ(ierr); 223c31cb41cSBarry Smith ierr = PetscFree(ts->data);CHKERRQ(ierr); 224815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPGetType_C","",PETSC_NULL);CHKERRQ(ierr); 225815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPSetType_C","",PETSC_NULL);CHKERRQ(ierr); 226815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPGetNumStages_C","",PETSC_NULL);CHKERRQ(ierr); 227815f1ad5SJed 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" 234815f1ad5SJed Brown /*@C 235815f1ad5SJed Brown TSSSPSetType - set the SSP time integration scheme to use 236815f1ad5SJed Brown 237815f1ad5SJed Brown Logically Collective 238815f1ad5SJed Brown 239815f1ad5SJed Brown Input Arguments: 240815f1ad5SJed Brown ts - time stepping object 241815f1ad5SJed Brown type - type of scheme to use 242815f1ad5SJed Brown 243815f1ad5SJed Brown Options Database Keys: 244815f1ad5SJed Brown -ts_ssp_type <rks2>: Type of SSP method (one of) rks2 rks3 rk104 245815f1ad5SJed Brown -ts_ssp_nstages <5>: Number of stages 246815f1ad5SJed Brown 247815f1ad5SJed Brown Level: beginner 248815f1ad5SJed Brown 249815f1ad5SJed Brown .seealso: TSSSP, TSSSPGetType(), TSSSPSetNumStages(), TSSSPRKS2, TSSSPRKS3, TSSSPRK104 250815f1ad5SJed Brown @*/ 251815f1ad5SJed Brown PetscErrorCode TSSSPSetType(TS ts,const TSSSPType type) 252815f1ad5SJed Brown { 253815f1ad5SJed Brown PetscErrorCode ierr; 254815f1ad5SJed Brown 255815f1ad5SJed Brown PetscFunctionBegin; 256815f1ad5SJed Brown PetscValidHeaderSpecific(ts,TS_CLASSID,1); 257815f1ad5SJed Brown ierr = PetscTryMethod(ts,"TSSSPSetType_C",(TS,const TSSSPType),(ts,type));CHKERRQ(ierr); 258815f1ad5SJed Brown PetscFunctionReturn(0); 259815f1ad5SJed Brown } 260815f1ad5SJed Brown 261815f1ad5SJed Brown #undef __FUNCT__ 262815f1ad5SJed Brown #define __FUNCT__ "TSSSPGetType" 263815f1ad5SJed Brown /*@C 264815f1ad5SJed Brown TSSSPGetType - get the SSP time integration scheme 265815f1ad5SJed Brown 266815f1ad5SJed Brown Logically Collective 267815f1ad5SJed Brown 268815f1ad5SJed Brown Input Argument: 269815f1ad5SJed Brown ts - time stepping object 270815f1ad5SJed Brown 271815f1ad5SJed Brown Output Argument: 272815f1ad5SJed Brown type - type of scheme being used 273815f1ad5SJed Brown 274815f1ad5SJed Brown Level: beginner 275815f1ad5SJed Brown 276815f1ad5SJed Brown .seealso: TSSSP, TSSSPSettype(), TSSSPSetNumStages(), TSSSPRKS2, TSSSPRKS3, TSSSPRK104 277815f1ad5SJed Brown @*/ 278815f1ad5SJed Brown PetscErrorCode TSSSPGetType(TS ts,const TSSSPType *type) 279815f1ad5SJed Brown { 280815f1ad5SJed Brown PetscErrorCode ierr; 281815f1ad5SJed Brown 282815f1ad5SJed Brown PetscFunctionBegin; 283815f1ad5SJed Brown PetscValidHeaderSpecific(ts,TS_CLASSID,1); 284815f1ad5SJed Brown ierr = PetscTryMethod(ts,"TSSSPGetType_C",(TS,const TSSSPType*),(ts,type));CHKERRQ(ierr); 285815f1ad5SJed Brown PetscFunctionReturn(0); 286815f1ad5SJed Brown } 287815f1ad5SJed Brown 288815f1ad5SJed Brown #undef __FUNCT__ 289815f1ad5SJed Brown #define __FUNCT__ "TSSSPSetNumStages" 290815f1ad5SJed Brown /*@ 291815f1ad5SJed Brown TSSSPSetNumStages - set the number of stages to use with the SSP method 292815f1ad5SJed Brown 293815f1ad5SJed Brown Logically Collective 294815f1ad5SJed Brown 295815f1ad5SJed Brown Input Arguments: 296815f1ad5SJed Brown ts - time stepping object 297815f1ad5SJed Brown nstages - number of stages 298815f1ad5SJed Brown 299815f1ad5SJed Brown Options Database Keys: 300815f1ad5SJed Brown -ts_ssp_type <rks2>: NumStages of SSP method (one of) rks2 rks3 rk104 301815f1ad5SJed Brown -ts_ssp_nstages <5>: Number of stages 302815f1ad5SJed Brown 303815f1ad5SJed Brown Level: beginner 304815f1ad5SJed Brown 305815f1ad5SJed Brown .seealso: TSSSP, TSSSPGetNumStages(), TSSSPSetNumStages(), TSSSPRKS2, TSSSPRKS3, TSSSPRK104 306815f1ad5SJed Brown @*/ 307815f1ad5SJed Brown PetscErrorCode TSSSPSetNumStages(TS ts,PetscInt nstages) 308815f1ad5SJed Brown { 309815f1ad5SJed Brown PetscErrorCode ierr; 310815f1ad5SJed Brown 311815f1ad5SJed Brown PetscFunctionBegin; 312815f1ad5SJed Brown PetscValidHeaderSpecific(ts,TS_CLASSID,1); 313815f1ad5SJed Brown ierr = PetscTryMethod(ts,"TSSSPSetNumStages_C",(TS,PetscInt),(ts,nstages));CHKERRQ(ierr); 314815f1ad5SJed Brown PetscFunctionReturn(0); 315815f1ad5SJed Brown } 316815f1ad5SJed Brown 317815f1ad5SJed Brown #undef __FUNCT__ 318815f1ad5SJed Brown #define __FUNCT__ "TSSSPGetNumStages" 319815f1ad5SJed Brown /*@ 320815f1ad5SJed Brown TSSSPGetNumStages - get the number of stages in the SSP time integration scheme 321815f1ad5SJed Brown 322815f1ad5SJed Brown Logically Collective 323815f1ad5SJed Brown 324815f1ad5SJed Brown Input Argument: 325815f1ad5SJed Brown ts - time stepping object 326815f1ad5SJed Brown 327815f1ad5SJed Brown Output Argument: 328815f1ad5SJed Brown nstages - number of stages 329815f1ad5SJed Brown 330815f1ad5SJed Brown Level: beginner 331815f1ad5SJed Brown 332815f1ad5SJed Brown .seealso: TSSSP, TSSSPGetType(), TSSSPSetNumStages(), TSSSPRKS2, TSSSPRKS3, TSSSPRK104 333815f1ad5SJed Brown @*/ 334815f1ad5SJed Brown PetscErrorCode TSSSPGetNumStages(TS ts,PetscInt *nstages) 335815f1ad5SJed Brown { 336815f1ad5SJed Brown PetscErrorCode ierr; 337815f1ad5SJed Brown 338815f1ad5SJed Brown PetscFunctionBegin; 339815f1ad5SJed Brown PetscValidHeaderSpecific(ts,TS_CLASSID,1); 340815f1ad5SJed Brown ierr = PetscTryMethod(ts,"TSSSPGetNumStages_C",(TS,PetscInt*),(ts,nstages));CHKERRQ(ierr); 341815f1ad5SJed Brown PetscFunctionReturn(0); 342815f1ad5SJed Brown } 343815f1ad5SJed Brown 344815f1ad5SJed Brown EXTERN_C_BEGIN 345815f1ad5SJed Brown #undef __FUNCT__ 346815f1ad5SJed Brown #define __FUNCT__ "TSSSPSetType_SSP" 347815f1ad5SJed 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*5164425aSJed Brown ierr = PetscFree(ssp->type_name);CHKERRQ(ierr); 357*5164425aSJed Brown ierr = PetscStrallocpy(type,&ssp->type_name);CHKERRQ(ierr); 358ef7bb5aaSJed Brown PetscFunctionReturn(0); 359ef7bb5aaSJed Brown } 360815f1ad5SJed Brown #undef __FUNCT__ 361815f1ad5SJed Brown #define __FUNCT__ "TSSSPGetType_SSP" 362815f1ad5SJed Brown PetscErrorCode TSSSPGetType_SSP(TS ts,const TSSSPType *type) 363815f1ad5SJed Brown { 364815f1ad5SJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 365815f1ad5SJed Brown 366815f1ad5SJed Brown PetscFunctionBegin; 367*5164425aSJed Brown *type = ssp->type_name; 368815f1ad5SJed Brown PetscFunctionReturn(0); 369815f1ad5SJed Brown } 370815f1ad5SJed Brown #undef __FUNCT__ 371815f1ad5SJed Brown #define __FUNCT__ "TSSSPSetNumStages_SSP" 372815f1ad5SJed Brown PetscErrorCode TSSSPSetNumStages_SSP(TS ts,PetscInt nstages) 373815f1ad5SJed Brown { 374815f1ad5SJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 375815f1ad5SJed Brown 376815f1ad5SJed Brown PetscFunctionBegin; 377815f1ad5SJed Brown ssp->nstages = nstages; 378815f1ad5SJed Brown PetscFunctionReturn(0); 379815f1ad5SJed Brown } 380815f1ad5SJed Brown #undef __FUNCT__ 381815f1ad5SJed Brown #define __FUNCT__ "TSSSPGetNumStages_SSP" 382815f1ad5SJed Brown PetscErrorCode TSSSPGetNumStages_SSP(TS ts,PetscInt *nstages) 383815f1ad5SJed Brown { 384815f1ad5SJed Brown TS_SSP *ssp = (TS_SSP*)ts->data; 385815f1ad5SJed Brown 386815f1ad5SJed Brown PetscFunctionBegin; 387815f1ad5SJed Brown *nstages = ssp->nstages; 388815f1ad5SJed Brown PetscFunctionReturn(0); 389815f1ad5SJed Brown } 390*5164425aSJed Brown EXTERN_C_END 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 492815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPGetType_C","TSSSPGetType_SSP",TSSSPGetType_SSP);CHKERRQ(ierr); 493815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPSetType_C","TSSSPSetType_SSP",TSSSPSetType_SSP);CHKERRQ(ierr); 494815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPGetNumStages_C","TSSSPGetNumStages_SSP",TSSSPGetNumStages_SSP);CHKERRQ(ierr); 495815f1ad5SJed Brown ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSSSPSetNumStages_C","TSSSPSetNumStages_SSP",TSSSPSetNumStages_SSP);CHKERRQ(ierr); 496815f1ad5SJed 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