xref: /petsc/src/ts/impls/glee/glee.c (revision 580bdb303e1ee3b1222b2042810b4c26340259c6)
12302aa1bSDebojyoti Ghosh /*
22302aa1bSDebojyoti Ghosh   Code for time stepping with the General Linear with Error Estimation method
32302aa1bSDebojyoti Ghosh 
4642f3702SEmil Constantinescu 
52302aa1bSDebojyoti Ghosh   Notes:
62302aa1bSDebojyoti Ghosh   The general system is written as
72302aa1bSDebojyoti Ghosh 
82302aa1bSDebojyoti Ghosh   Udot = F(t,U)
92302aa1bSDebojyoti Ghosh 
102302aa1bSDebojyoti Ghosh */
112302aa1bSDebojyoti Ghosh #include <petsc/private/tsimpl.h>                /*I   "petscts.h"   I*/
122302aa1bSDebojyoti Ghosh #include <petscdm.h>
132302aa1bSDebojyoti Ghosh 
14642f3702SEmil Constantinescu static PetscBool  cited = PETSC_FALSE;
15642f3702SEmil Constantinescu static const char citation[] =
16642f3702SEmil Constantinescu   "@ARTICLE{Constantinescu_TR2016b,\n"
17642f3702SEmil Constantinescu   " author = {Constantinescu, E.M.},\n"
18642f3702SEmil Constantinescu   " title = {Estimating Global Errors in Time Stepping},\n"
19642f3702SEmil Constantinescu   " journal = {ArXiv e-prints},\n"
20642f3702SEmil Constantinescu   " year = 2016,\n"
21642f3702SEmil Constantinescu   " adsurl = {http://adsabs.harvard.edu/abs/2015arXiv150305166C}\n}\n";
22642f3702SEmil Constantinescu 
232302aa1bSDebojyoti Ghosh static TSGLEEType   TSGLEEDefaultType = TSGLEE35;
242302aa1bSDebojyoti Ghosh static PetscBool    TSGLEERegisterAllCalled;
252302aa1bSDebojyoti Ghosh static PetscBool    TSGLEEPackageInitialized;
262302aa1bSDebojyoti Ghosh static PetscInt     explicit_stage_time_id;
272302aa1bSDebojyoti Ghosh 
282302aa1bSDebojyoti Ghosh typedef struct _GLEETableau *GLEETableau;
292302aa1bSDebojyoti Ghosh struct _GLEETableau {
302302aa1bSDebojyoti Ghosh   char      *name;
312302aa1bSDebojyoti Ghosh   PetscInt   order;               /* Classical approximation order of the method i*/
322302aa1bSDebojyoti Ghosh   PetscInt   s;                   /* Number of stages */
332302aa1bSDebojyoti Ghosh   PetscInt   r;                   /* Number of steps */
342302aa1bSDebojyoti Ghosh   PetscReal  gamma;               /* LTE ratio */
352302aa1bSDebojyoti Ghosh   PetscReal *A,*B,*U,*V,*S,*F,*c; /* Tableau */
362302aa1bSDebojyoti Ghosh   PetscReal *Fembed;              /* Embedded final method coefficients */
37fd96ebc2SDebojyoti Ghosh   PetscReal *Ferror;              /* Coefficients for computing error   */
3857df6a1bSDebojyoti Ghosh   PetscReal *Serror;              /* Coefficients for initializing the error   */
392302aa1bSDebojyoti Ghosh   PetscInt   pinterp;             /* Interpolation order */
402302aa1bSDebojyoti Ghosh   PetscReal *binterp;             /* Interpolation coefficients */
412302aa1bSDebojyoti Ghosh   PetscReal  ccfl;                /* Placeholder for CFL coefficient relative to forward Euler  */
422302aa1bSDebojyoti Ghosh };
432302aa1bSDebojyoti Ghosh typedef struct _GLEETableauLink *GLEETableauLink;
442302aa1bSDebojyoti Ghosh struct _GLEETableauLink {
452302aa1bSDebojyoti Ghosh   struct _GLEETableau tab;
462302aa1bSDebojyoti Ghosh   GLEETableauLink     next;
472302aa1bSDebojyoti Ghosh };
482302aa1bSDebojyoti Ghosh static GLEETableauLink GLEETableauList;
492302aa1bSDebojyoti Ghosh 
502302aa1bSDebojyoti Ghosh typedef struct {
512302aa1bSDebojyoti Ghosh   GLEETableau  tableau;
522302aa1bSDebojyoti Ghosh   Vec          *Y;         /* Solution vector (along with auxiliary solution y~ or eps) */
532302aa1bSDebojyoti Ghosh   Vec          *X;         /* Temporary solution vector */
542302aa1bSDebojyoti Ghosh   Vec          *YStage;    /* Stage values */
552302aa1bSDebojyoti Ghosh   Vec          *YdotStage; /* Stage right hand side */
562302aa1bSDebojyoti Ghosh   Vec          W;          /* Right-hand-side for implicit stage solve */
572302aa1bSDebojyoti Ghosh   Vec          Ydot;       /* Work vector holding Ydot during residual evaluation */
580a01e1b2SEmil Constantinescu   Vec          yGErr;      /* Vector holding the global error after a step is completed */
59ec0e3ee2SEmil Constantinescu   PetscScalar  *swork;     /* Scalar work (size of the number of stages)*/
60ec0e3ee2SEmil Constantinescu   PetscScalar  *rwork;     /* Scalar work (size of the number of steps)*/
612302aa1bSDebojyoti Ghosh   PetscReal    scoeff;     /* shift = scoeff/dt */
622302aa1bSDebojyoti Ghosh   PetscReal    stage_time;
632302aa1bSDebojyoti Ghosh   TSStepStatus status;
642302aa1bSDebojyoti Ghosh } TS_GLEE;
652302aa1bSDebojyoti Ghosh 
662302aa1bSDebojyoti Ghosh /*MC
672302aa1bSDebojyoti Ghosh      TSGLEE23 - Second order three stage GLEE method
682302aa1bSDebojyoti Ghosh 
692302aa1bSDebojyoti Ghosh      This method has three stages.
702302aa1bSDebojyoti Ghosh      s = 3, r = 2
712302aa1bSDebojyoti Ghosh 
722302aa1bSDebojyoti Ghosh      Level: advanced
732302aa1bSDebojyoti Ghosh 
742302aa1bSDebojyoti Ghosh .seealso: TSGLEE
7536c34d14SEmil Constantinescu M*/
762302aa1bSDebojyoti Ghosh /*MC
772302aa1bSDebojyoti Ghosh      TSGLEE24 - Second order four stage GLEE method
782302aa1bSDebojyoti Ghosh 
792302aa1bSDebojyoti Ghosh      This method has four stages.
802302aa1bSDebojyoti Ghosh      s = 4, r = 2
812302aa1bSDebojyoti Ghosh 
822302aa1bSDebojyoti Ghosh      Level: advanced
832302aa1bSDebojyoti Ghosh 
842302aa1bSDebojyoti Ghosh .seealso: TSGLEE
8536c34d14SEmil Constantinescu M*/
862302aa1bSDebojyoti Ghosh /*MC
872302aa1bSDebojyoti Ghosh      TSGLEE25i - Second order five stage GLEE method
882302aa1bSDebojyoti Ghosh 
892302aa1bSDebojyoti Ghosh      This method has five stages.
902302aa1bSDebojyoti Ghosh      s = 5, r = 2
912302aa1bSDebojyoti Ghosh 
922302aa1bSDebojyoti Ghosh      Level: advanced
932302aa1bSDebojyoti Ghosh 
942302aa1bSDebojyoti Ghosh .seealso: TSGLEE
9536c34d14SEmil Constantinescu M*/
962302aa1bSDebojyoti Ghosh /*MC
972302aa1bSDebojyoti Ghosh      TSGLEE35  - Third order five stage GLEE method
982302aa1bSDebojyoti Ghosh 
992302aa1bSDebojyoti Ghosh      This method has five stages.
1002302aa1bSDebojyoti Ghosh      s = 5, r = 2
1012302aa1bSDebojyoti Ghosh 
1022302aa1bSDebojyoti Ghosh      Level: advanced
1032302aa1bSDebojyoti Ghosh 
1042302aa1bSDebojyoti Ghosh .seealso: TSGLEE
10536c34d14SEmil Constantinescu M*/
1062302aa1bSDebojyoti Ghosh /*MC
1072302aa1bSDebojyoti Ghosh      TSGLEEEXRK2A  - Second order six stage GLEE method
1082302aa1bSDebojyoti Ghosh 
1092302aa1bSDebojyoti Ghosh      This method has six stages.
1102302aa1bSDebojyoti Ghosh      s = 6, r = 2
1112302aa1bSDebojyoti Ghosh 
1122302aa1bSDebojyoti Ghosh      Level: advanced
1132302aa1bSDebojyoti Ghosh 
1142302aa1bSDebojyoti Ghosh .seealso: TSGLEE
11536c34d14SEmil Constantinescu M*/
1162302aa1bSDebojyoti Ghosh /*MC
1172302aa1bSDebojyoti Ghosh      TSGLEERK32G1  - Third order eight stage GLEE method
1182302aa1bSDebojyoti Ghosh 
1192302aa1bSDebojyoti Ghosh      This method has eight stages.
1202302aa1bSDebojyoti Ghosh      s = 8, r = 2
1212302aa1bSDebojyoti Ghosh 
1222302aa1bSDebojyoti Ghosh      Level: advanced
1232302aa1bSDebojyoti Ghosh 
1242302aa1bSDebojyoti Ghosh .seealso: TSGLEE
12536c34d14SEmil Constantinescu M*/
1262302aa1bSDebojyoti Ghosh /*MC
1272302aa1bSDebojyoti Ghosh      TSGLEERK285EX  - Second order nine stage GLEE method
1282302aa1bSDebojyoti Ghosh 
1292302aa1bSDebojyoti Ghosh      This method has nine stages.
1302302aa1bSDebojyoti Ghosh      s = 9, r = 2
1312302aa1bSDebojyoti Ghosh 
1322302aa1bSDebojyoti Ghosh      Level: advanced
1332302aa1bSDebojyoti Ghosh 
1342302aa1bSDebojyoti Ghosh .seealso: TSGLEE
13536c34d14SEmil Constantinescu M*/
1362302aa1bSDebojyoti Ghosh 
1372302aa1bSDebojyoti Ghosh /*@C
1382302aa1bSDebojyoti Ghosh   TSGLEERegisterAll - Registers all of the General Linear with Error Estimation methods in TSGLEE
1392302aa1bSDebojyoti Ghosh 
1402302aa1bSDebojyoti Ghosh   Not Collective, but should be called by all processes which will need the schemes to be registered
1412302aa1bSDebojyoti Ghosh 
1422302aa1bSDebojyoti Ghosh   Level: advanced
1432302aa1bSDebojyoti Ghosh 
1442302aa1bSDebojyoti Ghosh .seealso:  TSGLEERegisterDestroy()
1452302aa1bSDebojyoti Ghosh @*/
1462302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegisterAll(void)
1472302aa1bSDebojyoti Ghosh {
1482302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
1492302aa1bSDebojyoti Ghosh 
1502302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
1512302aa1bSDebojyoti Ghosh   if (TSGLEERegisterAllCalled) PetscFunctionReturn(0);
1522302aa1bSDebojyoti Ghosh   TSGLEERegisterAllCalled = PETSC_TRUE;
1532302aa1bSDebojyoti Ghosh 
1542302aa1bSDebojyoti Ghosh   {
155b1fbfd33SSatish Balay #define GAMMA 0.5
1562302aa1bSDebojyoti Ghosh     /* y-eps form */
1572302aa1bSDebojyoti Ghosh     const PetscInt
158ab8c5912SEmil Constantinescu       p = 1,
159ab8c5912SEmil Constantinescu       s = 3,
160ab8c5912SEmil Constantinescu       r = 2;
161ab8c5912SEmil Constantinescu     const PetscReal
162ab8c5912SEmil Constantinescu       A[3][3]   = {{1.0,0,0},{0,0.5,0},{0,0.5,0.5}},
163ab8c5912SEmil Constantinescu       B[2][3]   = {{1.0,0,0},{-2.0,1.0,1.0}},
164ab8c5912SEmil Constantinescu       U[3][2]   = {{1.0,0},{1.0,0.5},{1.0,0.5}},
165ab8c5912SEmil Constantinescu       V[2][2]   = {{1,0},{0,1}},
166ab8c5912SEmil Constantinescu       S[2]      = {1,0},
167ab8c5912SEmil Constantinescu       F[2]      = {1,0},
168b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
16957df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
17057df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
171b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEEi1,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
172ab8c5912SEmil Constantinescu   }
173ab8c5912SEmil Constantinescu   {
174b1fbfd33SSatish Balay #undef GAMMA
175b1fbfd33SSatish Balay #define GAMMA 0.0
176ab8c5912SEmil Constantinescu     /* y-eps form */
177ab8c5912SEmil Constantinescu     const PetscInt
1782302aa1bSDebojyoti Ghosh       p = 2,
1792302aa1bSDebojyoti Ghosh       s = 3,
1802302aa1bSDebojyoti Ghosh       r = 2;
1812302aa1bSDebojyoti Ghosh     const PetscReal
1822302aa1bSDebojyoti Ghosh       A[3][3]   = {{0,0,0},{1,0,0},{0.25,0.25,0}},
1832302aa1bSDebojyoti 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}},
1842302aa1bSDebojyoti Ghosh       U[3][2]   = {{1,0},{1,10},{1,-1}},
1852302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
1862302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
1872302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
188b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
18957df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
19057df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
191b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEE23,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
1922302aa1bSDebojyoti Ghosh   }
1932302aa1bSDebojyoti Ghosh   {
194b1fbfd33SSatish Balay #undef GAMMA
195b1fbfd33SSatish Balay #define GAMMA 0.0
1962302aa1bSDebojyoti Ghosh     /* y-y~ form */
1972302aa1bSDebojyoti Ghosh     const PetscInt
1982302aa1bSDebojyoti Ghosh       p = 2,
1992302aa1bSDebojyoti Ghosh       s = 4,
2002302aa1bSDebojyoti Ghosh       r = 2;
2012302aa1bSDebojyoti Ghosh     const PetscReal
2022302aa1bSDebojyoti 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}},
2032302aa1bSDebojyoti 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}},
2042302aa1bSDebojyoti Ghosh       U[4][2]   = {{0,1},{75.0/58.0,-17.0/58.0},{0,1},{0,1}},
2052302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2062302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2072302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
208fd96ebc2SDebojyoti Ghosh       Fembed[2] = {0,1},
209b1fbfd33SSatish Balay       Ferror[2] = {-1.0/(1.0-GAMMA),1.0/(1.0-GAMMA)},
210b1fbfd33SSatish Balay       Serror[2] = {1.0-GAMMA,1.0};
211b1fbfd33SSatish Balay       ierr = TSGLEERegister(TSGLEE24,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
2122302aa1bSDebojyoti Ghosh   }
2132302aa1bSDebojyoti Ghosh   {
214b1fbfd33SSatish Balay #undef GAMMA
215b1fbfd33SSatish Balay #define GAMMA 0.0
2162302aa1bSDebojyoti Ghosh     /* y-y~ form */
2172302aa1bSDebojyoti Ghosh     const PetscInt
2182302aa1bSDebojyoti Ghosh       p = 2,
2192302aa1bSDebojyoti Ghosh       s = 5,
2202302aa1bSDebojyoti Ghosh       r = 2;
2212302aa1bSDebojyoti Ghosh     const PetscReal
2222302aa1bSDebojyoti Ghosh       A[5][5]   = {{0,0,0,0,0},
2232302aa1bSDebojyoti Ghosh                    {-0.94079244066783383269,0,0,0,0},
2242302aa1bSDebojyoti Ghosh                    {0.64228187778301907108,0.10915356933958500042,0,0,0},
2252302aa1bSDebojyoti Ghosh                    {-0.51764297742287450812,0.74414270351096040738,-0.71404164927824538121,0,0},
2262302aa1bSDebojyoti Ghosh                    {-0.44696561556825969206,-0.76768425657590196518,0.20111608138142987881,0.93828186737840469796,0}},
2272302aa1bSDebojyoti Ghosh       B[2][5]   = {{-0.029309178948150356153,-0.49671981884013874923,0.34275801517650053274,0.32941112623949194988,0.85385985637229662276},
2282302aa1bSDebojyoti Ghosh                    {0.78133219686062535272,0.074238691892675897635,0.57957363498384957966,-0.24638502829674959968,-0.18875949544040123033}},
2292302aa1bSDebojyoti Ghosh       U[5][2]   = {{0.16911424754448327735,0.83088575245551672265},
2302302aa1bSDebojyoti Ghosh                    {0.53638465733199574340,0.46361534266800425660},
2312302aa1bSDebojyoti Ghosh                    {0.39901579167169582526,0.60098420832830417474},
2322302aa1bSDebojyoti Ghosh                    {0.87689005530618575480,0.12310994469381424520},
2332302aa1bSDebojyoti Ghosh                    {0.99056100455550913009,0.0094389954444908699092}},
2342302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2352302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2362302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
237fd96ebc2SDebojyoti Ghosh       Fembed[2] = {0,1},
238b1fbfd33SSatish Balay       Ferror[2] = {-1.0/(1.0-GAMMA),1.0/(1.0-GAMMA)},
239b1fbfd33SSatish Balay       Serror[2] = {1.0-GAMMA,1.0};
240b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEE25I,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
2412302aa1bSDebojyoti Ghosh   }
2422302aa1bSDebojyoti Ghosh   {
243b1fbfd33SSatish Balay #undef GAMMA
244b1fbfd33SSatish Balay #define GAMMA 0.0
2452302aa1bSDebojyoti Ghosh     /* y-y~ form */
2462302aa1bSDebojyoti Ghosh     const PetscInt
2472302aa1bSDebojyoti Ghosh       p = 3,
2482302aa1bSDebojyoti Ghosh       s = 5,
2492302aa1bSDebojyoti Ghosh       r = 2;
2502302aa1bSDebojyoti Ghosh     const PetscReal
2512302aa1bSDebojyoti Ghosh       A[5][5]   = {{0,0,0,0,0},
2522302aa1bSDebojyoti Ghosh                    {- 2169604947363702313.0 /  24313474998937147335.0,0,0,0,0},
2532302aa1bSDebojyoti Ghosh                    {46526746497697123895.0 /  94116917485856474137.0,-10297879244026594958.0 /  49199457603717988219.0,0,0,0},
2542302aa1bSDebojyoti Ghosh                    {23364788935845982499.0 /  87425311444725389446.0,-79205144337496116638.0 / 148994349441340815519.0,40051189859317443782.0 /  36487615018004984309.0,0,0},
25517d8b14cSSatish Balay                    {42089522664062539205.0 / 124911313006412840286.0,-15074384760342762939.0 / 137927286865289746282.0,-62274678522253371016.0 / 125918573676298591413.0,13755475729852471739.0 /  79257927066651693390.0,0}},
2562302aa1bSDebojyoti Ghosh       B[2][5]   = {{61546696837458703723.0 /  56982519523786160813.0,-55810892792806293355.0 / 206957624151308356511.0,24061048952676379087.0 / 158739347956038723465.0,3577972206874351339.0 /   7599733370677197135.0,-59449832954780563947.0 / 137360038685338563670.0},
2572302aa1bSDebojyoti Ghosh                    {- 9738262186984159168.0 /  99299082461487742983.0,-32797097931948613195.0 /  61521565616362163366.0,42895514606418420631.0 /  71714201188501437336.0,22608567633166065068.0 /  55371917805607957003.0,94655809487476459565.0 / 151517167160302729021.0}},
2582302aa1bSDebojyoti Ghosh       U[5][2]   = {{70820309139834661559.0 /  80863923579509469826.0,10043614439674808267.0 /  80863923579509469826.0},
2592302aa1bSDebojyoti Ghosh                    {161694774978034105510.0 / 106187653640211060371.0,-55507121337823045139.0 / 106187653640211060371.0},
2602302aa1bSDebojyoti Ghosh                    {78486094644566264568.0 /  88171030896733822981.0,9684936252167558413.0 /  88171030896733822981.0},
2612302aa1bSDebojyoti Ghosh                    {65394922146334854435.0 /  84570853840405479554.0,19175931694070625119.0 /  84570853840405479554.0},
2622302aa1bSDebojyoti Ghosh                    {8607282770183754108.0 / 108658046436496925911.0,100050763666313171803.0 / 108658046436496925911.0}},
2632302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2642302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2652302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
266fd96ebc2SDebojyoti Ghosh       Fembed[2] = {0,1},
267b1fbfd33SSatish Balay       Ferror[2] = {-1.0/(1.0-GAMMA),1.0/(1.0-GAMMA)},
268b1fbfd33SSatish Balay       Serror[2] = {1.0-GAMMA,1.0};
269b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEE35,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
2702302aa1bSDebojyoti Ghosh   }
2712302aa1bSDebojyoti Ghosh   {
272b1fbfd33SSatish Balay #undef GAMMA
273b1fbfd33SSatish Balay #define GAMMA 0.25
2742302aa1bSDebojyoti Ghosh     /* y-eps form */
2752302aa1bSDebojyoti Ghosh     const PetscInt
2762302aa1bSDebojyoti Ghosh       p = 2,
2772302aa1bSDebojyoti Ghosh       s = 6,
2782302aa1bSDebojyoti Ghosh       r = 2;
2792302aa1bSDebojyoti Ghosh     const PetscReal
2802302aa1bSDebojyoti Ghosh       A[6][6]   = {{0,0,0,0,0,0},
2812302aa1bSDebojyoti Ghosh                    {1,0,0,0,0,0},
2822302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0},
2832302aa1bSDebojyoti Ghosh                    {0,0,0.5,0,0,0},
2842302aa1bSDebojyoti Ghosh                    {0,0,0.25,0.25,0,0},
2852302aa1bSDebojyoti Ghosh                    {0,0,0.25,0.25,0.5,0}},
2862302aa1bSDebojyoti Ghosh       B[2][6]   = {{0.5,0.5,0,0,0,0},
2872302aa1bSDebojyoti 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}},
2882302aa1bSDebojyoti Ghosh       U[6][2]   = {{1,0},{1,0},{1,0.75},{1,0.75},{1,0.75},{1,0.75}},
2892302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2902302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
2912302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
292b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
29357df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
29457df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
295b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEEEXRK2A,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
2962302aa1bSDebojyoti Ghosh   }
2972302aa1bSDebojyoti Ghosh   {
298b1fbfd33SSatish Balay #undef GAMMA
299b1fbfd33SSatish Balay #define GAMMA 0.0
3002302aa1bSDebojyoti Ghosh     /* y-eps form */
3012302aa1bSDebojyoti Ghosh     const PetscInt
3022302aa1bSDebojyoti Ghosh       p = 3,
3032302aa1bSDebojyoti Ghosh       s = 8,
3042302aa1bSDebojyoti Ghosh       r = 2;
3052302aa1bSDebojyoti Ghosh     const PetscReal
3062302aa1bSDebojyoti Ghosh       A[8][8]   = {{0,0,0,0,0,0,0,0},
3072302aa1bSDebojyoti Ghosh                    {0.5,0,0,0,0,0,0,0},
3082302aa1bSDebojyoti Ghosh                    {-1,2,0,0,0,0,0,0},
3092302aa1bSDebojyoti Ghosh                    {1.0/6.0,2.0/3.0,1.0/6.0,0,0,0,0,0},
3102302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0,0,0},
3112302aa1bSDebojyoti Ghosh                    {-7.0/24.0,1.0/3.0,1.0/12.0,-1.0/8.0,0.5,0,0,0},
3122302aa1bSDebojyoti Ghosh                    {7.0/6.0,-4.0/3.0,-1.0/3.0,0.5,-1.0,2.0,0,0},
3132302aa1bSDebojyoti Ghosh                    {0,0,0,0,1.0/6.0,2.0/3.0,1.0/6.0,0}},
3142302aa1bSDebojyoti Ghosh       B[2][8]   = {{1.0/6.0,2.0/3.0,1.0/6.0,0,0,0,0,0},
3152302aa1bSDebojyoti 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}},
3162302aa1bSDebojyoti Ghosh       U[8][2]   = {{1,0},{1,0},{1,0},{1,0},{1,1},{1,1},{1,1},{1,1}},
3172302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
3182302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
3192302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
320b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
32157df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
32257df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
323b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEERK32G1,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
3242302aa1bSDebojyoti Ghosh   }
3252302aa1bSDebojyoti Ghosh   {
326b1fbfd33SSatish Balay #undef GAMMA
327b1fbfd33SSatish Balay #define GAMMA 0.25
3282302aa1bSDebojyoti Ghosh     /* y-eps form */
3292302aa1bSDebojyoti Ghosh     const PetscInt
3302302aa1bSDebojyoti Ghosh       p = 2,
3312302aa1bSDebojyoti Ghosh       s = 9,
3322302aa1bSDebojyoti Ghosh       r = 2;
3332302aa1bSDebojyoti Ghosh     const PetscReal
3342302aa1bSDebojyoti Ghosh       A[9][9]   = {{0,0,0,0,0,0,0,0,0},
3352302aa1bSDebojyoti Ghosh                    {0.585786437626904966,0,0,0,0,0,0,0,0},
3362302aa1bSDebojyoti Ghosh                    {0.149999999999999994,0.849999999999999978,0,0,0,0,0,0,0},
3372302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0,0,0,0},
3382302aa1bSDebojyoti Ghosh                    {0,0,0,0.292893218813452483,0,0,0,0,0},
3392302aa1bSDebojyoti Ghosh                    {0,0,0,0.0749999999999999972,0.424999999999999989,0,0,0,0},
3402302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0,0,0},
3412302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0.292893218813452483,0,0},
3422302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0.0749999999999999972,0.424999999999999989,0}},
3432302aa1bSDebojyoti Ghosh       B[2][9]   = {{0.353553390593273786,0.353553390593273786,0.292893218813452483,0,0,0,0,0,0},
3442302aa1bSDebojyoti Ghosh                    {-0.471404520791031678,-0.471404520791031678,-0.390524291751269959,0.235702260395515839,0.235702260395515839,0.195262145875634979,0.235702260395515839,0.235702260395515839,0.195262145875634979}},
3452302aa1bSDebojyoti 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}},
3462302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
3472302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
3482302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
349b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
35057df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
35157df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
352b1fbfd33SSatish Balay     ierr = TSGLEERegister(TSGLEERK285EX,p,s,r,GAMMA,&A[0][0],&B[0][0],&U[0][0],&V[0][0],S,F,NULL,Fembed,Ferror,Serror,0,NULL);CHKERRQ(ierr);
3532302aa1bSDebojyoti Ghosh   }
3542302aa1bSDebojyoti Ghosh 
3552302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3562302aa1bSDebojyoti Ghosh }
3572302aa1bSDebojyoti Ghosh 
3582302aa1bSDebojyoti Ghosh /*@C
3592302aa1bSDebojyoti Ghosh    TSGLEERegisterDestroy - Frees the list of schemes that were registered by TSGLEERegister().
3602302aa1bSDebojyoti Ghosh 
3612302aa1bSDebojyoti Ghosh    Not Collective
3622302aa1bSDebojyoti Ghosh 
3632302aa1bSDebojyoti Ghosh    Level: advanced
3642302aa1bSDebojyoti Ghosh 
3652302aa1bSDebojyoti Ghosh .seealso: TSGLEERegister(), TSGLEERegisterAll()
3662302aa1bSDebojyoti Ghosh @*/
3672302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegisterDestroy(void)
3682302aa1bSDebojyoti Ghosh {
3692302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
3702302aa1bSDebojyoti Ghosh   GLEETableauLink link;
3712302aa1bSDebojyoti Ghosh 
3722302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
3732302aa1bSDebojyoti Ghosh   while ((link = GLEETableauList)) {
3742302aa1bSDebojyoti Ghosh     GLEETableau t = &link->tab;
3752302aa1bSDebojyoti Ghosh     GLEETableauList = link->next;
3762302aa1bSDebojyoti Ghosh     ierr = PetscFree5(t->A,t->B,t->U,t->V,t->c);CHKERRQ(ierr);
3772302aa1bSDebojyoti Ghosh     ierr = PetscFree2(t->S,t->F);               CHKERRQ(ierr);
3782302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->Fembed);               CHKERRQ(ierr);
379fd96ebc2SDebojyoti Ghosh     ierr = PetscFree (t->Ferror);               CHKERRQ(ierr);
38057df6a1bSDebojyoti Ghosh     ierr = PetscFree (t->Serror);               CHKERRQ(ierr);
3812302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->binterp);              CHKERRQ(ierr);
3822302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->name);                 CHKERRQ(ierr);
3832302aa1bSDebojyoti Ghosh     ierr = PetscFree (link);                    CHKERRQ(ierr);
3842302aa1bSDebojyoti Ghosh   }
3852302aa1bSDebojyoti Ghosh   TSGLEERegisterAllCalled = PETSC_FALSE;
3862302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3872302aa1bSDebojyoti Ghosh }
3882302aa1bSDebojyoti Ghosh 
3892302aa1bSDebojyoti Ghosh /*@C
3902302aa1bSDebojyoti Ghosh   TSGLEEInitializePackage - This function initializes everything in the TSGLEE package. It is called
3918a690491SBarry Smith   from TSInitializePackage().
3922302aa1bSDebojyoti Ghosh 
3932302aa1bSDebojyoti Ghosh   Level: developer
3942302aa1bSDebojyoti Ghosh 
3952302aa1bSDebojyoti Ghosh .seealso: PetscInitialize()
3962302aa1bSDebojyoti Ghosh @*/
3972302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEInitializePackage(void)
3982302aa1bSDebojyoti Ghosh {
3992302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
4002302aa1bSDebojyoti Ghosh 
4012302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4022302aa1bSDebojyoti Ghosh   if (TSGLEEPackageInitialized) PetscFunctionReturn(0);
4032302aa1bSDebojyoti Ghosh   TSGLEEPackageInitialized = PETSC_TRUE;
4042302aa1bSDebojyoti Ghosh   ierr = TSGLEERegisterAll();CHKERRQ(ierr);
4052302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposedDataRegister(&explicit_stage_time_id);CHKERRQ(ierr);
4062302aa1bSDebojyoti Ghosh   ierr = PetscRegisterFinalize(TSGLEEFinalizePackage);CHKERRQ(ierr);
4072302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
4082302aa1bSDebojyoti Ghosh }
4092302aa1bSDebojyoti Ghosh 
4102302aa1bSDebojyoti Ghosh /*@C
4112302aa1bSDebojyoti Ghosh   TSGLEEFinalizePackage - This function destroys everything in the TSGLEE package. It is
4122302aa1bSDebojyoti Ghosh   called from PetscFinalize().
4132302aa1bSDebojyoti Ghosh 
4142302aa1bSDebojyoti Ghosh   Level: developer
4152302aa1bSDebojyoti Ghosh 
4162302aa1bSDebojyoti Ghosh .seealso: PetscFinalize()
4172302aa1bSDebojyoti Ghosh @*/
4182302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEFinalizePackage(void)
4192302aa1bSDebojyoti Ghosh {
4202302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
4212302aa1bSDebojyoti Ghosh 
4222302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4232302aa1bSDebojyoti Ghosh   TSGLEEPackageInitialized = PETSC_FALSE;
4242302aa1bSDebojyoti Ghosh   ierr = TSGLEERegisterDestroy();CHKERRQ(ierr);
4252302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
4262302aa1bSDebojyoti Ghosh }
4272302aa1bSDebojyoti Ghosh 
4282302aa1bSDebojyoti Ghosh /*@C
4292302aa1bSDebojyoti Ghosh    TSGLEERegister - register an GLEE scheme by providing the entries in the Butcher tableau
4302302aa1bSDebojyoti Ghosh 
4312302aa1bSDebojyoti Ghosh    Not Collective, but the same schemes should be registered on all processes on which they will be used
4322302aa1bSDebojyoti Ghosh 
4332302aa1bSDebojyoti Ghosh    Input Parameters:
4342302aa1bSDebojyoti Ghosh +  name   - identifier for method
4352302aa1bSDebojyoti Ghosh .  order  - order of method
4362302aa1bSDebojyoti Ghosh .  s - number of stages
4372302aa1bSDebojyoti Ghosh .  r - number of steps
4382302aa1bSDebojyoti Ghosh .  gamma - LTE ratio
4392302aa1bSDebojyoti Ghosh .  A - stage coefficients (dimension s*s, row-major)
4402302aa1bSDebojyoti Ghosh .  B - step completion coefficients (dimension r*s, row-major)
4412302aa1bSDebojyoti Ghosh .  U - method coefficients (dimension s*r, row-major)
4422302aa1bSDebojyoti Ghosh .  V - method coefficients (dimension r*r, row-major)
4432302aa1bSDebojyoti Ghosh .  S - starting coefficients
4442302aa1bSDebojyoti Ghosh .  F - finishing coefficients
4452302aa1bSDebojyoti Ghosh .  c - abscissa (dimension s; NULL to use row sums of A)
4462302aa1bSDebojyoti Ghosh .  Fembed - step completion coefficients for embedded method
447fd96ebc2SDebojyoti Ghosh .  Ferror - error computation coefficients
44857df6a1bSDebojyoti Ghosh .  Serror - error initialization coefficients
4492302aa1bSDebojyoti Ghosh .  pinterp - order of interpolation (0 if unavailable)
4502302aa1bSDebojyoti Ghosh -  binterp - array of interpolation coefficients (NULL if unavailable)
4512302aa1bSDebojyoti Ghosh 
4522302aa1bSDebojyoti Ghosh    Notes:
4532302aa1bSDebojyoti Ghosh    Several GLEE methods are provided, this function is only needed to create new methods.
4542302aa1bSDebojyoti Ghosh 
4552302aa1bSDebojyoti Ghosh    Level: advanced
4562302aa1bSDebojyoti Ghosh 
4572302aa1bSDebojyoti Ghosh .seealso: TSGLEE
4582302aa1bSDebojyoti Ghosh @*/
4592302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegister(TSGLEEType name,PetscInt order,PetscInt s, PetscInt r,
4602302aa1bSDebojyoti Ghosh                               PetscReal gamma,
4612302aa1bSDebojyoti Ghosh                               const PetscReal A[],const PetscReal B[],
4622302aa1bSDebojyoti Ghosh                               const PetscReal U[],const PetscReal V[],
4632302aa1bSDebojyoti Ghosh                               const PetscReal S[],const PetscReal F[],
464fd96ebc2SDebojyoti Ghosh                               const PetscReal c[],
465fd96ebc2SDebojyoti Ghosh                               const PetscReal Fembed[],const PetscReal Ferror[],
46657df6a1bSDebojyoti Ghosh                               const PetscReal Serror[],
4672302aa1bSDebojyoti Ghosh                               PetscInt pinterp, const PetscReal binterp[])
4682302aa1bSDebojyoti Ghosh {
4692302aa1bSDebojyoti Ghosh   PetscErrorCode    ierr;
4702302aa1bSDebojyoti Ghosh   GLEETableauLink   link;
4712302aa1bSDebojyoti Ghosh   GLEETableau       t;
4722302aa1bSDebojyoti Ghosh   PetscInt          i,j;
4732302aa1bSDebojyoti Ghosh 
4742302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4751d36bdfdSBarry Smith   ierr     = TSGLEEInitializePackage();CHKERRQ(ierr);
476*580bdb30SBarry Smith   ierr     = PetscNew(&link);CHKERRQ(ierr);
4772302aa1bSDebojyoti Ghosh   t        = &link->tab;
4782302aa1bSDebojyoti Ghosh   ierr     = PetscStrallocpy(name,&t->name);CHKERRQ(ierr);
4792302aa1bSDebojyoti Ghosh   t->order = order;
4802302aa1bSDebojyoti Ghosh   t->s     = s;
4812302aa1bSDebojyoti Ghosh   t->r     = r;
4822302aa1bSDebojyoti Ghosh   t->gamma = gamma;
4832302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc5(s*s,&t->A,r*r,&t->V,s,&t->c,r*s,&t->B,s*r,&t->U);CHKERRQ(ierr);
4842302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc2(r,&t->S,r,&t->F);CHKERRQ(ierr);
485*580bdb30SBarry Smith   ierr     = PetscArraycpy(t->A,A,s*s);CHKERRQ(ierr);
486*580bdb30SBarry Smith   ierr     = PetscArraycpy(t->B,B,r*s);CHKERRQ(ierr);
487*580bdb30SBarry Smith   ierr     = PetscArraycpy(t->U,U,s*r);CHKERRQ(ierr);
488*580bdb30SBarry Smith   ierr     = PetscArraycpy(t->V,V,r*r);CHKERRQ(ierr);
489*580bdb30SBarry Smith   ierr     = PetscArraycpy(t->S,S,r  );CHKERRQ(ierr);
490*580bdb30SBarry Smith   ierr     = PetscArraycpy(t->F,F,r  );CHKERRQ(ierr);
4912302aa1bSDebojyoti Ghosh   if (c) {
492*580bdb30SBarry Smith     ierr   = PetscArraycpy(t->c,c,s);CHKERRQ(ierr);
4932302aa1bSDebojyoti Ghosh   } else {
4942302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) for (j=0,t->c[i]=0; j<s; j++) t->c[i] += A[i*s+j];
4952302aa1bSDebojyoti Ghosh   }
4962302aa1bSDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Fembed);CHKERRQ(ierr);
497fd96ebc2SDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Ferror);CHKERRQ(ierr);
49857df6a1bSDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Serror);CHKERRQ(ierr);
499*580bdb30SBarry Smith   ierr = PetscArraycpy(t->Fembed,Fembed,r);CHKERRQ(ierr);
500*580bdb30SBarry Smith   ierr = PetscArraycpy(t->Ferror,Ferror,r);CHKERRQ(ierr);
501*580bdb30SBarry Smith   ierr = PetscArraycpy(t->Serror,Serror,r);CHKERRQ(ierr);
5022302aa1bSDebojyoti Ghosh   t->pinterp = pinterp;
5032302aa1bSDebojyoti Ghosh   ierr       = PetscMalloc1(s*pinterp,&t->binterp);CHKERRQ(ierr);
504*580bdb30SBarry Smith   ierr       = PetscArraycpy(t->binterp,binterp,s*pinterp);CHKERRQ(ierr);
5052302aa1bSDebojyoti Ghosh 
5062302aa1bSDebojyoti Ghosh   link->next      = GLEETableauList;
5072302aa1bSDebojyoti Ghosh   GLEETableauList = link;
5082302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
5092302aa1bSDebojyoti Ghosh }
5102302aa1bSDebojyoti Ghosh 
5112302aa1bSDebojyoti Ghosh static PetscErrorCode TSEvaluateStep_GLEE(TS ts,PetscInt order,Vec X,PetscBool *done)
5122302aa1bSDebojyoti Ghosh {
5132302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*) ts->data;
5142302aa1bSDebojyoti Ghosh   GLEETableau     tab = glee->tableau;
5152302aa1bSDebojyoti Ghosh   PetscReal       h, *B = tab->B, *V = tab->V,
516fd96ebc2SDebojyoti Ghosh                   *F = tab->F,
517fd96ebc2SDebojyoti Ghosh                   *Fembed = tab->Fembed;
5182302aa1bSDebojyoti Ghosh   PetscInt        s = tab->s, r = tab->r, i, j;
5192302aa1bSDebojyoti Ghosh   Vec             *Y = glee->Y, *YdotStage = glee->YdotStage;
520ec0e3ee2SEmil Constantinescu   PetscScalar     *ws = glee->swork, *wr = glee->rwork;
5212302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
5222302aa1bSDebojyoti Ghosh 
5232302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
5242302aa1bSDebojyoti Ghosh 
5252302aa1bSDebojyoti Ghosh   switch (glee->status) {
5262302aa1bSDebojyoti Ghosh     case TS_STEP_INCOMPLETE:
5272302aa1bSDebojyoti Ghosh     case TS_STEP_PENDING:
5282302aa1bSDebojyoti Ghosh       h = ts->time_step; break;
5292302aa1bSDebojyoti Ghosh     case TS_STEP_COMPLETE:
530ed450d42SEmil Constantinescu       h = ts->ptime - ts->ptime_prev; break;
5312302aa1bSDebojyoti Ghosh     default: SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_PLIB,"Invalid TSStepStatus");
5322302aa1bSDebojyoti Ghosh   }
5332302aa1bSDebojyoti Ghosh 
5342302aa1bSDebojyoti Ghosh   if (order == tab->order) {
5352302aa1bSDebojyoti Ghosh 
5362302aa1bSDebojyoti Ghosh     /* Note: Irrespective of whether status is TS_STEP_INCOMPLETE
537fd96ebc2SDebojyoti Ghosh              or TS_STEP_COMPLETE, glee->X has the solution at the
5382302aa1bSDebojyoti Ghosh              beginning of the time step. So no need to roll-back.
5392302aa1bSDebojyoti Ghosh     */
5402302aa1bSDebojyoti Ghosh     if (glee->status == TS_STEP_INCOMPLETE) {
5412302aa1bSDebojyoti Ghosh       for (i=0; i<r; i++) {
5422302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(Y[i]);CHKERRQ(ierr);
543ec0e3ee2SEmil Constantinescu         for (j=0; j<r; j++) wr[j] = V[i*r+j];
544ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(Y[i],r,wr,glee->X);CHKERRQ(ierr);
545ec0e3ee2SEmil Constantinescu         for (j=0; j<s; j++) ws[j] = h*B[i*s+j];
546ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(Y[i],s,ws,YdotStage);CHKERRQ(ierr);
5472302aa1bSDebojyoti Ghosh       }
5482302aa1bSDebojyoti Ghosh       ierr = VecZeroEntries(X);CHKERRQ(ierr);
549ec0e3ee2SEmil Constantinescu       for (j=0; j<r; j++) wr[j] = F[j];
550ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(X,r,wr,Y);CHKERRQ(ierr);
5512302aa1bSDebojyoti Ghosh     } else {ierr = VecCopy(ts->vec_sol,X);CHKERRQ(ierr);}
5522302aa1bSDebojyoti Ghosh     PetscFunctionReturn(0);
5532302aa1bSDebojyoti Ghosh 
5542302aa1bSDebojyoti Ghosh   } else if (order == tab->order-1) {
5552302aa1bSDebojyoti Ghosh 
5562302aa1bSDebojyoti Ghosh     /* Complete with the embedded method (Fembed) */
5572302aa1bSDebojyoti Ghosh     for (i=0; i<r; i++) {
5582302aa1bSDebojyoti Ghosh       ierr = VecZeroEntries(Y[i]);CHKERRQ(ierr);
559ec0e3ee2SEmil Constantinescu       for (j=0; j<r; j++) wr[j] = V[i*r+j];
560ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(Y[i],r,wr,glee->X);CHKERRQ(ierr);
561ec0e3ee2SEmil Constantinescu       for (j=0; j<s; j++) ws[j] = h*B[i*s+j];
562ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(Y[i],s,ws,YdotStage);CHKERRQ(ierr);
5632302aa1bSDebojyoti Ghosh     }
5642302aa1bSDebojyoti Ghosh     ierr = VecZeroEntries(X);CHKERRQ(ierr);
565ec0e3ee2SEmil Constantinescu     for (j=0; j<r; j++) wr[j] = Fembed[j];
566ec0e3ee2SEmil Constantinescu     ierr = VecMAXPY(X,r,wr,Y);CHKERRQ(ierr);
567fd96ebc2SDebojyoti Ghosh 
5682302aa1bSDebojyoti Ghosh     if (done) *done = PETSC_TRUE;
5692302aa1bSDebojyoti Ghosh     PetscFunctionReturn(0);
5702302aa1bSDebojyoti Ghosh   }
5712302aa1bSDebojyoti Ghosh   if (done) *done = PETSC_FALSE;
5722302aa1bSDebojyoti 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);
5732302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
5742302aa1bSDebojyoti Ghosh }
5752302aa1bSDebojyoti Ghosh 
5762302aa1bSDebojyoti Ghosh static PetscErrorCode TSStep_GLEE(TS ts)
5772302aa1bSDebojyoti Ghosh {
5782302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
5792302aa1bSDebojyoti Ghosh   GLEETableau     tab = glee->tableau;
5802302aa1bSDebojyoti Ghosh   const PetscInt  s = tab->s, r = tab->r;
5812302aa1bSDebojyoti Ghosh   PetscReal       *A = tab->A, *U = tab->U,
5822302aa1bSDebojyoti Ghosh                   *F = tab->F,
5832302aa1bSDebojyoti Ghosh                   *c = tab->c;
5842302aa1bSDebojyoti Ghosh   Vec             *Y = glee->Y, *X = glee->X,
5852302aa1bSDebojyoti Ghosh                   *YStage = glee->YStage,
5862302aa1bSDebojyoti Ghosh                   *YdotStage = glee->YdotStage,
5872302aa1bSDebojyoti Ghosh                   W = glee->W;
5882302aa1bSDebojyoti Ghosh   SNES            snes;
589ec0e3ee2SEmil Constantinescu   PetscScalar     *ws = glee->swork, *wr = glee->rwork;
5902302aa1bSDebojyoti Ghosh   TSAdapt         adapt;
5912302aa1bSDebojyoti Ghosh   PetscInt        i,j,reject,next_scheme,its,lits;
5922302aa1bSDebojyoti Ghosh   PetscReal       next_time_step;
5932302aa1bSDebojyoti Ghosh   PetscReal       t;
5942302aa1bSDebojyoti Ghosh   PetscBool       accept;
5952302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
5962302aa1bSDebojyoti Ghosh 
5972302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
598642f3702SEmil Constantinescu   ierr = PetscCitationsRegister(citation,&cited);CHKERRQ(ierr);
599642f3702SEmil Constantinescu 
6002302aa1bSDebojyoti Ghosh   for (i=0; i<r; i++) { ierr = VecCopy(Y[i],X[i]);CHKERRQ(ierr); }
6012302aa1bSDebojyoti Ghosh 
6022302aa1bSDebojyoti Ghosh   ierr           = TSGetSNES(ts,&snes);CHKERRQ(ierr);
6032302aa1bSDebojyoti Ghosh   next_time_step = ts->time_step;
6042302aa1bSDebojyoti Ghosh   t              = ts->ptime;
6052302aa1bSDebojyoti Ghosh   accept         = PETSC_TRUE;
6062302aa1bSDebojyoti Ghosh   glee->status   = TS_STEP_INCOMPLETE;
6072302aa1bSDebojyoti Ghosh 
6082302aa1bSDebojyoti Ghosh   for (reject=0; reject<ts->max_reject && !ts->reason; reject++,ts->reject++) {
6092302aa1bSDebojyoti Ghosh 
6102302aa1bSDebojyoti Ghosh     PetscReal h = ts->time_step;
6112302aa1bSDebojyoti Ghosh     ierr = TSPreStep(ts);CHKERRQ(ierr);
6122302aa1bSDebojyoti Ghosh 
6132302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) {
6142302aa1bSDebojyoti Ghosh 
6152302aa1bSDebojyoti Ghosh       glee->stage_time = t + h*c[i];
6162302aa1bSDebojyoti Ghosh       ierr = TSPreStage(ts,glee->stage_time);CHKERRQ(ierr);
6172302aa1bSDebojyoti Ghosh 
6182302aa1bSDebojyoti Ghosh       if (A[i*s+i] == 0) {  /* Explicit stage */
6192302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(YStage[i]);CHKERRQ(ierr);
620ec0e3ee2SEmil Constantinescu         for (j=0; j<r; j++) wr[j] = U[i*r+j];
621ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(YStage[i],r,wr,X);CHKERRQ(ierr);
622ec0e3ee2SEmil Constantinescu         for (j=0; j<i; j++) ws[j] = h*A[i*s+j];
623ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(YStage[i],i,ws,YdotStage);CHKERRQ(ierr);
6242302aa1bSDebojyoti Ghosh       } else {              /* Implicit stage */
6252302aa1bSDebojyoti Ghosh         glee->scoeff = 1.0/A[i*s+i];
6262302aa1bSDebojyoti Ghosh         /* compute right-hand-side */
6272302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(W);CHKERRQ(ierr);
628ec0e3ee2SEmil Constantinescu         for (j=0; j<r; j++) wr[j] = U[i*r+j];
629ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(W,r,wr,X);CHKERRQ(ierr);
630ec0e3ee2SEmil Constantinescu         for (j=0; j<i; j++) ws[j] = h*A[i*s+j];
631ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(W,i,ws,YdotStage);CHKERRQ(ierr);
6322302aa1bSDebojyoti Ghosh         ierr = VecScale(W,glee->scoeff/h);CHKERRQ(ierr);
6332302aa1bSDebojyoti Ghosh         /* set initial guess */
6342302aa1bSDebojyoti Ghosh         ierr = VecCopy(i>0 ? YStage[i-1] : ts->vec_sol,YStage[i]);CHKERRQ(ierr);
6352302aa1bSDebojyoti Ghosh         /* solve for this stage */
6362302aa1bSDebojyoti Ghosh         ierr = SNESSolve(snes,W,YStage[i]);CHKERRQ(ierr);
6372302aa1bSDebojyoti Ghosh         ierr = SNESGetIterationNumber(snes,&its);CHKERRQ(ierr);
6382302aa1bSDebojyoti Ghosh         ierr = SNESGetLinearSolveIterations(snes,&lits);CHKERRQ(ierr);
6392302aa1bSDebojyoti Ghosh         ts->snes_its += its; ts->ksp_its += lits;
6402302aa1bSDebojyoti Ghosh       }
6412302aa1bSDebojyoti Ghosh       ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr);
642d6629dc5SEmil Constantinescu       ierr = TSAdaptCheckStage(adapt,ts,glee->stage_time,YStage[i],&accept);CHKERRQ(ierr);
6432302aa1bSDebojyoti Ghosh       if (!accept) goto reject_step;
6442302aa1bSDebojyoti Ghosh       ierr = TSPostStage(ts,glee->stage_time,i,YStage);CHKERRQ(ierr);
6452302aa1bSDebojyoti Ghosh       ierr = TSComputeRHSFunction(ts,t+h*c[i],YStage[i],YdotStage[i]);CHKERRQ(ierr);
6462302aa1bSDebojyoti Ghosh     }
6472302aa1bSDebojyoti Ghosh     ierr = TSEvaluateStep(ts,tab->order,ts->vec_sol,NULL);CHKERRQ(ierr);
6482302aa1bSDebojyoti Ghosh     glee->status = TS_STEP_PENDING;
6492302aa1bSDebojyoti Ghosh 
6502302aa1bSDebojyoti Ghosh     /* Register only the current method as a candidate because we're not supporting multiple candidates yet. */
6512302aa1bSDebojyoti Ghosh     ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr);
6522302aa1bSDebojyoti Ghosh     ierr = TSAdaptCandidatesClear(adapt);CHKERRQ(ierr);
6531917a363SLisandro Dalcin     ierr = TSAdaptCandidateAdd(adapt,tab->name,tab->order,1,tab->ccfl,(PetscReal)tab->s,PETSC_TRUE);CHKERRQ(ierr);
6542302aa1bSDebojyoti Ghosh     ierr = TSAdaptChoose(adapt,ts,ts->time_step,&next_scheme,&next_time_step,&accept);CHKERRQ(ierr);
6552302aa1bSDebojyoti Ghosh     if (accept) {
6562302aa1bSDebojyoti Ghosh       /* ignore next_scheme for now */
6572302aa1bSDebojyoti Ghosh       ts->ptime     += ts->time_step;
6582302aa1bSDebojyoti Ghosh       ts->time_step  = next_time_step;
6592302aa1bSDebojyoti Ghosh       glee->status = TS_STEP_COMPLETE;
6600a01e1b2SEmil Constantinescu       /* compute and store the global error */
6610a01e1b2SEmil Constantinescu       /* Note: this is not needed if TSAdaptGLEE is not used */
6620a01e1b2SEmil Constantinescu       ierr = TSGetTimeError(ts,0,&(glee->yGErr));CHKERRQ(ierr);
6632302aa1bSDebojyoti Ghosh       ierr = PetscObjectComposedDataSetReal((PetscObject)ts->vec_sol,explicit_stage_time_id,ts->ptime);CHKERRQ(ierr);
6642302aa1bSDebojyoti Ghosh       break;
6652302aa1bSDebojyoti Ghosh     } else {                    /* Roll back the current step */
666ec0e3ee2SEmil Constantinescu       for (j=0; j<r; j++) wr[j] = F[j];
667ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(ts->vec_sol,r,wr,X);CHKERRQ(ierr);
6682302aa1bSDebojyoti Ghosh       ts->time_step = next_time_step;
6692302aa1bSDebojyoti Ghosh       glee->status  = TS_STEP_INCOMPLETE;
6702302aa1bSDebojyoti Ghosh     }
6712302aa1bSDebojyoti Ghosh reject_step: continue;
6722302aa1bSDebojyoti Ghosh   }
6732302aa1bSDebojyoti Ghosh   if (glee->status != TS_STEP_COMPLETE && !ts->reason) ts->reason = TS_DIVERGED_STEP_REJECTED;
6742302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
6752302aa1bSDebojyoti Ghosh }
6762302aa1bSDebojyoti Ghosh 
6772302aa1bSDebojyoti Ghosh static PetscErrorCode TSInterpolate_GLEE(TS ts,PetscReal itime,Vec X)
6782302aa1bSDebojyoti Ghosh {
6792302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
6802302aa1bSDebojyoti Ghosh   PetscInt        s=glee->tableau->s, pinterp=glee->tableau->pinterp,i,j;
6812302aa1bSDebojyoti Ghosh   PetscReal       h,tt,t;
6822302aa1bSDebojyoti Ghosh   PetscScalar     *b;
6832302aa1bSDebojyoti Ghosh   const PetscReal *B = glee->tableau->binterp;
6842302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
6852302aa1bSDebojyoti Ghosh 
6862302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
6872302aa1bSDebojyoti Ghosh   if (!B) SETERRQ1(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"TSGLEE %s does not have an interpolation formula",glee->tableau->name);
6882302aa1bSDebojyoti Ghosh   switch (glee->status) {
6892302aa1bSDebojyoti Ghosh     case TS_STEP_INCOMPLETE:
6902302aa1bSDebojyoti Ghosh     case TS_STEP_PENDING:
6912302aa1bSDebojyoti Ghosh       h = ts->time_step;
6922302aa1bSDebojyoti Ghosh       t = (itime - ts->ptime)/h;
6932302aa1bSDebojyoti Ghosh       break;
6942302aa1bSDebojyoti Ghosh     case TS_STEP_COMPLETE:
695ed450d42SEmil Constantinescu       h = ts->ptime - ts->ptime_prev;
6962302aa1bSDebojyoti Ghosh       t = (itime - ts->ptime)/h + 1; /* In the interval [0,1] */
6972302aa1bSDebojyoti Ghosh       break;
6982302aa1bSDebojyoti Ghosh     default: SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_PLIB,"Invalid TSStepStatus");
6992302aa1bSDebojyoti Ghosh   }
7002302aa1bSDebojyoti Ghosh   ierr = PetscMalloc1(s,&b);CHKERRQ(ierr);
7012302aa1bSDebojyoti Ghosh   for (i=0; i<s; i++) b[i] = 0;
7022302aa1bSDebojyoti Ghosh   for (j=0,tt=t; j<pinterp; j++,tt*=t) {
7032302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) {
7042302aa1bSDebojyoti Ghosh       b[i]  += h * B[i*pinterp+j] * tt;
7052302aa1bSDebojyoti Ghosh     }
7062302aa1bSDebojyoti Ghosh   }
7072302aa1bSDebojyoti Ghosh   ierr = VecCopy(glee->YStage[0],X);CHKERRQ(ierr);
7082302aa1bSDebojyoti Ghosh   ierr = VecMAXPY(X,s,b,glee->YdotStage);CHKERRQ(ierr);
7092302aa1bSDebojyoti Ghosh   ierr = PetscFree(b);CHKERRQ(ierr);
7102302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7112302aa1bSDebojyoti Ghosh }
7122302aa1bSDebojyoti Ghosh 
7132302aa1bSDebojyoti Ghosh /*------------------------------------------------------------*/
7142302aa1bSDebojyoti Ghosh static PetscErrorCode TSReset_GLEE(TS ts)
7152302aa1bSDebojyoti Ghosh {
7162302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
7172302aa1bSDebojyoti Ghosh   PetscInt       s, r;
7182302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7192302aa1bSDebojyoti Ghosh 
7202302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7212302aa1bSDebojyoti Ghosh   if (!glee->tableau) PetscFunctionReturn(0);
7222302aa1bSDebojyoti Ghosh   s    = glee->tableau->s;
7232302aa1bSDebojyoti Ghosh   r    = glee->tableau->r;
7242302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(r,&glee->Y);CHKERRQ(ierr);
7252302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(r,&glee->X);CHKERRQ(ierr);
7262302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(s,&glee->YStage);CHKERRQ(ierr);
7272302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(s,&glee->YdotStage);CHKERRQ(ierr);
7282302aa1bSDebojyoti Ghosh   ierr = VecDestroy(&glee->Ydot);CHKERRQ(ierr);
7290a01e1b2SEmil Constantinescu   ierr = VecDestroy(&glee->yGErr);CHKERRQ(ierr);
7302302aa1bSDebojyoti Ghosh   ierr = VecDestroy(&glee->W);CHKERRQ(ierr);
731ec0e3ee2SEmil Constantinescu   ierr = PetscFree2(glee->swork,glee->rwork);CHKERRQ(ierr);
7322302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7332302aa1bSDebojyoti Ghosh }
7342302aa1bSDebojyoti Ghosh 
7352302aa1bSDebojyoti Ghosh static PetscErrorCode TSGLEEGetVecs(TS ts,DM dm,Vec *Ydot)
7362302aa1bSDebojyoti Ghosh {
7372302aa1bSDebojyoti Ghosh   TS_GLEE     *glee = (TS_GLEE*)ts->data;
7382302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7392302aa1bSDebojyoti Ghosh 
7402302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7412302aa1bSDebojyoti Ghosh   if (Ydot) {
7422302aa1bSDebojyoti Ghosh     if (dm && dm != ts->dm) {
7432302aa1bSDebojyoti Ghosh       ierr = DMGetNamedGlobalVector(dm,"TSGLEE_Ydot",Ydot);CHKERRQ(ierr);
7442302aa1bSDebojyoti Ghosh     } else *Ydot = glee->Ydot;
7452302aa1bSDebojyoti Ghosh   }
7462302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7472302aa1bSDebojyoti Ghosh }
7482302aa1bSDebojyoti Ghosh 
7492302aa1bSDebojyoti Ghosh 
7502302aa1bSDebojyoti Ghosh static PetscErrorCode TSGLEERestoreVecs(TS ts,DM dm,Vec *Ydot)
7512302aa1bSDebojyoti Ghosh {
7522302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7532302aa1bSDebojyoti Ghosh 
7542302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7552302aa1bSDebojyoti Ghosh   if (Ydot) {
7562302aa1bSDebojyoti Ghosh     if (dm && dm != ts->dm) {
7572302aa1bSDebojyoti Ghosh       ierr = DMRestoreNamedGlobalVector(dm,"TSGLEE_Ydot",Ydot);CHKERRQ(ierr);
7582302aa1bSDebojyoti Ghosh     }
7592302aa1bSDebojyoti Ghosh   }
7602302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7612302aa1bSDebojyoti Ghosh }
7622302aa1bSDebojyoti Ghosh 
7632302aa1bSDebojyoti Ghosh /*
7642302aa1bSDebojyoti Ghosh   This defines the nonlinear equation that is to be solved with SNES
7652302aa1bSDebojyoti Ghosh */
7662302aa1bSDebojyoti Ghosh static PetscErrorCode SNESTSFormFunction_GLEE(SNES snes,Vec X,Vec F,TS ts)
7672302aa1bSDebojyoti Ghosh {
7682302aa1bSDebojyoti Ghosh   TS_GLEE       *glee = (TS_GLEE*)ts->data;
7692302aa1bSDebojyoti Ghosh   DM             dm,dmsave;
7702302aa1bSDebojyoti Ghosh   Vec            Ydot;
7712302aa1bSDebojyoti Ghosh   PetscReal      shift = glee->scoeff / ts->time_step;
7722302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7732302aa1bSDebojyoti Ghosh 
7742302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7752302aa1bSDebojyoti Ghosh   ierr   = SNESGetDM(snes,&dm);CHKERRQ(ierr);
7762302aa1bSDebojyoti Ghosh   ierr   = TSGLEEGetVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7772302aa1bSDebojyoti Ghosh   /* Set Ydot = shift*X */
7782302aa1bSDebojyoti Ghosh   ierr   = VecCopy(X,Ydot);CHKERRQ(ierr);
7792302aa1bSDebojyoti Ghosh   ierr   = VecScale(Ydot,shift);CHKERRQ(ierr);
7802302aa1bSDebojyoti Ghosh   dmsave = ts->dm;
7812302aa1bSDebojyoti Ghosh   ts->dm = dm;
7822302aa1bSDebojyoti Ghosh 
7832302aa1bSDebojyoti Ghosh   ierr = TSComputeIFunction(ts,glee->stage_time,X,Ydot,F,PETSC_FALSE);CHKERRQ(ierr);
7842302aa1bSDebojyoti Ghosh 
7852302aa1bSDebojyoti Ghosh   ts->dm = dmsave;
7862302aa1bSDebojyoti Ghosh   ierr   = TSGLEERestoreVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7872302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7882302aa1bSDebojyoti Ghosh }
7892302aa1bSDebojyoti Ghosh 
7902302aa1bSDebojyoti Ghosh static PetscErrorCode SNESTSFormJacobian_GLEE(SNES snes,Vec X,Mat A,Mat B,TS ts)
7912302aa1bSDebojyoti Ghosh {
7922302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
7932302aa1bSDebojyoti Ghosh   DM             dm,dmsave;
7942302aa1bSDebojyoti Ghosh   Vec            Ydot;
7952302aa1bSDebojyoti Ghosh   PetscReal      shift = glee->scoeff / ts->time_step;
7962302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7972302aa1bSDebojyoti Ghosh 
7982302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7992302aa1bSDebojyoti Ghosh   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
8002302aa1bSDebojyoti Ghosh   ierr = TSGLEEGetVecs(ts,dm,&Ydot);CHKERRQ(ierr);
8012302aa1bSDebojyoti Ghosh   /* glee->Ydot has already been computed in SNESTSFormFunction_GLEE (SNES guarantees this) */
8022302aa1bSDebojyoti Ghosh   dmsave = ts->dm;
8032302aa1bSDebojyoti Ghosh   ts->dm = dm;
8042302aa1bSDebojyoti Ghosh 
8052302aa1bSDebojyoti Ghosh   ierr = TSComputeIJacobian(ts,glee->stage_time,X,Ydot,shift,A,B,PETSC_FALSE);CHKERRQ(ierr);
8062302aa1bSDebojyoti Ghosh 
8072302aa1bSDebojyoti Ghosh   ts->dm = dmsave;
8082302aa1bSDebojyoti Ghosh   ierr   = TSGLEERestoreVecs(ts,dm,&Ydot);CHKERRQ(ierr);
8092302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8102302aa1bSDebojyoti Ghosh }
8112302aa1bSDebojyoti Ghosh 
8122302aa1bSDebojyoti Ghosh static PetscErrorCode DMCoarsenHook_TSGLEE(DM fine,DM coarse,void *ctx)
8132302aa1bSDebojyoti Ghosh {
8142302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8152302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8162302aa1bSDebojyoti Ghosh }
8172302aa1bSDebojyoti Ghosh 
8182302aa1bSDebojyoti Ghosh static PetscErrorCode DMRestrictHook_TSGLEE(DM fine,Mat restrct,Vec rscale,Mat inject,DM coarse,void *ctx)
8192302aa1bSDebojyoti Ghosh {
8202302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8212302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8222302aa1bSDebojyoti Ghosh }
8232302aa1bSDebojyoti Ghosh 
8242302aa1bSDebojyoti Ghosh 
8252302aa1bSDebojyoti Ghosh static PetscErrorCode DMSubDomainHook_TSGLEE(DM dm,DM subdm,void *ctx)
8262302aa1bSDebojyoti Ghosh {
8272302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8282302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8292302aa1bSDebojyoti Ghosh }
8302302aa1bSDebojyoti Ghosh 
8312302aa1bSDebojyoti Ghosh static PetscErrorCode DMSubDomainRestrictHook_TSGLEE(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
8322302aa1bSDebojyoti Ghosh {
8332302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8342302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8352302aa1bSDebojyoti Ghosh }
8362302aa1bSDebojyoti Ghosh 
8372302aa1bSDebojyoti Ghosh static PetscErrorCode TSSetUp_GLEE(TS ts)
8382302aa1bSDebojyoti Ghosh {
8392302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
8402302aa1bSDebojyoti Ghosh   GLEETableau    tab;
8412302aa1bSDebojyoti Ghosh   PetscInt       s,r;
8422302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8432302aa1bSDebojyoti Ghosh   DM             dm;
8442302aa1bSDebojyoti Ghosh 
8452302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8462302aa1bSDebojyoti Ghosh   if (!glee->tableau) {
8472302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,TSGLEEDefaultType);CHKERRQ(ierr);
8482302aa1bSDebojyoti Ghosh   }
8492302aa1bSDebojyoti Ghosh   tab  = glee->tableau;
8502302aa1bSDebojyoti Ghosh   s    = tab->s;
8512302aa1bSDebojyoti Ghosh   r    = tab->r;
8522302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,r,&glee->Y);CHKERRQ(ierr);
8532302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,r,&glee->X);CHKERRQ(ierr);
8542302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,s,&glee->YStage);CHKERRQ(ierr);
8552302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,s,&glee->YdotStage);CHKERRQ(ierr);
8562302aa1bSDebojyoti Ghosh   ierr = VecDuplicate(ts->vec_sol,&glee->Ydot);CHKERRQ(ierr);
8570a01e1b2SEmil Constantinescu   ierr = VecDuplicate(ts->vec_sol,&glee->yGErr);CHKERRQ(ierr);
858657c1e31SEmil Constantinescu   ierr = VecZeroEntries(glee->yGErr);CHKERRQ(ierr);
8592302aa1bSDebojyoti Ghosh   ierr = VecDuplicate(ts->vec_sol,&glee->W);CHKERRQ(ierr);
860ec0e3ee2SEmil Constantinescu   ierr = PetscMalloc2(s,&glee->swork,r,&glee->rwork);CHKERRQ(ierr);
8612302aa1bSDebojyoti Ghosh   ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
8622302aa1bSDebojyoti Ghosh   ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_TSGLEE,DMRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
8632302aa1bSDebojyoti Ghosh   ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_TSGLEE,DMSubDomainRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
8642302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8652302aa1bSDebojyoti Ghosh }
8662302aa1bSDebojyoti Ghosh 
8672302aa1bSDebojyoti Ghosh PetscErrorCode TSStartingMethod_GLEE(TS ts)
8682302aa1bSDebojyoti Ghosh {
8692302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
8706e2e232bSDebojyoti Ghosh   GLEETableau    tab  = glee->tableau;
8716e2e232bSDebojyoti Ghosh   PetscInt       r=tab->r,i;
8726e2e232bSDebojyoti Ghosh   PetscReal      *S=tab->S;
8732302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8742302aa1bSDebojyoti Ghosh 
8752302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8762302aa1bSDebojyoti Ghosh   for (i=0; i<r; i++) {
8772302aa1bSDebojyoti Ghosh     ierr = VecZeroEntries(glee->Y[i]);CHKERRQ(ierr);
8782302aa1bSDebojyoti Ghosh     ierr = VecAXPY(glee->Y[i],S[i],ts->vec_sol);CHKERRQ(ierr);
8792302aa1bSDebojyoti Ghosh   }
8802302aa1bSDebojyoti Ghosh 
8812302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8822302aa1bSDebojyoti Ghosh }
8832302aa1bSDebojyoti Ghosh 
8842302aa1bSDebojyoti Ghosh 
8852302aa1bSDebojyoti Ghosh /*------------------------------------------------------------*/
8862302aa1bSDebojyoti Ghosh 
8876b234c65SEmil Constantinescu static PetscErrorCode TSSetFromOptions_GLEE(PetscOptionItems *PetscOptionsObject,TS ts)
8882302aa1bSDebojyoti Ghosh {
8892302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8902302aa1bSDebojyoti Ghosh   char           gleetype[256];
8912302aa1bSDebojyoti Ghosh 
8922302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8932302aa1bSDebojyoti Ghosh   ierr = PetscOptionsHead(PetscOptionsObject,"GLEE ODE solver options");CHKERRQ(ierr);
8942302aa1bSDebojyoti Ghosh   {
8952302aa1bSDebojyoti Ghosh     GLEETableauLink link;
8962302aa1bSDebojyoti Ghosh     PetscInt        count,choice;
8972302aa1bSDebojyoti Ghosh     PetscBool       flg;
8982302aa1bSDebojyoti Ghosh     const char      **namelist;
8992302aa1bSDebojyoti Ghosh 
9002302aa1bSDebojyoti Ghosh     ierr = PetscStrncpy(gleetype,TSGLEEDefaultType,sizeof(gleetype));CHKERRQ(ierr);
9012302aa1bSDebojyoti Ghosh     for (link=GLEETableauList,count=0; link; link=link->next,count++) ;
902f489ac74SBarry Smith     ierr = PetscMalloc1(count,(char***)&namelist);CHKERRQ(ierr);
9032302aa1bSDebojyoti Ghosh     for (link=GLEETableauList,count=0; link; link=link->next,count++) namelist[count] = link->tab.name;
9042302aa1bSDebojyoti Ghosh     ierr = PetscOptionsEList("-ts_glee_type","Family of GLEE method","TSGLEESetType",(const char*const*)namelist,count,gleetype,&choice,&flg);CHKERRQ(ierr);
9052302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,flg ? namelist[choice] : gleetype);CHKERRQ(ierr);
9062302aa1bSDebojyoti Ghosh     ierr = PetscFree(namelist);CHKERRQ(ierr);
9072302aa1bSDebojyoti Ghosh   }
9082302aa1bSDebojyoti Ghosh   ierr = PetscOptionsTail();CHKERRQ(ierr);
9092302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9102302aa1bSDebojyoti Ghosh }
9112302aa1bSDebojyoti Ghosh 
9122302aa1bSDebojyoti Ghosh static PetscErrorCode TSView_GLEE(TS ts,PetscViewer viewer)
9132302aa1bSDebojyoti Ghosh {
9142302aa1bSDebojyoti Ghosh   TS_GLEE        *glee   = (TS_GLEE*)ts->data;
9152302aa1bSDebojyoti Ghosh   GLEETableau    tab  = glee->tableau;
9162302aa1bSDebojyoti Ghosh   PetscBool      iascii;
9172302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9182302aa1bSDebojyoti Ghosh 
9192302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9202302aa1bSDebojyoti Ghosh   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
9212302aa1bSDebojyoti Ghosh   if (iascii) {
9222302aa1bSDebojyoti Ghosh     TSGLEEType gleetype;
9232302aa1bSDebojyoti Ghosh     char       buf[512];
9242302aa1bSDebojyoti Ghosh     ierr = TSGLEEGetType(ts,&gleetype);CHKERRQ(ierr);
925efd4aadfSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  GLEE type %s\n",gleetype);CHKERRQ(ierr);
9262302aa1bSDebojyoti Ghosh     ierr = PetscFormatRealArray(buf,sizeof(buf),"% 8.6f",tab->s,tab->c);CHKERRQ(ierr);
9272302aa1bSDebojyoti Ghosh     ierr = PetscViewerASCIIPrintf(viewer,"  Abscissa     c = %s\n",buf);CHKERRQ(ierr);
9282302aa1bSDebojyoti Ghosh     /* Note: print out r as well */
9292302aa1bSDebojyoti Ghosh   }
9302302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9312302aa1bSDebojyoti Ghosh }
9322302aa1bSDebojyoti Ghosh 
9332302aa1bSDebojyoti Ghosh static PetscErrorCode TSLoad_GLEE(TS ts,PetscViewer viewer)
9342302aa1bSDebojyoti Ghosh {
9352302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9362302aa1bSDebojyoti Ghosh   SNES           snes;
9372302aa1bSDebojyoti Ghosh   TSAdapt        tsadapt;
9382302aa1bSDebojyoti Ghosh 
9392302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9402302aa1bSDebojyoti Ghosh   ierr = TSGetAdapt(ts,&tsadapt);CHKERRQ(ierr);
9412302aa1bSDebojyoti Ghosh   ierr = TSAdaptLoad(tsadapt,viewer);CHKERRQ(ierr);
9422302aa1bSDebojyoti Ghosh   ierr = TSGetSNES(ts,&snes);CHKERRQ(ierr);
9432302aa1bSDebojyoti Ghosh   ierr = SNESLoad(snes,viewer);CHKERRQ(ierr);
9442302aa1bSDebojyoti Ghosh   /* function and Jacobian context for SNES when used with TS is always ts object */
9452302aa1bSDebojyoti Ghosh   ierr = SNESSetFunction(snes,NULL,NULL,ts);CHKERRQ(ierr);
9462302aa1bSDebojyoti Ghosh   ierr = SNESSetJacobian(snes,NULL,NULL,NULL,ts);CHKERRQ(ierr);
9472302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9482302aa1bSDebojyoti Ghosh }
9492302aa1bSDebojyoti Ghosh 
9502302aa1bSDebojyoti Ghosh /*@C
9512302aa1bSDebojyoti Ghosh   TSGLEESetType - Set the type of GLEE scheme
9522302aa1bSDebojyoti Ghosh 
9532302aa1bSDebojyoti Ghosh   Logically collective
9542302aa1bSDebojyoti Ghosh 
9552302aa1bSDebojyoti Ghosh   Input Parameter:
9562302aa1bSDebojyoti Ghosh +  ts - timestepping context
9572302aa1bSDebojyoti Ghosh -  gleetype - type of GLEE-scheme
9582302aa1bSDebojyoti Ghosh 
9592302aa1bSDebojyoti Ghosh   Level: intermediate
9602302aa1bSDebojyoti Ghosh 
9612302aa1bSDebojyoti Ghosh .seealso: TSGLEEGetType(), TSGLEE
9622302aa1bSDebojyoti Ghosh @*/
9632302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEESetType(TS ts,TSGLEEType gleetype)
9642302aa1bSDebojyoti Ghosh {
9652302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9662302aa1bSDebojyoti Ghosh 
9672302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9682302aa1bSDebojyoti Ghosh   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
969b92453a8SLisandro Dalcin   PetscValidCharPointer(gleetype,2);
9702302aa1bSDebojyoti Ghosh   ierr = PetscTryMethod(ts,"TSGLEESetType_C",(TS,TSGLEEType),(ts,gleetype));CHKERRQ(ierr);
9712302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9722302aa1bSDebojyoti Ghosh }
9732302aa1bSDebojyoti Ghosh 
9742302aa1bSDebojyoti Ghosh /*@C
9752302aa1bSDebojyoti Ghosh   TSGLEEGetType - Get the type of GLEE scheme
9762302aa1bSDebojyoti Ghosh 
9772302aa1bSDebojyoti Ghosh   Logically collective
9782302aa1bSDebojyoti Ghosh 
9792302aa1bSDebojyoti Ghosh   Input Parameter:
9802302aa1bSDebojyoti Ghosh .  ts - timestepping context
9812302aa1bSDebojyoti Ghosh 
9822302aa1bSDebojyoti Ghosh   Output Parameter:
9832302aa1bSDebojyoti Ghosh .  gleetype - type of GLEE-scheme
9842302aa1bSDebojyoti Ghosh 
9852302aa1bSDebojyoti Ghosh   Level: intermediate
9862302aa1bSDebojyoti Ghosh 
9872302aa1bSDebojyoti Ghosh .seealso: TSGLEESetType()
9882302aa1bSDebojyoti Ghosh @*/
9892302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEGetType(TS ts,TSGLEEType *gleetype)
9902302aa1bSDebojyoti Ghosh {
9912302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9922302aa1bSDebojyoti Ghosh 
9932302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9942302aa1bSDebojyoti Ghosh   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
9952302aa1bSDebojyoti Ghosh   ierr = PetscUseMethod(ts,"TSGLEEGetType_C",(TS,TSGLEEType*),(ts,gleetype));CHKERRQ(ierr);
9962302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9972302aa1bSDebojyoti Ghosh }
9982302aa1bSDebojyoti Ghosh 
9992302aa1bSDebojyoti Ghosh PetscErrorCode  TSGLEEGetType_GLEE(TS ts,TSGLEEType *gleetype)
10002302aa1bSDebojyoti Ghosh {
10012302aa1bSDebojyoti Ghosh   TS_GLEE     *glee = (TS_GLEE*)ts->data;
10022302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
10032302aa1bSDebojyoti Ghosh 
10042302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10052302aa1bSDebojyoti Ghosh   if (!glee->tableau) {
10062302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,TSGLEEDefaultType);CHKERRQ(ierr);
10072302aa1bSDebojyoti Ghosh   }
10082302aa1bSDebojyoti Ghosh   *gleetype = glee->tableau->name;
10092302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10102302aa1bSDebojyoti Ghosh }
10112302aa1bSDebojyoti Ghosh PetscErrorCode  TSGLEESetType_GLEE(TS ts,TSGLEEType gleetype)
10122302aa1bSDebojyoti Ghosh {
10132302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10142302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
10152302aa1bSDebojyoti Ghosh   PetscBool       match;
10162302aa1bSDebojyoti Ghosh   GLEETableauLink link;
10172302aa1bSDebojyoti Ghosh 
10182302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10192302aa1bSDebojyoti Ghosh   if (glee->tableau) {
10202302aa1bSDebojyoti Ghosh     ierr = PetscStrcmp(glee->tableau->name,gleetype,&match);CHKERRQ(ierr);
10212302aa1bSDebojyoti Ghosh     if (match) PetscFunctionReturn(0);
10222302aa1bSDebojyoti Ghosh   }
10232302aa1bSDebojyoti Ghosh   for (link = GLEETableauList; link; link=link->next) {
10242302aa1bSDebojyoti Ghosh     ierr = PetscStrcmp(link->tab.name,gleetype,&match);CHKERRQ(ierr);
10252302aa1bSDebojyoti Ghosh     if (match) {
10262302aa1bSDebojyoti Ghosh       ierr = TSReset_GLEE(ts);CHKERRQ(ierr);
10272302aa1bSDebojyoti Ghosh       glee->tableau = &link->tab;
10282302aa1bSDebojyoti Ghosh       PetscFunctionReturn(0);
10292302aa1bSDebojyoti Ghosh     }
10302302aa1bSDebojyoti Ghosh   }
10312302aa1bSDebojyoti Ghosh   SETERRQ1(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_UNKNOWN_TYPE,"Could not find '%s'",gleetype);
10322302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10332302aa1bSDebojyoti Ghosh }
10342302aa1bSDebojyoti Ghosh 
10352302aa1bSDebojyoti Ghosh static PetscErrorCode  TSGetStages_GLEE(TS ts,PetscInt *ns,Vec **Y)
10362302aa1bSDebojyoti Ghosh {
10372302aa1bSDebojyoti Ghosh   TS_GLEE *glee = (TS_GLEE*)ts->data;
10382302aa1bSDebojyoti Ghosh 
10392302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10400429704eSStefano Zampini   if (ns) *ns = glee->tableau->s;
1041d5509560SEmil Constantinescu   if (Y)  *Y  = glee->YStage;
10422302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10432302aa1bSDebojyoti Ghosh }
10442302aa1bSDebojyoti Ghosh 
1045b2bf4f3aSDebojyoti Ghosh PetscErrorCode TSGetSolutionComponents_GLEE(TS ts,PetscInt *n,Vec *Y)
10462302aa1bSDebojyoti Ghosh {
10472302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10482302aa1bSDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
10496e2e232bSDebojyoti Ghosh   PetscErrorCode  ierr;
10502302aa1bSDebojyoti Ghosh 
10512302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10524cdd57e5SDebojyoti Ghosh   if (!Y) *n = tab->r;
10532302aa1bSDebojyoti Ghosh   else {
10544cdd57e5SDebojyoti Ghosh     if ((*n >= 0) && (*n < tab->r)) {
10554cdd57e5SDebojyoti Ghosh       ierr = VecCopy(glee->Y[*n],*Y);CHKERRQ(ierr);
10569657682dSDebojyoti Ghosh     } else SETERRQ3(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_OUTOFRANGE,"Second argument (%d) out of range[%d,%d].",*n,0,tab->r-1);
10572302aa1bSDebojyoti Ghosh   }
10582302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10592302aa1bSDebojyoti Ghosh }
10602302aa1bSDebojyoti Ghosh 
10614cdd57e5SDebojyoti Ghosh PetscErrorCode TSGetAuxSolution_GLEE(TS ts,Vec *X)
10624cdd57e5SDebojyoti Ghosh {
10634cdd57e5SDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10644cdd57e5SDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
10654cdd57e5SDebojyoti Ghosh   PetscReal       *F    = tab->Fembed;
10664cdd57e5SDebojyoti Ghosh   PetscInt        r     = tab->r;
10674cdd57e5SDebojyoti Ghosh   Vec             *Y    = glee->Y;
1068ec0e3ee2SEmil Constantinescu   PetscScalar     *wr   = glee->rwork;
1069ec0e3ee2SEmil Constantinescu   PetscInt        i;
10704cdd57e5SDebojyoti Ghosh   PetscErrorCode  ierr;
10714cdd57e5SDebojyoti Ghosh 
10724cdd57e5SDebojyoti Ghosh   PetscFunctionBegin;
10734cdd57e5SDebojyoti Ghosh   ierr = VecZeroEntries(*X);CHKERRQ(ierr);
1074ec0e3ee2SEmil Constantinescu   for (i=0; i<r; i++) wr[i] = F[i];
1075ec0e3ee2SEmil Constantinescu   ierr = VecMAXPY((*X),r,wr,Y);CHKERRQ(ierr);
10764cdd57e5SDebojyoti Ghosh   PetscFunctionReturn(0);
10774cdd57e5SDebojyoti Ghosh }
10784cdd57e5SDebojyoti Ghosh 
10790a01e1b2SEmil Constantinescu PetscErrorCode TSGetTimeError_GLEE(TS ts,PetscInt n,Vec *X)
10804cdd57e5SDebojyoti Ghosh {
10814cdd57e5SDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10824cdd57e5SDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
10834cdd57e5SDebojyoti Ghosh   PetscReal       *F    = tab->Ferror;
10844cdd57e5SDebojyoti Ghosh   PetscInt        r     = tab->r;
10854cdd57e5SDebojyoti Ghosh   Vec             *Y    = glee->Y;
1086ec0e3ee2SEmil Constantinescu   PetscScalar     *wr   = glee->rwork;
1087ec0e3ee2SEmil Constantinescu   PetscInt        i;
10884cdd57e5SDebojyoti Ghosh   PetscErrorCode  ierr;
10894cdd57e5SDebojyoti Ghosh 
10904cdd57e5SDebojyoti Ghosh   PetscFunctionBegin;
10914cdd57e5SDebojyoti Ghosh   ierr = VecZeroEntries(*X);CHKERRQ(ierr);
1092657c1e31SEmil Constantinescu   if(n==0){
1093ec0e3ee2SEmil Constantinescu     for (i=0; i<r; i++) wr[i] = F[i];
1094ec0e3ee2SEmil Constantinescu     ierr = VecMAXPY((*X),r,wr,Y);CHKERRQ(ierr);
10950a01e1b2SEmil Constantinescu   } else if(n==-1) {
1096657c1e31SEmil Constantinescu     *X=glee->yGErr;
10970a01e1b2SEmil Constantinescu   }
10984cdd57e5SDebojyoti Ghosh   PetscFunctionReturn(0);
10994cdd57e5SDebojyoti Ghosh }
11004cdd57e5SDebojyoti Ghosh 
110157df6a1bSDebojyoti Ghosh PetscErrorCode TSSetTimeError_GLEE(TS ts,Vec X)
110257df6a1bSDebojyoti Ghosh {
110357df6a1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
110457df6a1bSDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
110557df6a1bSDebojyoti Ghosh   PetscReal       *S    = tab->Serror;
110657df6a1bSDebojyoti Ghosh   PetscInt        r     = tab->r,i;
110757df6a1bSDebojyoti Ghosh   Vec             *Y    = glee->Y;
110857df6a1bSDebojyoti Ghosh   PetscErrorCode  ierr;
110957df6a1bSDebojyoti Ghosh 
111057df6a1bSDebojyoti Ghosh   PetscFunctionBegin;
11119657682dSDebojyoti Ghosh   if (r != 2) SETERRQ2(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"TSSetTimeError_GLEE not supported for '%s' with r=%D.",tab->name,tab->r);
111257df6a1bSDebojyoti Ghosh   for (i=1; i<r; i++) {
111357df6a1bSDebojyoti Ghosh     ierr = VecCopy(ts->vec_sol,Y[i]);CHKERRQ(ierr);
111457df6a1bSDebojyoti Ghosh     ierr = VecAXPBY(Y[i],S[0],S[1],X);CHKERRQ(ierr);
1115642ca4e8SEmil Constantinescu     ierr = VecCopy(X,glee->yGErr);CHKERRQ(ierr);
111657df6a1bSDebojyoti Ghosh   }
111757df6a1bSDebojyoti Ghosh   PetscFunctionReturn(0);
111857df6a1bSDebojyoti Ghosh }
111957df6a1bSDebojyoti Ghosh 
1120b3a6b972SJed Brown static PetscErrorCode TSDestroy_GLEE(TS ts)
1121b3a6b972SJed Brown {
1122b3a6b972SJed Brown   PetscErrorCode ierr;
1123b3a6b972SJed Brown 
1124b3a6b972SJed Brown   PetscFunctionBegin;
1125b3a6b972SJed Brown   ierr = TSReset_GLEE(ts);CHKERRQ(ierr);
1126b3a6b972SJed Brown   if (ts->dm) {
1127b3a6b972SJed Brown     ierr = DMCoarsenHookRemove(ts->dm,DMCoarsenHook_TSGLEE,DMRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
1128b3a6b972SJed Brown     ierr = DMSubDomainHookRemove(ts->dm,DMSubDomainHook_TSGLEE,DMSubDomainRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
1129b3a6b972SJed Brown   }
1130b3a6b972SJed Brown   ierr = PetscFree(ts->data);CHKERRQ(ierr);
1131b3a6b972SJed Brown   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEEGetType_C",NULL);CHKERRQ(ierr);
1132b3a6b972SJed Brown   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEESetType_C",NULL);CHKERRQ(ierr);
1133b3a6b972SJed Brown   PetscFunctionReturn(0);
1134b3a6b972SJed Brown }
1135b3a6b972SJed Brown 
11362302aa1bSDebojyoti Ghosh /* ------------------------------------------------------------ */
11372302aa1bSDebojyoti Ghosh /*MC
11382302aa1bSDebojyoti Ghosh       TSGLEE - ODE and DAE solver using General Linear with Error Estimation schemes
11392302aa1bSDebojyoti Ghosh 
11402302aa1bSDebojyoti Ghosh   The user should provide the right hand side of the equation
11412302aa1bSDebojyoti Ghosh   using TSSetRHSFunction().
11422302aa1bSDebojyoti Ghosh 
11432302aa1bSDebojyoti Ghosh   Notes:
11442302aa1bSDebojyoti Ghosh   The default is TSGLEE35, it can be changed with TSGLEESetType() or -ts_glee_type
11452302aa1bSDebojyoti Ghosh 
11462302aa1bSDebojyoti Ghosh   Level: beginner
11472302aa1bSDebojyoti Ghosh 
11482302aa1bSDebojyoti Ghosh .seealso:  TSCreate(), TS, TSSetType(), TSGLEESetType(), TSGLEEGetType(),
11492302aa1bSDebojyoti Ghosh            TSGLEE23, TTSGLEE24, TSGLEE35, TSGLEE25I, TSGLEEEXRK2A,
11502302aa1bSDebojyoti Ghosh            TSGLEERK32G1, TSGLEERK285EX, TSGLEEType, TSGLEERegister()
11512302aa1bSDebojyoti Ghosh 
11522302aa1bSDebojyoti Ghosh M*/
11532302aa1bSDebojyoti Ghosh PETSC_EXTERN PetscErrorCode TSCreate_GLEE(TS ts)
11542302aa1bSDebojyoti Ghosh {
11552302aa1bSDebojyoti Ghosh   TS_GLEE         *th;
11562302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
11572302aa1bSDebojyoti Ghosh 
11582302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
11592302aa1bSDebojyoti Ghosh #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
11602302aa1bSDebojyoti Ghosh   ierr = TSGLEEInitializePackage();CHKERRQ(ierr);
11612302aa1bSDebojyoti Ghosh #endif
11622302aa1bSDebojyoti Ghosh 
11632302aa1bSDebojyoti Ghosh   ts->ops->reset                  = TSReset_GLEE;
11642302aa1bSDebojyoti Ghosh   ts->ops->destroy                = TSDestroy_GLEE;
11652302aa1bSDebojyoti Ghosh   ts->ops->view                   = TSView_GLEE;
11662302aa1bSDebojyoti Ghosh   ts->ops->load                   = TSLoad_GLEE;
11672302aa1bSDebojyoti Ghosh   ts->ops->setup                  = TSSetUp_GLEE;
11682302aa1bSDebojyoti Ghosh   ts->ops->step                   = TSStep_GLEE;
11692302aa1bSDebojyoti Ghosh   ts->ops->interpolate            = TSInterpolate_GLEE;
11702302aa1bSDebojyoti Ghosh   ts->ops->evaluatestep           = TSEvaluateStep_GLEE;
11712302aa1bSDebojyoti Ghosh   ts->ops->setfromoptions         = TSSetFromOptions_GLEE;
11722302aa1bSDebojyoti Ghosh   ts->ops->getstages              = TSGetStages_GLEE;
11732302aa1bSDebojyoti Ghosh   ts->ops->snesfunction           = SNESTSFormFunction_GLEE;
11742302aa1bSDebojyoti Ghosh   ts->ops->snesjacobian           = SNESTSFormJacobian_GLEE;
1175b2bf4f3aSDebojyoti Ghosh   ts->ops->getsolutioncomponents  = TSGetSolutionComponents_GLEE;
11764cdd57e5SDebojyoti Ghosh   ts->ops->getauxsolution         = TSGetAuxSolution_GLEE;
11774cdd57e5SDebojyoti Ghosh   ts->ops->gettimeerror           = TSGetTimeError_GLEE;
117857df6a1bSDebojyoti Ghosh   ts->ops->settimeerror           = TSSetTimeError_GLEE;
11792302aa1bSDebojyoti Ghosh   ts->ops->startingmethod         = TSStartingMethod_GLEE;
1180b80d5313SLisandro Dalcin   ts->default_adapt_type          = TSADAPTGLEE;
11812302aa1bSDebojyoti Ghosh 
1182efd4aadfSBarry Smith   ts->usessnes = PETSC_TRUE;
1183efd4aadfSBarry Smith 
11842302aa1bSDebojyoti Ghosh   ierr = PetscNewLog(ts,&th);CHKERRQ(ierr);
11852302aa1bSDebojyoti Ghosh   ts->data = (void*)th;
11862302aa1bSDebojyoti Ghosh 
11872302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEEGetType_C",TSGLEEGetType_GLEE);CHKERRQ(ierr);
11882302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEESetType_C",TSGLEESetType_GLEE);CHKERRQ(ierr);
11892302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
11902302aa1bSDebojyoti Ghosh }
1191