xref: /petsc/src/ts/impls/glee/glee.c (revision efd4aadf157bf1ba2d80c2be092fcf4247860003)
12302aa1bSDebojyoti Ghosh /*
22302aa1bSDebojyoti Ghosh   Code for time stepping with the General Linear with Error Estimation method
32302aa1bSDebojyoti Ghosh 
4642f3702SEmil Constantinescu 
52302aa1bSDebojyoti Ghosh   Notes:
62302aa1bSDebojyoti Ghosh   The general system is written as
72302aa1bSDebojyoti Ghosh 
82302aa1bSDebojyoti Ghosh   Udot = F(t,U)
92302aa1bSDebojyoti Ghosh 
102302aa1bSDebojyoti Ghosh */
112302aa1bSDebojyoti Ghosh #include <petsc/private/tsimpl.h>                /*I   "petscts.h"   I*/
122302aa1bSDebojyoti Ghosh #include <petscdm.h>
132302aa1bSDebojyoti Ghosh 
14642f3702SEmil Constantinescu static PetscBool  cited = PETSC_FALSE;
15642f3702SEmil Constantinescu static const char citation[] =
16642f3702SEmil Constantinescu   "@ARTICLE{Constantinescu_TR2016b,\n"
17642f3702SEmil Constantinescu   " author = {Constantinescu, E.M.},\n"
18642f3702SEmil Constantinescu   " title = {Estimating Global Errors in Time Stepping},\n"
19642f3702SEmil Constantinescu   " journal = {ArXiv e-prints},\n"
20642f3702SEmil Constantinescu   " year = 2016,\n"
21642f3702SEmil Constantinescu   " adsurl = {http://adsabs.harvard.edu/abs/2015arXiv150305166C}\n}\n";
22642f3702SEmil Constantinescu 
232302aa1bSDebojyoti Ghosh static TSGLEEType   TSGLEEDefaultType = TSGLEE35;
242302aa1bSDebojyoti Ghosh static PetscBool    TSGLEERegisterAllCalled;
252302aa1bSDebojyoti Ghosh static PetscBool    TSGLEEPackageInitialized;
262302aa1bSDebojyoti Ghosh static PetscInt     explicit_stage_time_id;
272302aa1bSDebojyoti Ghosh 
282302aa1bSDebojyoti Ghosh typedef struct _GLEETableau *GLEETableau;
292302aa1bSDebojyoti Ghosh struct _GLEETableau {
302302aa1bSDebojyoti Ghosh   char      *name;
312302aa1bSDebojyoti Ghosh   PetscInt   order;               /* Classical approximation order of the method i*/
322302aa1bSDebojyoti Ghosh   PetscInt   s;                   /* Number of stages */
332302aa1bSDebojyoti Ghosh   PetscInt   r;                   /* Number of steps */
342302aa1bSDebojyoti Ghosh   PetscReal  gamma;               /* LTE ratio */
352302aa1bSDebojyoti Ghosh   PetscReal *A,*B,*U,*V,*S,*F,*c; /* Tableau */
362302aa1bSDebojyoti Ghosh   PetscReal *Fembed;              /* Embedded final method coefficients */
37fd96ebc2SDebojyoti Ghosh   PetscReal *Ferror;              /* Coefficients for computing error   */
3857df6a1bSDebojyoti Ghosh   PetscReal *Serror;              /* Coefficients for initializing the error   */
392302aa1bSDebojyoti Ghosh   PetscInt   pinterp;             /* Interpolation order */
402302aa1bSDebojyoti Ghosh   PetscReal *binterp;             /* Interpolation coefficients */
412302aa1bSDebojyoti Ghosh   PetscReal  ccfl;                /* Placeholder for CFL coefficient relative to forward Euler  */
422302aa1bSDebojyoti Ghosh };
432302aa1bSDebojyoti Ghosh typedef struct _GLEETableauLink *GLEETableauLink;
442302aa1bSDebojyoti Ghosh struct _GLEETableauLink {
452302aa1bSDebojyoti Ghosh   struct _GLEETableau tab;
462302aa1bSDebojyoti Ghosh   GLEETableauLink     next;
472302aa1bSDebojyoti Ghosh };
482302aa1bSDebojyoti Ghosh static GLEETableauLink GLEETableauList;
492302aa1bSDebojyoti Ghosh 
502302aa1bSDebojyoti Ghosh typedef struct {
512302aa1bSDebojyoti Ghosh   GLEETableau  tableau;
522302aa1bSDebojyoti Ghosh   Vec          *Y;         /* Solution vector (along with auxiliary solution y~ or eps) */
532302aa1bSDebojyoti Ghosh   Vec          *X;         /* Temporary solution vector */
542302aa1bSDebojyoti Ghosh   Vec          *YStage;    /* Stage values */
552302aa1bSDebojyoti Ghosh   Vec          *YdotStage; /* Stage right hand side */
562302aa1bSDebojyoti Ghosh   Vec          W;          /* Right-hand-side for implicit stage solve */
572302aa1bSDebojyoti Ghosh   Vec          Ydot;       /* Work vector holding Ydot during residual evaluation */
580a01e1b2SEmil Constantinescu   Vec          yGErr;      /* Vector holding the global error after a step is completed */
59ec0e3ee2SEmil Constantinescu   PetscScalar  *swork;     /* Scalar work (size of the number of stages)*/
60ec0e3ee2SEmil Constantinescu   PetscScalar  *rwork;     /* Scalar work (size of the number of steps)*/
612302aa1bSDebojyoti Ghosh   PetscReal    scoeff;     /* shift = scoeff/dt */
622302aa1bSDebojyoti Ghosh   PetscReal    stage_time;
632302aa1bSDebojyoti Ghosh   TSStepStatus status;
642302aa1bSDebojyoti Ghosh } TS_GLEE;
652302aa1bSDebojyoti Ghosh 
662302aa1bSDebojyoti Ghosh /*MC
672302aa1bSDebojyoti Ghosh      TSGLEE23 - Second order three stage GLEE method
682302aa1bSDebojyoti Ghosh 
692302aa1bSDebojyoti Ghosh      This method has three stages.
702302aa1bSDebojyoti Ghosh      s = 3, r = 2
712302aa1bSDebojyoti Ghosh 
722302aa1bSDebojyoti Ghosh      Level: advanced
732302aa1bSDebojyoti Ghosh 
742302aa1bSDebojyoti Ghosh .seealso: TSGLEE
7536c34d14SEmil Constantinescu M*/
762302aa1bSDebojyoti Ghosh /*MC
772302aa1bSDebojyoti Ghosh      TSGLEE24 - Second order four stage GLEE method
782302aa1bSDebojyoti Ghosh 
792302aa1bSDebojyoti Ghosh      This method has four stages.
802302aa1bSDebojyoti Ghosh      s = 4, r = 2
812302aa1bSDebojyoti Ghosh 
822302aa1bSDebojyoti Ghosh      Level: advanced
832302aa1bSDebojyoti Ghosh 
842302aa1bSDebojyoti Ghosh .seealso: TSGLEE
8536c34d14SEmil Constantinescu M*/
862302aa1bSDebojyoti Ghosh /*MC
872302aa1bSDebojyoti Ghosh      TSGLEE25i - Second order five stage GLEE method
882302aa1bSDebojyoti Ghosh 
892302aa1bSDebojyoti Ghosh      This method has five stages.
902302aa1bSDebojyoti Ghosh      s = 5, r = 2
912302aa1bSDebojyoti Ghosh 
922302aa1bSDebojyoti Ghosh      Level: advanced
932302aa1bSDebojyoti Ghosh 
942302aa1bSDebojyoti Ghosh .seealso: TSGLEE
9536c34d14SEmil Constantinescu M*/
962302aa1bSDebojyoti Ghosh /*MC
972302aa1bSDebojyoti Ghosh      TSGLEE35  - Third order five stage GLEE method
982302aa1bSDebojyoti Ghosh 
992302aa1bSDebojyoti Ghosh      This method has five stages.
1002302aa1bSDebojyoti Ghosh      s = 5, r = 2
1012302aa1bSDebojyoti Ghosh 
1022302aa1bSDebojyoti Ghosh      Level: advanced
1032302aa1bSDebojyoti Ghosh 
1042302aa1bSDebojyoti Ghosh .seealso: TSGLEE
10536c34d14SEmil Constantinescu M*/
1062302aa1bSDebojyoti Ghosh /*MC
1072302aa1bSDebojyoti Ghosh      TSGLEEEXRK2A  - Second order six stage GLEE method
1082302aa1bSDebojyoti Ghosh 
1092302aa1bSDebojyoti Ghosh      This method has six stages.
1102302aa1bSDebojyoti Ghosh      s = 6, r = 2
1112302aa1bSDebojyoti Ghosh 
1122302aa1bSDebojyoti Ghosh      Level: advanced
1132302aa1bSDebojyoti Ghosh 
1142302aa1bSDebojyoti Ghosh .seealso: TSGLEE
11536c34d14SEmil Constantinescu M*/
1162302aa1bSDebojyoti Ghosh /*MC
1172302aa1bSDebojyoti Ghosh      TSGLEERK32G1  - Third order eight stage GLEE method
1182302aa1bSDebojyoti Ghosh 
1192302aa1bSDebojyoti Ghosh      This method has eight stages.
1202302aa1bSDebojyoti Ghosh      s = 8, r = 2
1212302aa1bSDebojyoti Ghosh 
1222302aa1bSDebojyoti Ghosh      Level: advanced
1232302aa1bSDebojyoti Ghosh 
1242302aa1bSDebojyoti Ghosh .seealso: TSGLEE
12536c34d14SEmil Constantinescu M*/
1262302aa1bSDebojyoti Ghosh /*MC
1272302aa1bSDebojyoti Ghosh      TSGLEERK285EX  - Second order nine stage GLEE method
1282302aa1bSDebojyoti Ghosh 
1292302aa1bSDebojyoti Ghosh      This method has nine stages.
1302302aa1bSDebojyoti Ghosh      s = 9, r = 2
1312302aa1bSDebojyoti Ghosh 
1322302aa1bSDebojyoti Ghosh      Level: advanced
1332302aa1bSDebojyoti Ghosh 
1342302aa1bSDebojyoti Ghosh .seealso: TSGLEE
13536c34d14SEmil Constantinescu M*/
1362302aa1bSDebojyoti Ghosh 
1372302aa1bSDebojyoti Ghosh /*@C
1382302aa1bSDebojyoti Ghosh   TSGLEERegisterAll - Registers all of the General Linear with Error Estimation methods in TSGLEE
1392302aa1bSDebojyoti Ghosh 
1402302aa1bSDebojyoti Ghosh   Not Collective, but should be called by all processes which will need the schemes to be registered
1412302aa1bSDebojyoti Ghosh 
1422302aa1bSDebojyoti Ghosh   Level: advanced
1432302aa1bSDebojyoti Ghosh 
1442302aa1bSDebojyoti Ghosh .keywords: TS, TSGLEE, register, all
1452302aa1bSDebojyoti Ghosh 
1462302aa1bSDebojyoti Ghosh .seealso:  TSGLEERegisterDestroy()
1472302aa1bSDebojyoti Ghosh @*/
1482302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegisterAll(void)
1492302aa1bSDebojyoti Ghosh {
1502302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
1512302aa1bSDebojyoti Ghosh 
1522302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
1532302aa1bSDebojyoti Ghosh   if (TSGLEERegisterAllCalled) PetscFunctionReturn(0);
1542302aa1bSDebojyoti Ghosh   TSGLEERegisterAllCalled = PETSC_TRUE;
1552302aa1bSDebojyoti Ghosh 
1562302aa1bSDebojyoti Ghosh   {
157b1fbfd33SSatish Balay #define GAMMA 0.5
1582302aa1bSDebojyoti Ghosh     /* y-eps form */
1592302aa1bSDebojyoti Ghosh     const PetscInt
160ab8c5912SEmil Constantinescu       p = 1,
161ab8c5912SEmil Constantinescu       s = 3,
162ab8c5912SEmil Constantinescu       r = 2;
163ab8c5912SEmil Constantinescu     const PetscReal
164ab8c5912SEmil Constantinescu       A[3][3]   = {{1.0,0,0},{0,0.5,0},{0,0.5,0.5}},
165ab8c5912SEmil Constantinescu       B[2][3]   = {{1.0,0,0},{-2.0,1.0,1.0}},
166ab8c5912SEmil Constantinescu       U[3][2]   = {{1.0,0},{1.0,0.5},{1.0,0.5}},
167ab8c5912SEmil Constantinescu       V[2][2]   = {{1,0},{0,1}},
168ab8c5912SEmil Constantinescu       S[2]      = {1,0},
169ab8c5912SEmil Constantinescu       F[2]      = {1,0},
170b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
17157df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
17257df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
173b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEEi1,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
174ab8c5912SEmil Constantinescu   }
175ab8c5912SEmil Constantinescu   {
176b1fbfd33SSatish Balay #undef GAMMA
177b1fbfd33SSatish Balay #define GAMMA 0.0
178ab8c5912SEmil Constantinescu     /* y-eps form */
179ab8c5912SEmil Constantinescu     const PetscInt
1802302aa1bSDebojyoti Ghosh       p = 2,
1812302aa1bSDebojyoti Ghosh       s = 3,
1822302aa1bSDebojyoti Ghosh       r = 2;
1832302aa1bSDebojyoti Ghosh     const PetscReal
1842302aa1bSDebojyoti Ghosh       A[3][3]   = {{0,0,0},{1,0,0},{0.25,0.25,0}},
1852302aa1bSDebojyoti Ghosh       B[2][3]   = {{1.0/12.0,1.0/12.0,5.0/6.0},{1.0/12.0,1.0/12.0,-1.0/6.0}},
1862302aa1bSDebojyoti Ghosh       U[3][2]   = {{1,0},{1,10},{1,-1}},
1872302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
1882302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
1892302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
190b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
19157df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
19257df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
193b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEE23,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
1942302aa1bSDebojyoti Ghosh   }
1952302aa1bSDebojyoti Ghosh   {
196b1fbfd33SSatish Balay #undef GAMMA
197b1fbfd33SSatish Balay #define GAMMA 0.0
1982302aa1bSDebojyoti Ghosh     /* y-y~ form */
1992302aa1bSDebojyoti Ghosh     const PetscInt
2002302aa1bSDebojyoti Ghosh       p = 2,
2012302aa1bSDebojyoti Ghosh       s = 4,
2022302aa1bSDebojyoti Ghosh       r = 2;
2032302aa1bSDebojyoti Ghosh     const PetscReal
2042302aa1bSDebojyoti Ghosh       A[4][4]   = {{0,0,0,0},{0.75,0,0,0},{0.25,29.0/60.0,0,0},{-21.0/44.0,145.0/44.0,-20.0/11.0,0}},
2052302aa1bSDebojyoti Ghosh       B[2][4]   = {{109.0/275.0,58.0/75.0,-37.0/110.0,1.0/6.0},{3.0/11.0,0,75.0/88.0,-1.0/8.0}},
2062302aa1bSDebojyoti Ghosh       U[4][2]   = {{0,1},{75.0/58.0,-17.0/58.0},{0,1},{0,1}},
2072302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2082302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2092302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
210fd96ebc2SDebojyoti Ghosh       Fembed[2] = {0,1},
211b1fbfd33SSatish Balay       Ferror[2] = {-1.0/(1.0-GAMMA),1.0/(1.0-GAMMA)},
212b1fbfd33SSatish Balay       Serror[2] = {1.0-GAMMA,1.0};
213b1fbfd33SSatish Balay       ierr = TSGLEERegister(TSGLEE24,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
2142302aa1bSDebojyoti Ghosh   }
2152302aa1bSDebojyoti Ghosh   {
216b1fbfd33SSatish Balay #undef GAMMA
217b1fbfd33SSatish Balay #define GAMMA 0.0
2182302aa1bSDebojyoti Ghosh     /* y-y~ form */
2192302aa1bSDebojyoti Ghosh     const PetscInt
2202302aa1bSDebojyoti Ghosh       p = 2,
2212302aa1bSDebojyoti Ghosh       s = 5,
2222302aa1bSDebojyoti Ghosh       r = 2;
2232302aa1bSDebojyoti Ghosh     const PetscReal
2242302aa1bSDebojyoti Ghosh       A[5][5]   = {{0,0,0,0,0},
2252302aa1bSDebojyoti Ghosh                    {-0.94079244066783383269,0,0,0,0},
2262302aa1bSDebojyoti Ghosh                    {0.64228187778301907108,0.10915356933958500042,0,0,0},
2272302aa1bSDebojyoti Ghosh                    {-0.51764297742287450812,0.74414270351096040738,-0.71404164927824538121,0,0},
2282302aa1bSDebojyoti Ghosh                    {-0.44696561556825969206,-0.76768425657590196518,0.20111608138142987881,0.93828186737840469796,0}},
2292302aa1bSDebojyoti Ghosh       B[2][5]   = {{-0.029309178948150356153,-0.49671981884013874923,0.34275801517650053274,0.32941112623949194988,0.85385985637229662276},
2302302aa1bSDebojyoti Ghosh                    {0.78133219686062535272,0.074238691892675897635,0.57957363498384957966,-0.24638502829674959968,-0.18875949544040123033}},
2312302aa1bSDebojyoti Ghosh       U[5][2]   = {{0.16911424754448327735,0.83088575245551672265},
2322302aa1bSDebojyoti Ghosh                    {0.53638465733199574340,0.46361534266800425660},
2332302aa1bSDebojyoti Ghosh                    {0.39901579167169582526,0.60098420832830417474},
2342302aa1bSDebojyoti Ghosh                    {0.87689005530618575480,0.12310994469381424520},
2352302aa1bSDebojyoti Ghosh                    {0.99056100455550913009,0.0094389954444908699092}},
2362302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2372302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2382302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
239fd96ebc2SDebojyoti Ghosh       Fembed[2] = {0,1},
240b1fbfd33SSatish Balay       Ferror[2] = {-1.0/(1.0-GAMMA),1.0/(1.0-GAMMA)},
241b1fbfd33SSatish Balay       Serror[2] = {1.0-GAMMA,1.0};
242b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEE25I,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
2432302aa1bSDebojyoti Ghosh   }
2442302aa1bSDebojyoti Ghosh   {
245b1fbfd33SSatish Balay #undef GAMMA
246b1fbfd33SSatish Balay #define GAMMA 0.0
2472302aa1bSDebojyoti Ghosh     /* y-y~ form */
2482302aa1bSDebojyoti Ghosh     const PetscInt
2492302aa1bSDebojyoti Ghosh       p = 3,
2502302aa1bSDebojyoti Ghosh       s = 5,
2512302aa1bSDebojyoti Ghosh       r = 2;
2522302aa1bSDebojyoti Ghosh     const PetscReal
2532302aa1bSDebojyoti Ghosh       A[5][5]   = {{0,0,0,0,0},
2542302aa1bSDebojyoti Ghosh                    {- 2169604947363702313.0 /  24313474998937147335.0,0,0,0,0},
2552302aa1bSDebojyoti Ghosh                    {46526746497697123895.0 /  94116917485856474137.0,-10297879244026594958.0 /  49199457603717988219.0,0,0,0},
2562302aa1bSDebojyoti Ghosh                    {23364788935845982499.0 /  87425311444725389446.0,-79205144337496116638.0 / 148994349441340815519.0,40051189859317443782.0 /  36487615018004984309.0,0,0},
25717d8b14cSSatish Balay                    {42089522664062539205.0 / 124911313006412840286.0,-15074384760342762939.0 / 137927286865289746282.0,-62274678522253371016.0 / 125918573676298591413.0,13755475729852471739.0 /  79257927066651693390.0,0}},
2582302aa1bSDebojyoti Ghosh       B[2][5]   = {{61546696837458703723.0 /  56982519523786160813.0,-55810892792806293355.0 / 206957624151308356511.0,24061048952676379087.0 / 158739347956038723465.0,3577972206874351339.0 /   7599733370677197135.0,-59449832954780563947.0 / 137360038685338563670.0},
2592302aa1bSDebojyoti Ghosh                    {- 9738262186984159168.0 /  99299082461487742983.0,-32797097931948613195.0 /  61521565616362163366.0,42895514606418420631.0 /  71714201188501437336.0,22608567633166065068.0 /  55371917805607957003.0,94655809487476459565.0 / 151517167160302729021.0}},
2602302aa1bSDebojyoti Ghosh       U[5][2]   = {{70820309139834661559.0 /  80863923579509469826.0,10043614439674808267.0 /  80863923579509469826.0},
2612302aa1bSDebojyoti Ghosh                    {161694774978034105510.0 / 106187653640211060371.0,-55507121337823045139.0 / 106187653640211060371.0},
2622302aa1bSDebojyoti Ghosh                    {78486094644566264568.0 /  88171030896733822981.0,9684936252167558413.0 /  88171030896733822981.0},
2632302aa1bSDebojyoti Ghosh                    {65394922146334854435.0 /  84570853840405479554.0,19175931694070625119.0 /  84570853840405479554.0},
2642302aa1bSDebojyoti Ghosh                    {8607282770183754108.0 / 108658046436496925911.0,100050763666313171803.0 / 108658046436496925911.0}},
2652302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2662302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2672302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
268fd96ebc2SDebojyoti Ghosh       Fembed[2] = {0,1},
269b1fbfd33SSatish Balay       Ferror[2] = {-1.0/(1.0-GAMMA),1.0/(1.0-GAMMA)},
270b1fbfd33SSatish Balay       Serror[2] = {1.0-GAMMA,1.0};
271b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEE35,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
2722302aa1bSDebojyoti Ghosh   }
2732302aa1bSDebojyoti Ghosh   {
274b1fbfd33SSatish Balay #undef GAMMA
275b1fbfd33SSatish Balay #define GAMMA 0.25
2762302aa1bSDebojyoti Ghosh     /* y-eps form */
2772302aa1bSDebojyoti Ghosh     const PetscInt
2782302aa1bSDebojyoti Ghosh       p = 2,
2792302aa1bSDebojyoti Ghosh       s = 6,
2802302aa1bSDebojyoti Ghosh       r = 2;
2812302aa1bSDebojyoti Ghosh     const PetscReal
2822302aa1bSDebojyoti Ghosh       A[6][6]   = {{0,0,0,0,0,0},
2832302aa1bSDebojyoti Ghosh                    {1,0,0,0,0,0},
2842302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0},
2852302aa1bSDebojyoti Ghosh                    {0,0,0.5,0,0,0},
2862302aa1bSDebojyoti Ghosh                    {0,0,0.25,0.25,0,0},
2872302aa1bSDebojyoti Ghosh                    {0,0,0.25,0.25,0.5,0}},
2882302aa1bSDebojyoti Ghosh       B[2][6]   = {{0.5,0.5,0,0,0,0},
2892302aa1bSDebojyoti Ghosh                    {-2.0/3.0,-2.0/3.0,1.0/3.0,1.0/3.0,1.0/3.0,1.0/3.0}},
2902302aa1bSDebojyoti Ghosh       U[6][2]   = {{1,0},{1,0},{1,0.75},{1,0.75},{1,0.75},{1,0.75}},
2912302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2922302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
2932302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
294b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
29557df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
29657df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
297b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEEEXRK2A,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
2982302aa1bSDebojyoti Ghosh   }
2992302aa1bSDebojyoti Ghosh   {
300b1fbfd33SSatish Balay #undef GAMMA
301b1fbfd33SSatish Balay #define GAMMA 0.0
3022302aa1bSDebojyoti Ghosh     /* y-eps form */
3032302aa1bSDebojyoti Ghosh     const PetscInt
3042302aa1bSDebojyoti Ghosh       p = 3,
3052302aa1bSDebojyoti Ghosh       s = 8,
3062302aa1bSDebojyoti Ghosh       r = 2;
3072302aa1bSDebojyoti Ghosh     const PetscReal
3082302aa1bSDebojyoti Ghosh       A[8][8]   = {{0,0,0,0,0,0,0,0},
3092302aa1bSDebojyoti Ghosh                    {0.5,0,0,0,0,0,0,0},
3102302aa1bSDebojyoti Ghosh                    {-1,2,0,0,0,0,0,0},
3112302aa1bSDebojyoti Ghosh                    {1.0/6.0,2.0/3.0,1.0/6.0,0,0,0,0,0},
3122302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0,0,0},
3132302aa1bSDebojyoti Ghosh                    {-7.0/24.0,1.0/3.0,1.0/12.0,-1.0/8.0,0.5,0,0,0},
3142302aa1bSDebojyoti Ghosh                    {7.0/6.0,-4.0/3.0,-1.0/3.0,0.5,-1.0,2.0,0,0},
3152302aa1bSDebojyoti Ghosh                    {0,0,0,0,1.0/6.0,2.0/3.0,1.0/6.0,0}},
3162302aa1bSDebojyoti Ghosh       B[2][8]   = {{1.0/6.0,2.0/3.0,1.0/6.0,0,0,0,0,0},
3172302aa1bSDebojyoti Ghosh                    {-1.0/6.0,-2.0/3.0,-1.0/6.0,0,1.0/6.0,2.0/3.0,1.0/6.0,0}},
3182302aa1bSDebojyoti Ghosh       U[8][2]   = {{1,0},{1,0},{1,0},{1,0},{1,1},{1,1},{1,1},{1,1}},
3192302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
3202302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
3212302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
322b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
32357df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
32457df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
325b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEERK32G1,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
3262302aa1bSDebojyoti Ghosh   }
3272302aa1bSDebojyoti Ghosh   {
328b1fbfd33SSatish Balay #undef GAMMA
329b1fbfd33SSatish Balay #define GAMMA 0.25
3302302aa1bSDebojyoti Ghosh     /* y-eps form */
3312302aa1bSDebojyoti Ghosh     const PetscInt
3322302aa1bSDebojyoti Ghosh       p = 2,
3332302aa1bSDebojyoti Ghosh       s = 9,
3342302aa1bSDebojyoti Ghosh       r = 2;
3352302aa1bSDebojyoti Ghosh     const PetscReal
3362302aa1bSDebojyoti Ghosh       A[9][9]   = {{0,0,0,0,0,0,0,0,0},
3372302aa1bSDebojyoti Ghosh                    {0.585786437626904966,0,0,0,0,0,0,0,0},
3382302aa1bSDebojyoti Ghosh                    {0.149999999999999994,0.849999999999999978,0,0,0,0,0,0,0},
3392302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0,0,0,0},
3402302aa1bSDebojyoti Ghosh                    {0,0,0,0.292893218813452483,0,0,0,0,0},
3412302aa1bSDebojyoti Ghosh                    {0,0,0,0.0749999999999999972,0.424999999999999989,0,0,0,0},
3422302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0,0,0},
3432302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0.292893218813452483,0,0},
3442302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0.0749999999999999972,0.424999999999999989,0}},
3452302aa1bSDebojyoti Ghosh       B[2][9]   = {{0.353553390593273786,0.353553390593273786,0.292893218813452483,0,0,0,0,0,0},
3462302aa1bSDebojyoti Ghosh                    {-0.471404520791031678,-0.471404520791031678,-0.390524291751269959,0.235702260395515839,0.235702260395515839,0.195262145875634979,0.235702260395515839,0.235702260395515839,0.195262145875634979}},
3472302aa1bSDebojyoti Ghosh       U[9][2]   = {{1,0},{1,0},{1,0},{1,0.75},{1,0.75},{1,0.75},{1,0.75},{1,0.75},{1,0.75}},
3482302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
3492302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
3502302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
351b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
35257df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
35357df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
354b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEERK285EX,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
3552302aa1bSDebojyoti Ghosh   }
3562302aa1bSDebojyoti Ghosh 
3572302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3582302aa1bSDebojyoti Ghosh }
3592302aa1bSDebojyoti Ghosh 
3602302aa1bSDebojyoti Ghosh /*@C
3612302aa1bSDebojyoti Ghosh    TSGLEERegisterDestroy - Frees the list of schemes that were registered by TSGLEERegister().
3622302aa1bSDebojyoti Ghosh 
3632302aa1bSDebojyoti Ghosh    Not Collective
3642302aa1bSDebojyoti Ghosh 
3652302aa1bSDebojyoti Ghosh    Level: advanced
3662302aa1bSDebojyoti Ghosh 
3672302aa1bSDebojyoti Ghosh .keywords: TSGLEE, register, destroy
3682302aa1bSDebojyoti Ghosh .seealso: TSGLEERegister(), TSGLEERegisterAll()
3692302aa1bSDebojyoti Ghosh @*/
3702302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegisterDestroy(void)
3712302aa1bSDebojyoti Ghosh {
3722302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
3732302aa1bSDebojyoti Ghosh   GLEETableauLink link;
3742302aa1bSDebojyoti Ghosh 
3752302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
3762302aa1bSDebojyoti Ghosh   while ((link = GLEETableauList)) {
3772302aa1bSDebojyoti Ghosh     GLEETableau t = &link->tab;
3782302aa1bSDebojyoti Ghosh     GLEETableauList = link->next;
3792302aa1bSDebojyoti Ghosh     ierr = PetscFree5(t->A,t->B,t->U,t->V,t->c);  CHKERRQ(ierr);
3802302aa1bSDebojyoti Ghosh     ierr = PetscFree2(t->S,t->F);                 CHKERRQ(ierr);
3812302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->Fembed);                 CHKERRQ(ierr);
382fd96ebc2SDebojyoti Ghosh     ierr = PetscFree (t->Ferror);                 CHKERRQ(ierr);
38357df6a1bSDebojyoti Ghosh     ierr = PetscFree (t->Serror);                 CHKERRQ(ierr);
3842302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->binterp);                CHKERRQ(ierr);
3852302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->name);                   CHKERRQ(ierr);
3862302aa1bSDebojyoti Ghosh     ierr = PetscFree (link);                      CHKERRQ(ierr);
3872302aa1bSDebojyoti Ghosh   }
3882302aa1bSDebojyoti Ghosh   TSGLEERegisterAllCalled = PETSC_FALSE;
3892302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3902302aa1bSDebojyoti Ghosh }
3912302aa1bSDebojyoti Ghosh 
3922302aa1bSDebojyoti Ghosh /*@C
3932302aa1bSDebojyoti Ghosh   TSGLEEInitializePackage - This function initializes everything in the TSGLEE package. It is called
3942302aa1bSDebojyoti Ghosh   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to TSCreate_GLEE()
3952302aa1bSDebojyoti Ghosh   when using static libraries.
3962302aa1bSDebojyoti Ghosh 
3972302aa1bSDebojyoti Ghosh   Level: developer
3982302aa1bSDebojyoti Ghosh 
3992302aa1bSDebojyoti Ghosh .keywords: TS, TSGLEE, initialize, package
4002302aa1bSDebojyoti Ghosh .seealso: PetscInitialize()
4012302aa1bSDebojyoti Ghosh @*/
4022302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEInitializePackage(void)
4032302aa1bSDebojyoti Ghosh {
4042302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
4052302aa1bSDebojyoti Ghosh 
4062302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4072302aa1bSDebojyoti Ghosh   if (TSGLEEPackageInitialized) PetscFunctionReturn(0);
4082302aa1bSDebojyoti Ghosh   TSGLEEPackageInitialized = PETSC_TRUE;
4092302aa1bSDebojyoti Ghosh   ierr = TSGLEERegisterAll();CHKERRQ(ierr);
4102302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposedDataRegister(&explicit_stage_time_id);CHKERRQ(ierr);
4112302aa1bSDebojyoti Ghosh   ierr = PetscRegisterFinalize(TSGLEEFinalizePackage);CHKERRQ(ierr);
4122302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
4132302aa1bSDebojyoti Ghosh }
4142302aa1bSDebojyoti Ghosh 
4152302aa1bSDebojyoti Ghosh /*@C
4162302aa1bSDebojyoti Ghosh   TSGLEEFinalizePackage - This function destroys everything in the TSGLEE package. It is
4172302aa1bSDebojyoti Ghosh   called from PetscFinalize().
4182302aa1bSDebojyoti Ghosh 
4192302aa1bSDebojyoti Ghosh   Level: developer
4202302aa1bSDebojyoti Ghosh 
4212302aa1bSDebojyoti Ghosh .keywords: Petsc, destroy, package
4222302aa1bSDebojyoti Ghosh .seealso: PetscFinalize()
4232302aa1bSDebojyoti Ghosh @*/
4242302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEFinalizePackage(void)
4252302aa1bSDebojyoti Ghosh {
4262302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
4272302aa1bSDebojyoti Ghosh 
4282302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4292302aa1bSDebojyoti Ghosh   TSGLEEPackageInitialized = PETSC_FALSE;
4302302aa1bSDebojyoti Ghosh   ierr = TSGLEERegisterDestroy();CHKERRQ(ierr);
4312302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
4322302aa1bSDebojyoti Ghosh }
4332302aa1bSDebojyoti Ghosh 
4342302aa1bSDebojyoti Ghosh /*@C
4352302aa1bSDebojyoti Ghosh    TSGLEERegister - register an GLEE scheme by providing the entries in the Butcher tableau
4362302aa1bSDebojyoti Ghosh 
4372302aa1bSDebojyoti Ghosh    Not Collective, but the same schemes should be registered on all processes on which they will be used
4382302aa1bSDebojyoti Ghosh 
4392302aa1bSDebojyoti Ghosh    Input Parameters:
4402302aa1bSDebojyoti Ghosh +  name   - identifier for method
4412302aa1bSDebojyoti Ghosh .  order  - order of method
4422302aa1bSDebojyoti Ghosh .  s - number of stages
4432302aa1bSDebojyoti Ghosh .  r - number of steps
4442302aa1bSDebojyoti Ghosh .  gamma - LTE ratio
4452302aa1bSDebojyoti Ghosh .  A - stage coefficients (dimension s*s, row-major)
4462302aa1bSDebojyoti Ghosh .  B - step completion coefficients (dimension r*s, row-major)
4472302aa1bSDebojyoti Ghosh .  U - method coefficients (dimension s*r, row-major)
4482302aa1bSDebojyoti Ghosh .  V - method coefficients (dimension r*r, row-major)
4492302aa1bSDebojyoti Ghosh .  S - starting coefficients
4502302aa1bSDebojyoti Ghosh .  F - finishing coefficients
4512302aa1bSDebojyoti Ghosh .  c - abscissa (dimension s; NULL to use row sums of A)
4522302aa1bSDebojyoti Ghosh .  Fembed - step completion coefficients for embedded method
453fd96ebc2SDebojyoti Ghosh .  Ferror - error computation coefficients
45457df6a1bSDebojyoti Ghosh .  Serror - error initialization coefficients
4552302aa1bSDebojyoti Ghosh .  pinterp - order of interpolation (0 if unavailable)
4562302aa1bSDebojyoti Ghosh -  binterp - array of interpolation coefficients (NULL if unavailable)
4572302aa1bSDebojyoti Ghosh 
4582302aa1bSDebojyoti Ghosh    Notes:
4592302aa1bSDebojyoti Ghosh    Several GLEE methods are provided, this function is only needed to create new methods.
4602302aa1bSDebojyoti Ghosh 
4612302aa1bSDebojyoti Ghosh    Level: advanced
4622302aa1bSDebojyoti Ghosh 
4632302aa1bSDebojyoti Ghosh .keywords: TS, register
4642302aa1bSDebojyoti Ghosh 
4652302aa1bSDebojyoti Ghosh .seealso: TSGLEE
4662302aa1bSDebojyoti Ghosh @*/
4672302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegister(TSGLEEType name,PetscInt order,PetscInt s, PetscInt r,
4682302aa1bSDebojyoti Ghosh                               PetscReal gamma,
4692302aa1bSDebojyoti Ghosh                               const PetscReal A[],const PetscReal B[],
4702302aa1bSDebojyoti Ghosh                               const PetscReal U[],const PetscReal V[],
4712302aa1bSDebojyoti Ghosh                               const PetscReal S[],const PetscReal F[],
472fd96ebc2SDebojyoti Ghosh                               const PetscReal c[],
473fd96ebc2SDebojyoti Ghosh                               const PetscReal Fembed[],const PetscReal Ferror[],
47457df6a1bSDebojyoti Ghosh                               const PetscReal Serror[],
4752302aa1bSDebojyoti Ghosh                               PetscInt pinterp, const PetscReal binterp[])
4762302aa1bSDebojyoti Ghosh {
4772302aa1bSDebojyoti Ghosh   PetscErrorCode    ierr;
4782302aa1bSDebojyoti Ghosh   GLEETableauLink   link;
4792302aa1bSDebojyoti Ghosh   GLEETableau       t;
4802302aa1bSDebojyoti Ghosh   PetscInt          i,j;
4812302aa1bSDebojyoti Ghosh 
4822302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4832302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc(sizeof(*link),&link);CHKERRQ(ierr);
4842302aa1bSDebojyoti Ghosh   ierr     = PetscMemzero(link,sizeof(*link));CHKERRQ(ierr);
4852302aa1bSDebojyoti Ghosh   t        = &link->tab;
4862302aa1bSDebojyoti Ghosh   ierr     = PetscStrallocpy(name,&t->name);CHKERRQ(ierr);
4872302aa1bSDebojyoti Ghosh   t->order = order;
4882302aa1bSDebojyoti Ghosh   t->s     = s;
4892302aa1bSDebojyoti Ghosh   t->r     = r;
4902302aa1bSDebojyoti Ghosh   t->gamma = gamma;
4912302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc5(s*s,&t->A,r*r,&t->V,s,&t->c,r*s,&t->B,s*r,&t->U); CHKERRQ(ierr);
4922302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc2(r,&t->S,r,&t->F); CHKERRQ(ierr);
4932302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->A,A,s*s*sizeof(A[0]));CHKERRQ(ierr);
4942302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->B,B,r*s*sizeof(B[0]));CHKERRQ(ierr);
4952302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->U,U,s*r*sizeof(U[0]));CHKERRQ(ierr);
4962302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->V,V,r*r*sizeof(V[0]));CHKERRQ(ierr);
4972302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->S,S,r  *sizeof(S[0]));CHKERRQ(ierr);
4982302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->F,F,r  *sizeof(F[0]));CHKERRQ(ierr);
4992302aa1bSDebojyoti Ghosh   if (c) {
5002302aa1bSDebojyoti Ghosh     ierr   = PetscMemcpy(t->c,c,s*sizeof(c[0])); CHKERRQ(ierr);
5012302aa1bSDebojyoti Ghosh   } else {
5022302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) for (j=0,t->c[i]=0; j<s; j++) t->c[i] += A[i*s+j];
5032302aa1bSDebojyoti Ghosh   }
5042302aa1bSDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Fembed);CHKERRQ(ierr);
505fd96ebc2SDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Ferror);CHKERRQ(ierr);
50657df6a1bSDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Serror);CHKERRQ(ierr);
5072302aa1bSDebojyoti Ghosh   ierr = PetscMemcpy(t->Fembed,Fembed,r*sizeof(Fembed[0]));CHKERRQ(ierr);
508fd96ebc2SDebojyoti Ghosh   ierr = PetscMemcpy(t->Ferror,Ferror,r*sizeof(Ferror[0]));CHKERRQ(ierr);
50957df6a1bSDebojyoti Ghosh   ierr = PetscMemcpy(t->Serror,Serror,r*sizeof(Serror[0]));CHKERRQ(ierr);
5102302aa1bSDebojyoti Ghosh   t->pinterp = pinterp;
5112302aa1bSDebojyoti Ghosh   ierr       = PetscMalloc1(s*pinterp,&t->binterp);CHKERRQ(ierr);
5122302aa1bSDebojyoti Ghosh   ierr       = PetscMemcpy(t->binterp,binterp,s*pinterp*sizeof(binterp[0]));CHKERRQ(ierr);
5132302aa1bSDebojyoti Ghosh 
5142302aa1bSDebojyoti Ghosh   link->next      = GLEETableauList;
5152302aa1bSDebojyoti Ghosh   GLEETableauList = link;
5162302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
5172302aa1bSDebojyoti Ghosh }
5182302aa1bSDebojyoti Ghosh 
5192302aa1bSDebojyoti Ghosh static PetscErrorCode TSEvaluateStep_GLEE(TS ts,PetscInt order,Vec X,PetscBool *done)
5202302aa1bSDebojyoti Ghosh {
5212302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*) ts->data;
5222302aa1bSDebojyoti Ghosh   GLEETableau     tab = glee->tableau;
5232302aa1bSDebojyoti Ghosh   PetscReal       h, *B = tab->B, *V = tab->V,
524fd96ebc2SDebojyoti Ghosh                   *F = tab->F,
525fd96ebc2SDebojyoti Ghosh                   *Fembed = tab->Fembed;
5262302aa1bSDebojyoti Ghosh   PetscInt        s = tab->s, r = tab->r, i, j;
5272302aa1bSDebojyoti Ghosh   Vec             *Y = glee->Y, *YdotStage = glee->YdotStage;
528ec0e3ee2SEmil Constantinescu   PetscScalar     *ws = glee->swork, *wr = glee->rwork;
5292302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
5302302aa1bSDebojyoti Ghosh 
5312302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
5322302aa1bSDebojyoti Ghosh 
5332302aa1bSDebojyoti Ghosh   switch (glee->status) {
5342302aa1bSDebojyoti Ghosh     case TS_STEP_INCOMPLETE:
5352302aa1bSDebojyoti Ghosh     case TS_STEP_PENDING:
5362302aa1bSDebojyoti Ghosh       h = ts->time_step; break;
5372302aa1bSDebojyoti Ghosh     case TS_STEP_COMPLETE:
538ed450d42SEmil Constantinescu       h = ts->ptime - ts->ptime_prev; break;
5392302aa1bSDebojyoti Ghosh     default: SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_PLIB,"Invalid TSStepStatus");
5402302aa1bSDebojyoti Ghosh   }
5412302aa1bSDebojyoti Ghosh 
5422302aa1bSDebojyoti Ghosh   if (order == tab->order) {
5432302aa1bSDebojyoti Ghosh 
5442302aa1bSDebojyoti Ghosh     /* Note: Irrespective of whether status is TS_STEP_INCOMPLETE
545fd96ebc2SDebojyoti Ghosh              or TS_STEP_COMPLETE, glee->X has the solution at the
5462302aa1bSDebojyoti Ghosh              beginning of the time step. So no need to roll-back.
5472302aa1bSDebojyoti Ghosh     */
5482302aa1bSDebojyoti Ghosh     if (glee->status == TS_STEP_INCOMPLETE) {
5492302aa1bSDebojyoti Ghosh       for (i=0; i<r; i++) {
5502302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(Y[i]); CHKERRQ(ierr);
551ec0e3ee2SEmil Constantinescu         for (j=0; j<r; j++) wr[j] = V[i*r+j];
552ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(Y[i],r,wr,glee->X); CHKERRQ(ierr);
553ec0e3ee2SEmil Constantinescu         for (j=0; j<s; j++) ws[j] = h*B[i*s+j];
554ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(Y[i],s,ws,YdotStage); CHKERRQ(ierr);
5552302aa1bSDebojyoti Ghosh       }
5562302aa1bSDebojyoti Ghosh       ierr = VecZeroEntries(X);CHKERRQ(ierr);
557ec0e3ee2SEmil Constantinescu       for (j=0; j<r; j++) wr[j] = F[j];
558ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(X,r,wr,Y);CHKERRQ(ierr);
5592302aa1bSDebojyoti Ghosh     } else {ierr = VecCopy(ts->vec_sol,X);CHKERRQ(ierr);}
5602302aa1bSDebojyoti Ghosh     PetscFunctionReturn(0);
5612302aa1bSDebojyoti Ghosh 
5622302aa1bSDebojyoti Ghosh   } else if (order == tab->order-1) {
5632302aa1bSDebojyoti Ghosh 
5642302aa1bSDebojyoti Ghosh     /* Complete with the embedded method (Fembed) */
5652302aa1bSDebojyoti Ghosh     for (i=0; i<r; i++) {
5662302aa1bSDebojyoti Ghosh       ierr = VecZeroEntries(Y[i]); CHKERRQ(ierr);
567ec0e3ee2SEmil Constantinescu       for (j=0; j<r; j++) wr[j] = V[i*r+j];
568ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(Y[i],r,wr,glee->X); CHKERRQ(ierr);
569ec0e3ee2SEmil Constantinescu       for (j=0; j<s; j++) ws[j] = h*B[i*s+j];
570ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(Y[i],s,ws,YdotStage); CHKERRQ(ierr);
5712302aa1bSDebojyoti Ghosh     }
5722302aa1bSDebojyoti Ghosh     ierr = VecZeroEntries(X);CHKERRQ(ierr);
573ec0e3ee2SEmil Constantinescu     for (j=0; j<r; j++) wr[j] = Fembed[j];
574ec0e3ee2SEmil Constantinescu     ierr = VecMAXPY(X,r,wr,Y);CHKERRQ(ierr);
575fd96ebc2SDebojyoti Ghosh 
5762302aa1bSDebojyoti Ghosh     if (done) *done = PETSC_TRUE;
5772302aa1bSDebojyoti Ghosh     PetscFunctionReturn(0);
5782302aa1bSDebojyoti Ghosh   }
5792302aa1bSDebojyoti Ghosh   if (done) *done = PETSC_FALSE;
5802302aa1bSDebojyoti Ghosh   else SETERRQ3(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"GLEE '%s' of order %D cannot evaluate step at order %D",tab->name,tab->order,order);
5812302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
5822302aa1bSDebojyoti Ghosh }
5832302aa1bSDebojyoti Ghosh 
5842302aa1bSDebojyoti Ghosh static PetscErrorCode TSStep_GLEE(TS ts)
5852302aa1bSDebojyoti Ghosh {
5862302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
5872302aa1bSDebojyoti Ghosh   GLEETableau     tab = glee->tableau;
5882302aa1bSDebojyoti Ghosh   const PetscInt  s = tab->s, r = tab->r;
5892302aa1bSDebojyoti Ghosh   PetscReal       *A = tab->A, *U = tab->U,
5902302aa1bSDebojyoti Ghosh                   *F = tab->F,
5912302aa1bSDebojyoti Ghosh                   *c = tab->c;
5922302aa1bSDebojyoti Ghosh   Vec             *Y = glee->Y, *X = glee->X,
5932302aa1bSDebojyoti Ghosh                   *YStage = glee->YStage,
5942302aa1bSDebojyoti Ghosh                   *YdotStage = glee->YdotStage,
5952302aa1bSDebojyoti Ghosh                   W = glee->W;
5962302aa1bSDebojyoti Ghosh   SNES            snes;
597ec0e3ee2SEmil Constantinescu   PetscScalar     *ws = glee->swork, *wr = glee->rwork;
5982302aa1bSDebojyoti Ghosh   TSAdapt         adapt;
5992302aa1bSDebojyoti Ghosh   PetscInt        i,j,reject,next_scheme,its,lits;
6002302aa1bSDebojyoti Ghosh   PetscReal       next_time_step;
6012302aa1bSDebojyoti Ghosh   PetscReal       t;
6022302aa1bSDebojyoti Ghosh   PetscBool       accept;
6032302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
6042302aa1bSDebojyoti Ghosh 
6052302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
606642f3702SEmil Constantinescu   ierr = PetscCitationsRegister(citation,&cited);CHKERRQ(ierr);
607642f3702SEmil Constantinescu 
6082302aa1bSDebojyoti Ghosh   for (i=0; i<r; i++) { ierr = VecCopy(Y[i],X[i]); CHKERRQ(ierr); }
6092302aa1bSDebojyoti Ghosh 
6102302aa1bSDebojyoti Ghosh   ierr           = TSGetSNES(ts,&snes);CHKERRQ(ierr);
6112302aa1bSDebojyoti Ghosh   next_time_step = ts->time_step;
6122302aa1bSDebojyoti Ghosh   t              = ts->ptime;
6132302aa1bSDebojyoti Ghosh   accept         = PETSC_TRUE;
6142302aa1bSDebojyoti Ghosh   glee->status   = TS_STEP_INCOMPLETE;
6152302aa1bSDebojyoti Ghosh 
6162302aa1bSDebojyoti Ghosh   for (reject=0; reject<ts->max_reject && !ts->reason; reject++,ts->reject++) {
6172302aa1bSDebojyoti Ghosh 
6182302aa1bSDebojyoti Ghosh     PetscReal h = ts->time_step;
6192302aa1bSDebojyoti Ghosh     ierr = TSPreStep(ts);CHKERRQ(ierr);
6202302aa1bSDebojyoti Ghosh 
6212302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) {
6222302aa1bSDebojyoti Ghosh 
6232302aa1bSDebojyoti Ghosh       glee->stage_time = t + h*c[i];
6242302aa1bSDebojyoti Ghosh       ierr = TSPreStage(ts,glee->stage_time); CHKERRQ(ierr);
6252302aa1bSDebojyoti Ghosh 
6262302aa1bSDebojyoti Ghosh       if (A[i*s+i] == 0) {  /* Explicit stage */
6272302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(YStage[i]);CHKERRQ(ierr);
628ec0e3ee2SEmil Constantinescu         for (j=0; j<r; j++) wr[j] = U[i*r+j];
629ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(YStage[i],r,wr,X);CHKERRQ(ierr);
630ec0e3ee2SEmil Constantinescu         for (j=0; j<i; j++) ws[j] = h*A[i*s+j];
631ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(YStage[i],i,ws,YdotStage);CHKERRQ(ierr);
6322302aa1bSDebojyoti Ghosh       } else {              /* Implicit stage */
6332302aa1bSDebojyoti Ghosh         glee->scoeff = 1.0/A[i*s+i];
6342302aa1bSDebojyoti Ghosh         /* compute right-hand-side */
6352302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(W);CHKERRQ(ierr);
636ec0e3ee2SEmil Constantinescu         for (j=0; j<r; j++) wr[j] = U[i*r+j];
637ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(W,r,wr,X);CHKERRQ(ierr);
638ec0e3ee2SEmil Constantinescu         for (j=0; j<i; j++) ws[j] = h*A[i*s+j];
639ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(W,i,ws,YdotStage);CHKERRQ(ierr);
6402302aa1bSDebojyoti Ghosh         ierr = VecScale(W,glee->scoeff/h);CHKERRQ(ierr);
6412302aa1bSDebojyoti Ghosh         /* set initial guess */
6422302aa1bSDebojyoti Ghosh         ierr = VecCopy(i>0 ? YStage[i-1] : ts->vec_sol,YStage[i]);CHKERRQ(ierr);
6432302aa1bSDebojyoti Ghosh         /* solve for this stage */
6442302aa1bSDebojyoti Ghosh         ierr = SNESSolve(snes,W,YStage[i]);CHKERRQ(ierr);
6452302aa1bSDebojyoti Ghosh         ierr = SNESGetIterationNumber(snes,&its);CHKERRQ(ierr);
6462302aa1bSDebojyoti Ghosh         ierr = SNESGetLinearSolveIterations(snes,&lits);CHKERRQ(ierr);
6472302aa1bSDebojyoti Ghosh         ts->snes_its += its; ts->ksp_its += lits;
6482302aa1bSDebojyoti Ghosh       }
6492302aa1bSDebojyoti Ghosh       ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr);
650d6629dc5SEmil Constantinescu       ierr = TSAdaptCheckStage(adapt,ts,glee->stage_time,YStage[i],&accept);CHKERRQ(ierr);
6512302aa1bSDebojyoti Ghosh       if (!accept) goto reject_step;
6522302aa1bSDebojyoti Ghosh       ierr = TSPostStage(ts,glee->stage_time,i,YStage); CHKERRQ(ierr);
6532302aa1bSDebojyoti Ghosh       ierr = TSComputeRHSFunction(ts,t+h*c[i],YStage[i],YdotStage[i]);CHKERRQ(ierr);
6542302aa1bSDebojyoti Ghosh     }
6552302aa1bSDebojyoti Ghosh     ierr = TSEvaluateStep(ts,tab->order,ts->vec_sol,NULL);CHKERRQ(ierr);
6562302aa1bSDebojyoti Ghosh     glee->status = TS_STEP_PENDING;
6572302aa1bSDebojyoti Ghosh 
6582302aa1bSDebojyoti Ghosh     /* Register only the current method as a candidate because we're not supporting multiple candidates yet. */
6592302aa1bSDebojyoti Ghosh     ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr);
6602302aa1bSDebojyoti Ghosh     ierr = TSAdaptCandidatesClear(adapt);CHKERRQ(ierr);
6611917a363SLisandro Dalcin     ierr = TSAdaptCandidateAdd(adapt,tab->name,tab->order,1,tab->ccfl,(PetscReal)tab->s,PETSC_TRUE);CHKERRQ(ierr);
6622302aa1bSDebojyoti Ghosh     ierr = TSAdaptChoose(adapt,ts,ts->time_step,&next_scheme,&next_time_step,&accept);CHKERRQ(ierr);
6632302aa1bSDebojyoti Ghosh     if (accept) {
6642302aa1bSDebojyoti Ghosh       /* ignore next_scheme for now */
6652302aa1bSDebojyoti Ghosh       ts->ptime     += ts->time_step;
6662302aa1bSDebojyoti Ghosh       ts->time_step  = next_time_step;
6672302aa1bSDebojyoti Ghosh       glee->status = TS_STEP_COMPLETE;
6680a01e1b2SEmil Constantinescu       /* compute and store the global error */
6690a01e1b2SEmil Constantinescu       /* Note: this is not needed if TSAdaptGLEE is not used */
6700a01e1b2SEmil Constantinescu       ierr = TSGetTimeError(ts,0,&(glee->yGErr));CHKERRQ(ierr);
6712302aa1bSDebojyoti Ghosh       ierr = PetscObjectComposedDataSetReal((PetscObject)ts->vec_sol,explicit_stage_time_id,ts->ptime);CHKERRQ(ierr);
6722302aa1bSDebojyoti Ghosh       break;
6732302aa1bSDebojyoti Ghosh     } else {                    /* Roll back the current step */
674ec0e3ee2SEmil Constantinescu       for (j=0; j<r; j++) wr[j] = F[j];
675ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(ts->vec_sol,r,wr,X);CHKERRQ(ierr);
6762302aa1bSDebojyoti Ghosh       ts->time_step = next_time_step;
6772302aa1bSDebojyoti Ghosh       glee->status  = TS_STEP_INCOMPLETE;
6782302aa1bSDebojyoti Ghosh     }
6792302aa1bSDebojyoti Ghosh reject_step: continue;
6802302aa1bSDebojyoti Ghosh   }
6812302aa1bSDebojyoti Ghosh   if (glee->status != TS_STEP_COMPLETE && !ts->reason) ts->reason = TS_DIVERGED_STEP_REJECTED;
6822302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
6832302aa1bSDebojyoti Ghosh }
6842302aa1bSDebojyoti Ghosh 
6852302aa1bSDebojyoti Ghosh static PetscErrorCode TSInterpolate_GLEE(TS ts,PetscReal itime,Vec X)
6862302aa1bSDebojyoti Ghosh {
6872302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
6882302aa1bSDebojyoti Ghosh   PetscInt        s=glee->tableau->s, pinterp=glee->tableau->pinterp,i,j;
6892302aa1bSDebojyoti Ghosh   PetscReal       h,tt,t;
6902302aa1bSDebojyoti Ghosh   PetscScalar     *b;
6912302aa1bSDebojyoti Ghosh   const PetscReal *B = glee->tableau->binterp;
6922302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
6932302aa1bSDebojyoti Ghosh 
6942302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
6952302aa1bSDebojyoti Ghosh   if (!B) SETERRQ1(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"TSGLEE %s does not have an interpolation formula",glee->tableau->name);
6962302aa1bSDebojyoti Ghosh   switch (glee->status) {
6972302aa1bSDebojyoti Ghosh     case TS_STEP_INCOMPLETE:
6982302aa1bSDebojyoti Ghosh     case TS_STEP_PENDING:
6992302aa1bSDebojyoti Ghosh       h = ts->time_step;
7002302aa1bSDebojyoti Ghosh       t = (itime - ts->ptime)/h;
7012302aa1bSDebojyoti Ghosh       break;
7022302aa1bSDebojyoti Ghosh     case TS_STEP_COMPLETE:
703ed450d42SEmil Constantinescu       h = ts->ptime - ts->ptime_prev;
7042302aa1bSDebojyoti Ghosh       t = (itime - ts->ptime)/h + 1; /* In the interval [0,1] */
7052302aa1bSDebojyoti Ghosh       break;
7062302aa1bSDebojyoti Ghosh     default: SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_PLIB,"Invalid TSStepStatus");
7072302aa1bSDebojyoti Ghosh   }
7082302aa1bSDebojyoti Ghosh   ierr = PetscMalloc1(s,&b);CHKERRQ(ierr);
7092302aa1bSDebojyoti Ghosh   for (i=0; i<s; i++) b[i] = 0;
7102302aa1bSDebojyoti Ghosh   for (j=0,tt=t; j<pinterp; j++,tt*=t) {
7112302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) {
7122302aa1bSDebojyoti Ghosh       b[i]  += h * B[i*pinterp+j] * tt;
7132302aa1bSDebojyoti Ghosh     }
7142302aa1bSDebojyoti Ghosh   }
7152302aa1bSDebojyoti Ghosh   ierr = VecCopy(glee->YStage[0],X);CHKERRQ(ierr);
7162302aa1bSDebojyoti Ghosh   ierr = VecMAXPY(X,s,b,glee->YdotStage);CHKERRQ(ierr);
7172302aa1bSDebojyoti Ghosh   ierr = PetscFree(b);CHKERRQ(ierr);
7182302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7192302aa1bSDebojyoti Ghosh }
7202302aa1bSDebojyoti Ghosh 
7212302aa1bSDebojyoti Ghosh /*------------------------------------------------------------*/
7222302aa1bSDebojyoti Ghosh static PetscErrorCode TSReset_GLEE(TS ts)
7232302aa1bSDebojyoti Ghosh {
7242302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
7252302aa1bSDebojyoti Ghosh   PetscInt       s, r;
7262302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7272302aa1bSDebojyoti Ghosh 
7282302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7292302aa1bSDebojyoti Ghosh   if (!glee->tableau) PetscFunctionReturn(0);
7302302aa1bSDebojyoti Ghosh   s    = glee->tableau->s;
7312302aa1bSDebojyoti Ghosh   r    = glee->tableau->r;
7322302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(r,&glee->Y);CHKERRQ(ierr);
7332302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(r,&glee->X);CHKERRQ(ierr);
7342302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(s,&glee->YStage);CHKERRQ(ierr);
7352302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(s,&glee->YdotStage);CHKERRQ(ierr);
7362302aa1bSDebojyoti Ghosh   ierr = VecDestroy(&glee->Ydot);CHKERRQ(ierr);
7370a01e1b2SEmil Constantinescu   ierr = VecDestroy(&glee->yGErr);CHKERRQ(ierr);
7382302aa1bSDebojyoti Ghosh   ierr = VecDestroy(&glee->W);CHKERRQ(ierr);
739ec0e3ee2SEmil Constantinescu   ierr = PetscFree2(glee->swork,glee->rwork);CHKERRQ(ierr);
7402302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7412302aa1bSDebojyoti Ghosh }
7422302aa1bSDebojyoti Ghosh 
7432302aa1bSDebojyoti Ghosh static PetscErrorCode TSDestroy_GLEE(TS ts)
7442302aa1bSDebojyoti Ghosh {
7452302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7462302aa1bSDebojyoti Ghosh 
7472302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7482302aa1bSDebojyoti Ghosh   ierr = TSReset_GLEE(ts);CHKERRQ(ierr);
7492302aa1bSDebojyoti Ghosh   ierr = PetscFree(ts->data);CHKERRQ(ierr);
7502302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEEGetType_C",NULL);CHKERRQ(ierr);
7512302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEESetType_C",NULL);CHKERRQ(ierr);
7522302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7532302aa1bSDebojyoti Ghosh }
7542302aa1bSDebojyoti Ghosh 
7552302aa1bSDebojyoti Ghosh static PetscErrorCode TSGLEEGetVecs(TS ts,DM dm,Vec *Ydot)
7562302aa1bSDebojyoti Ghosh {
7572302aa1bSDebojyoti Ghosh   TS_GLEE     *glee = (TS_GLEE*)ts->data;
7582302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7592302aa1bSDebojyoti Ghosh 
7602302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7612302aa1bSDebojyoti Ghosh   if (Ydot) {
7622302aa1bSDebojyoti Ghosh     if (dm && dm != ts->dm) {
7632302aa1bSDebojyoti Ghosh       ierr = DMGetNamedGlobalVector(dm,"TSGLEE_Ydot",Ydot);CHKERRQ(ierr);
7642302aa1bSDebojyoti Ghosh     } else *Ydot = glee->Ydot;
7652302aa1bSDebojyoti Ghosh   }
7662302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7672302aa1bSDebojyoti Ghosh }
7682302aa1bSDebojyoti Ghosh 
7692302aa1bSDebojyoti Ghosh 
7702302aa1bSDebojyoti Ghosh static PetscErrorCode TSGLEERestoreVecs(TS ts,DM dm,Vec *Ydot)
7712302aa1bSDebojyoti Ghosh {
7722302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7732302aa1bSDebojyoti Ghosh 
7742302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7752302aa1bSDebojyoti Ghosh   if (Ydot) {
7762302aa1bSDebojyoti Ghosh     if (dm && dm != ts->dm) {
7772302aa1bSDebojyoti Ghosh       ierr = DMRestoreNamedGlobalVector(dm,"TSGLEE_Ydot",Ydot);CHKERRQ(ierr);
7782302aa1bSDebojyoti Ghosh     }
7792302aa1bSDebojyoti Ghosh   }
7802302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7812302aa1bSDebojyoti Ghosh }
7822302aa1bSDebojyoti Ghosh 
7832302aa1bSDebojyoti Ghosh /*
7842302aa1bSDebojyoti Ghosh   This defines the nonlinear equation that is to be solved with SNES
7852302aa1bSDebojyoti Ghosh */
7862302aa1bSDebojyoti Ghosh static PetscErrorCode SNESTSFormFunction_GLEE(SNES snes,Vec X,Vec F,TS ts)
7872302aa1bSDebojyoti Ghosh {
7882302aa1bSDebojyoti Ghosh   TS_GLEE       *glee = (TS_GLEE*)ts->data;
7892302aa1bSDebojyoti Ghosh   DM             dm,dmsave;
7902302aa1bSDebojyoti Ghosh   Vec            Ydot;
7912302aa1bSDebojyoti Ghosh   PetscReal      shift = glee->scoeff / ts->time_step;
7922302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7932302aa1bSDebojyoti Ghosh 
7942302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7952302aa1bSDebojyoti Ghosh   ierr   = SNESGetDM(snes,&dm);CHKERRQ(ierr);
7962302aa1bSDebojyoti Ghosh   ierr   = TSGLEEGetVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7972302aa1bSDebojyoti Ghosh   /* Set Ydot = shift*X */
7982302aa1bSDebojyoti Ghosh   ierr   = VecCopy(X,Ydot);CHKERRQ(ierr);
7992302aa1bSDebojyoti Ghosh   ierr   = VecScale(Ydot,shift);CHKERRQ(ierr);
8002302aa1bSDebojyoti Ghosh   dmsave = ts->dm;
8012302aa1bSDebojyoti Ghosh   ts->dm = dm;
8022302aa1bSDebojyoti Ghosh 
8032302aa1bSDebojyoti Ghosh   ierr = TSComputeIFunction(ts,glee->stage_time,X,Ydot,F,PETSC_FALSE);CHKERRQ(ierr);
8042302aa1bSDebojyoti Ghosh 
8052302aa1bSDebojyoti Ghosh   ts->dm = dmsave;
8062302aa1bSDebojyoti Ghosh   ierr   = TSGLEERestoreVecs(ts,dm,&Ydot);CHKERRQ(ierr);
8072302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8082302aa1bSDebojyoti Ghosh }
8092302aa1bSDebojyoti Ghosh 
8102302aa1bSDebojyoti Ghosh static PetscErrorCode SNESTSFormJacobian_GLEE(SNES snes,Vec X,Mat A,Mat B,TS ts)
8112302aa1bSDebojyoti Ghosh {
8122302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
8132302aa1bSDebojyoti Ghosh   DM             dm,dmsave;
8142302aa1bSDebojyoti Ghosh   Vec            Ydot;
8152302aa1bSDebojyoti Ghosh   PetscReal      shift = glee->scoeff / ts->time_step;
8162302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8172302aa1bSDebojyoti Ghosh 
8182302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8192302aa1bSDebojyoti Ghosh   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
8202302aa1bSDebojyoti Ghosh   ierr = TSGLEEGetVecs(ts,dm,&Ydot);CHKERRQ(ierr);
8212302aa1bSDebojyoti Ghosh   /* glee->Ydot has already been computed in SNESTSFormFunction_GLEE (SNES guarantees this) */
8222302aa1bSDebojyoti Ghosh   dmsave = ts->dm;
8232302aa1bSDebojyoti Ghosh   ts->dm = dm;
8242302aa1bSDebojyoti Ghosh 
8252302aa1bSDebojyoti Ghosh   ierr = TSComputeIJacobian(ts,glee->stage_time,X,Ydot,shift,A,B,PETSC_FALSE);CHKERRQ(ierr);
8262302aa1bSDebojyoti Ghosh 
8272302aa1bSDebojyoti Ghosh   ts->dm = dmsave;
8282302aa1bSDebojyoti Ghosh   ierr   = TSGLEERestoreVecs(ts,dm,&Ydot);CHKERRQ(ierr);
8292302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8302302aa1bSDebojyoti Ghosh }
8312302aa1bSDebojyoti Ghosh 
8322302aa1bSDebojyoti Ghosh static PetscErrorCode DMCoarsenHook_TSGLEE(DM fine,DM coarse,void *ctx)
8332302aa1bSDebojyoti Ghosh {
8342302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8352302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8362302aa1bSDebojyoti Ghosh }
8372302aa1bSDebojyoti Ghosh 
8382302aa1bSDebojyoti Ghosh static PetscErrorCode DMRestrictHook_TSGLEE(DM fine,Mat restrct,Vec rscale,Mat inject,DM coarse,void *ctx)
8392302aa1bSDebojyoti Ghosh {
8402302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8412302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8422302aa1bSDebojyoti Ghosh }
8432302aa1bSDebojyoti Ghosh 
8442302aa1bSDebojyoti Ghosh 
8452302aa1bSDebojyoti Ghosh static PetscErrorCode DMSubDomainHook_TSGLEE(DM dm,DM subdm,void *ctx)
8462302aa1bSDebojyoti Ghosh {
8472302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8482302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8492302aa1bSDebojyoti Ghosh }
8502302aa1bSDebojyoti Ghosh 
8512302aa1bSDebojyoti Ghosh static PetscErrorCode DMSubDomainRestrictHook_TSGLEE(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
8522302aa1bSDebojyoti Ghosh {
8532302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8542302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8552302aa1bSDebojyoti Ghosh }
8562302aa1bSDebojyoti Ghosh 
8572302aa1bSDebojyoti Ghosh static PetscErrorCode TSSetUp_GLEE(TS ts)
8582302aa1bSDebojyoti Ghosh {
8592302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
8602302aa1bSDebojyoti Ghosh   GLEETableau    tab;
8612302aa1bSDebojyoti Ghosh   PetscInt       s,r;
8622302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8632302aa1bSDebojyoti Ghosh   DM             dm;
8642302aa1bSDebojyoti Ghosh 
8652302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8662302aa1bSDebojyoti Ghosh   if (!glee->tableau) {
8672302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,TSGLEEDefaultType);CHKERRQ(ierr);
8682302aa1bSDebojyoti Ghosh   }
8692302aa1bSDebojyoti Ghosh   tab  = glee->tableau;
8702302aa1bSDebojyoti Ghosh   s    = tab->s;
8712302aa1bSDebojyoti Ghosh   r    = tab->r;
8722302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,r,&glee->Y);CHKERRQ(ierr);
8732302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,r,&glee->X);CHKERRQ(ierr);
8742302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,s,&glee->YStage);CHKERRQ(ierr);
8752302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,s,&glee->YdotStage);CHKERRQ(ierr);
8762302aa1bSDebojyoti Ghosh   ierr = VecDuplicate(ts->vec_sol,&glee->Ydot);CHKERRQ(ierr);
8770a01e1b2SEmil Constantinescu   ierr = VecDuplicate(ts->vec_sol,&glee->yGErr);CHKERRQ(ierr);
878657c1e31SEmil Constantinescu   ierr = VecZeroEntries(glee->yGErr);CHKERRQ(ierr);
8792302aa1bSDebojyoti Ghosh   ierr = VecDuplicate(ts->vec_sol,&glee->W);CHKERRQ(ierr);
880ec0e3ee2SEmil Constantinescu   ierr = PetscMalloc2(s,&glee->swork,r,&glee->rwork); CHKERRQ(ierr);
8812302aa1bSDebojyoti Ghosh   ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
8822302aa1bSDebojyoti Ghosh   if (dm) {
8832302aa1bSDebojyoti Ghosh     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_TSGLEE,DMRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
8842302aa1bSDebojyoti Ghosh     ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_TSGLEE,DMSubDomainRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
8852302aa1bSDebojyoti Ghosh   }
8862302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8872302aa1bSDebojyoti Ghosh }
8882302aa1bSDebojyoti Ghosh 
8892302aa1bSDebojyoti Ghosh PetscErrorCode TSStartingMethod_GLEE(TS ts)
8902302aa1bSDebojyoti Ghosh {
8912302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
8926e2e232bSDebojyoti Ghosh   GLEETableau    tab  = glee->tableau;
8936e2e232bSDebojyoti Ghosh   PetscInt       r=tab->r,i;
8946e2e232bSDebojyoti Ghosh   PetscReal      *S=tab->S;
8952302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8962302aa1bSDebojyoti Ghosh 
8972302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8982302aa1bSDebojyoti Ghosh   for (i=0; i<r; i++) {
8992302aa1bSDebojyoti Ghosh     ierr = VecZeroEntries(glee->Y[i]);CHKERRQ(ierr);
9002302aa1bSDebojyoti Ghosh     ierr = VecAXPY(glee->Y[i],S[i],ts->vec_sol);CHKERRQ(ierr);
9012302aa1bSDebojyoti Ghosh   }
9022302aa1bSDebojyoti Ghosh 
9032302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9042302aa1bSDebojyoti Ghosh }
9052302aa1bSDebojyoti Ghosh 
9062302aa1bSDebojyoti Ghosh 
9072302aa1bSDebojyoti Ghosh /*------------------------------------------------------------*/
9082302aa1bSDebojyoti Ghosh 
9096b234c65SEmil Constantinescu static PetscErrorCode TSSetFromOptions_GLEE(PetscOptionItems *PetscOptionsObject,TS ts)
9102302aa1bSDebojyoti Ghosh {
9112302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9122302aa1bSDebojyoti Ghosh   char           gleetype[256];
9132302aa1bSDebojyoti Ghosh 
9142302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9152302aa1bSDebojyoti Ghosh   ierr = PetscOptionsHead(PetscOptionsObject,"GLEE ODE solver options");CHKERRQ(ierr);
9162302aa1bSDebojyoti Ghosh   {
9172302aa1bSDebojyoti Ghosh     GLEETableauLink link;
9182302aa1bSDebojyoti Ghosh     PetscInt        count,choice;
9192302aa1bSDebojyoti Ghosh     PetscBool       flg;
9202302aa1bSDebojyoti Ghosh     const char      **namelist;
9212302aa1bSDebojyoti Ghosh 
9222302aa1bSDebojyoti Ghosh     ierr = PetscStrncpy(gleetype,TSGLEEDefaultType,sizeof(gleetype));CHKERRQ(ierr);
9232302aa1bSDebojyoti Ghosh     for (link=GLEETableauList,count=0; link; link=link->next,count++) ;
9242302aa1bSDebojyoti Ghosh     ierr = PetscMalloc1(count,&namelist);CHKERRQ(ierr);
9252302aa1bSDebojyoti Ghosh     for (link=GLEETableauList,count=0; link; link=link->next,count++) namelist[count] = link->tab.name;
9262302aa1bSDebojyoti Ghosh     ierr = PetscOptionsEList("-ts_glee_type","Family of GLEE method","TSGLEESetType",(const char*const*)namelist,count,gleetype,&choice,&flg);CHKERRQ(ierr);
9272302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,flg ? namelist[choice] : gleetype);CHKERRQ(ierr);
9282302aa1bSDebojyoti Ghosh     ierr = PetscFree(namelist);CHKERRQ(ierr);
9292302aa1bSDebojyoti Ghosh   }
9302302aa1bSDebojyoti Ghosh   ierr = PetscOptionsTail();CHKERRQ(ierr);
9312302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9322302aa1bSDebojyoti Ghosh }
9332302aa1bSDebojyoti Ghosh 
9342302aa1bSDebojyoti Ghosh static PetscErrorCode PetscFormatRealArray(char buf[],size_t len,const char *fmt,PetscInt n,const PetscReal x[])
9352302aa1bSDebojyoti Ghosh {
9362302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9372302aa1bSDebojyoti Ghosh   PetscInt       i;
9382302aa1bSDebojyoti Ghosh   size_t         left,count;
9392302aa1bSDebojyoti Ghosh   char           *p;
9402302aa1bSDebojyoti Ghosh 
9412302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9422302aa1bSDebojyoti Ghosh   for (i=0,p=buf,left=len; i<n; i++) {
9432302aa1bSDebojyoti Ghosh     ierr = PetscSNPrintfCount(p,left,fmt,&count,x[i]);CHKERRQ(ierr);
9442302aa1bSDebojyoti Ghosh     if (count >= left) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Insufficient space in buffer");
9452302aa1bSDebojyoti Ghosh     left -= count;
9462302aa1bSDebojyoti Ghosh     p    += count;
9472302aa1bSDebojyoti Ghosh     *p++  = ' ';
9482302aa1bSDebojyoti Ghosh   }
9492302aa1bSDebojyoti Ghosh   p[i ? 0 : -1] = 0;
9502302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9512302aa1bSDebojyoti Ghosh }
9522302aa1bSDebojyoti Ghosh 
9532302aa1bSDebojyoti Ghosh static PetscErrorCode TSView_GLEE(TS ts,PetscViewer viewer)
9542302aa1bSDebojyoti Ghosh {
9552302aa1bSDebojyoti Ghosh   TS_GLEE        *glee   = (TS_GLEE*)ts->data;
9562302aa1bSDebojyoti Ghosh   GLEETableau    tab  = glee->tableau;
9572302aa1bSDebojyoti Ghosh   PetscBool      iascii;
9582302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9592302aa1bSDebojyoti Ghosh 
9602302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9612302aa1bSDebojyoti Ghosh   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
9622302aa1bSDebojyoti Ghosh   if (iascii) {
9632302aa1bSDebojyoti Ghosh     TSGLEEType gleetype;
9642302aa1bSDebojyoti Ghosh     char   buf[512];
9652302aa1bSDebojyoti Ghosh     ierr = TSGLEEGetType(ts,&gleetype);CHKERRQ(ierr);
966*efd4aadfSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  GLEE type %s\n",gleetype);CHKERRQ(ierr);
9672302aa1bSDebojyoti Ghosh     ierr = PetscFormatRealArray(buf,sizeof(buf),"% 8.6f",tab->s,tab->c);CHKERRQ(ierr);
9682302aa1bSDebojyoti Ghosh     ierr = PetscViewerASCIIPrintf(viewer,"  Abscissa     c = %s\n",buf);CHKERRQ(ierr);
9692302aa1bSDebojyoti Ghosh     /* Note: print out r as well */
9702302aa1bSDebojyoti Ghosh   }
9712302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9722302aa1bSDebojyoti Ghosh }
9732302aa1bSDebojyoti Ghosh 
9742302aa1bSDebojyoti Ghosh static PetscErrorCode TSLoad_GLEE(TS ts,PetscViewer viewer)
9752302aa1bSDebojyoti Ghosh {
9762302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9772302aa1bSDebojyoti Ghosh   SNES           snes;
9782302aa1bSDebojyoti Ghosh   TSAdapt        tsadapt;
9792302aa1bSDebojyoti Ghosh 
9802302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9812302aa1bSDebojyoti Ghosh   ierr = TSGetAdapt(ts,&tsadapt);CHKERRQ(ierr);
9822302aa1bSDebojyoti Ghosh   ierr = TSAdaptLoad(tsadapt,viewer);CHKERRQ(ierr);
9832302aa1bSDebojyoti Ghosh   ierr = TSGetSNES(ts,&snes);CHKERRQ(ierr);
9842302aa1bSDebojyoti Ghosh   ierr = SNESLoad(snes,viewer);CHKERRQ(ierr);
9852302aa1bSDebojyoti Ghosh   /* function and Jacobian context for SNES when used with TS is always ts object */
9862302aa1bSDebojyoti Ghosh   ierr = SNESSetFunction(snes,NULL,NULL,ts);CHKERRQ(ierr);
9872302aa1bSDebojyoti Ghosh   ierr = SNESSetJacobian(snes,NULL,NULL,NULL,ts);CHKERRQ(ierr);
9882302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9892302aa1bSDebojyoti Ghosh }
9902302aa1bSDebojyoti Ghosh 
9912302aa1bSDebojyoti Ghosh /*@C
9922302aa1bSDebojyoti Ghosh   TSGLEESetType - Set the type of GLEE scheme
9932302aa1bSDebojyoti Ghosh 
9942302aa1bSDebojyoti Ghosh   Logically collective
9952302aa1bSDebojyoti Ghosh 
9962302aa1bSDebojyoti Ghosh   Input Parameter:
9972302aa1bSDebojyoti Ghosh +  ts - timestepping context
9982302aa1bSDebojyoti Ghosh -  gleetype - type of GLEE-scheme
9992302aa1bSDebojyoti Ghosh 
10002302aa1bSDebojyoti Ghosh   Level: intermediate
10012302aa1bSDebojyoti Ghosh 
10022302aa1bSDebojyoti Ghosh .seealso: TSGLEEGetType(), TSGLEE
10032302aa1bSDebojyoti Ghosh @*/
10042302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEESetType(TS ts,TSGLEEType gleetype)
10052302aa1bSDebojyoti Ghosh {
10062302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
10072302aa1bSDebojyoti Ghosh 
10082302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10092302aa1bSDebojyoti Ghosh   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1010b92453a8SLisandro Dalcin   PetscValidCharPointer(gleetype,2);
10112302aa1bSDebojyoti Ghosh   ierr = PetscTryMethod(ts,"TSGLEESetType_C",(TS,TSGLEEType),(ts,gleetype));CHKERRQ(ierr);
10122302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10132302aa1bSDebojyoti Ghosh }
10142302aa1bSDebojyoti Ghosh 
10152302aa1bSDebojyoti Ghosh /*@C
10162302aa1bSDebojyoti Ghosh   TSGLEEGetType - Get the type of GLEE scheme
10172302aa1bSDebojyoti Ghosh 
10182302aa1bSDebojyoti Ghosh   Logically collective
10192302aa1bSDebojyoti Ghosh 
10202302aa1bSDebojyoti Ghosh   Input Parameter:
10212302aa1bSDebojyoti Ghosh .  ts - timestepping context
10222302aa1bSDebojyoti Ghosh 
10232302aa1bSDebojyoti Ghosh   Output Parameter:
10242302aa1bSDebojyoti Ghosh .  gleetype - type of GLEE-scheme
10252302aa1bSDebojyoti Ghosh 
10262302aa1bSDebojyoti Ghosh   Level: intermediate
10272302aa1bSDebojyoti Ghosh 
10282302aa1bSDebojyoti Ghosh .seealso: TSGLEESetType()
10292302aa1bSDebojyoti Ghosh @*/
10302302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEGetType(TS ts,TSGLEEType *gleetype)
10312302aa1bSDebojyoti Ghosh {
10322302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
10332302aa1bSDebojyoti Ghosh 
10342302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10352302aa1bSDebojyoti Ghosh   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
10362302aa1bSDebojyoti Ghosh   ierr = PetscUseMethod(ts,"TSGLEEGetType_C",(TS,TSGLEEType*),(ts,gleetype));CHKERRQ(ierr);
10372302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10382302aa1bSDebojyoti Ghosh }
10392302aa1bSDebojyoti Ghosh 
10402302aa1bSDebojyoti Ghosh PetscErrorCode  TSGLEEGetType_GLEE(TS ts,TSGLEEType *gleetype)
10412302aa1bSDebojyoti Ghosh {
10422302aa1bSDebojyoti Ghosh   TS_GLEE     *glee = (TS_GLEE*)ts->data;
10432302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
10442302aa1bSDebojyoti Ghosh 
10452302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10462302aa1bSDebojyoti Ghosh   if (!glee->tableau) {
10472302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,TSGLEEDefaultType);CHKERRQ(ierr);
10482302aa1bSDebojyoti Ghosh   }
10492302aa1bSDebojyoti Ghosh   *gleetype = glee->tableau->name;
10502302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10512302aa1bSDebojyoti Ghosh }
10522302aa1bSDebojyoti Ghosh PetscErrorCode  TSGLEESetType_GLEE(TS ts,TSGLEEType gleetype)
10532302aa1bSDebojyoti Ghosh {
10542302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10552302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
10562302aa1bSDebojyoti Ghosh   PetscBool       match;
10572302aa1bSDebojyoti Ghosh   GLEETableauLink link;
10582302aa1bSDebojyoti Ghosh 
10592302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10602302aa1bSDebojyoti Ghosh   if (glee->tableau) {
10612302aa1bSDebojyoti Ghosh     ierr = PetscStrcmp(glee->tableau->name,gleetype,&match);CHKERRQ(ierr);
10622302aa1bSDebojyoti Ghosh     if (match) PetscFunctionReturn(0);
10632302aa1bSDebojyoti Ghosh   }
10642302aa1bSDebojyoti Ghosh   for (link = GLEETableauList; link; link=link->next) {
10652302aa1bSDebojyoti Ghosh     ierr = PetscStrcmp(link->tab.name,gleetype,&match);CHKERRQ(ierr);
10662302aa1bSDebojyoti Ghosh     if (match) {
10672302aa1bSDebojyoti Ghosh       ierr = TSReset_GLEE(ts);CHKERRQ(ierr);
10682302aa1bSDebojyoti Ghosh       glee->tableau = &link->tab;
10692302aa1bSDebojyoti Ghosh       PetscFunctionReturn(0);
10702302aa1bSDebojyoti Ghosh     }
10712302aa1bSDebojyoti Ghosh   }
10722302aa1bSDebojyoti Ghosh   SETERRQ1(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_UNKNOWN_TYPE,"Could not find '%s'",gleetype);
10732302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10742302aa1bSDebojyoti Ghosh }
10752302aa1bSDebojyoti Ghosh 
10762302aa1bSDebojyoti Ghosh static PetscErrorCode  TSGetStages_GLEE(TS ts,PetscInt *ns,Vec **Y)
10772302aa1bSDebojyoti Ghosh {
10782302aa1bSDebojyoti Ghosh   TS_GLEE *glee = (TS_GLEE*)ts->data;
10792302aa1bSDebojyoti Ghosh 
10802302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10812302aa1bSDebojyoti Ghosh   *ns = glee->tableau->s;
1082d5509560SEmil Constantinescu   if(Y) *Y  = glee->YStage;
10832302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10842302aa1bSDebojyoti Ghosh }
10852302aa1bSDebojyoti Ghosh 
1086b2bf4f3aSDebojyoti Ghosh PetscErrorCode TSGetSolutionComponents_GLEE(TS ts,PetscInt *n,Vec *Y)
10872302aa1bSDebojyoti Ghosh {
10882302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10892302aa1bSDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
10906e2e232bSDebojyoti Ghosh   PetscErrorCode  ierr;
10912302aa1bSDebojyoti Ghosh 
10922302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10934cdd57e5SDebojyoti Ghosh   if (!Y) *n = tab->r;
10942302aa1bSDebojyoti Ghosh   else {
10954cdd57e5SDebojyoti Ghosh     if ((*n >= 0) && (*n < tab->r)) {
10964cdd57e5SDebojyoti Ghosh       ierr = VecCopy(glee->Y[*n],*Y); CHKERRQ(ierr);
10979657682dSDebojyoti Ghosh     } else SETERRQ3(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_OUTOFRANGE,"Second argument (%d) out of range[%d,%d].",*n,0,tab->r-1);
10982302aa1bSDebojyoti Ghosh   }
10992302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
11002302aa1bSDebojyoti Ghosh }
11012302aa1bSDebojyoti Ghosh 
11024cdd57e5SDebojyoti Ghosh PetscErrorCode TSGetAuxSolution_GLEE(TS ts,Vec *X)
11034cdd57e5SDebojyoti Ghosh {
11044cdd57e5SDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
11054cdd57e5SDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
11064cdd57e5SDebojyoti Ghosh   PetscReal       *F    = tab->Fembed;
11074cdd57e5SDebojyoti Ghosh   PetscInt        r     = tab->r;
11084cdd57e5SDebojyoti Ghosh   Vec             *Y    = glee->Y;
1109ec0e3ee2SEmil Constantinescu   PetscScalar     *wr   = glee->rwork;
1110ec0e3ee2SEmil Constantinescu   PetscInt        i;
11114cdd57e5SDebojyoti Ghosh   PetscErrorCode  ierr;
11124cdd57e5SDebojyoti Ghosh 
11134cdd57e5SDebojyoti Ghosh   PetscFunctionBegin;
11144cdd57e5SDebojyoti Ghosh   ierr = VecZeroEntries(*X);CHKERRQ(ierr);
1115ec0e3ee2SEmil Constantinescu   for (i=0; i<r; i++) wr[i] = F[i];
1116ec0e3ee2SEmil Constantinescu   ierr = VecMAXPY((*X),r,wr,Y);CHKERRQ(ierr);
11174cdd57e5SDebojyoti Ghosh   PetscFunctionReturn(0);
11184cdd57e5SDebojyoti Ghosh }
11194cdd57e5SDebojyoti Ghosh 
11200a01e1b2SEmil Constantinescu PetscErrorCode TSGetTimeError_GLEE(TS ts,PetscInt n,Vec *X)
11214cdd57e5SDebojyoti Ghosh {
11224cdd57e5SDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
11234cdd57e5SDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
11244cdd57e5SDebojyoti Ghosh   PetscReal       *F    = tab->Ferror;
11254cdd57e5SDebojyoti Ghosh   PetscInt        r     = tab->r;
11264cdd57e5SDebojyoti Ghosh   Vec             *Y    = glee->Y;
1127ec0e3ee2SEmil Constantinescu   PetscScalar     *wr   = glee->rwork;
1128ec0e3ee2SEmil Constantinescu   PetscInt        i;
11294cdd57e5SDebojyoti Ghosh   PetscErrorCode  ierr;
11304cdd57e5SDebojyoti Ghosh 
11314cdd57e5SDebojyoti Ghosh   PetscFunctionBegin;
11324cdd57e5SDebojyoti Ghosh   ierr = VecZeroEntries(*X);CHKERRQ(ierr);
1133657c1e31SEmil Constantinescu   if(n==0){
1134ec0e3ee2SEmil Constantinescu     for (i=0; i<r; i++) wr[i] = F[i];
1135ec0e3ee2SEmil Constantinescu     ierr = VecMAXPY((*X),r,wr,Y);CHKERRQ(ierr);
11360a01e1b2SEmil Constantinescu   } else if(n==-1) {
1137657c1e31SEmil Constantinescu     *X=glee->yGErr;
11380a01e1b2SEmil Constantinescu   }
11394cdd57e5SDebojyoti Ghosh   PetscFunctionReturn(0);
11404cdd57e5SDebojyoti Ghosh }
11414cdd57e5SDebojyoti Ghosh 
114257df6a1bSDebojyoti Ghosh PetscErrorCode TSSetTimeError_GLEE(TS ts,Vec X)
114357df6a1bSDebojyoti Ghosh {
114457df6a1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
114557df6a1bSDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
114657df6a1bSDebojyoti Ghosh   PetscReal       *S    = tab->Serror;
114757df6a1bSDebojyoti Ghosh   PetscInt        r     = tab->r,i;
114857df6a1bSDebojyoti Ghosh   Vec             *Y    = glee->Y;
114957df6a1bSDebojyoti Ghosh   PetscErrorCode  ierr;
115057df6a1bSDebojyoti Ghosh 
115157df6a1bSDebojyoti Ghosh   PetscFunctionBegin;
11529657682dSDebojyoti Ghosh   if (r != 2) SETERRQ2(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"TSSetTimeError_GLEE not supported for '%s' with r=%D.",tab->name,tab->r);
115357df6a1bSDebojyoti Ghosh   for (i=1; i<r; i++) {
115457df6a1bSDebojyoti Ghosh     ierr = VecCopy(ts->vec_sol,Y[i]); CHKERRQ(ierr);
115557df6a1bSDebojyoti Ghosh     ierr = VecAXPBY(Y[i],S[0],S[1],X); CHKERRQ(ierr);
1156642ca4e8SEmil Constantinescu     ierr = VecCopy(X,glee->yGErr); CHKERRQ(ierr);
115757df6a1bSDebojyoti Ghosh   }
115857df6a1bSDebojyoti Ghosh   PetscFunctionReturn(0);
115957df6a1bSDebojyoti Ghosh }
116057df6a1bSDebojyoti Ghosh 
11612302aa1bSDebojyoti Ghosh /* ------------------------------------------------------------ */
11622302aa1bSDebojyoti Ghosh /*MC
11632302aa1bSDebojyoti Ghosh       TSGLEE - ODE and DAE solver using General Linear with Error Estimation schemes
11642302aa1bSDebojyoti Ghosh 
11652302aa1bSDebojyoti Ghosh   The user should provide the right hand side of the equation
11662302aa1bSDebojyoti Ghosh   using TSSetRHSFunction().
11672302aa1bSDebojyoti Ghosh 
11682302aa1bSDebojyoti Ghosh   Notes:
11692302aa1bSDebojyoti Ghosh   The default is TSGLEE35, it can be changed with TSGLEESetType() or -ts_glee_type
11702302aa1bSDebojyoti Ghosh 
11712302aa1bSDebojyoti Ghosh   Level: beginner
11722302aa1bSDebojyoti Ghosh 
11732302aa1bSDebojyoti Ghosh .seealso:  TSCreate(), TS, TSSetType(), TSGLEESetType(), TSGLEEGetType(),
11742302aa1bSDebojyoti Ghosh            TSGLEE23, TTSGLEE24, TSGLEE35, TSGLEE25I, TSGLEEEXRK2A,
11752302aa1bSDebojyoti Ghosh            TSGLEERK32G1, TSGLEERK285EX, TSGLEEType, TSGLEERegister()
11762302aa1bSDebojyoti Ghosh 
11772302aa1bSDebojyoti Ghosh M*/
11782302aa1bSDebojyoti Ghosh PETSC_EXTERN PetscErrorCode TSCreate_GLEE(TS ts)
11792302aa1bSDebojyoti Ghosh {
11802302aa1bSDebojyoti Ghosh   TS_GLEE         *th;
11812302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
11822302aa1bSDebojyoti Ghosh 
11832302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
11842302aa1bSDebojyoti Ghosh #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
11852302aa1bSDebojyoti Ghosh   ierr = TSGLEEInitializePackage();CHKERRQ(ierr);
11862302aa1bSDebojyoti Ghosh #endif
11872302aa1bSDebojyoti Ghosh 
11882302aa1bSDebojyoti Ghosh   ts->ops->reset                  = TSReset_GLEE;
11892302aa1bSDebojyoti Ghosh   ts->ops->destroy                = TSDestroy_GLEE;
11902302aa1bSDebojyoti Ghosh   ts->ops->view                   = TSView_GLEE;
11912302aa1bSDebojyoti Ghosh   ts->ops->load                   = TSLoad_GLEE;
11922302aa1bSDebojyoti Ghosh   ts->ops->setup                  = TSSetUp_GLEE;
11932302aa1bSDebojyoti Ghosh   ts->ops->step                   = TSStep_GLEE;
11942302aa1bSDebojyoti Ghosh   ts->ops->interpolate            = TSInterpolate_GLEE;
11952302aa1bSDebojyoti Ghosh   ts->ops->evaluatestep           = TSEvaluateStep_GLEE;
11962302aa1bSDebojyoti Ghosh   ts->ops->setfromoptions         = TSSetFromOptions_GLEE;
11972302aa1bSDebojyoti Ghosh   ts->ops->getstages              = TSGetStages_GLEE;
11982302aa1bSDebojyoti Ghosh   ts->ops->snesfunction           = SNESTSFormFunction_GLEE;
11992302aa1bSDebojyoti Ghosh   ts->ops->snesjacobian           = SNESTSFormJacobian_GLEE;
1200b2bf4f3aSDebojyoti Ghosh   ts->ops->getsolutioncomponents  = TSGetSolutionComponents_GLEE;
12014cdd57e5SDebojyoti Ghosh   ts->ops->getauxsolution         = TSGetAuxSolution_GLEE;
12024cdd57e5SDebojyoti Ghosh   ts->ops->gettimeerror           = TSGetTimeError_GLEE;
120357df6a1bSDebojyoti Ghosh   ts->ops->settimeerror           = TSSetTimeError_GLEE;
12042302aa1bSDebojyoti Ghosh   ts->ops->startingmethod         = TSStartingMethod_GLEE;
1205b80d5313SLisandro Dalcin   ts->default_adapt_type          = TSADAPTGLEE;
12062302aa1bSDebojyoti Ghosh 
1207*efd4aadfSBarry Smith   ts->usessnes = PETSC_TRUE;
1208*efd4aadfSBarry Smith 
12092302aa1bSDebojyoti Ghosh   ierr = PetscNewLog(ts,&th);CHKERRQ(ierr);
12102302aa1bSDebojyoti Ghosh   ts->data = (void*)th;
12112302aa1bSDebojyoti Ghosh 
12122302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEEGetType_C",TSGLEEGetType_GLEE);CHKERRQ(ierr);
12132302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEESetType_C",TSGLEESetType_GLEE);CHKERRQ(ierr);
12142302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
12152302aa1bSDebojyoti Ghosh }
1216