xref: /petsc/src/ts/impls/glee/glee.c (revision 6e2e232b796ca97c80a46af38996e334030786f4)
12302aa1bSDebojyoti Ghosh /*
22302aa1bSDebojyoti Ghosh   Code for time stepping with the General Linear with Error Estimation method
32302aa1bSDebojyoti Ghosh 
42302aa1bSDebojyoti Ghosh   Notes:
52302aa1bSDebojyoti Ghosh   The general system is written as
62302aa1bSDebojyoti Ghosh 
72302aa1bSDebojyoti Ghosh   Udot = F(t,U)
82302aa1bSDebojyoti Ghosh 
92302aa1bSDebojyoti Ghosh */
102302aa1bSDebojyoti Ghosh #include <petsc/private/tsimpl.h>                /*I   "petscts.h"   I*/
112302aa1bSDebojyoti Ghosh #include <petscdm.h>
122302aa1bSDebojyoti Ghosh 
132302aa1bSDebojyoti Ghosh static TSGLEEType   TSGLEEDefaultType = TSGLEE35;
142302aa1bSDebojyoti Ghosh static PetscBool    TSGLEERegisterAllCalled;
152302aa1bSDebojyoti Ghosh static PetscBool    TSGLEEPackageInitialized;
162302aa1bSDebojyoti Ghosh static PetscInt     explicit_stage_time_id;
172302aa1bSDebojyoti Ghosh 
182302aa1bSDebojyoti Ghosh typedef struct _GLEETableau *GLEETableau;
192302aa1bSDebojyoti Ghosh struct _GLEETableau {
202302aa1bSDebojyoti Ghosh   char      *name;
212302aa1bSDebojyoti Ghosh   PetscInt   order;               /* Classical approximation order of the method i*/
222302aa1bSDebojyoti Ghosh   PetscInt   s;                   /* Number of stages */
232302aa1bSDebojyoti Ghosh   PetscInt   r;                   /* Number of steps */
242302aa1bSDebojyoti Ghosh   PetscReal  gamma;               /* LTE ratio */
252302aa1bSDebojyoti Ghosh   PetscReal *A,*B,*U,*V,*S,*F,*c; /* Tableau */
262302aa1bSDebojyoti Ghosh   PetscReal *Fembed;              /* Embedded final method coefficients */
272302aa1bSDebojyoti Ghosh   PetscInt   pinterp;             /* Interpolation order */
282302aa1bSDebojyoti Ghosh   PetscReal *binterp;             /* Interpolation coefficients */
292302aa1bSDebojyoti Ghosh   PetscReal  ccfl;                /* Placeholder for CFL coefficient relative to forward Euler  */
302302aa1bSDebojyoti Ghosh };
312302aa1bSDebojyoti Ghosh typedef struct _GLEETableauLink *GLEETableauLink;
322302aa1bSDebojyoti Ghosh struct _GLEETableauLink {
332302aa1bSDebojyoti Ghosh   struct _GLEETableau tab;
342302aa1bSDebojyoti Ghosh   GLEETableauLink     next;
352302aa1bSDebojyoti Ghosh };
362302aa1bSDebojyoti Ghosh static GLEETableauLink GLEETableauList;
372302aa1bSDebojyoti Ghosh 
382302aa1bSDebojyoti Ghosh typedef struct {
392302aa1bSDebojyoti Ghosh   GLEETableau  tableau;
402302aa1bSDebojyoti Ghosh   Vec          *Y;         /* Solution vector (along with auxiliary solution y~ or eps) */
412302aa1bSDebojyoti Ghosh   Vec          *X;         /* Temporary solution vector */
422302aa1bSDebojyoti Ghosh   Vec          *YStage;    /* Stage values */
432302aa1bSDebojyoti Ghosh   Vec          *YdotStage; /* Stage right hand side */
442302aa1bSDebojyoti Ghosh   Vec          W;          /* Right-hand-side for implicit stage solve */
452302aa1bSDebojyoti Ghosh   Vec          Ydot;       /* Work vector holding Ydot during residual evaluation */
462302aa1bSDebojyoti Ghosh   PetscScalar  *work;      /* Scalar work */
472302aa1bSDebojyoti Ghosh   PetscReal    scoeff;     /* shift = scoeff/dt */
482302aa1bSDebojyoti Ghosh   PetscReal    stage_time;
492302aa1bSDebojyoti Ghosh   TSStepStatus status;
502302aa1bSDebojyoti Ghosh } TS_GLEE;
512302aa1bSDebojyoti Ghosh 
522302aa1bSDebojyoti Ghosh /*MC
532302aa1bSDebojyoti Ghosh      TSGLEE23 - Second order three stage GLEE method
542302aa1bSDebojyoti Ghosh 
552302aa1bSDebojyoti Ghosh      This method has three stages.
562302aa1bSDebojyoti Ghosh      s = 3, r = 2
572302aa1bSDebojyoti Ghosh 
582302aa1bSDebojyoti Ghosh      Level: advanced
592302aa1bSDebojyoti Ghosh 
602302aa1bSDebojyoti Ghosh .seealso: TSGLEE
612302aa1bSDebojyoti Ghosh */
622302aa1bSDebojyoti Ghosh /*MC
632302aa1bSDebojyoti Ghosh      TSGLEE24 - Second order four stage GLEE method
642302aa1bSDebojyoti Ghosh 
652302aa1bSDebojyoti Ghosh      This method has four stages.
662302aa1bSDebojyoti Ghosh      s = 4, r = 2
672302aa1bSDebojyoti Ghosh 
682302aa1bSDebojyoti Ghosh      Level: advanced
692302aa1bSDebojyoti Ghosh 
702302aa1bSDebojyoti Ghosh .seealso: TSGLEE
712302aa1bSDebojyoti Ghosh */
722302aa1bSDebojyoti Ghosh /*MC
732302aa1bSDebojyoti Ghosh      TSGLEE25i - Second order five stage GLEE method
742302aa1bSDebojyoti Ghosh 
752302aa1bSDebojyoti Ghosh      This method has five stages.
762302aa1bSDebojyoti Ghosh      s = 5, r = 2
772302aa1bSDebojyoti Ghosh 
782302aa1bSDebojyoti Ghosh      Level: advanced
792302aa1bSDebojyoti Ghosh 
802302aa1bSDebojyoti Ghosh .seealso: TSGLEE
812302aa1bSDebojyoti Ghosh */
822302aa1bSDebojyoti Ghosh /*MC
832302aa1bSDebojyoti Ghosh      TSGLEE35  - Third order five stage GLEE method
842302aa1bSDebojyoti Ghosh 
852302aa1bSDebojyoti Ghosh      This method has five stages.
862302aa1bSDebojyoti Ghosh      s = 5, r = 2
872302aa1bSDebojyoti Ghosh 
882302aa1bSDebojyoti Ghosh      Level: advanced
892302aa1bSDebojyoti Ghosh 
902302aa1bSDebojyoti Ghosh .seealso: TSGLEE
912302aa1bSDebojyoti Ghosh */
922302aa1bSDebojyoti Ghosh /*MC
932302aa1bSDebojyoti Ghosh      TSGLEEEXRK2A  - Second order six stage GLEE method
942302aa1bSDebojyoti Ghosh 
952302aa1bSDebojyoti Ghosh      This method has six stages.
962302aa1bSDebojyoti Ghosh      s = 6, r = 2
972302aa1bSDebojyoti Ghosh 
982302aa1bSDebojyoti Ghosh      Level: advanced
992302aa1bSDebojyoti Ghosh 
1002302aa1bSDebojyoti Ghosh .seealso: TSGLEE
1012302aa1bSDebojyoti Ghosh */
1022302aa1bSDebojyoti Ghosh /*MC
1032302aa1bSDebojyoti Ghosh      TSGLEERK32G1  - Third order eight stage GLEE method
1042302aa1bSDebojyoti Ghosh 
1052302aa1bSDebojyoti Ghosh      This method has eight stages.
1062302aa1bSDebojyoti Ghosh      s = 8, r = 2
1072302aa1bSDebojyoti Ghosh 
1082302aa1bSDebojyoti Ghosh      Level: advanced
1092302aa1bSDebojyoti Ghosh 
1102302aa1bSDebojyoti Ghosh .seealso: TSGLEE
1112302aa1bSDebojyoti Ghosh */
1122302aa1bSDebojyoti Ghosh /*MC
1132302aa1bSDebojyoti Ghosh      TSGLEERK285EX  - Second order nine stage GLEE method
1142302aa1bSDebojyoti Ghosh 
1152302aa1bSDebojyoti Ghosh      This method has nine stages.
1162302aa1bSDebojyoti Ghosh      s = 9, r = 2
1172302aa1bSDebojyoti Ghosh 
1182302aa1bSDebojyoti Ghosh      Level: advanced
1192302aa1bSDebojyoti Ghosh 
1202302aa1bSDebojyoti Ghosh .seealso: TSGLEE
1212302aa1bSDebojyoti Ghosh */
1222302aa1bSDebojyoti Ghosh 
1232302aa1bSDebojyoti Ghosh #undef __FUNCT__
1242302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEERegisterAll"
1252302aa1bSDebojyoti Ghosh /*@C
1262302aa1bSDebojyoti Ghosh   TSGLEERegisterAll - Registers all of the General Linear with Error Estimation methods in TSGLEE
1272302aa1bSDebojyoti Ghosh 
1282302aa1bSDebojyoti Ghosh   Not Collective, but should be called by all processes which will need the schemes to be registered
1292302aa1bSDebojyoti Ghosh 
1302302aa1bSDebojyoti Ghosh   Level: advanced
1312302aa1bSDebojyoti Ghosh 
1322302aa1bSDebojyoti Ghosh .keywords: TS, TSGLEE, register, all
1332302aa1bSDebojyoti Ghosh 
1342302aa1bSDebojyoti Ghosh .seealso:  TSGLEERegisterDestroy()
1352302aa1bSDebojyoti Ghosh @*/
1362302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegisterAll(void)
1372302aa1bSDebojyoti Ghosh {
1382302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
1392302aa1bSDebojyoti Ghosh 
1402302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
1412302aa1bSDebojyoti Ghosh   if (TSGLEERegisterAllCalled) PetscFunctionReturn(0);
1422302aa1bSDebojyoti Ghosh   TSGLEERegisterAllCalled = PETSC_TRUE;
1432302aa1bSDebojyoti Ghosh 
1442302aa1bSDebojyoti Ghosh   {
1452302aa1bSDebojyoti Ghosh     /* y-eps form */
1462302aa1bSDebojyoti Ghosh     const PetscInt
1472302aa1bSDebojyoti Ghosh       p = 2,
1482302aa1bSDebojyoti Ghosh       s = 3,
1492302aa1bSDebojyoti Ghosh       r = 2;
1502302aa1bSDebojyoti Ghosh     const PetscReal
1512302aa1bSDebojyoti Ghosh       gamma     = 0,
1522302aa1bSDebojyoti Ghosh       A[3][3]   = {{0,0,0},{1,0,0},{0.25,0.25,0}},
1532302aa1bSDebojyoti 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}},
1542302aa1bSDebojyoti Ghosh       U[3][2]   = {{1,0},{1,10},{1,-1}},
1552302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
1562302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
1572302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
1582302aa1bSDebojyoti Ghosh       Fembed[2] = {1,1};
1592302aa1bSDebojyoti Ghosh     ierr = TSGLEERegister(TSGLEE23,p,s,r,gamma,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,0,NULL);CHKERRQ(ierr);
1602302aa1bSDebojyoti Ghosh   }
1612302aa1bSDebojyoti Ghosh   {
1622302aa1bSDebojyoti Ghosh     /* y-y~ form */
1632302aa1bSDebojyoti Ghosh     const PetscInt
1642302aa1bSDebojyoti Ghosh       p = 2,
1652302aa1bSDebojyoti Ghosh       s = 4,
1662302aa1bSDebojyoti Ghosh       r = 2;
1672302aa1bSDebojyoti Ghosh     const PetscReal
1682302aa1bSDebojyoti Ghosh       gamma     = 0,
1692302aa1bSDebojyoti 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}},
1702302aa1bSDebojyoti 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}},
1712302aa1bSDebojyoti Ghosh       U[4][2]   = {{0,1},{75.0/58.0,-17.0/58.0},{0,1},{0,1}},
1722302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
1732302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
1742302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
1752302aa1bSDebojyoti Ghosh       Fembed[2] = {0,1};
1762302aa1bSDebojyoti Ghosh       ierr = TSGLEERegister(TSGLEE24,p,s,r,gamma,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,0,NULL);CHKERRQ(ierr);
1772302aa1bSDebojyoti Ghosh   }
1782302aa1bSDebojyoti Ghosh   {
1792302aa1bSDebojyoti Ghosh     /* y-y~ form */
1802302aa1bSDebojyoti Ghosh     const PetscInt
1812302aa1bSDebojyoti Ghosh       p = 2,
1822302aa1bSDebojyoti Ghosh       s = 5,
1832302aa1bSDebojyoti Ghosh       r = 2;
1842302aa1bSDebojyoti Ghosh     const PetscReal
1852302aa1bSDebojyoti Ghosh       gamma     = 0,
1862302aa1bSDebojyoti Ghosh       A[5][5]   = {{0,0,0,0,0},
1872302aa1bSDebojyoti Ghosh                    {-0.94079244066783383269,0,0,0,0},
1882302aa1bSDebojyoti Ghosh                    {0.64228187778301907108,0.10915356933958500042,0,0,0},
1892302aa1bSDebojyoti Ghosh                    {-0.51764297742287450812,0.74414270351096040738,-0.71404164927824538121,0,0},
1902302aa1bSDebojyoti Ghosh                    {-0.44696561556825969206,-0.76768425657590196518,0.20111608138142987881,0.93828186737840469796,0}},
1912302aa1bSDebojyoti Ghosh       B[2][5]   = {{-0.029309178948150356153,-0.49671981884013874923,0.34275801517650053274,0.32941112623949194988,0.85385985637229662276},
1922302aa1bSDebojyoti Ghosh                    {0.78133219686062535272,0.074238691892675897635,0.57957363498384957966,-0.24638502829674959968,-0.18875949544040123033}},
1932302aa1bSDebojyoti Ghosh       U[5][2]   = {{0.16911424754448327735,0.83088575245551672265},
1942302aa1bSDebojyoti Ghosh                    {0.53638465733199574340,0.46361534266800425660},
1952302aa1bSDebojyoti Ghosh                    {0.39901579167169582526,0.60098420832830417474},
1962302aa1bSDebojyoti Ghosh                    {0.87689005530618575480,0.12310994469381424520},
1972302aa1bSDebojyoti Ghosh                    {0.99056100455550913009,0.0094389954444908699092}},
1982302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
1992302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2002302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
2012302aa1bSDebojyoti Ghosh       Fembed[2] = {0,1};
2022302aa1bSDebojyoti Ghosh     ierr = TSGLEERegister(TSGLEE25I,p,s,r,gamma,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,0,NULL);CHKERRQ(ierr);
2032302aa1bSDebojyoti Ghosh   }
2042302aa1bSDebojyoti Ghosh   {
2052302aa1bSDebojyoti Ghosh     /* y-y~ form */
2062302aa1bSDebojyoti Ghosh     const PetscInt
2072302aa1bSDebojyoti Ghosh       p = 3,
2082302aa1bSDebojyoti Ghosh       s = 5,
2092302aa1bSDebojyoti Ghosh       r = 2;
2102302aa1bSDebojyoti Ghosh     const PetscReal
2112302aa1bSDebojyoti Ghosh       gamma     = 0,
2122302aa1bSDebojyoti Ghosh       A[5][5]   = {{0,0,0,0,0},
2132302aa1bSDebojyoti Ghosh                    {- 2169604947363702313.0 /  24313474998937147335.0,0,0,0,0},
2142302aa1bSDebojyoti Ghosh                    {46526746497697123895.0 /  94116917485856474137.0,-10297879244026594958.0 /  49199457603717988219.0,0,0,0},
2152302aa1bSDebojyoti Ghosh                    {23364788935845982499.0 /  87425311444725389446.0,-79205144337496116638.0 / 148994349441340815519.0,40051189859317443782.0 /  36487615018004984309.0,0,0},
2162302aa1bSDebojyoti Ghosh                    {42089522664062539205.0 / 124911313006412840286.0,-15074384760342762939.0 / 137927286865289746282.0,-62274678522253371016.0 / 125918573676298591413.0,13755475729852471739.0 /  79257927066651693390.0}},
2172302aa1bSDebojyoti Ghosh       B[2][5]   = {{61546696837458703723.0 /  56982519523786160813.0,-55810892792806293355.0 / 206957624151308356511.0,24061048952676379087.0 / 158739347956038723465.0,3577972206874351339.0 /   7599733370677197135.0,-59449832954780563947.0 / 137360038685338563670.0},
2182302aa1bSDebojyoti Ghosh                    {- 9738262186984159168.0 /  99299082461487742983.0,-32797097931948613195.0 /  61521565616362163366.0,42895514606418420631.0 /  71714201188501437336.0,22608567633166065068.0 /  55371917805607957003.0,94655809487476459565.0 / 151517167160302729021.0}},
2192302aa1bSDebojyoti Ghosh       U[5][2]   = {{70820309139834661559.0 /  80863923579509469826.0,10043614439674808267.0 /  80863923579509469826.0},
2202302aa1bSDebojyoti Ghosh                    {161694774978034105510.0 / 106187653640211060371.0,-55507121337823045139.0 / 106187653640211060371.0},
2212302aa1bSDebojyoti Ghosh                    {78486094644566264568.0 /  88171030896733822981.0,9684936252167558413.0 /  88171030896733822981.0},
2222302aa1bSDebojyoti Ghosh                    {65394922146334854435.0 /  84570853840405479554.0,19175931694070625119.0 /  84570853840405479554.0},
2232302aa1bSDebojyoti Ghosh                    {8607282770183754108.0 / 108658046436496925911.0,100050763666313171803.0 / 108658046436496925911.0}},
2242302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2252302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2262302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
2272302aa1bSDebojyoti Ghosh       Fembed[2] = {0,1};
2282302aa1bSDebojyoti Ghosh     ierr = TSGLEERegister(TSGLEE35,p,s,r,gamma,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,0,NULL);CHKERRQ(ierr);
2292302aa1bSDebojyoti Ghosh   }
2302302aa1bSDebojyoti Ghosh   {
2312302aa1bSDebojyoti Ghosh     /* y-eps form */
2322302aa1bSDebojyoti Ghosh     const PetscInt
2332302aa1bSDebojyoti Ghosh       p = 2,
2342302aa1bSDebojyoti Ghosh       s = 6,
2352302aa1bSDebojyoti Ghosh       r = 2;
2362302aa1bSDebojyoti Ghosh     const PetscReal
2372302aa1bSDebojyoti Ghosh       gamma     = 0.25,
2382302aa1bSDebojyoti Ghosh       A[6][6]   = {{0,0,0,0,0,0},
2392302aa1bSDebojyoti Ghosh                    {1,0,0,0,0,0},
2402302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0},
2412302aa1bSDebojyoti Ghosh                    {0,0,0.5,0,0,0},
2422302aa1bSDebojyoti Ghosh                    {0,0,0.25,0.25,0,0},
2432302aa1bSDebojyoti Ghosh                    {0,0,0.25,0.25,0.5,0}},
2442302aa1bSDebojyoti Ghosh       B[2][6]   = {{0.5,0.5,0,0,0,0},
2452302aa1bSDebojyoti 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}},
2462302aa1bSDebojyoti Ghosh       U[6][2]   = {{1,0},{1,0},{1,0.75},{1,0.75},{1,0.75},{1,0.75}},
2472302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2482302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
2492302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
2502302aa1bSDebojyoti Ghosh       Fembed[2] = {1,0.75};
2512302aa1bSDebojyoti Ghosh     ierr = TSGLEERegister(TSGLEEEXRK2A,p,s,r,gamma,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,0,NULL);CHKERRQ(ierr);
2522302aa1bSDebojyoti Ghosh   }
2532302aa1bSDebojyoti Ghosh   {
2542302aa1bSDebojyoti Ghosh     /* y-eps form */
2552302aa1bSDebojyoti Ghosh     const PetscInt
2562302aa1bSDebojyoti Ghosh       p = 3,
2572302aa1bSDebojyoti Ghosh       s = 8,
2582302aa1bSDebojyoti Ghosh       r = 2;
2592302aa1bSDebojyoti Ghosh     const PetscReal
2602302aa1bSDebojyoti Ghosh       gamma     = 0,
2612302aa1bSDebojyoti Ghosh       A[8][8]   = {{0,0,0,0,0,0,0,0},
2622302aa1bSDebojyoti Ghosh                    {0.5,0,0,0,0,0,0,0},
2632302aa1bSDebojyoti Ghosh                    {-1,2,0,0,0,0,0,0},
2642302aa1bSDebojyoti Ghosh                    {1.0/6.0,2.0/3.0,1.0/6.0,0,0,0,0,0},
2652302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0,0,0},
2662302aa1bSDebojyoti Ghosh                    {-7.0/24.0,1.0/3.0,1.0/12.0,-1.0/8.0,0.5,0,0,0},
2672302aa1bSDebojyoti Ghosh                    {7.0/6.0,-4.0/3.0,-1.0/3.0,0.5,-1.0,2.0,0,0},
2682302aa1bSDebojyoti Ghosh                    {0,0,0,0,1.0/6.0,2.0/3.0,1.0/6.0,0}},
2692302aa1bSDebojyoti Ghosh       B[2][8]   = {{1.0/6.0,2.0/3.0,1.0/6.0,0,0,0,0,0},
2702302aa1bSDebojyoti 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}},
2712302aa1bSDebojyoti Ghosh       U[8][2]   = {{1,0},{1,0},{1,0},{1,0},{1,1},{1,1},{1,1},{1,1}},
2722302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2732302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
2742302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
2752302aa1bSDebojyoti Ghosh       Fembed[2] = {1,1};
2762302aa1bSDebojyoti Ghosh     ierr = TSGLEERegister(TSGLEERK32G1,p,s,r,gamma,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,0,NULL);CHKERRQ(ierr);
2772302aa1bSDebojyoti Ghosh   }
2782302aa1bSDebojyoti Ghosh   {
2792302aa1bSDebojyoti Ghosh     /* y-eps form */
2802302aa1bSDebojyoti Ghosh     const PetscInt
2812302aa1bSDebojyoti Ghosh       p = 2,
2822302aa1bSDebojyoti Ghosh       s = 9,
2832302aa1bSDebojyoti Ghosh       r = 2;
2842302aa1bSDebojyoti Ghosh     const PetscReal
2852302aa1bSDebojyoti Ghosh       gamma     = 0.25,
2862302aa1bSDebojyoti Ghosh       A[9][9]   = {{0,0,0,0,0,0,0,0,0},
2872302aa1bSDebojyoti Ghosh                    {0.585786437626904966,0,0,0,0,0,0,0,0},
2882302aa1bSDebojyoti Ghosh                    {0.149999999999999994,0.849999999999999978,0,0,0,0,0,0,0},
2892302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0,0,0,0},
2902302aa1bSDebojyoti Ghosh                    {0,0,0,0.292893218813452483,0,0,0,0,0},
2912302aa1bSDebojyoti Ghosh                    {0,0,0,0.0749999999999999972,0.424999999999999989,0,0,0,0},
2922302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0,0,0},
2932302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0.292893218813452483,0,0},
2942302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0.0749999999999999972,0.424999999999999989,0}},
2952302aa1bSDebojyoti Ghosh       B[2][9]   = {{0.353553390593273786,0.353553390593273786,0.292893218813452483,0,0,0,0,0,0},
2962302aa1bSDebojyoti Ghosh                    {-0.471404520791031678,-0.471404520791031678,-0.390524291751269959,0.235702260395515839,0.235702260395515839,0.195262145875634979,0.235702260395515839,0.235702260395515839,0.195262145875634979}},
2972302aa1bSDebojyoti 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}},
2982302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2992302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
3002302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
3012302aa1bSDebojyoti Ghosh       Fembed[2] = {1,0.75};
3022302aa1bSDebojyoti Ghosh     ierr = TSGLEERegister(TSGLEERK285EX,p,s,r,gamma,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,0,NULL);CHKERRQ(ierr);
3032302aa1bSDebojyoti Ghosh   }
3042302aa1bSDebojyoti Ghosh 
3052302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3062302aa1bSDebojyoti Ghosh }
3072302aa1bSDebojyoti Ghosh 
3082302aa1bSDebojyoti Ghosh #undef __FUNCT__
3092302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEERegisterDestroy"
3102302aa1bSDebojyoti Ghosh /*@C
3112302aa1bSDebojyoti Ghosh    TSGLEERegisterDestroy - Frees the list of schemes that were registered by TSGLEERegister().
3122302aa1bSDebojyoti Ghosh 
3132302aa1bSDebojyoti Ghosh    Not Collective
3142302aa1bSDebojyoti Ghosh 
3152302aa1bSDebojyoti Ghosh    Level: advanced
3162302aa1bSDebojyoti Ghosh 
3172302aa1bSDebojyoti Ghosh .keywords: TSGLEE, register, destroy
3182302aa1bSDebojyoti Ghosh .seealso: TSGLEERegister(), TSGLEERegisterAll()
3192302aa1bSDebojyoti Ghosh @*/
3202302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegisterDestroy(void)
3212302aa1bSDebojyoti Ghosh {
3222302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
3232302aa1bSDebojyoti Ghosh   GLEETableauLink link;
3242302aa1bSDebojyoti Ghosh 
3252302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
3262302aa1bSDebojyoti Ghosh   while ((link = GLEETableauList)) {
3272302aa1bSDebojyoti Ghosh     GLEETableau t = &link->tab;
3282302aa1bSDebojyoti Ghosh     GLEETableauList = link->next;
3292302aa1bSDebojyoti Ghosh     ierr = PetscFree5(t->A,t->B,t->U,t->V,t->c);  CHKERRQ(ierr);
3302302aa1bSDebojyoti Ghosh     ierr = PetscFree2(t->S,t->F);                 CHKERRQ(ierr);
3312302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->Fembed);                 CHKERRQ(ierr);
3322302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->binterp);                CHKERRQ(ierr);
3332302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->name);                   CHKERRQ(ierr);
3342302aa1bSDebojyoti Ghosh     ierr = PetscFree (link);                      CHKERRQ(ierr);
3352302aa1bSDebojyoti Ghosh   }
3362302aa1bSDebojyoti Ghosh   TSGLEERegisterAllCalled = PETSC_FALSE;
3372302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3382302aa1bSDebojyoti Ghosh }
3392302aa1bSDebojyoti Ghosh 
3402302aa1bSDebojyoti Ghosh #undef __FUNCT__
3412302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEEInitializePackage"
3422302aa1bSDebojyoti Ghosh /*@C
3432302aa1bSDebojyoti Ghosh   TSGLEEInitializePackage - This function initializes everything in the TSGLEE package. It is called
3442302aa1bSDebojyoti Ghosh   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to TSCreate_GLEE()
3452302aa1bSDebojyoti Ghosh   when using static libraries.
3462302aa1bSDebojyoti Ghosh 
3472302aa1bSDebojyoti Ghosh   Level: developer
3482302aa1bSDebojyoti Ghosh 
3492302aa1bSDebojyoti Ghosh .keywords: TS, TSGLEE, initialize, package
3502302aa1bSDebojyoti Ghosh .seealso: PetscInitialize()
3512302aa1bSDebojyoti Ghosh @*/
3522302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEInitializePackage(void)
3532302aa1bSDebojyoti Ghosh {
3542302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
3552302aa1bSDebojyoti Ghosh 
3562302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
3572302aa1bSDebojyoti Ghosh   if (TSGLEEPackageInitialized) PetscFunctionReturn(0);
3582302aa1bSDebojyoti Ghosh   TSGLEEPackageInitialized = PETSC_TRUE;
3592302aa1bSDebojyoti Ghosh   ierr = TSGLEERegisterAll();CHKERRQ(ierr);
3602302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposedDataRegister(&explicit_stage_time_id);CHKERRQ(ierr);
3612302aa1bSDebojyoti Ghosh   ierr = PetscRegisterFinalize(TSGLEEFinalizePackage);CHKERRQ(ierr);
3622302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3632302aa1bSDebojyoti Ghosh }
3642302aa1bSDebojyoti Ghosh 
3652302aa1bSDebojyoti Ghosh #undef __FUNCT__
3662302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEEFinalizePackage"
3672302aa1bSDebojyoti Ghosh /*@C
3682302aa1bSDebojyoti Ghosh   TSGLEEFinalizePackage - This function destroys everything in the TSGLEE package. It is
3692302aa1bSDebojyoti Ghosh   called from PetscFinalize().
3702302aa1bSDebojyoti Ghosh 
3712302aa1bSDebojyoti Ghosh   Level: developer
3722302aa1bSDebojyoti Ghosh 
3732302aa1bSDebojyoti Ghosh .keywords: Petsc, destroy, package
3742302aa1bSDebojyoti Ghosh .seealso: PetscFinalize()
3752302aa1bSDebojyoti Ghosh @*/
3762302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEFinalizePackage(void)
3772302aa1bSDebojyoti Ghosh {
3782302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
3792302aa1bSDebojyoti Ghosh 
3802302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
3812302aa1bSDebojyoti Ghosh   TSGLEEPackageInitialized = PETSC_FALSE;
3822302aa1bSDebojyoti Ghosh   ierr = TSGLEERegisterDestroy();CHKERRQ(ierr);
3832302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3842302aa1bSDebojyoti Ghosh }
3852302aa1bSDebojyoti Ghosh 
3862302aa1bSDebojyoti Ghosh #undef __FUNCT__
3872302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEERegister"
3882302aa1bSDebojyoti Ghosh /*@C
3892302aa1bSDebojyoti Ghosh    TSGLEERegister - register an GLEE scheme by providing the entries in the Butcher tableau
3902302aa1bSDebojyoti Ghosh 
3912302aa1bSDebojyoti Ghosh    Not Collective, but the same schemes should be registered on all processes on which they will be used
3922302aa1bSDebojyoti Ghosh 
3932302aa1bSDebojyoti Ghosh    Input Parameters:
3942302aa1bSDebojyoti Ghosh +  name   - identifier for method
3952302aa1bSDebojyoti Ghosh .  order  - order of method
3962302aa1bSDebojyoti Ghosh .  s - number of stages
3972302aa1bSDebojyoti Ghosh .  r - number of steps
3982302aa1bSDebojyoti Ghosh .  gamma - LTE ratio
3992302aa1bSDebojyoti Ghosh .  A - stage coefficients (dimension s*s, row-major)
4002302aa1bSDebojyoti Ghosh .  B - step completion coefficients (dimension r*s, row-major)
4012302aa1bSDebojyoti Ghosh .  U - method coefficients (dimension s*r, row-major)
4022302aa1bSDebojyoti Ghosh .  V - method coefficients (dimension r*r, row-major)
4032302aa1bSDebojyoti Ghosh .  S - starting coefficients
4042302aa1bSDebojyoti Ghosh .  F - finishing coefficients
4052302aa1bSDebojyoti Ghosh .  c - abscissa (dimension s; NULL to use row sums of A)
4062302aa1bSDebojyoti Ghosh .  Fembed - step completion coefficients for embedded method
4072302aa1bSDebojyoti Ghosh .  pinterp - order of interpolation (0 if unavailable)
4082302aa1bSDebojyoti Ghosh -  binterp - array of interpolation coefficients (NULL if unavailable)
4092302aa1bSDebojyoti Ghosh 
4102302aa1bSDebojyoti Ghosh    Notes:
4112302aa1bSDebojyoti Ghosh    Several GLEE methods are provided, this function is only needed to create new methods.
4122302aa1bSDebojyoti Ghosh 
4132302aa1bSDebojyoti Ghosh    Level: advanced
4142302aa1bSDebojyoti Ghosh 
4152302aa1bSDebojyoti Ghosh .keywords: TS, register
4162302aa1bSDebojyoti Ghosh 
4172302aa1bSDebojyoti Ghosh .seealso: TSGLEE
4182302aa1bSDebojyoti Ghosh @*/
4192302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegister(TSGLEEType name,PetscInt order,PetscInt s, PetscInt r,
4202302aa1bSDebojyoti Ghosh                               PetscReal gamma,
4212302aa1bSDebojyoti Ghosh                               const PetscReal A[],const PetscReal B[],
4222302aa1bSDebojyoti Ghosh                               const PetscReal U[],const PetscReal V[],
4232302aa1bSDebojyoti Ghosh                               const PetscReal S[],const PetscReal F[],
4242302aa1bSDebojyoti Ghosh                               const PetscReal c[],const PetscReal Fembed[],
4252302aa1bSDebojyoti Ghosh                               PetscInt pinterp, const PetscReal binterp[])
4262302aa1bSDebojyoti Ghosh {
4272302aa1bSDebojyoti Ghosh   PetscErrorCode    ierr;
4282302aa1bSDebojyoti Ghosh   GLEETableauLink   link;
4292302aa1bSDebojyoti Ghosh   GLEETableau       t;
4302302aa1bSDebojyoti Ghosh   PetscInt          i,j;
4312302aa1bSDebojyoti Ghosh 
4322302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4332302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc(sizeof(*link),&link);CHKERRQ(ierr);
4342302aa1bSDebojyoti Ghosh   ierr     = PetscMemzero(link,sizeof(*link));CHKERRQ(ierr);
4352302aa1bSDebojyoti Ghosh   t        = &link->tab;
4362302aa1bSDebojyoti Ghosh   ierr     = PetscStrallocpy(name,&t->name);CHKERRQ(ierr);
4372302aa1bSDebojyoti Ghosh   t->order = order;
4382302aa1bSDebojyoti Ghosh   t->s     = s;
4392302aa1bSDebojyoti Ghosh   t->r     = r;
4402302aa1bSDebojyoti Ghosh   t->gamma = gamma;
4412302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc5(s*s,&t->A,r*r,&t->V,s,&t->c,r*s,&t->B,s*r,&t->U); CHKERRQ(ierr);
4422302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc2(r,&t->S,r,&t->F); CHKERRQ(ierr);
4432302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->A,A,s*s*sizeof(A[0]));CHKERRQ(ierr);
4442302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->B,B,r*s*sizeof(B[0]));CHKERRQ(ierr);
4452302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->U,U,s*r*sizeof(U[0]));CHKERRQ(ierr);
4462302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->V,V,r*r*sizeof(V[0]));CHKERRQ(ierr);
4472302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->S,S,r  *sizeof(S[0]));CHKERRQ(ierr);
4482302aa1bSDebojyoti Ghosh   ierr     = PetscMemcpy(t->F,F,r  *sizeof(F[0]));CHKERRQ(ierr);
4492302aa1bSDebojyoti Ghosh   if (c) {
4502302aa1bSDebojyoti Ghosh     ierr   = PetscMemcpy(t->c,c,s*sizeof(c[0])); CHKERRQ(ierr);
4512302aa1bSDebojyoti Ghosh   } else {
4522302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) for (j=0,t->c[i]=0; j<s; j++) t->c[i] += A[i*s+j];
4532302aa1bSDebojyoti Ghosh   }
4542302aa1bSDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Fembed);CHKERRQ(ierr);
4552302aa1bSDebojyoti Ghosh   ierr = PetscMemcpy(t->Fembed,Fembed,r*sizeof(Fembed[0]));CHKERRQ(ierr);
4562302aa1bSDebojyoti Ghosh   t->pinterp = pinterp;
4572302aa1bSDebojyoti Ghosh   ierr       = PetscMalloc1(s*pinterp,&t->binterp);CHKERRQ(ierr);
4582302aa1bSDebojyoti Ghosh   ierr       = PetscMemcpy(t->binterp,binterp,s*pinterp*sizeof(binterp[0]));CHKERRQ(ierr);
4592302aa1bSDebojyoti Ghosh 
4602302aa1bSDebojyoti Ghosh   link->next      = GLEETableauList;
4612302aa1bSDebojyoti Ghosh   GLEETableauList = link;
4622302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
4632302aa1bSDebojyoti Ghosh }
4642302aa1bSDebojyoti Ghosh 
4652302aa1bSDebojyoti Ghosh #undef __FUNCT__
4662302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSEvaluateStep_GLEE"
4672302aa1bSDebojyoti Ghosh static PetscErrorCode TSEvaluateStep_GLEE(TS ts,PetscInt order,Vec X,PetscBool *done)
4682302aa1bSDebojyoti Ghosh {
4692302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*) ts->data;
4702302aa1bSDebojyoti Ghosh   GLEETableau     tab = glee->tableau;
4712302aa1bSDebojyoti Ghosh   PetscReal       h, *B = tab->B, *V = tab->V,
4722302aa1bSDebojyoti Ghosh                   *F = tab->F, *Fembed = tab->Fembed;
4732302aa1bSDebojyoti Ghosh   PetscInt        s = tab->s, r = tab->r, i, j;
4742302aa1bSDebojyoti Ghosh   Vec             *Y = glee->Y, *YdotStage = glee->YdotStage;
4752302aa1bSDebojyoti Ghosh   PetscScalar     *w = glee->work;
4762302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
4772302aa1bSDebojyoti Ghosh 
4782302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4792302aa1bSDebojyoti Ghosh 
4802302aa1bSDebojyoti Ghosh   switch (glee->status) {
4812302aa1bSDebojyoti Ghosh     case TS_STEP_INCOMPLETE:
4822302aa1bSDebojyoti Ghosh     case TS_STEP_PENDING:
4832302aa1bSDebojyoti Ghosh       h = ts->time_step; break;
4842302aa1bSDebojyoti Ghosh     case TS_STEP_COMPLETE:
4852302aa1bSDebojyoti Ghosh       h = ts->time_step_prev; break;
4862302aa1bSDebojyoti Ghosh     default: SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_PLIB,"Invalid TSStepStatus");
4872302aa1bSDebojyoti Ghosh   }
4882302aa1bSDebojyoti Ghosh 
4892302aa1bSDebojyoti Ghosh   if (order == tab->order) {
4902302aa1bSDebojyoti Ghosh 
4912302aa1bSDebojyoti Ghosh     /* Note: Irrespective of whether status is TS_STEP_INCOMPLETE
4922302aa1bSDebojyoti Ghosh              or TS_STEP_COMPLETE, glee-X has the solution at the
4932302aa1bSDebojyoti Ghosh              beginning of the time step. So no need to roll-back.
4942302aa1bSDebojyoti Ghosh     */
4952302aa1bSDebojyoti Ghosh 
4962302aa1bSDebojyoti Ghosh     if (glee->status == TS_STEP_INCOMPLETE) {
4972302aa1bSDebojyoti Ghosh       for (i=0; i<r; i++) {
4982302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(Y[i]); CHKERRQ(ierr);
4992302aa1bSDebojyoti Ghosh         ierr = VecMAXPY(Y[i],r,(V+i*r),glee->X); CHKERRQ(ierr);
5002302aa1bSDebojyoti Ghosh         for (j=0; j<s; j++) w[j] = h*B[i*s+j];
5012302aa1bSDebojyoti Ghosh         ierr = VecMAXPY(Y[i],s,w,YdotStage); CHKERRQ(ierr);
5022302aa1bSDebojyoti Ghosh       }
5032302aa1bSDebojyoti Ghosh       ierr = VecZeroEntries(X);CHKERRQ(ierr);
5042302aa1bSDebojyoti Ghosh       ierr = VecMAXPY(X,r,F,Y);CHKERRQ(ierr);
5052302aa1bSDebojyoti Ghosh     } else {ierr = VecCopy(ts->vec_sol,X);CHKERRQ(ierr);}
5062302aa1bSDebojyoti Ghosh     PetscFunctionReturn(0);
5072302aa1bSDebojyoti Ghosh 
5082302aa1bSDebojyoti Ghosh   } else if (order == tab->order-1) {
5092302aa1bSDebojyoti Ghosh 
5102302aa1bSDebojyoti Ghosh     /* Complete with the embedded method (Fembed) */
5112302aa1bSDebojyoti Ghosh     for (i=0; i<r; i++) {
5122302aa1bSDebojyoti Ghosh       ierr = VecZeroEntries(Y[i]); CHKERRQ(ierr);
5132302aa1bSDebojyoti Ghosh       ierr = VecMAXPY(Y[i],r,(V+i*r),glee->X); CHKERRQ(ierr);
5142302aa1bSDebojyoti Ghosh       for (j=0; j<s; j++) w[j] = h*B[i*s+j];
5152302aa1bSDebojyoti Ghosh       ierr = VecMAXPY(Y[i],s,w,YdotStage); CHKERRQ(ierr);
5162302aa1bSDebojyoti Ghosh     }
5172302aa1bSDebojyoti Ghosh     ierr = VecZeroEntries(X);CHKERRQ(ierr);
5182302aa1bSDebojyoti Ghosh     ierr = VecMAXPY(X,r,Fembed,Y);CHKERRQ(ierr);
5192302aa1bSDebojyoti Ghosh     if (done) *done = PETSC_TRUE;
5202302aa1bSDebojyoti Ghosh     PetscFunctionReturn(0);
5212302aa1bSDebojyoti Ghosh   }
5222302aa1bSDebojyoti Ghosh   if (done) *done = PETSC_FALSE;
5232302aa1bSDebojyoti 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);
5242302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
5252302aa1bSDebojyoti Ghosh }
5262302aa1bSDebojyoti Ghosh 
5272302aa1bSDebojyoti Ghosh #undef __FUNCT__
5282302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSStep_GLEE"
5292302aa1bSDebojyoti Ghosh static PetscErrorCode TSStep_GLEE(TS ts)
5302302aa1bSDebojyoti Ghosh {
5312302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
5322302aa1bSDebojyoti Ghosh   GLEETableau     tab = glee->tableau;
5332302aa1bSDebojyoti Ghosh   const PetscInt  s = tab->s, r = tab->r;
5342302aa1bSDebojyoti Ghosh   PetscReal       *A = tab->A, *U = tab->U,
5352302aa1bSDebojyoti Ghosh                   *F = tab->F,
5362302aa1bSDebojyoti Ghosh                   *c = tab->c;
5372302aa1bSDebojyoti Ghosh   Vec             *Y = glee->Y, *X = glee->X,
5382302aa1bSDebojyoti Ghosh                   *YStage = glee->YStage,
5392302aa1bSDebojyoti Ghosh                   *YdotStage = glee->YdotStage,
5402302aa1bSDebojyoti Ghosh                   W = glee->W;
5412302aa1bSDebojyoti Ghosh   SNES            snes;
5422302aa1bSDebojyoti Ghosh   PetscScalar     *w = glee->work;
5432302aa1bSDebojyoti Ghosh   TSAdapt         adapt;
5442302aa1bSDebojyoti Ghosh   PetscInt        i,j,reject,next_scheme,its,lits;
5452302aa1bSDebojyoti Ghosh   PetscReal       next_time_step;
5462302aa1bSDebojyoti Ghosh   PetscReal       t;
5472302aa1bSDebojyoti Ghosh   PetscBool       accept;
5482302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
5492302aa1bSDebojyoti Ghosh 
5502302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
5512302aa1bSDebojyoti Ghosh   for (i=0; i<r; i++) { ierr = VecCopy(Y[i],X[i]); CHKERRQ(ierr); }
5522302aa1bSDebojyoti Ghosh 
5532302aa1bSDebojyoti Ghosh   ierr           = TSGetSNES(ts,&snes);CHKERRQ(ierr);
5542302aa1bSDebojyoti Ghosh   next_time_step = ts->time_step;
5552302aa1bSDebojyoti Ghosh   t              = ts->ptime;
5562302aa1bSDebojyoti Ghosh   accept         = PETSC_TRUE;
5572302aa1bSDebojyoti Ghosh   glee->status   = TS_STEP_INCOMPLETE;
5582302aa1bSDebojyoti Ghosh 
5592302aa1bSDebojyoti Ghosh   for (reject=0; reject<ts->max_reject && !ts->reason; reject++,ts->reject++) {
5602302aa1bSDebojyoti Ghosh 
5612302aa1bSDebojyoti Ghosh     PetscReal h = ts->time_step;
5622302aa1bSDebojyoti Ghosh     ierr = TSPreStep(ts);CHKERRQ(ierr);
5632302aa1bSDebojyoti Ghosh 
5642302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) {
5652302aa1bSDebojyoti Ghosh 
5662302aa1bSDebojyoti Ghosh       glee->stage_time = t + h*c[i];
5672302aa1bSDebojyoti Ghosh       ierr = TSPreStage(ts,glee->stage_time); CHKERRQ(ierr);
5682302aa1bSDebojyoti Ghosh 
5692302aa1bSDebojyoti Ghosh       if (A[i*s+i] == 0) {  /* Explicit stage */
5702302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(YStage[i]);CHKERRQ(ierr);
5712302aa1bSDebojyoti Ghosh         ierr = VecMAXPY(YStage[i],r,(U+i*r),X);CHKERRQ(ierr);
5722302aa1bSDebojyoti Ghosh         for (j=0; j<i; j++) w[j] = h*A[i*s+j];
5732302aa1bSDebojyoti Ghosh         ierr = VecMAXPY(YStage[i],i,w,YdotStage);CHKERRQ(ierr);
5742302aa1bSDebojyoti Ghosh       } else {              /* Implicit stage */
5752302aa1bSDebojyoti Ghosh         glee->scoeff = 1.0/A[i*s+i];
5762302aa1bSDebojyoti Ghosh         /* compute right-hand-side */
5772302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(W);CHKERRQ(ierr);
5782302aa1bSDebojyoti Ghosh         ierr = VecMAXPY(W,r,(U+i*r),X);CHKERRQ(ierr);
5792302aa1bSDebojyoti Ghosh         for (j=0; j<i; j++) w[j] = h*A[i*s+j];
5802302aa1bSDebojyoti Ghosh         ierr = VecMAXPY(W,i,w,YdotStage);CHKERRQ(ierr);
5812302aa1bSDebojyoti Ghosh         ierr = VecScale(W,glee->scoeff/h);CHKERRQ(ierr);
5822302aa1bSDebojyoti Ghosh         /* set initial guess */
5832302aa1bSDebojyoti Ghosh         ierr = VecCopy(i>0 ? YStage[i-1] : ts->vec_sol,YStage[i]);CHKERRQ(ierr);
5842302aa1bSDebojyoti Ghosh         /* solve for this stage */
5852302aa1bSDebojyoti Ghosh         ierr = SNESSolve(snes,W,YStage[i]);CHKERRQ(ierr);
5862302aa1bSDebojyoti Ghosh         ierr = SNESGetIterationNumber(snes,&its);CHKERRQ(ierr);
5872302aa1bSDebojyoti Ghosh         ierr = SNESGetLinearSolveIterations(snes,&lits);CHKERRQ(ierr);
5882302aa1bSDebojyoti Ghosh         ts->snes_its += its; ts->ksp_its += lits;
5892302aa1bSDebojyoti Ghosh       }
5902302aa1bSDebojyoti Ghosh       ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr);
5912302aa1bSDebojyoti Ghosh       ierr = TSAdaptCheckStage(adapt,ts,&accept);CHKERRQ(ierr);
5922302aa1bSDebojyoti Ghosh       if (!accept) goto reject_step;
5932302aa1bSDebojyoti Ghosh       ierr = TSPostStage(ts,glee->stage_time,i,YStage); CHKERRQ(ierr);
5942302aa1bSDebojyoti Ghosh       ierr = TSComputeRHSFunction(ts,t+h*c[i],YStage[i],YdotStage[i]);CHKERRQ(ierr);
5952302aa1bSDebojyoti Ghosh     }
5962302aa1bSDebojyoti Ghosh     ierr = TSEvaluateStep(ts,tab->order,ts->vec_sol,NULL);CHKERRQ(ierr);
5972302aa1bSDebojyoti Ghosh     glee->status = TS_STEP_PENDING;
5982302aa1bSDebojyoti Ghosh 
5992302aa1bSDebojyoti Ghosh     /* Register only the current method as a candidate because we're not supporting multiple candidates yet. */
6002302aa1bSDebojyoti Ghosh     ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr);
6012302aa1bSDebojyoti Ghosh     ierr = TSAdaptCandidatesClear(adapt);CHKERRQ(ierr);
6022302aa1bSDebojyoti Ghosh     ierr = TSAdaptCandidateAdd(adapt,tab->name,tab->order,1,tab->ccfl,1.*tab->s,PETSC_TRUE);CHKERRQ(ierr);
6032302aa1bSDebojyoti Ghosh     ierr = TSAdaptChoose(adapt,ts,ts->time_step,&next_scheme,&next_time_step,&accept);CHKERRQ(ierr);
6042302aa1bSDebojyoti Ghosh     if (accept) {
6052302aa1bSDebojyoti Ghosh       /* ignore next_scheme for now */
6062302aa1bSDebojyoti Ghosh       ts->ptime     += ts->time_step;
6072302aa1bSDebojyoti Ghosh       ts->time_step  = next_time_step;
6082302aa1bSDebojyoti Ghosh       ts->steps++;
6092302aa1bSDebojyoti Ghosh       glee->status = TS_STEP_COMPLETE;
6102302aa1bSDebojyoti Ghosh       ierr = PetscObjectComposedDataSetReal((PetscObject)ts->vec_sol,explicit_stage_time_id,ts->ptime);CHKERRQ(ierr);
6112302aa1bSDebojyoti Ghosh       break;
6122302aa1bSDebojyoti Ghosh     } else {                    /* Roll back the current step */
6132302aa1bSDebojyoti Ghosh       ierr = VecMAXPY(ts->vec_sol,r,F,X);CHKERRQ(ierr);
6142302aa1bSDebojyoti Ghosh       ts->time_step = next_time_step;
6152302aa1bSDebojyoti Ghosh       glee->status  = TS_STEP_INCOMPLETE;
6162302aa1bSDebojyoti Ghosh     }
6172302aa1bSDebojyoti Ghosh reject_step: continue;
6182302aa1bSDebojyoti Ghosh   }
6192302aa1bSDebojyoti Ghosh   if (glee->status != TS_STEP_COMPLETE && !ts->reason) ts->reason = TS_DIVERGED_STEP_REJECTED;
6202302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
6212302aa1bSDebojyoti Ghosh }
6222302aa1bSDebojyoti Ghosh 
6232302aa1bSDebojyoti Ghosh #undef __FUNCT__
6242302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSInterpolate_GLEE"
6252302aa1bSDebojyoti Ghosh static PetscErrorCode TSInterpolate_GLEE(TS ts,PetscReal itime,Vec X)
6262302aa1bSDebojyoti Ghosh {
6272302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
6282302aa1bSDebojyoti Ghosh   PetscInt        s=glee->tableau->s, pinterp=glee->tableau->pinterp,i,j;
6292302aa1bSDebojyoti Ghosh   PetscReal       h,tt,t;
6302302aa1bSDebojyoti Ghosh   PetscScalar     *b;
6312302aa1bSDebojyoti Ghosh   const PetscReal *B = glee->tableau->binterp;
6322302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
6332302aa1bSDebojyoti Ghosh 
6342302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
6352302aa1bSDebojyoti Ghosh   if (!B) SETERRQ1(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"TSGLEE %s does not have an interpolation formula",glee->tableau->name);
6362302aa1bSDebojyoti Ghosh   switch (glee->status) {
6372302aa1bSDebojyoti Ghosh     case TS_STEP_INCOMPLETE:
6382302aa1bSDebojyoti Ghosh     case TS_STEP_PENDING:
6392302aa1bSDebojyoti Ghosh       h = ts->time_step;
6402302aa1bSDebojyoti Ghosh       t = (itime - ts->ptime)/h;
6412302aa1bSDebojyoti Ghosh       break;
6422302aa1bSDebojyoti Ghosh     case TS_STEP_COMPLETE:
6432302aa1bSDebojyoti Ghosh       h = ts->time_step_prev;
6442302aa1bSDebojyoti Ghosh       t = (itime - ts->ptime)/h + 1; /* In the interval [0,1] */
6452302aa1bSDebojyoti Ghosh       break;
6462302aa1bSDebojyoti Ghosh     default: SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_PLIB,"Invalid TSStepStatus");
6472302aa1bSDebojyoti Ghosh   }
6482302aa1bSDebojyoti Ghosh   ierr = PetscMalloc1(s,&b);CHKERRQ(ierr);
6492302aa1bSDebojyoti Ghosh   for (i=0; i<s; i++) b[i] = 0;
6502302aa1bSDebojyoti Ghosh   for (j=0,tt=t; j<pinterp; j++,tt*=t) {
6512302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) {
6522302aa1bSDebojyoti Ghosh       b[i]  += h * B[i*pinterp+j] * tt;
6532302aa1bSDebojyoti Ghosh     }
6542302aa1bSDebojyoti Ghosh   }
6552302aa1bSDebojyoti Ghosh   ierr = VecCopy(glee->YStage[0],X);CHKERRQ(ierr);
6562302aa1bSDebojyoti Ghosh   ierr = VecMAXPY(X,s,b,glee->YdotStage);CHKERRQ(ierr);
6572302aa1bSDebojyoti Ghosh   ierr = PetscFree(b);CHKERRQ(ierr);
6582302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
6592302aa1bSDebojyoti Ghosh }
6602302aa1bSDebojyoti Ghosh 
6612302aa1bSDebojyoti Ghosh /*------------------------------------------------------------*/
6622302aa1bSDebojyoti Ghosh #undef __FUNCT__
6632302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSReset_GLEE"
6642302aa1bSDebojyoti Ghosh static PetscErrorCode TSReset_GLEE(TS ts)
6652302aa1bSDebojyoti Ghosh {
6662302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
6672302aa1bSDebojyoti Ghosh   PetscInt       s, r;
6682302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
6692302aa1bSDebojyoti Ghosh 
6702302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
6712302aa1bSDebojyoti Ghosh   if (!glee->tableau) PetscFunctionReturn(0);
6722302aa1bSDebojyoti Ghosh   s    = glee->tableau->s;
6732302aa1bSDebojyoti Ghosh   r    = glee->tableau->r;
6742302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(r,&glee->Y);CHKERRQ(ierr);
6752302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(r,&glee->X);CHKERRQ(ierr);
6762302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(s,&glee->YStage);CHKERRQ(ierr);
6772302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(s,&glee->YdotStage);CHKERRQ(ierr);
6782302aa1bSDebojyoti Ghosh   ierr = VecDestroy(&glee->Ydot);CHKERRQ(ierr);
6792302aa1bSDebojyoti Ghosh   ierr = VecDestroy(&glee->W);CHKERRQ(ierr);
6802302aa1bSDebojyoti Ghosh   ierr = PetscFree(glee->work);CHKERRQ(ierr);
6812302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
6822302aa1bSDebojyoti Ghosh }
6832302aa1bSDebojyoti Ghosh 
6842302aa1bSDebojyoti Ghosh #undef __FUNCT__
6852302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSDestroy_GLEE"
6862302aa1bSDebojyoti Ghosh static PetscErrorCode TSDestroy_GLEE(TS ts)
6872302aa1bSDebojyoti Ghosh {
6882302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
6892302aa1bSDebojyoti Ghosh 
6902302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
6912302aa1bSDebojyoti Ghosh   ierr = TSReset_GLEE(ts);CHKERRQ(ierr);
6922302aa1bSDebojyoti Ghosh   ierr = PetscFree(ts->data);CHKERRQ(ierr);
6932302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEEGetType_C",NULL);CHKERRQ(ierr);
6942302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEESetType_C",NULL);CHKERRQ(ierr);
6952302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
6962302aa1bSDebojyoti Ghosh }
6972302aa1bSDebojyoti Ghosh 
6982302aa1bSDebojyoti Ghosh #undef __FUNCT__
6992302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEEGetVecs"
7002302aa1bSDebojyoti Ghosh static PetscErrorCode TSGLEEGetVecs(TS ts,DM dm,Vec *Ydot)
7012302aa1bSDebojyoti Ghosh {
7022302aa1bSDebojyoti Ghosh   TS_GLEE     *glee = (TS_GLEE*)ts->data;
7032302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7042302aa1bSDebojyoti Ghosh 
7052302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7062302aa1bSDebojyoti Ghosh   if (Ydot) {
7072302aa1bSDebojyoti Ghosh     if (dm && dm != ts->dm) {
7082302aa1bSDebojyoti Ghosh       ierr = DMGetNamedGlobalVector(dm,"TSGLEE_Ydot",Ydot);CHKERRQ(ierr);
7092302aa1bSDebojyoti Ghosh     } else *Ydot = glee->Ydot;
7102302aa1bSDebojyoti Ghosh   }
7112302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7122302aa1bSDebojyoti Ghosh }
7132302aa1bSDebojyoti Ghosh 
7142302aa1bSDebojyoti Ghosh 
7152302aa1bSDebojyoti Ghosh #undef __FUNCT__
7162302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEERestoreVecs"
7172302aa1bSDebojyoti Ghosh static PetscErrorCode TSGLEERestoreVecs(TS ts,DM dm,Vec *Ydot)
7182302aa1bSDebojyoti Ghosh {
7192302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7202302aa1bSDebojyoti Ghosh 
7212302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7222302aa1bSDebojyoti Ghosh   if (Ydot) {
7232302aa1bSDebojyoti Ghosh     if (dm && dm != ts->dm) {
7242302aa1bSDebojyoti Ghosh       ierr = DMRestoreNamedGlobalVector(dm,"TSGLEE_Ydot",Ydot);CHKERRQ(ierr);
7252302aa1bSDebojyoti Ghosh     }
7262302aa1bSDebojyoti Ghosh   }
7272302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7282302aa1bSDebojyoti Ghosh }
7292302aa1bSDebojyoti Ghosh 
7302302aa1bSDebojyoti Ghosh /*
7312302aa1bSDebojyoti Ghosh   This defines the nonlinear equation that is to be solved with SNES
7322302aa1bSDebojyoti Ghosh */
7332302aa1bSDebojyoti Ghosh #undef __FUNCT__
7342302aa1bSDebojyoti Ghosh #define __FUNCT__ "SNESTSFormFunction_GLEE"
7352302aa1bSDebojyoti Ghosh static PetscErrorCode SNESTSFormFunction_GLEE(SNES snes,Vec X,Vec F,TS ts)
7362302aa1bSDebojyoti Ghosh {
7372302aa1bSDebojyoti Ghosh   TS_GLEE       *glee = (TS_GLEE*)ts->data;
7382302aa1bSDebojyoti Ghosh   DM             dm,dmsave;
7392302aa1bSDebojyoti Ghosh   Vec            Ydot;
7402302aa1bSDebojyoti Ghosh   PetscReal      shift = glee->scoeff / ts->time_step;
7412302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7422302aa1bSDebojyoti Ghosh 
7432302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7442302aa1bSDebojyoti Ghosh   ierr   = SNESGetDM(snes,&dm);CHKERRQ(ierr);
7452302aa1bSDebojyoti Ghosh   ierr   = TSGLEEGetVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7462302aa1bSDebojyoti Ghosh   /* Set Ydot = shift*X */
7472302aa1bSDebojyoti Ghosh   ierr   = VecCopy(X,Ydot);CHKERRQ(ierr);
7482302aa1bSDebojyoti Ghosh   ierr   = VecScale(Ydot,shift);CHKERRQ(ierr);
7492302aa1bSDebojyoti Ghosh   dmsave = ts->dm;
7502302aa1bSDebojyoti Ghosh   ts->dm = dm;
7512302aa1bSDebojyoti Ghosh 
7522302aa1bSDebojyoti Ghosh   ierr = TSComputeIFunction(ts,glee->stage_time,X,Ydot,F,PETSC_FALSE);CHKERRQ(ierr);
7532302aa1bSDebojyoti Ghosh 
7542302aa1bSDebojyoti Ghosh   ts->dm = dmsave;
7552302aa1bSDebojyoti Ghosh   ierr   = TSGLEERestoreVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7562302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7572302aa1bSDebojyoti Ghosh }
7582302aa1bSDebojyoti Ghosh 
7592302aa1bSDebojyoti Ghosh #undef __FUNCT__
7602302aa1bSDebojyoti Ghosh #define __FUNCT__ "SNESTSFormJacobian_GLEE"
7612302aa1bSDebojyoti Ghosh static PetscErrorCode SNESTSFormJacobian_GLEE(SNES snes,Vec X,Mat A,Mat B,TS ts)
7622302aa1bSDebojyoti Ghosh {
7632302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
7642302aa1bSDebojyoti Ghosh   DM             dm,dmsave;
7652302aa1bSDebojyoti Ghosh   Vec            Ydot;
7662302aa1bSDebojyoti Ghosh   PetscReal      shift = glee->scoeff / ts->time_step;
7672302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7682302aa1bSDebojyoti Ghosh 
7692302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7702302aa1bSDebojyoti Ghosh   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
7712302aa1bSDebojyoti Ghosh   ierr = TSGLEEGetVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7722302aa1bSDebojyoti Ghosh   /* glee->Ydot has already been computed in SNESTSFormFunction_GLEE (SNES guarantees this) */
7732302aa1bSDebojyoti Ghosh   dmsave = ts->dm;
7742302aa1bSDebojyoti Ghosh   ts->dm = dm;
7752302aa1bSDebojyoti Ghosh 
7762302aa1bSDebojyoti Ghosh   ierr = TSComputeIJacobian(ts,glee->stage_time,X,Ydot,shift,A,B,PETSC_FALSE);CHKERRQ(ierr);
7772302aa1bSDebojyoti Ghosh 
7782302aa1bSDebojyoti Ghosh   ts->dm = dmsave;
7792302aa1bSDebojyoti Ghosh   ierr   = TSGLEERestoreVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7802302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7812302aa1bSDebojyoti Ghosh }
7822302aa1bSDebojyoti Ghosh 
7832302aa1bSDebojyoti Ghosh #undef __FUNCT__
7842302aa1bSDebojyoti Ghosh #define __FUNCT__ "DMCoarsenHook_TSGLEE"
7852302aa1bSDebojyoti Ghosh static PetscErrorCode DMCoarsenHook_TSGLEE(DM fine,DM coarse,void *ctx)
7862302aa1bSDebojyoti Ghosh {
7872302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7882302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7892302aa1bSDebojyoti Ghosh }
7902302aa1bSDebojyoti Ghosh 
7912302aa1bSDebojyoti Ghosh #undef __FUNCT__
7922302aa1bSDebojyoti Ghosh #define __FUNCT__ "DMRestrictHook_TSGLEE"
7932302aa1bSDebojyoti Ghosh static PetscErrorCode DMRestrictHook_TSGLEE(DM fine,Mat restrct,Vec rscale,Mat inject,DM coarse,void *ctx)
7942302aa1bSDebojyoti Ghosh {
7952302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7962302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7972302aa1bSDebojyoti Ghosh }
7982302aa1bSDebojyoti Ghosh 
7992302aa1bSDebojyoti Ghosh 
8002302aa1bSDebojyoti Ghosh #undef __FUNCT__
8012302aa1bSDebojyoti Ghosh #define __FUNCT__ "DMSubDomainHook_TSGLEE"
8022302aa1bSDebojyoti Ghosh static PetscErrorCode DMSubDomainHook_TSGLEE(DM dm,DM subdm,void *ctx)
8032302aa1bSDebojyoti Ghosh {
8042302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8052302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8062302aa1bSDebojyoti Ghosh }
8072302aa1bSDebojyoti Ghosh 
8082302aa1bSDebojyoti Ghosh #undef __FUNCT__
8092302aa1bSDebojyoti Ghosh #define __FUNCT__ "DMSubDomainRestrictHook_TSGLEE"
8102302aa1bSDebojyoti Ghosh static PetscErrorCode DMSubDomainRestrictHook_TSGLEE(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
8112302aa1bSDebojyoti Ghosh {
8122302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8132302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8142302aa1bSDebojyoti Ghosh }
8152302aa1bSDebojyoti Ghosh 
8162302aa1bSDebojyoti Ghosh #undef __FUNCT__
8172302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSSetUp_GLEE"
8182302aa1bSDebojyoti Ghosh static PetscErrorCode TSSetUp_GLEE(TS ts)
8192302aa1bSDebojyoti Ghosh {
8202302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
8212302aa1bSDebojyoti Ghosh   GLEETableau    tab;
8222302aa1bSDebojyoti Ghosh   PetscInt       s,r;
8232302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8242302aa1bSDebojyoti Ghosh   DM             dm;
8252302aa1bSDebojyoti Ghosh 
8262302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8272302aa1bSDebojyoti Ghosh   if (!glee->tableau) {
8282302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,TSGLEEDefaultType);CHKERRQ(ierr);
8292302aa1bSDebojyoti Ghosh   }
8302302aa1bSDebojyoti Ghosh   tab  = glee->tableau;
8312302aa1bSDebojyoti Ghosh   s    = tab->s;
8322302aa1bSDebojyoti Ghosh   r    = tab->r;
8332302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,r,&glee->Y);CHKERRQ(ierr);
8342302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,r,&glee->X);CHKERRQ(ierr);
8352302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,s,&glee->YStage);CHKERRQ(ierr);
8362302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,s,&glee->YdotStage);CHKERRQ(ierr);
8372302aa1bSDebojyoti Ghosh   ierr = VecDuplicate(ts->vec_sol,&glee->Ydot);CHKERRQ(ierr);
8382302aa1bSDebojyoti Ghosh   ierr = VecDuplicate(ts->vec_sol,&glee->W);CHKERRQ(ierr);
8392302aa1bSDebojyoti Ghosh   ierr = PetscMalloc1(s,&glee->work);CHKERRQ(ierr);
8402302aa1bSDebojyoti Ghosh   ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
8412302aa1bSDebojyoti Ghosh   if (dm) {
8422302aa1bSDebojyoti Ghosh     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_TSGLEE,DMRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
8432302aa1bSDebojyoti Ghosh     ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_TSGLEE,DMSubDomainRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
8442302aa1bSDebojyoti Ghosh   }
8452302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8462302aa1bSDebojyoti Ghosh }
8472302aa1bSDebojyoti Ghosh 
8482302aa1bSDebojyoti Ghosh #undef __FUNCT__
8492302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSStartingMethod_GLEE"
8502302aa1bSDebojyoti Ghosh PetscErrorCode TSStartingMethod_GLEE(TS ts)
8512302aa1bSDebojyoti Ghosh {
8522302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
853*6e2e232bSDebojyoti Ghosh   GLEETableau    tab  = glee->tableau;
854*6e2e232bSDebojyoti Ghosh   PetscInt       r=tab->r,i;
855*6e2e232bSDebojyoti Ghosh   PetscReal      *S=tab->S;
8562302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8572302aa1bSDebojyoti Ghosh 
8582302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8592302aa1bSDebojyoti Ghosh   for (i=0; i<r; i++) {
8602302aa1bSDebojyoti Ghosh     ierr = VecZeroEntries(glee->Y[i]);CHKERRQ(ierr);
8612302aa1bSDebojyoti Ghosh     ierr = VecAXPY(glee->Y[i],S[i],ts->vec_sol);CHKERRQ(ierr);
8622302aa1bSDebojyoti Ghosh   }
8632302aa1bSDebojyoti Ghosh 
8642302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8652302aa1bSDebojyoti Ghosh }
8662302aa1bSDebojyoti Ghosh 
8672302aa1bSDebojyoti Ghosh 
8682302aa1bSDebojyoti Ghosh /*------------------------------------------------------------*/
8692302aa1bSDebojyoti Ghosh 
8702302aa1bSDebojyoti Ghosh #undef __FUNCT__
8712302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSSetFromOptions_GLEE"
8722302aa1bSDebojyoti Ghosh static PetscErrorCode TSSetFromOptions_GLEE(PetscOptions *PetscOptionsObject,TS ts)
8732302aa1bSDebojyoti Ghosh {
8742302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8752302aa1bSDebojyoti Ghosh   char           gleetype[256];
8762302aa1bSDebojyoti Ghosh 
8772302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8782302aa1bSDebojyoti Ghosh   ierr = PetscOptionsHead(PetscOptionsObject,"GLEE ODE solver options");CHKERRQ(ierr);
8792302aa1bSDebojyoti Ghosh   {
8802302aa1bSDebojyoti Ghosh     GLEETableauLink link;
8812302aa1bSDebojyoti Ghosh     PetscInt        count,choice;
8822302aa1bSDebojyoti Ghosh     PetscBool       flg;
8832302aa1bSDebojyoti Ghosh     const char      **namelist;
8842302aa1bSDebojyoti Ghosh 
8852302aa1bSDebojyoti Ghosh     ierr = PetscStrncpy(gleetype,TSGLEEDefaultType,sizeof(gleetype));CHKERRQ(ierr);
8862302aa1bSDebojyoti Ghosh     for (link=GLEETableauList,count=0; link; link=link->next,count++) ;
8872302aa1bSDebojyoti Ghosh     ierr = PetscMalloc1(count,&namelist);CHKERRQ(ierr);
8882302aa1bSDebojyoti Ghosh     for (link=GLEETableauList,count=0; link; link=link->next,count++) namelist[count] = link->tab.name;
8892302aa1bSDebojyoti Ghosh     ierr = PetscOptionsEList("-ts_glee_type","Family of GLEE method","TSGLEESetType",(const char*const*)namelist,count,gleetype,&choice,&flg);CHKERRQ(ierr);
8902302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,flg ? namelist[choice] : gleetype);CHKERRQ(ierr);
8912302aa1bSDebojyoti Ghosh     ierr = PetscFree(namelist);CHKERRQ(ierr);
8922302aa1bSDebojyoti Ghosh   }
8932302aa1bSDebojyoti Ghosh   ierr = PetscOptionsTail();CHKERRQ(ierr);
8942302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8952302aa1bSDebojyoti Ghosh }
8962302aa1bSDebojyoti Ghosh 
8972302aa1bSDebojyoti Ghosh #undef __FUNCT__
8982302aa1bSDebojyoti Ghosh #define __FUNCT__ "PetscFormatRealArray"
8992302aa1bSDebojyoti Ghosh static PetscErrorCode PetscFormatRealArray(char buf[],size_t len,const char *fmt,PetscInt n,const PetscReal x[])
9002302aa1bSDebojyoti Ghosh {
9012302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9022302aa1bSDebojyoti Ghosh   PetscInt       i;
9032302aa1bSDebojyoti Ghosh   size_t         left,count;
9042302aa1bSDebojyoti Ghosh   char           *p;
9052302aa1bSDebojyoti Ghosh 
9062302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9072302aa1bSDebojyoti Ghosh   for (i=0,p=buf,left=len; i<n; i++) {
9082302aa1bSDebojyoti Ghosh     ierr = PetscSNPrintfCount(p,left,fmt,&count,x[i]);CHKERRQ(ierr);
9092302aa1bSDebojyoti Ghosh     if (count >= left) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Insufficient space in buffer");
9102302aa1bSDebojyoti Ghosh     left -= count;
9112302aa1bSDebojyoti Ghosh     p    += count;
9122302aa1bSDebojyoti Ghosh     *p++  = ' ';
9132302aa1bSDebojyoti Ghosh   }
9142302aa1bSDebojyoti Ghosh   p[i ? 0 : -1] = 0;
9152302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9162302aa1bSDebojyoti Ghosh }
9172302aa1bSDebojyoti Ghosh 
9182302aa1bSDebojyoti Ghosh #undef __FUNCT__
9192302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSView_GLEE"
9202302aa1bSDebojyoti Ghosh static PetscErrorCode TSView_GLEE(TS ts,PetscViewer viewer)
9212302aa1bSDebojyoti Ghosh {
9222302aa1bSDebojyoti Ghosh   TS_GLEE        *glee   = (TS_GLEE*)ts->data;
9232302aa1bSDebojyoti Ghosh   GLEETableau    tab  = glee->tableau;
9242302aa1bSDebojyoti Ghosh   PetscBool      iascii;
9252302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9262302aa1bSDebojyoti Ghosh   TSAdapt        adapt;
9272302aa1bSDebojyoti Ghosh 
9282302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9292302aa1bSDebojyoti Ghosh   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
9302302aa1bSDebojyoti Ghosh   if (iascii) {
9312302aa1bSDebojyoti Ghosh     TSGLEEType gleetype;
9322302aa1bSDebojyoti Ghosh     char   buf[512];
9332302aa1bSDebojyoti Ghosh     ierr = TSGLEEGetType(ts,&gleetype);CHKERRQ(ierr);
9342302aa1bSDebojyoti Ghosh     ierr = PetscViewerASCIIPrintf(viewer,"  GLEE %s\n",gleetype);CHKERRQ(ierr);
9352302aa1bSDebojyoti Ghosh     ierr = PetscFormatRealArray(buf,sizeof(buf),"% 8.6f",tab->s,tab->c);CHKERRQ(ierr);
9362302aa1bSDebojyoti Ghosh     ierr = PetscViewerASCIIPrintf(viewer,"  Abscissa     c = %s\n",buf);CHKERRQ(ierr);
9372302aa1bSDebojyoti Ghosh     /* Note: print out r as well */
9382302aa1bSDebojyoti Ghosh   }
9392302aa1bSDebojyoti Ghosh   ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr);
9402302aa1bSDebojyoti Ghosh   ierr = TSAdaptView(adapt,viewer);CHKERRQ(ierr);
9412302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9422302aa1bSDebojyoti Ghosh }
9432302aa1bSDebojyoti Ghosh 
9442302aa1bSDebojyoti Ghosh #undef __FUNCT__
9452302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSLoad_GLEE"
9462302aa1bSDebojyoti Ghosh static PetscErrorCode TSLoad_GLEE(TS ts,PetscViewer viewer)
9472302aa1bSDebojyoti Ghosh {
9482302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9492302aa1bSDebojyoti Ghosh   SNES           snes;
9502302aa1bSDebojyoti Ghosh   TSAdapt        tsadapt;
9512302aa1bSDebojyoti Ghosh 
9522302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9532302aa1bSDebojyoti Ghosh   ierr = TSGetAdapt(ts,&tsadapt);CHKERRQ(ierr);
9542302aa1bSDebojyoti Ghosh   ierr = TSAdaptLoad(tsadapt,viewer);CHKERRQ(ierr);
9552302aa1bSDebojyoti Ghosh   ierr = TSGetSNES(ts,&snes);CHKERRQ(ierr);
9562302aa1bSDebojyoti Ghosh   ierr = SNESLoad(snes,viewer);CHKERRQ(ierr);
9572302aa1bSDebojyoti Ghosh   /* function and Jacobian context for SNES when used with TS is always ts object */
9582302aa1bSDebojyoti Ghosh   ierr = SNESSetFunction(snes,NULL,NULL,ts);CHKERRQ(ierr);
9592302aa1bSDebojyoti Ghosh   ierr = SNESSetJacobian(snes,NULL,NULL,NULL,ts);CHKERRQ(ierr);
9602302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9612302aa1bSDebojyoti Ghosh }
9622302aa1bSDebojyoti Ghosh 
9632302aa1bSDebojyoti Ghosh #undef __FUNCT__
9642302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEESetType"
9652302aa1bSDebojyoti Ghosh /*@C
9662302aa1bSDebojyoti Ghosh   TSGLEESetType - Set the type of GLEE scheme
9672302aa1bSDebojyoti Ghosh 
9682302aa1bSDebojyoti Ghosh   Logically collective
9692302aa1bSDebojyoti Ghosh 
9702302aa1bSDebojyoti Ghosh   Input Parameter:
9712302aa1bSDebojyoti Ghosh +  ts - timestepping context
9722302aa1bSDebojyoti Ghosh -  gleetype - type of GLEE-scheme
9732302aa1bSDebojyoti Ghosh 
9742302aa1bSDebojyoti Ghosh   Level: intermediate
9752302aa1bSDebojyoti Ghosh 
9762302aa1bSDebojyoti Ghosh .seealso: TSGLEEGetType(), TSGLEE
9772302aa1bSDebojyoti Ghosh @*/
9782302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEESetType(TS ts,TSGLEEType gleetype)
9792302aa1bSDebojyoti Ghosh {
9802302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9812302aa1bSDebojyoti Ghosh 
9822302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9832302aa1bSDebojyoti Ghosh   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
9842302aa1bSDebojyoti Ghosh   ierr = PetscTryMethod(ts,"TSGLEESetType_C",(TS,TSGLEEType),(ts,gleetype));CHKERRQ(ierr);
9852302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9862302aa1bSDebojyoti Ghosh }
9872302aa1bSDebojyoti Ghosh 
9882302aa1bSDebojyoti Ghosh #undef __FUNCT__
9892302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEEGetType"
9902302aa1bSDebojyoti Ghosh /*@C
9912302aa1bSDebojyoti Ghosh   TSGLEEGetType - Get the type of GLEE scheme
9922302aa1bSDebojyoti Ghosh 
9932302aa1bSDebojyoti Ghosh   Logically collective
9942302aa1bSDebojyoti Ghosh 
9952302aa1bSDebojyoti Ghosh   Input Parameter:
9962302aa1bSDebojyoti Ghosh .  ts - timestepping context
9972302aa1bSDebojyoti Ghosh 
9982302aa1bSDebojyoti Ghosh   Output Parameter:
9992302aa1bSDebojyoti Ghosh .  gleetype - type of GLEE-scheme
10002302aa1bSDebojyoti Ghosh 
10012302aa1bSDebojyoti Ghosh   Level: intermediate
10022302aa1bSDebojyoti Ghosh 
10032302aa1bSDebojyoti Ghosh .seealso: TSGLEESetType()
10042302aa1bSDebojyoti Ghosh @*/
10052302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEGetType(TS ts,TSGLEEType *gleetype)
10062302aa1bSDebojyoti Ghosh {
10072302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
10082302aa1bSDebojyoti Ghosh 
10092302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10102302aa1bSDebojyoti Ghosh   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
10112302aa1bSDebojyoti Ghosh   ierr = PetscUseMethod(ts,"TSGLEEGetType_C",(TS,TSGLEEType*),(ts,gleetype));CHKERRQ(ierr);
10122302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10132302aa1bSDebojyoti Ghosh }
10142302aa1bSDebojyoti Ghosh 
10152302aa1bSDebojyoti Ghosh #undef __FUNCT__
10162302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEEGetType_GLEE"
10172302aa1bSDebojyoti Ghosh PetscErrorCode  TSGLEEGetType_GLEE(TS ts,TSGLEEType *gleetype)
10182302aa1bSDebojyoti Ghosh {
10192302aa1bSDebojyoti Ghosh   TS_GLEE     *glee = (TS_GLEE*)ts->data;
10202302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
10212302aa1bSDebojyoti Ghosh 
10222302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10232302aa1bSDebojyoti Ghosh   if (!glee->tableau) {
10242302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,TSGLEEDefaultType);CHKERRQ(ierr);
10252302aa1bSDebojyoti Ghosh   }
10262302aa1bSDebojyoti Ghosh   *gleetype = glee->tableau->name;
10272302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10282302aa1bSDebojyoti Ghosh }
10292302aa1bSDebojyoti Ghosh #undef __FUNCT__
10302302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGLEESetType_GLEE"
10312302aa1bSDebojyoti Ghosh PetscErrorCode  TSGLEESetType_GLEE(TS ts,TSGLEEType gleetype)
10322302aa1bSDebojyoti Ghosh {
10332302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10342302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
10352302aa1bSDebojyoti Ghosh   PetscBool       match;
10362302aa1bSDebojyoti Ghosh   GLEETableauLink link;
10372302aa1bSDebojyoti Ghosh 
10382302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10392302aa1bSDebojyoti Ghosh   if (glee->tableau) {
10402302aa1bSDebojyoti Ghosh     ierr = PetscStrcmp(glee->tableau->name,gleetype,&match);CHKERRQ(ierr);
10412302aa1bSDebojyoti Ghosh     if (match) PetscFunctionReturn(0);
10422302aa1bSDebojyoti Ghosh   }
10432302aa1bSDebojyoti Ghosh   for (link = GLEETableauList; link; link=link->next) {
10442302aa1bSDebojyoti Ghosh     ierr = PetscStrcmp(link->tab.name,gleetype,&match);CHKERRQ(ierr);
10452302aa1bSDebojyoti Ghosh     if (match) {
10462302aa1bSDebojyoti Ghosh       ierr = TSReset_GLEE(ts);CHKERRQ(ierr);
10472302aa1bSDebojyoti Ghosh       glee->tableau = &link->tab;
10482302aa1bSDebojyoti Ghosh       PetscFunctionReturn(0);
10492302aa1bSDebojyoti Ghosh     }
10502302aa1bSDebojyoti Ghosh   }
10512302aa1bSDebojyoti Ghosh   SETERRQ1(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_UNKNOWN_TYPE,"Could not find '%s'",gleetype);
10522302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10532302aa1bSDebojyoti Ghosh }
10542302aa1bSDebojyoti Ghosh 
10552302aa1bSDebojyoti Ghosh #undef __FUNCT__
10562302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGetStages_GLEE"
10572302aa1bSDebojyoti Ghosh static PetscErrorCode  TSGetStages_GLEE(TS ts,PetscInt *ns,Vec **Y)
10582302aa1bSDebojyoti Ghosh {
10592302aa1bSDebojyoti Ghosh   TS_GLEE *glee = (TS_GLEE*)ts->data;
10602302aa1bSDebojyoti Ghosh 
10612302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10622302aa1bSDebojyoti Ghosh   *ns = glee->tableau->s;
10632302aa1bSDebojyoti Ghosh   if(Y) *Y  = glee->Y;
10642302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10652302aa1bSDebojyoti Ghosh }
10662302aa1bSDebojyoti Ghosh 
10672302aa1bSDebojyoti Ghosh #undef __FUNCT__
10682302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSGetAuxSolution_GLEE"
10692302aa1bSDebojyoti Ghosh PetscErrorCode TSGetAuxSolution_GLEE(TS ts,PetscInt *n,Vec *Y)
10702302aa1bSDebojyoti Ghosh {
10712302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10722302aa1bSDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
1073*6e2e232bSDebojyoti Ghosh   PetscErrorCode  ierr;
10742302aa1bSDebojyoti Ghosh 
10752302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10762302aa1bSDebojyoti Ghosh   if (!Y) *n = tab->r - 1;
10772302aa1bSDebojyoti Ghosh   else {
1078*6e2e232bSDebojyoti Ghosh     if ((*n >= 0) && (*n < tab->r-1)) {
1079*6e2e232bSDebojyoti Ghosh       ierr = VecCopy(glee->Y[*n],*Y); CHKERRQ(ierr);
1080*6e2e232bSDebojyoti Ghosh     } else {
10812302aa1bSDebojyoti Ghosh       /* XXX: Error message for invalid value of n */
10822302aa1bSDebojyoti Ghosh     }
10832302aa1bSDebojyoti Ghosh   }
10842302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10852302aa1bSDebojyoti Ghosh }
10862302aa1bSDebojyoti Ghosh 
10872302aa1bSDebojyoti Ghosh /* ------------------------------------------------------------ */
10882302aa1bSDebojyoti Ghosh /*MC
10892302aa1bSDebojyoti Ghosh       TSGLEE - ODE and DAE solver using General Linear with Error Estimation schemes
10902302aa1bSDebojyoti Ghosh 
10912302aa1bSDebojyoti Ghosh   The user should provide the right hand side of the equation
10922302aa1bSDebojyoti Ghosh   using TSSetRHSFunction().
10932302aa1bSDebojyoti Ghosh 
10942302aa1bSDebojyoti Ghosh   Notes:
10952302aa1bSDebojyoti Ghosh   The default is TSGLEE35, it can be changed with TSGLEESetType() or -ts_glee_type
10962302aa1bSDebojyoti Ghosh 
10972302aa1bSDebojyoti Ghosh   Level: beginner
10982302aa1bSDebojyoti Ghosh 
10992302aa1bSDebojyoti Ghosh .seealso:  TSCreate(), TS, TSSetType(), TSGLEESetType(), TSGLEEGetType(),
11002302aa1bSDebojyoti Ghosh            TSGLEE23, TTSGLEE24, TSGLEE35, TSGLEE25I, TSGLEEEXRK2A,
11012302aa1bSDebojyoti Ghosh            TSGLEERK32G1, TSGLEERK285EX, TSGLEEType, TSGLEERegister()
11022302aa1bSDebojyoti Ghosh 
11032302aa1bSDebojyoti Ghosh M*/
11042302aa1bSDebojyoti Ghosh #undef __FUNCT__
11052302aa1bSDebojyoti Ghosh #define __FUNCT__ "TSCreate_GLEE"
11062302aa1bSDebojyoti Ghosh PETSC_EXTERN PetscErrorCode TSCreate_GLEE(TS ts)
11072302aa1bSDebojyoti Ghosh {
11082302aa1bSDebojyoti Ghosh   TS_GLEE         *th;
11092302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
11102302aa1bSDebojyoti Ghosh 
11112302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
11122302aa1bSDebojyoti Ghosh #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
11132302aa1bSDebojyoti Ghosh   ierr = TSGLEEInitializePackage();CHKERRQ(ierr);
11142302aa1bSDebojyoti Ghosh #endif
11152302aa1bSDebojyoti Ghosh 
11162302aa1bSDebojyoti Ghosh   ts->ops->reset          = TSReset_GLEE;
11172302aa1bSDebojyoti Ghosh   ts->ops->destroy        = TSDestroy_GLEE;
11182302aa1bSDebojyoti Ghosh   ts->ops->view           = TSView_GLEE;
11192302aa1bSDebojyoti Ghosh   ts->ops->load           = TSLoad_GLEE;
11202302aa1bSDebojyoti Ghosh   ts->ops->setup          = TSSetUp_GLEE;
11212302aa1bSDebojyoti Ghosh   ts->ops->step           = TSStep_GLEE;
11222302aa1bSDebojyoti Ghosh   ts->ops->interpolate    = TSInterpolate_GLEE;
11232302aa1bSDebojyoti Ghosh   ts->ops->evaluatestep   = TSEvaluateStep_GLEE;
11242302aa1bSDebojyoti Ghosh   ts->ops->setfromoptions = TSSetFromOptions_GLEE;
11252302aa1bSDebojyoti Ghosh   ts->ops->getstages      = TSGetStages_GLEE;
11262302aa1bSDebojyoti Ghosh   ts->ops->snesfunction   = SNESTSFormFunction_GLEE;
11272302aa1bSDebojyoti Ghosh   ts->ops->snesjacobian   = SNESTSFormJacobian_GLEE;
11282302aa1bSDebojyoti Ghosh   ts->ops->getauxsolution = TSGetAuxSolution_GLEE;
11292302aa1bSDebojyoti Ghosh   ts->ops->startingmethod = TSStartingMethod_GLEE;
11302302aa1bSDebojyoti Ghosh 
11312302aa1bSDebojyoti Ghosh   ierr = PetscNewLog(ts,&th);CHKERRQ(ierr);
11322302aa1bSDebojyoti Ghosh   ts->data = (void*)th;
11332302aa1bSDebojyoti Ghosh 
11342302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEEGetType_C",TSGLEEGetType_GLEE);CHKERRQ(ierr);
11352302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEESetType_C",TSGLEESetType_GLEE);CHKERRQ(ierr);
11362302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
11372302aa1bSDebojyoti Ghosh }
1138