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