xref: /petsc/src/ts/impls/glee/glee.c (revision d8d19677bbccf95218448bee62e6b87f4513e133)
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 
13642f3702SEmil Constantinescu static PetscBool  cited = PETSC_FALSE;
14642f3702SEmil Constantinescu static const char citation[] =
15642f3702SEmil Constantinescu   "@ARTICLE{Constantinescu_TR2016b,\n"
16642f3702SEmil Constantinescu   " author = {Constantinescu, E.M.},\n"
17642f3702SEmil Constantinescu   " title = {Estimating Global Errors in Time Stepping},\n"
18642f3702SEmil Constantinescu   " journal = {ArXiv e-prints},\n"
19642f3702SEmil Constantinescu   " year = 2016,\n"
20642f3702SEmil Constantinescu   " adsurl = {http://adsabs.harvard.edu/abs/2015arXiv150305166C}\n}\n";
21642f3702SEmil Constantinescu 
222302aa1bSDebojyoti Ghosh static TSGLEEType   TSGLEEDefaultType = TSGLEE35;
232302aa1bSDebojyoti Ghosh static PetscBool    TSGLEERegisterAllCalled;
242302aa1bSDebojyoti Ghosh static PetscBool    TSGLEEPackageInitialized;
252302aa1bSDebojyoti Ghosh static PetscInt     explicit_stage_time_id;
262302aa1bSDebojyoti Ghosh 
272302aa1bSDebojyoti Ghosh typedef struct _GLEETableau *GLEETableau;
282302aa1bSDebojyoti Ghosh struct _GLEETableau {
292302aa1bSDebojyoti Ghosh   char      *name;
302302aa1bSDebojyoti Ghosh   PetscInt   order;               /* Classical approximation order of the method i*/
312302aa1bSDebojyoti Ghosh   PetscInt   s;                   /* Number of stages */
322302aa1bSDebojyoti Ghosh   PetscInt   r;                   /* Number of steps */
332302aa1bSDebojyoti Ghosh   PetscReal  gamma;               /* LTE ratio */
342302aa1bSDebojyoti Ghosh   PetscReal *A,*B,*U,*V,*S,*F,*c; /* Tableau */
352302aa1bSDebojyoti Ghosh   PetscReal *Fembed;              /* Embedded final method coefficients */
36fd96ebc2SDebojyoti Ghosh   PetscReal *Ferror;              /* Coefficients for computing error   */
3757df6a1bSDebojyoti Ghosh   PetscReal *Serror;              /* Coefficients for initializing the error   */
382302aa1bSDebojyoti Ghosh   PetscInt   pinterp;             /* Interpolation order */
392302aa1bSDebojyoti Ghosh   PetscReal *binterp;             /* Interpolation coefficients */
402302aa1bSDebojyoti Ghosh   PetscReal  ccfl;                /* Placeholder for CFL coefficient relative to forward Euler  */
412302aa1bSDebojyoti Ghosh };
422302aa1bSDebojyoti Ghosh typedef struct _GLEETableauLink *GLEETableauLink;
432302aa1bSDebojyoti Ghosh struct _GLEETableauLink {
442302aa1bSDebojyoti Ghosh   struct _GLEETableau tab;
452302aa1bSDebojyoti Ghosh   GLEETableauLink     next;
462302aa1bSDebojyoti Ghosh };
472302aa1bSDebojyoti Ghosh static GLEETableauLink GLEETableauList;
482302aa1bSDebojyoti Ghosh 
492302aa1bSDebojyoti Ghosh typedef struct {
502302aa1bSDebojyoti Ghosh   GLEETableau  tableau;
512302aa1bSDebojyoti Ghosh   Vec          *Y;         /* Solution vector (along with auxiliary solution y~ or eps) */
522302aa1bSDebojyoti Ghosh   Vec          *X;         /* Temporary solution vector */
532302aa1bSDebojyoti Ghosh   Vec          *YStage;    /* Stage values */
542302aa1bSDebojyoti Ghosh   Vec          *YdotStage; /* Stage right hand side */
552302aa1bSDebojyoti Ghosh   Vec          W;          /* Right-hand-side for implicit stage solve */
562302aa1bSDebojyoti Ghosh   Vec          Ydot;       /* Work vector holding Ydot during residual evaluation */
570a01e1b2SEmil Constantinescu   Vec          yGErr;      /* Vector holding the global error after a step is completed */
58ec0e3ee2SEmil Constantinescu   PetscScalar  *swork;     /* Scalar work (size of the number of stages)*/
59ec0e3ee2SEmil Constantinescu   PetscScalar  *rwork;     /* Scalar work (size of the number of steps)*/
602302aa1bSDebojyoti Ghosh   PetscReal    scoeff;     /* shift = scoeff/dt */
612302aa1bSDebojyoti Ghosh   PetscReal    stage_time;
622302aa1bSDebojyoti Ghosh   TSStepStatus status;
632302aa1bSDebojyoti Ghosh } TS_GLEE;
642302aa1bSDebojyoti Ghosh 
652302aa1bSDebojyoti Ghosh /*MC
662302aa1bSDebojyoti Ghosh      TSGLEE23 - Second order three stage GLEE method
672302aa1bSDebojyoti Ghosh 
682302aa1bSDebojyoti Ghosh      This method has three stages.
692302aa1bSDebojyoti Ghosh      s = 3, r = 2
702302aa1bSDebojyoti Ghosh 
712302aa1bSDebojyoti Ghosh      Level: advanced
722302aa1bSDebojyoti Ghosh 
732302aa1bSDebojyoti Ghosh .seealso: TSGLEE
7436c34d14SEmil Constantinescu M*/
752302aa1bSDebojyoti Ghosh /*MC
762302aa1bSDebojyoti Ghosh      TSGLEE24 - Second order four stage GLEE method
772302aa1bSDebojyoti Ghosh 
782302aa1bSDebojyoti Ghosh      This method has four stages.
792302aa1bSDebojyoti Ghosh      s = 4, r = 2
802302aa1bSDebojyoti Ghosh 
812302aa1bSDebojyoti Ghosh      Level: advanced
822302aa1bSDebojyoti Ghosh 
832302aa1bSDebojyoti Ghosh .seealso: TSGLEE
8436c34d14SEmil Constantinescu M*/
852302aa1bSDebojyoti Ghosh /*MC
862302aa1bSDebojyoti Ghosh      TSGLEE25i - Second order five stage GLEE method
872302aa1bSDebojyoti Ghosh 
882302aa1bSDebojyoti Ghosh      This method has five stages.
892302aa1bSDebojyoti Ghosh      s = 5, r = 2
902302aa1bSDebojyoti Ghosh 
912302aa1bSDebojyoti Ghosh      Level: advanced
922302aa1bSDebojyoti Ghosh 
932302aa1bSDebojyoti Ghosh .seealso: TSGLEE
9436c34d14SEmil Constantinescu M*/
952302aa1bSDebojyoti Ghosh /*MC
962302aa1bSDebojyoti Ghosh      TSGLEE35  - Third order five stage GLEE method
972302aa1bSDebojyoti Ghosh 
982302aa1bSDebojyoti Ghosh      This method has five stages.
992302aa1bSDebojyoti Ghosh      s = 5, r = 2
1002302aa1bSDebojyoti Ghosh 
1012302aa1bSDebojyoti Ghosh      Level: advanced
1022302aa1bSDebojyoti Ghosh 
1032302aa1bSDebojyoti Ghosh .seealso: TSGLEE
10436c34d14SEmil Constantinescu M*/
1052302aa1bSDebojyoti Ghosh /*MC
1062302aa1bSDebojyoti Ghosh      TSGLEEEXRK2A  - Second order six stage GLEE method
1072302aa1bSDebojyoti Ghosh 
1082302aa1bSDebojyoti Ghosh      This method has six stages.
1092302aa1bSDebojyoti Ghosh      s = 6, r = 2
1102302aa1bSDebojyoti Ghosh 
1112302aa1bSDebojyoti Ghosh      Level: advanced
1122302aa1bSDebojyoti Ghosh 
1132302aa1bSDebojyoti Ghosh .seealso: TSGLEE
11436c34d14SEmil Constantinescu M*/
1152302aa1bSDebojyoti Ghosh /*MC
1162302aa1bSDebojyoti Ghosh      TSGLEERK32G1  - Third order eight stage GLEE method
1172302aa1bSDebojyoti Ghosh 
1182302aa1bSDebojyoti Ghosh      This method has eight stages.
1192302aa1bSDebojyoti Ghosh      s = 8, r = 2
1202302aa1bSDebojyoti Ghosh 
1212302aa1bSDebojyoti Ghosh      Level: advanced
1222302aa1bSDebojyoti Ghosh 
1232302aa1bSDebojyoti Ghosh .seealso: TSGLEE
12436c34d14SEmil Constantinescu M*/
1252302aa1bSDebojyoti Ghosh /*MC
1262302aa1bSDebojyoti Ghosh      TSGLEERK285EX  - Second order nine stage GLEE method
1272302aa1bSDebojyoti Ghosh 
1282302aa1bSDebojyoti Ghosh      This method has nine stages.
1292302aa1bSDebojyoti Ghosh      s = 9, r = 2
1302302aa1bSDebojyoti Ghosh 
1312302aa1bSDebojyoti Ghosh      Level: advanced
1322302aa1bSDebojyoti Ghosh 
1332302aa1bSDebojyoti Ghosh .seealso: TSGLEE
13436c34d14SEmil Constantinescu M*/
1352302aa1bSDebojyoti Ghosh 
1362302aa1bSDebojyoti Ghosh /*@C
1372302aa1bSDebojyoti Ghosh   TSGLEERegisterAll - Registers all of the General Linear with Error Estimation methods in TSGLEE
1382302aa1bSDebojyoti Ghosh 
1392302aa1bSDebojyoti Ghosh   Not Collective, but should be called by all processes which will need the schemes to be registered
1402302aa1bSDebojyoti Ghosh 
1412302aa1bSDebojyoti Ghosh   Level: advanced
1422302aa1bSDebojyoti Ghosh 
1432302aa1bSDebojyoti Ghosh .seealso:  TSGLEERegisterDestroy()
1442302aa1bSDebojyoti Ghosh @*/
1452302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegisterAll(void)
1462302aa1bSDebojyoti Ghosh {
1472302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
1482302aa1bSDebojyoti Ghosh 
1492302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
1502302aa1bSDebojyoti Ghosh   if (TSGLEERegisterAllCalled) PetscFunctionReturn(0);
1512302aa1bSDebojyoti Ghosh   TSGLEERegisterAllCalled = PETSC_TRUE;
1522302aa1bSDebojyoti Ghosh 
1532302aa1bSDebojyoti Ghosh   {
154b1fbfd33SSatish Balay #define GAMMA 0.5
1552302aa1bSDebojyoti Ghosh     /* y-eps form */
1562302aa1bSDebojyoti Ghosh     const PetscInt
157ab8c5912SEmil Constantinescu       p = 1,
158ab8c5912SEmil Constantinescu       s = 3,
159ab8c5912SEmil Constantinescu       r = 2;
160ab8c5912SEmil Constantinescu     const PetscReal
161ab8c5912SEmil Constantinescu       A[3][3]   = {{1.0,0,0},{0,0.5,0},{0,0.5,0.5}},
162ab8c5912SEmil Constantinescu       B[2][3]   = {{1.0,0,0},{-2.0,1.0,1.0}},
163ab8c5912SEmil Constantinescu       U[3][2]   = {{1.0,0},{1.0,0.5},{1.0,0.5}},
164ab8c5912SEmil Constantinescu       V[2][2]   = {{1,0},{0,1}},
165ab8c5912SEmil Constantinescu       S[2]      = {1,0},
166ab8c5912SEmil Constantinescu       F[2]      = {1,0},
167b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
16857df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
16957df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
170b1fbfd33SSatish 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);
171ab8c5912SEmil Constantinescu   }
172ab8c5912SEmil Constantinescu   {
173b1fbfd33SSatish Balay #undef GAMMA
174b1fbfd33SSatish Balay #define GAMMA 0.0
175ab8c5912SEmil Constantinescu     /* y-eps form */
176ab8c5912SEmil Constantinescu     const PetscInt
1772302aa1bSDebojyoti Ghosh       p = 2,
1782302aa1bSDebojyoti Ghosh       s = 3,
1792302aa1bSDebojyoti Ghosh       r = 2;
1802302aa1bSDebojyoti Ghosh     const PetscReal
1812302aa1bSDebojyoti Ghosh       A[3][3]   = {{0,0,0},{1,0,0},{0.25,0.25,0}},
1822302aa1bSDebojyoti 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}},
1832302aa1bSDebojyoti Ghosh       U[3][2]   = {{1,0},{1,10},{1,-1}},
1842302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
1852302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
1862302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
187b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
18857df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
18957df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
190b1fbfd33SSatish 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);
1912302aa1bSDebojyoti Ghosh   }
1922302aa1bSDebojyoti Ghosh   {
193b1fbfd33SSatish Balay #undef GAMMA
194b1fbfd33SSatish Balay #define GAMMA 0.0
1952302aa1bSDebojyoti Ghosh     /* y-y~ form */
1962302aa1bSDebojyoti Ghosh     const PetscInt
1972302aa1bSDebojyoti Ghosh       p = 2,
1982302aa1bSDebojyoti Ghosh       s = 4,
1992302aa1bSDebojyoti Ghosh       r = 2;
2002302aa1bSDebojyoti Ghosh     const PetscReal
2012302aa1bSDebojyoti 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}},
2022302aa1bSDebojyoti 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}},
2032302aa1bSDebojyoti Ghosh       U[4][2]   = {{0,1},{75.0/58.0,-17.0/58.0},{0,1},{0,1}},
2042302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2052302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2062302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
207fd96ebc2SDebojyoti Ghosh       Fembed[2] = {0,1},
208b1fbfd33SSatish Balay       Ferror[2] = {-1.0/(1.0-GAMMA),1.0/(1.0-GAMMA)},
209b1fbfd33SSatish Balay       Serror[2] = {1.0-GAMMA,1.0};
210b1fbfd33SSatish 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);
2112302aa1bSDebojyoti Ghosh   }
2122302aa1bSDebojyoti Ghosh   {
213b1fbfd33SSatish Balay #undef GAMMA
214b1fbfd33SSatish Balay #define GAMMA 0.0
2152302aa1bSDebojyoti Ghosh     /* y-y~ form */
2162302aa1bSDebojyoti Ghosh     const PetscInt
2172302aa1bSDebojyoti Ghosh       p = 2,
2182302aa1bSDebojyoti Ghosh       s = 5,
2192302aa1bSDebojyoti Ghosh       r = 2;
2202302aa1bSDebojyoti Ghosh     const PetscReal
2212302aa1bSDebojyoti Ghosh       A[5][5]   = {{0,0,0,0,0},
2222302aa1bSDebojyoti Ghosh                    {-0.94079244066783383269,0,0,0,0},
2232302aa1bSDebojyoti Ghosh                    {0.64228187778301907108,0.10915356933958500042,0,0,0},
2242302aa1bSDebojyoti Ghosh                    {-0.51764297742287450812,0.74414270351096040738,-0.71404164927824538121,0,0},
2252302aa1bSDebojyoti Ghosh                    {-0.44696561556825969206,-0.76768425657590196518,0.20111608138142987881,0.93828186737840469796,0}},
2262302aa1bSDebojyoti Ghosh       B[2][5]   = {{-0.029309178948150356153,-0.49671981884013874923,0.34275801517650053274,0.32941112623949194988,0.85385985637229662276},
2272302aa1bSDebojyoti Ghosh                    {0.78133219686062535272,0.074238691892675897635,0.57957363498384957966,-0.24638502829674959968,-0.18875949544040123033}},
2282302aa1bSDebojyoti Ghosh       U[5][2]   = {{0.16911424754448327735,0.83088575245551672265},
2292302aa1bSDebojyoti Ghosh                    {0.53638465733199574340,0.46361534266800425660},
2302302aa1bSDebojyoti Ghosh                    {0.39901579167169582526,0.60098420832830417474},
2312302aa1bSDebojyoti Ghosh                    {0.87689005530618575480,0.12310994469381424520},
2322302aa1bSDebojyoti Ghosh                    {0.99056100455550913009,0.0094389954444908699092}},
2332302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2342302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2352302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
236fd96ebc2SDebojyoti Ghosh       Fembed[2] = {0,1},
237b1fbfd33SSatish Balay       Ferror[2] = {-1.0/(1.0-GAMMA),1.0/(1.0-GAMMA)},
238b1fbfd33SSatish Balay       Serror[2] = {1.0-GAMMA,1.0};
239b1fbfd33SSatish 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);
2402302aa1bSDebojyoti Ghosh   }
2412302aa1bSDebojyoti Ghosh   {
242b1fbfd33SSatish Balay #undef GAMMA
243b1fbfd33SSatish Balay #define GAMMA 0.0
2442302aa1bSDebojyoti Ghosh     /* y-y~ form */
2452302aa1bSDebojyoti Ghosh     const PetscInt
2462302aa1bSDebojyoti Ghosh       p = 3,
2472302aa1bSDebojyoti Ghosh       s = 5,
2482302aa1bSDebojyoti Ghosh       r = 2;
2492302aa1bSDebojyoti Ghosh     const PetscReal
2502302aa1bSDebojyoti Ghosh       A[5][5]   = {{0,0,0,0,0},
2512302aa1bSDebojyoti Ghosh                    {- 2169604947363702313.0 /  24313474998937147335.0,0,0,0,0},
2522302aa1bSDebojyoti Ghosh                    {46526746497697123895.0 /  94116917485856474137.0,-10297879244026594958.0 /  49199457603717988219.0,0,0,0},
2532302aa1bSDebojyoti Ghosh                    {23364788935845982499.0 /  87425311444725389446.0,-79205144337496116638.0 / 148994349441340815519.0,40051189859317443782.0 /  36487615018004984309.0,0,0},
25417d8b14cSSatish Balay                    {42089522664062539205.0 / 124911313006412840286.0,-15074384760342762939.0 / 137927286865289746282.0,-62274678522253371016.0 / 125918573676298591413.0,13755475729852471739.0 /  79257927066651693390.0,0}},
2552302aa1bSDebojyoti Ghosh       B[2][5]   = {{61546696837458703723.0 /  56982519523786160813.0,-55810892792806293355.0 / 206957624151308356511.0,24061048952676379087.0 / 158739347956038723465.0,3577972206874351339.0 /   7599733370677197135.0,-59449832954780563947.0 / 137360038685338563670.0},
2562302aa1bSDebojyoti Ghosh                    {- 9738262186984159168.0 /  99299082461487742983.0,-32797097931948613195.0 /  61521565616362163366.0,42895514606418420631.0 /  71714201188501437336.0,22608567633166065068.0 /  55371917805607957003.0,94655809487476459565.0 / 151517167160302729021.0}},
2572302aa1bSDebojyoti Ghosh       U[5][2]   = {{70820309139834661559.0 /  80863923579509469826.0,10043614439674808267.0 /  80863923579509469826.0},
2582302aa1bSDebojyoti Ghosh                    {161694774978034105510.0 / 106187653640211060371.0,-55507121337823045139.0 / 106187653640211060371.0},
2592302aa1bSDebojyoti Ghosh                    {78486094644566264568.0 /  88171030896733822981.0,9684936252167558413.0 /  88171030896733822981.0},
2602302aa1bSDebojyoti Ghosh                    {65394922146334854435.0 /  84570853840405479554.0,19175931694070625119.0 /  84570853840405479554.0},
2612302aa1bSDebojyoti Ghosh                    {8607282770183754108.0 / 108658046436496925911.0,100050763666313171803.0 / 108658046436496925911.0}},
2622302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2632302aa1bSDebojyoti Ghosh       S[2]      = {1,1},
2642302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
265fd96ebc2SDebojyoti Ghosh       Fembed[2] = {0,1},
266b1fbfd33SSatish Balay       Ferror[2] = {-1.0/(1.0-GAMMA),1.0/(1.0-GAMMA)},
267b1fbfd33SSatish Balay       Serror[2] = {1.0-GAMMA,1.0};
268b1fbfd33SSatish 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);
2692302aa1bSDebojyoti Ghosh   }
2702302aa1bSDebojyoti Ghosh   {
271b1fbfd33SSatish Balay #undef GAMMA
272b1fbfd33SSatish Balay #define GAMMA 0.25
2732302aa1bSDebojyoti Ghosh     /* y-eps form */
2742302aa1bSDebojyoti Ghosh     const PetscInt
2752302aa1bSDebojyoti Ghosh       p = 2,
2762302aa1bSDebojyoti Ghosh       s = 6,
2772302aa1bSDebojyoti Ghosh       r = 2;
2782302aa1bSDebojyoti Ghosh     const PetscReal
2792302aa1bSDebojyoti Ghosh       A[6][6]   = {{0,0,0,0,0,0},
2802302aa1bSDebojyoti Ghosh                    {1,0,0,0,0,0},
2812302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0},
2822302aa1bSDebojyoti Ghosh                    {0,0,0.5,0,0,0},
2832302aa1bSDebojyoti Ghosh                    {0,0,0.25,0.25,0,0},
2842302aa1bSDebojyoti Ghosh                    {0,0,0.25,0.25,0.5,0}},
2852302aa1bSDebojyoti Ghosh       B[2][6]   = {{0.5,0.5,0,0,0,0},
2862302aa1bSDebojyoti 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}},
2872302aa1bSDebojyoti Ghosh       U[6][2]   = {{1,0},{1,0},{1,0.75},{1,0.75},{1,0.75},{1,0.75}},
2882302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
2892302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
2902302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
291b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
29257df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
29357df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
294b1fbfd33SSatish 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);
2952302aa1bSDebojyoti Ghosh   }
2962302aa1bSDebojyoti Ghosh   {
297b1fbfd33SSatish Balay #undef GAMMA
298b1fbfd33SSatish Balay #define GAMMA 0.0
2992302aa1bSDebojyoti Ghosh     /* y-eps form */
3002302aa1bSDebojyoti Ghosh     const PetscInt
3012302aa1bSDebojyoti Ghosh       p = 3,
3022302aa1bSDebojyoti Ghosh       s = 8,
3032302aa1bSDebojyoti Ghosh       r = 2;
3042302aa1bSDebojyoti Ghosh     const PetscReal
3052302aa1bSDebojyoti Ghosh       A[8][8]   = {{0,0,0,0,0,0,0,0},
3062302aa1bSDebojyoti Ghosh                    {0.5,0,0,0,0,0,0,0},
3072302aa1bSDebojyoti Ghosh                    {-1,2,0,0,0,0,0,0},
3082302aa1bSDebojyoti Ghosh                    {1.0/6.0,2.0/3.0,1.0/6.0,0,0,0,0,0},
3092302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0,0,0},
3102302aa1bSDebojyoti Ghosh                    {-7.0/24.0,1.0/3.0,1.0/12.0,-1.0/8.0,0.5,0,0,0},
3112302aa1bSDebojyoti Ghosh                    {7.0/6.0,-4.0/3.0,-1.0/3.0,0.5,-1.0,2.0,0,0},
3122302aa1bSDebojyoti Ghosh                    {0,0,0,0,1.0/6.0,2.0/3.0,1.0/6.0,0}},
3132302aa1bSDebojyoti Ghosh       B[2][8]   = {{1.0/6.0,2.0/3.0,1.0/6.0,0,0,0,0,0},
3142302aa1bSDebojyoti 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}},
3152302aa1bSDebojyoti Ghosh       U[8][2]   = {{1,0},{1,0},{1,0},{1,0},{1,1},{1,1},{1,1},{1,1}},
3162302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
3172302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
3182302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
319b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
32057df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
32157df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
322b1fbfd33SSatish 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);
3232302aa1bSDebojyoti Ghosh   }
3242302aa1bSDebojyoti Ghosh   {
325b1fbfd33SSatish Balay #undef GAMMA
326b1fbfd33SSatish Balay #define GAMMA 0.25
3272302aa1bSDebojyoti Ghosh     /* y-eps form */
3282302aa1bSDebojyoti Ghosh     const PetscInt
3292302aa1bSDebojyoti Ghosh       p = 2,
3302302aa1bSDebojyoti Ghosh       s = 9,
3312302aa1bSDebojyoti Ghosh       r = 2;
3322302aa1bSDebojyoti Ghosh     const PetscReal
3332302aa1bSDebojyoti Ghosh       A[9][9]   = {{0,0,0,0,0,0,0,0,0},
3342302aa1bSDebojyoti Ghosh                    {0.585786437626904966,0,0,0,0,0,0,0,0},
3352302aa1bSDebojyoti Ghosh                    {0.149999999999999994,0.849999999999999978,0,0,0,0,0,0,0},
3362302aa1bSDebojyoti Ghosh                    {0,0,0,0,0,0,0,0,0},
3372302aa1bSDebojyoti Ghosh                    {0,0,0,0.292893218813452483,0,0,0,0,0},
3382302aa1bSDebojyoti Ghosh                    {0,0,0,0.0749999999999999972,0.424999999999999989,0,0,0,0},
3392302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0,0,0},
3402302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0.292893218813452483,0,0},
3412302aa1bSDebojyoti Ghosh                    {0,0,0,0.176776695296636893,0.176776695296636893,0.146446609406726241,0.0749999999999999972,0.424999999999999989,0}},
3422302aa1bSDebojyoti Ghosh       B[2][9]   = {{0.353553390593273786,0.353553390593273786,0.292893218813452483,0,0,0,0,0,0},
3432302aa1bSDebojyoti Ghosh                    {-0.471404520791031678,-0.471404520791031678,-0.390524291751269959,0.235702260395515839,0.235702260395515839,0.195262145875634979,0.235702260395515839,0.235702260395515839,0.195262145875634979}},
3442302aa1bSDebojyoti 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}},
3452302aa1bSDebojyoti Ghosh       V[2][2]   = {{1,0},{0,1}},
3462302aa1bSDebojyoti Ghosh       S[2]      = {1,0},
3472302aa1bSDebojyoti Ghosh       F[2]      = {1,0},
348b1fbfd33SSatish Balay       Fembed[2] = {1,1-GAMMA},
34957df6a1bSDebojyoti Ghosh       Ferror[2] = {0,1},
35057df6a1bSDebojyoti Ghosh       Serror[2] = {1,0};
351b1fbfd33SSatish 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);
3522302aa1bSDebojyoti Ghosh   }
3532302aa1bSDebojyoti Ghosh 
3542302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3552302aa1bSDebojyoti Ghosh }
3562302aa1bSDebojyoti Ghosh 
3572302aa1bSDebojyoti Ghosh /*@C
3582302aa1bSDebojyoti Ghosh    TSGLEERegisterDestroy - Frees the list of schemes that were registered by TSGLEERegister().
3592302aa1bSDebojyoti Ghosh 
3602302aa1bSDebojyoti Ghosh    Not Collective
3612302aa1bSDebojyoti Ghosh 
3622302aa1bSDebojyoti Ghosh    Level: advanced
3632302aa1bSDebojyoti Ghosh 
3642302aa1bSDebojyoti Ghosh .seealso: TSGLEERegister(), TSGLEERegisterAll()
3652302aa1bSDebojyoti Ghosh @*/
3662302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegisterDestroy(void)
3672302aa1bSDebojyoti Ghosh {
3682302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
3692302aa1bSDebojyoti Ghosh   GLEETableauLink link;
3702302aa1bSDebojyoti Ghosh 
3712302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
3722302aa1bSDebojyoti Ghosh   while ((link = GLEETableauList)) {
3732302aa1bSDebojyoti Ghosh     GLEETableau t = &link->tab;
3742302aa1bSDebojyoti Ghosh     GLEETableauList = link->next;
3752302aa1bSDebojyoti Ghosh     ierr = PetscFree5(t->A,t->B,t->U,t->V,t->c);CHKERRQ(ierr);
3762302aa1bSDebojyoti Ghosh     ierr = PetscFree2(t->S,t->F);               CHKERRQ(ierr);
3772302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->Fembed);               CHKERRQ(ierr);
378fd96ebc2SDebojyoti Ghosh     ierr = PetscFree (t->Ferror);               CHKERRQ(ierr);
37957df6a1bSDebojyoti Ghosh     ierr = PetscFree (t->Serror);               CHKERRQ(ierr);
3802302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->binterp);              CHKERRQ(ierr);
3812302aa1bSDebojyoti Ghosh     ierr = PetscFree (t->name);                 CHKERRQ(ierr);
3822302aa1bSDebojyoti Ghosh     ierr = PetscFree (link);                    CHKERRQ(ierr);
3832302aa1bSDebojyoti Ghosh   }
3842302aa1bSDebojyoti Ghosh   TSGLEERegisterAllCalled = PETSC_FALSE;
3852302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
3862302aa1bSDebojyoti Ghosh }
3872302aa1bSDebojyoti Ghosh 
3882302aa1bSDebojyoti Ghosh /*@C
3892302aa1bSDebojyoti Ghosh   TSGLEEInitializePackage - This function initializes everything in the TSGLEE package. It is called
3908a690491SBarry Smith   from TSInitializePackage().
3912302aa1bSDebojyoti Ghosh 
3922302aa1bSDebojyoti Ghosh   Level: developer
3932302aa1bSDebojyoti Ghosh 
3942302aa1bSDebojyoti Ghosh .seealso: PetscInitialize()
3952302aa1bSDebojyoti Ghosh @*/
3962302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEInitializePackage(void)
3972302aa1bSDebojyoti Ghosh {
3982302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
3992302aa1bSDebojyoti Ghosh 
4002302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4012302aa1bSDebojyoti Ghosh   if (TSGLEEPackageInitialized) PetscFunctionReturn(0);
4022302aa1bSDebojyoti Ghosh   TSGLEEPackageInitialized = PETSC_TRUE;
4032302aa1bSDebojyoti Ghosh   ierr = TSGLEERegisterAll();CHKERRQ(ierr);
4042302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposedDataRegister(&explicit_stage_time_id);CHKERRQ(ierr);
4052302aa1bSDebojyoti Ghosh   ierr = PetscRegisterFinalize(TSGLEEFinalizePackage);CHKERRQ(ierr);
4062302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
4072302aa1bSDebojyoti Ghosh }
4082302aa1bSDebojyoti Ghosh 
4092302aa1bSDebojyoti Ghosh /*@C
4102302aa1bSDebojyoti Ghosh   TSGLEEFinalizePackage - This function destroys everything in the TSGLEE package. It is
4112302aa1bSDebojyoti Ghosh   called from PetscFinalize().
4122302aa1bSDebojyoti Ghosh 
4132302aa1bSDebojyoti Ghosh   Level: developer
4142302aa1bSDebojyoti Ghosh 
4152302aa1bSDebojyoti Ghosh .seealso: PetscFinalize()
4162302aa1bSDebojyoti Ghosh @*/
4172302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEFinalizePackage(void)
4182302aa1bSDebojyoti Ghosh {
4192302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
4202302aa1bSDebojyoti Ghosh 
4212302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4222302aa1bSDebojyoti Ghosh   TSGLEEPackageInitialized = PETSC_FALSE;
4232302aa1bSDebojyoti Ghosh   ierr = TSGLEERegisterDestroy();CHKERRQ(ierr);
4242302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
4252302aa1bSDebojyoti Ghosh }
4262302aa1bSDebojyoti Ghosh 
4272302aa1bSDebojyoti Ghosh /*@C
4282302aa1bSDebojyoti Ghosh    TSGLEERegister - register an GLEE scheme by providing the entries in the Butcher tableau
4292302aa1bSDebojyoti Ghosh 
4302302aa1bSDebojyoti Ghosh    Not Collective, but the same schemes should be registered on all processes on which they will be used
4312302aa1bSDebojyoti Ghosh 
4322302aa1bSDebojyoti Ghosh    Input Parameters:
4332302aa1bSDebojyoti Ghosh +  name   - identifier for method
4342302aa1bSDebojyoti Ghosh .  order  - order of method
4352302aa1bSDebojyoti Ghosh .  s - number of stages
4362302aa1bSDebojyoti Ghosh .  r - number of steps
4372302aa1bSDebojyoti Ghosh .  gamma - LTE ratio
4382302aa1bSDebojyoti Ghosh .  A - stage coefficients (dimension s*s, row-major)
4392302aa1bSDebojyoti Ghosh .  B - step completion coefficients (dimension r*s, row-major)
4402302aa1bSDebojyoti Ghosh .  U - method coefficients (dimension s*r, row-major)
4412302aa1bSDebojyoti Ghosh .  V - method coefficients (dimension r*r, row-major)
4422302aa1bSDebojyoti Ghosh .  S - starting coefficients
4432302aa1bSDebojyoti Ghosh .  F - finishing coefficients
4442302aa1bSDebojyoti Ghosh .  c - abscissa (dimension s; NULL to use row sums of A)
4452302aa1bSDebojyoti Ghosh .  Fembed - step completion coefficients for embedded method
446fd96ebc2SDebojyoti Ghosh .  Ferror - error computation coefficients
44757df6a1bSDebojyoti Ghosh .  Serror - error initialization coefficients
4482302aa1bSDebojyoti Ghosh .  pinterp - order of interpolation (0 if unavailable)
4492302aa1bSDebojyoti Ghosh -  binterp - array of interpolation coefficients (NULL if unavailable)
4502302aa1bSDebojyoti Ghosh 
4512302aa1bSDebojyoti Ghosh    Notes:
4522302aa1bSDebojyoti Ghosh    Several GLEE methods are provided, this function is only needed to create new methods.
4532302aa1bSDebojyoti Ghosh 
4542302aa1bSDebojyoti Ghosh    Level: advanced
4552302aa1bSDebojyoti Ghosh 
4562302aa1bSDebojyoti Ghosh .seealso: TSGLEE
4572302aa1bSDebojyoti Ghosh @*/
4582302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEERegister(TSGLEEType name,PetscInt order,PetscInt s, PetscInt r,
4592302aa1bSDebojyoti Ghosh                               PetscReal gamma,
4602302aa1bSDebojyoti Ghosh                               const PetscReal A[],const PetscReal B[],
4612302aa1bSDebojyoti Ghosh                               const PetscReal U[],const PetscReal V[],
4622302aa1bSDebojyoti Ghosh                               const PetscReal S[],const PetscReal F[],
463fd96ebc2SDebojyoti Ghosh                               const PetscReal c[],
464fd96ebc2SDebojyoti Ghosh                               const PetscReal Fembed[],const PetscReal Ferror[],
46557df6a1bSDebojyoti Ghosh                               const PetscReal Serror[],
4662302aa1bSDebojyoti Ghosh                               PetscInt pinterp, const PetscReal binterp[])
4672302aa1bSDebojyoti Ghosh {
4682302aa1bSDebojyoti Ghosh   PetscErrorCode    ierr;
4692302aa1bSDebojyoti Ghosh   GLEETableauLink   link;
4702302aa1bSDebojyoti Ghosh   GLEETableau       t;
4712302aa1bSDebojyoti Ghosh   PetscInt          i,j;
4722302aa1bSDebojyoti Ghosh 
4732302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
4741d36bdfdSBarry Smith   ierr     = TSGLEEInitializePackage();CHKERRQ(ierr);
475580bdb30SBarry Smith   ierr     = PetscNew(&link);CHKERRQ(ierr);
4762302aa1bSDebojyoti Ghosh   t        = &link->tab;
4772302aa1bSDebojyoti Ghosh   ierr     = PetscStrallocpy(name,&t->name);CHKERRQ(ierr);
4782302aa1bSDebojyoti Ghosh   t->order = order;
4792302aa1bSDebojyoti Ghosh   t->s     = s;
4802302aa1bSDebojyoti Ghosh   t->r     = r;
4812302aa1bSDebojyoti Ghosh   t->gamma = gamma;
4822302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc5(s*s,&t->A,r*r,&t->V,s,&t->c,r*s,&t->B,s*r,&t->U);CHKERRQ(ierr);
4832302aa1bSDebojyoti Ghosh   ierr     = PetscMalloc2(r,&t->S,r,&t->F);CHKERRQ(ierr);
484580bdb30SBarry Smith   ierr     = PetscArraycpy(t->A,A,s*s);CHKERRQ(ierr);
485580bdb30SBarry Smith   ierr     = PetscArraycpy(t->B,B,r*s);CHKERRQ(ierr);
486580bdb30SBarry Smith   ierr     = PetscArraycpy(t->U,U,s*r);CHKERRQ(ierr);
487580bdb30SBarry Smith   ierr     = PetscArraycpy(t->V,V,r*r);CHKERRQ(ierr);
488580bdb30SBarry Smith   ierr     = PetscArraycpy(t->S,S,r);CHKERRQ(ierr);
489580bdb30SBarry Smith   ierr     = PetscArraycpy(t->F,F,r);CHKERRQ(ierr);
4902302aa1bSDebojyoti Ghosh   if (c) {
491580bdb30SBarry Smith     ierr   = PetscArraycpy(t->c,c,s);CHKERRQ(ierr);
4922302aa1bSDebojyoti Ghosh   } else {
4932302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) for (j=0,t->c[i]=0; j<s; j++) t->c[i] += A[i*s+j];
4942302aa1bSDebojyoti Ghosh   }
4952302aa1bSDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Fembed);CHKERRQ(ierr);
496fd96ebc2SDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Ferror);CHKERRQ(ierr);
49757df6a1bSDebojyoti Ghosh   ierr = PetscMalloc1(r,&t->Serror);CHKERRQ(ierr);
498580bdb30SBarry Smith   ierr = PetscArraycpy(t->Fembed,Fembed,r);CHKERRQ(ierr);
499580bdb30SBarry Smith   ierr = PetscArraycpy(t->Ferror,Ferror,r);CHKERRQ(ierr);
500580bdb30SBarry Smith   ierr = PetscArraycpy(t->Serror,Serror,r);CHKERRQ(ierr);
5012302aa1bSDebojyoti Ghosh   t->pinterp = pinterp;
5022302aa1bSDebojyoti Ghosh   ierr       = PetscMalloc1(s*pinterp,&t->binterp);CHKERRQ(ierr);
503580bdb30SBarry Smith   ierr       = PetscArraycpy(t->binterp,binterp,s*pinterp);CHKERRQ(ierr);
5042302aa1bSDebojyoti Ghosh 
5052302aa1bSDebojyoti Ghosh   link->next      = GLEETableauList;
5062302aa1bSDebojyoti Ghosh   GLEETableauList = link;
5072302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
5082302aa1bSDebojyoti Ghosh }
5092302aa1bSDebojyoti Ghosh 
5102302aa1bSDebojyoti Ghosh static PetscErrorCode TSEvaluateStep_GLEE(TS ts,PetscInt order,Vec X,PetscBool *done)
5112302aa1bSDebojyoti Ghosh {
5122302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*) ts->data;
5132302aa1bSDebojyoti Ghosh   GLEETableau     tab = glee->tableau;
5142302aa1bSDebojyoti Ghosh   PetscReal       h, *B = tab->B, *V = tab->V,
515fd96ebc2SDebojyoti Ghosh                   *F = tab->F,
516fd96ebc2SDebojyoti Ghosh                   *Fembed = tab->Fembed;
5172302aa1bSDebojyoti Ghosh   PetscInt        s = tab->s, r = tab->r, i, j;
5182302aa1bSDebojyoti Ghosh   Vec             *Y = glee->Y, *YdotStage = glee->YdotStage;
519ec0e3ee2SEmil Constantinescu   PetscScalar     *ws = glee->swork, *wr = glee->rwork;
5202302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
5212302aa1bSDebojyoti Ghosh 
5222302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
5232302aa1bSDebojyoti Ghosh 
5242302aa1bSDebojyoti Ghosh   switch (glee->status) {
5252302aa1bSDebojyoti Ghosh     case TS_STEP_INCOMPLETE:
5262302aa1bSDebojyoti Ghosh     case TS_STEP_PENDING:
5272302aa1bSDebojyoti Ghosh       h = ts->time_step; break;
5282302aa1bSDebojyoti Ghosh     case TS_STEP_COMPLETE:
529ed450d42SEmil Constantinescu       h = ts->ptime - ts->ptime_prev; break;
5302302aa1bSDebojyoti Ghosh     default: SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_PLIB,"Invalid TSStepStatus");
5312302aa1bSDebojyoti Ghosh   }
5322302aa1bSDebojyoti Ghosh 
5332302aa1bSDebojyoti Ghosh   if (order == tab->order) {
5342302aa1bSDebojyoti Ghosh 
5352302aa1bSDebojyoti Ghosh     /* Note: Irrespective of whether status is TS_STEP_INCOMPLETE
536fd96ebc2SDebojyoti Ghosh              or TS_STEP_COMPLETE, glee->X has the solution at the
5372302aa1bSDebojyoti Ghosh              beginning of the time step. So no need to roll-back.
5382302aa1bSDebojyoti Ghosh     */
5392302aa1bSDebojyoti Ghosh     if (glee->status == TS_STEP_INCOMPLETE) {
5402302aa1bSDebojyoti Ghosh       for (i=0; i<r; i++) {
5412302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(Y[i]);CHKERRQ(ierr);
542ec0e3ee2SEmil Constantinescu         for (j=0; j<r; j++) wr[j] = V[i*r+j];
543ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(Y[i],r,wr,glee->X);CHKERRQ(ierr);
544ec0e3ee2SEmil Constantinescu         for (j=0; j<s; j++) ws[j] = h*B[i*s+j];
545ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(Y[i],s,ws,YdotStage);CHKERRQ(ierr);
5462302aa1bSDebojyoti Ghosh       }
5472302aa1bSDebojyoti Ghosh       ierr = VecZeroEntries(X);CHKERRQ(ierr);
548ec0e3ee2SEmil Constantinescu       for (j=0; j<r; j++) wr[j] = F[j];
549ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(X,r,wr,Y);CHKERRQ(ierr);
5502302aa1bSDebojyoti Ghosh     } else {ierr = VecCopy(ts->vec_sol,X);CHKERRQ(ierr);}
5512302aa1bSDebojyoti Ghosh     PetscFunctionReturn(0);
5522302aa1bSDebojyoti Ghosh 
5532302aa1bSDebojyoti Ghosh   } else if (order == tab->order-1) {
5542302aa1bSDebojyoti Ghosh 
5552302aa1bSDebojyoti Ghosh     /* Complete with the embedded method (Fembed) */
5562302aa1bSDebojyoti Ghosh     for (i=0; i<r; i++) {
5572302aa1bSDebojyoti Ghosh       ierr = VecZeroEntries(Y[i]);CHKERRQ(ierr);
558ec0e3ee2SEmil Constantinescu       for (j=0; j<r; j++) wr[j] = V[i*r+j];
559ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(Y[i],r,wr,glee->X);CHKERRQ(ierr);
560ec0e3ee2SEmil Constantinescu       for (j=0; j<s; j++) ws[j] = h*B[i*s+j];
561ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(Y[i],s,ws,YdotStage);CHKERRQ(ierr);
5622302aa1bSDebojyoti Ghosh     }
5632302aa1bSDebojyoti Ghosh     ierr = VecZeroEntries(X);CHKERRQ(ierr);
564ec0e3ee2SEmil Constantinescu     for (j=0; j<r; j++) wr[j] = Fembed[j];
565ec0e3ee2SEmil Constantinescu     ierr = VecMAXPY(X,r,wr,Y);CHKERRQ(ierr);
566fd96ebc2SDebojyoti Ghosh 
5672302aa1bSDebojyoti Ghosh     if (done) *done = PETSC_TRUE;
5682302aa1bSDebojyoti Ghosh     PetscFunctionReturn(0);
5692302aa1bSDebojyoti Ghosh   }
5702302aa1bSDebojyoti Ghosh   if (done) *done = PETSC_FALSE;
5712302aa1bSDebojyoti 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);
5722302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
5732302aa1bSDebojyoti Ghosh }
5742302aa1bSDebojyoti Ghosh 
5752302aa1bSDebojyoti Ghosh static PetscErrorCode TSStep_GLEE(TS ts)
5762302aa1bSDebojyoti Ghosh {
5772302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
5782302aa1bSDebojyoti Ghosh   GLEETableau     tab = glee->tableau;
5792302aa1bSDebojyoti Ghosh   const PetscInt  s = tab->s, r = tab->r;
5802302aa1bSDebojyoti Ghosh   PetscReal       *A = tab->A, *U = tab->U,
5812302aa1bSDebojyoti Ghosh                   *F = tab->F,
5822302aa1bSDebojyoti Ghosh                   *c = tab->c;
5832302aa1bSDebojyoti Ghosh   Vec             *Y = glee->Y, *X = glee->X,
5842302aa1bSDebojyoti Ghosh                   *YStage = glee->YStage,
5852302aa1bSDebojyoti Ghosh                   *YdotStage = glee->YdotStage,
5862302aa1bSDebojyoti Ghosh                   W = glee->W;
5872302aa1bSDebojyoti Ghosh   SNES            snes;
588ec0e3ee2SEmil Constantinescu   PetscScalar     *ws = glee->swork, *wr = glee->rwork;
5892302aa1bSDebojyoti Ghosh   TSAdapt         adapt;
5902302aa1bSDebojyoti Ghosh   PetscInt        i,j,reject,next_scheme,its,lits;
5912302aa1bSDebojyoti Ghosh   PetscReal       next_time_step;
5922302aa1bSDebojyoti Ghosh   PetscReal       t;
5932302aa1bSDebojyoti Ghosh   PetscBool       accept;
5942302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
5952302aa1bSDebojyoti Ghosh 
5962302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
597642f3702SEmil Constantinescu   ierr = PetscCitationsRegister(citation,&cited);CHKERRQ(ierr);
598642f3702SEmil Constantinescu 
5992302aa1bSDebojyoti Ghosh   for (i=0; i<r; i++) { ierr = VecCopy(Y[i],X[i]);CHKERRQ(ierr); }
6002302aa1bSDebojyoti Ghosh 
6012302aa1bSDebojyoti Ghosh   ierr           = TSGetSNES(ts,&snes);CHKERRQ(ierr);
6022302aa1bSDebojyoti Ghosh   next_time_step = ts->time_step;
6032302aa1bSDebojyoti Ghosh   t              = ts->ptime;
6042302aa1bSDebojyoti Ghosh   accept         = PETSC_TRUE;
6052302aa1bSDebojyoti Ghosh   glee->status   = TS_STEP_INCOMPLETE;
6062302aa1bSDebojyoti Ghosh 
6072302aa1bSDebojyoti Ghosh   for (reject=0; reject<ts->max_reject && !ts->reason; reject++,ts->reject++) {
6082302aa1bSDebojyoti Ghosh 
6092302aa1bSDebojyoti Ghosh     PetscReal h = ts->time_step;
6102302aa1bSDebojyoti Ghosh     ierr = TSPreStep(ts);CHKERRQ(ierr);
6112302aa1bSDebojyoti Ghosh 
6122302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) {
6132302aa1bSDebojyoti Ghosh 
6142302aa1bSDebojyoti Ghosh       glee->stage_time = t + h*c[i];
6152302aa1bSDebojyoti Ghosh       ierr = TSPreStage(ts,glee->stage_time);CHKERRQ(ierr);
6162302aa1bSDebojyoti Ghosh 
6172302aa1bSDebojyoti Ghosh       if (A[i*s+i] == 0) {  /* Explicit stage */
6182302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(YStage[i]);CHKERRQ(ierr);
619ec0e3ee2SEmil Constantinescu         for (j=0; j<r; j++) wr[j] = U[i*r+j];
620ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(YStage[i],r,wr,X);CHKERRQ(ierr);
621ec0e3ee2SEmil Constantinescu         for (j=0; j<i; j++) ws[j] = h*A[i*s+j];
622ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(YStage[i],i,ws,YdotStage);CHKERRQ(ierr);
6232302aa1bSDebojyoti Ghosh       } else {              /* Implicit stage */
6242302aa1bSDebojyoti Ghosh         glee->scoeff = 1.0/A[i*s+i];
6252302aa1bSDebojyoti Ghosh         /* compute right-hand-side */
6262302aa1bSDebojyoti Ghosh         ierr = VecZeroEntries(W);CHKERRQ(ierr);
627ec0e3ee2SEmil Constantinescu         for (j=0; j<r; j++) wr[j] = U[i*r+j];
628ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(W,r,wr,X);CHKERRQ(ierr);
629ec0e3ee2SEmil Constantinescu         for (j=0; j<i; j++) ws[j] = h*A[i*s+j];
630ec0e3ee2SEmil Constantinescu         ierr = VecMAXPY(W,i,ws,YdotStage);CHKERRQ(ierr);
6312302aa1bSDebojyoti Ghosh         ierr = VecScale(W,glee->scoeff/h);CHKERRQ(ierr);
6322302aa1bSDebojyoti Ghosh         /* set initial guess */
6332302aa1bSDebojyoti Ghosh         ierr = VecCopy(i>0 ? YStage[i-1] : ts->vec_sol,YStage[i]);CHKERRQ(ierr);
6342302aa1bSDebojyoti Ghosh         /* solve for this stage */
6352302aa1bSDebojyoti Ghosh         ierr = SNESSolve(snes,W,YStage[i]);CHKERRQ(ierr);
6362302aa1bSDebojyoti Ghosh         ierr = SNESGetIterationNumber(snes,&its);CHKERRQ(ierr);
6372302aa1bSDebojyoti Ghosh         ierr = SNESGetLinearSolveIterations(snes,&lits);CHKERRQ(ierr);
6382302aa1bSDebojyoti Ghosh         ts->snes_its += its; ts->ksp_its += lits;
6392302aa1bSDebojyoti Ghosh       }
6402302aa1bSDebojyoti Ghosh       ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr);
641d6629dc5SEmil Constantinescu       ierr = TSAdaptCheckStage(adapt,ts,glee->stage_time,YStage[i],&accept);CHKERRQ(ierr);
6422302aa1bSDebojyoti Ghosh       if (!accept) goto reject_step;
6432302aa1bSDebojyoti Ghosh       ierr = TSPostStage(ts,glee->stage_time,i,YStage);CHKERRQ(ierr);
6442302aa1bSDebojyoti Ghosh       ierr = TSComputeRHSFunction(ts,t+h*c[i],YStage[i],YdotStage[i]);CHKERRQ(ierr);
6452302aa1bSDebojyoti Ghosh     }
6462302aa1bSDebojyoti Ghosh     ierr = TSEvaluateStep(ts,tab->order,ts->vec_sol,NULL);CHKERRQ(ierr);
6472302aa1bSDebojyoti Ghosh     glee->status = TS_STEP_PENDING;
6482302aa1bSDebojyoti Ghosh 
6492302aa1bSDebojyoti Ghosh     /* Register only the current method as a candidate because we're not supporting multiple candidates yet. */
6502302aa1bSDebojyoti Ghosh     ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr);
6512302aa1bSDebojyoti Ghosh     ierr = TSAdaptCandidatesClear(adapt);CHKERRQ(ierr);
6521917a363SLisandro Dalcin     ierr = TSAdaptCandidateAdd(adapt,tab->name,tab->order,1,tab->ccfl,(PetscReal)tab->s,PETSC_TRUE);CHKERRQ(ierr);
6532302aa1bSDebojyoti Ghosh     ierr = TSAdaptChoose(adapt,ts,ts->time_step,&next_scheme,&next_time_step,&accept);CHKERRQ(ierr);
6542302aa1bSDebojyoti Ghosh     if (accept) {
6552302aa1bSDebojyoti Ghosh       /* ignore next_scheme for now */
6562302aa1bSDebojyoti Ghosh       ts->ptime     += ts->time_step;
6572302aa1bSDebojyoti Ghosh       ts->time_step  = next_time_step;
6582302aa1bSDebojyoti Ghosh       glee->status = TS_STEP_COMPLETE;
6590a01e1b2SEmil Constantinescu       /* compute and store the global error */
6600a01e1b2SEmil Constantinescu       /* Note: this is not needed if TSAdaptGLEE is not used */
6610a01e1b2SEmil Constantinescu       ierr = TSGetTimeError(ts,0,&(glee->yGErr));CHKERRQ(ierr);
6622302aa1bSDebojyoti Ghosh       ierr = PetscObjectComposedDataSetReal((PetscObject)ts->vec_sol,explicit_stage_time_id,ts->ptime);CHKERRQ(ierr);
6632302aa1bSDebojyoti Ghosh       break;
6642302aa1bSDebojyoti Ghosh     } else {                    /* Roll back the current step */
665ec0e3ee2SEmil Constantinescu       for (j=0; j<r; j++) wr[j] = F[j];
666ec0e3ee2SEmil Constantinescu       ierr = VecMAXPY(ts->vec_sol,r,wr,X);CHKERRQ(ierr);
6672302aa1bSDebojyoti Ghosh       ts->time_step = next_time_step;
6682302aa1bSDebojyoti Ghosh       glee->status  = TS_STEP_INCOMPLETE;
6692302aa1bSDebojyoti Ghosh     }
6702302aa1bSDebojyoti Ghosh reject_step: continue;
6712302aa1bSDebojyoti Ghosh   }
6722302aa1bSDebojyoti Ghosh   if (glee->status != TS_STEP_COMPLETE && !ts->reason) ts->reason = TS_DIVERGED_STEP_REJECTED;
6732302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
6742302aa1bSDebojyoti Ghosh }
6752302aa1bSDebojyoti Ghosh 
6762302aa1bSDebojyoti Ghosh static PetscErrorCode TSInterpolate_GLEE(TS ts,PetscReal itime,Vec X)
6772302aa1bSDebojyoti Ghosh {
6782302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
6792302aa1bSDebojyoti Ghosh   PetscInt        s=glee->tableau->s, pinterp=glee->tableau->pinterp,i,j;
6802302aa1bSDebojyoti Ghosh   PetscReal       h,tt,t;
6812302aa1bSDebojyoti Ghosh   PetscScalar     *b;
6822302aa1bSDebojyoti Ghosh   const PetscReal *B = glee->tableau->binterp;
6832302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
6842302aa1bSDebojyoti Ghosh 
6852302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
6862302aa1bSDebojyoti Ghosh   if (!B) SETERRQ1(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"TSGLEE %s does not have an interpolation formula",glee->tableau->name);
6872302aa1bSDebojyoti Ghosh   switch (glee->status) {
6882302aa1bSDebojyoti Ghosh     case TS_STEP_INCOMPLETE:
6892302aa1bSDebojyoti Ghosh     case TS_STEP_PENDING:
6902302aa1bSDebojyoti Ghosh       h = ts->time_step;
6912302aa1bSDebojyoti Ghosh       t = (itime - ts->ptime)/h;
6922302aa1bSDebojyoti Ghosh       break;
6932302aa1bSDebojyoti Ghosh     case TS_STEP_COMPLETE:
694ed450d42SEmil Constantinescu       h = ts->ptime - ts->ptime_prev;
6952302aa1bSDebojyoti Ghosh       t = (itime - ts->ptime)/h + 1; /* In the interval [0,1] */
6962302aa1bSDebojyoti Ghosh       break;
6972302aa1bSDebojyoti Ghosh     default: SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_PLIB,"Invalid TSStepStatus");
6982302aa1bSDebojyoti Ghosh   }
6992302aa1bSDebojyoti Ghosh   ierr = PetscMalloc1(s,&b);CHKERRQ(ierr);
7002302aa1bSDebojyoti Ghosh   for (i=0; i<s; i++) b[i] = 0;
7012302aa1bSDebojyoti Ghosh   for (j=0,tt=t; j<pinterp; j++,tt*=t) {
7022302aa1bSDebojyoti Ghosh     for (i=0; i<s; i++) {
7032302aa1bSDebojyoti Ghosh       b[i]  += h * B[i*pinterp+j] * tt;
7042302aa1bSDebojyoti Ghosh     }
7052302aa1bSDebojyoti Ghosh   }
7062302aa1bSDebojyoti Ghosh   ierr = VecCopy(glee->YStage[0],X);CHKERRQ(ierr);
7072302aa1bSDebojyoti Ghosh   ierr = VecMAXPY(X,s,b,glee->YdotStage);CHKERRQ(ierr);
7082302aa1bSDebojyoti Ghosh   ierr = PetscFree(b);CHKERRQ(ierr);
7092302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7102302aa1bSDebojyoti Ghosh }
7112302aa1bSDebojyoti Ghosh 
7122302aa1bSDebojyoti Ghosh /*------------------------------------------------------------*/
7132302aa1bSDebojyoti Ghosh static PetscErrorCode TSReset_GLEE(TS ts)
7142302aa1bSDebojyoti Ghosh {
7152302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
7162302aa1bSDebojyoti Ghosh   PetscInt       s, r;
7172302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7182302aa1bSDebojyoti Ghosh 
7192302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7202302aa1bSDebojyoti Ghosh   if (!glee->tableau) PetscFunctionReturn(0);
7212302aa1bSDebojyoti Ghosh   s    = glee->tableau->s;
7222302aa1bSDebojyoti Ghosh   r    = glee->tableau->r;
7232302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(r,&glee->Y);CHKERRQ(ierr);
7242302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(r,&glee->X);CHKERRQ(ierr);
7252302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(s,&glee->YStage);CHKERRQ(ierr);
7262302aa1bSDebojyoti Ghosh   ierr = VecDestroyVecs(s,&glee->YdotStage);CHKERRQ(ierr);
7272302aa1bSDebojyoti Ghosh   ierr = VecDestroy(&glee->Ydot);CHKERRQ(ierr);
7280a01e1b2SEmil Constantinescu   ierr = VecDestroy(&glee->yGErr);CHKERRQ(ierr);
7292302aa1bSDebojyoti Ghosh   ierr = VecDestroy(&glee->W);CHKERRQ(ierr);
730ec0e3ee2SEmil Constantinescu   ierr = PetscFree2(glee->swork,glee->rwork);CHKERRQ(ierr);
7312302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7322302aa1bSDebojyoti Ghosh }
7332302aa1bSDebojyoti Ghosh 
7342302aa1bSDebojyoti Ghosh static PetscErrorCode TSGLEEGetVecs(TS ts,DM dm,Vec *Ydot)
7352302aa1bSDebojyoti Ghosh {
7362302aa1bSDebojyoti Ghosh   TS_GLEE     *glee = (TS_GLEE*)ts->data;
7372302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7382302aa1bSDebojyoti Ghosh 
7392302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7402302aa1bSDebojyoti Ghosh   if (Ydot) {
7412302aa1bSDebojyoti Ghosh     if (dm && dm != ts->dm) {
7422302aa1bSDebojyoti Ghosh       ierr = DMGetNamedGlobalVector(dm,"TSGLEE_Ydot",Ydot);CHKERRQ(ierr);
7432302aa1bSDebojyoti Ghosh     } else *Ydot = glee->Ydot;
7442302aa1bSDebojyoti Ghosh   }
7452302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7462302aa1bSDebojyoti Ghosh }
7472302aa1bSDebojyoti Ghosh 
7482302aa1bSDebojyoti Ghosh static PetscErrorCode TSGLEERestoreVecs(TS ts,DM dm,Vec *Ydot)
7492302aa1bSDebojyoti Ghosh {
7502302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7512302aa1bSDebojyoti Ghosh 
7522302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7532302aa1bSDebojyoti Ghosh   if (Ydot) {
7542302aa1bSDebojyoti Ghosh     if (dm && dm != ts->dm) {
7552302aa1bSDebojyoti Ghosh       ierr = DMRestoreNamedGlobalVector(dm,"TSGLEE_Ydot",Ydot);CHKERRQ(ierr);
7562302aa1bSDebojyoti Ghosh     }
7572302aa1bSDebojyoti Ghosh   }
7582302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7592302aa1bSDebojyoti Ghosh }
7602302aa1bSDebojyoti Ghosh 
7612302aa1bSDebojyoti Ghosh /*
7622302aa1bSDebojyoti Ghosh   This defines the nonlinear equation that is to be solved with SNES
7632302aa1bSDebojyoti Ghosh */
7642302aa1bSDebojyoti Ghosh static PetscErrorCode SNESTSFormFunction_GLEE(SNES snes,Vec X,Vec F,TS ts)
7652302aa1bSDebojyoti Ghosh {
7662302aa1bSDebojyoti Ghosh   TS_GLEE       *glee = (TS_GLEE*)ts->data;
7672302aa1bSDebojyoti Ghosh   DM             dm,dmsave;
7682302aa1bSDebojyoti Ghosh   Vec            Ydot;
7692302aa1bSDebojyoti Ghosh   PetscReal      shift = glee->scoeff / ts->time_step;
7702302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7712302aa1bSDebojyoti Ghosh 
7722302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7732302aa1bSDebojyoti Ghosh   ierr   = SNESGetDM(snes,&dm);CHKERRQ(ierr);
7742302aa1bSDebojyoti Ghosh   ierr   = TSGLEEGetVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7752302aa1bSDebojyoti Ghosh   /* Set Ydot = shift*X */
7762302aa1bSDebojyoti Ghosh   ierr   = VecCopy(X,Ydot);CHKERRQ(ierr);
7772302aa1bSDebojyoti Ghosh   ierr   = VecScale(Ydot,shift);CHKERRQ(ierr);
7782302aa1bSDebojyoti Ghosh   dmsave = ts->dm;
7792302aa1bSDebojyoti Ghosh   ts->dm = dm;
7802302aa1bSDebojyoti Ghosh 
7812302aa1bSDebojyoti Ghosh   ierr = TSComputeIFunction(ts,glee->stage_time,X,Ydot,F,PETSC_FALSE);CHKERRQ(ierr);
7822302aa1bSDebojyoti Ghosh 
7832302aa1bSDebojyoti Ghosh   ts->dm = dmsave;
7842302aa1bSDebojyoti Ghosh   ierr   = TSGLEERestoreVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7852302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
7862302aa1bSDebojyoti Ghosh }
7872302aa1bSDebojyoti Ghosh 
7882302aa1bSDebojyoti Ghosh static PetscErrorCode SNESTSFormJacobian_GLEE(SNES snes,Vec X,Mat A,Mat B,TS ts)
7892302aa1bSDebojyoti Ghosh {
7902302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
7912302aa1bSDebojyoti Ghosh   DM             dm,dmsave;
7922302aa1bSDebojyoti Ghosh   Vec            Ydot;
7932302aa1bSDebojyoti Ghosh   PetscReal      shift = glee->scoeff / ts->time_step;
7942302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
7952302aa1bSDebojyoti Ghosh 
7962302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
7972302aa1bSDebojyoti Ghosh   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
7982302aa1bSDebojyoti Ghosh   ierr = TSGLEEGetVecs(ts,dm,&Ydot);CHKERRQ(ierr);
7992302aa1bSDebojyoti Ghosh   /* glee->Ydot has already been computed in SNESTSFormFunction_GLEE (SNES guarantees this) */
8002302aa1bSDebojyoti Ghosh   dmsave = ts->dm;
8012302aa1bSDebojyoti Ghosh   ts->dm = dm;
8022302aa1bSDebojyoti Ghosh 
8032302aa1bSDebojyoti Ghosh   ierr = TSComputeIJacobian(ts,glee->stage_time,X,Ydot,shift,A,B,PETSC_FALSE);CHKERRQ(ierr);
8042302aa1bSDebojyoti Ghosh 
8052302aa1bSDebojyoti Ghosh   ts->dm = dmsave;
8062302aa1bSDebojyoti Ghosh   ierr   = TSGLEERestoreVecs(ts,dm,&Ydot);CHKERRQ(ierr);
8072302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8082302aa1bSDebojyoti Ghosh }
8092302aa1bSDebojyoti Ghosh 
8102302aa1bSDebojyoti Ghosh static PetscErrorCode DMCoarsenHook_TSGLEE(DM fine,DM coarse,void *ctx)
8112302aa1bSDebojyoti Ghosh {
8122302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8132302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8142302aa1bSDebojyoti Ghosh }
8152302aa1bSDebojyoti Ghosh 
8162302aa1bSDebojyoti Ghosh static PetscErrorCode DMRestrictHook_TSGLEE(DM fine,Mat restrct,Vec rscale,Mat inject,DM coarse,void *ctx)
8172302aa1bSDebojyoti Ghosh {
8182302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8192302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8202302aa1bSDebojyoti Ghosh }
8212302aa1bSDebojyoti Ghosh 
8222302aa1bSDebojyoti Ghosh static PetscErrorCode DMSubDomainHook_TSGLEE(DM dm,DM subdm,void *ctx)
8232302aa1bSDebojyoti Ghosh {
8242302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8252302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8262302aa1bSDebojyoti Ghosh }
8272302aa1bSDebojyoti Ghosh 
8282302aa1bSDebojyoti Ghosh static PetscErrorCode DMSubDomainRestrictHook_TSGLEE(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
8292302aa1bSDebojyoti Ghosh {
8302302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8312302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8322302aa1bSDebojyoti Ghosh }
8332302aa1bSDebojyoti Ghosh 
8342302aa1bSDebojyoti Ghosh static PetscErrorCode TSSetUp_GLEE(TS ts)
8352302aa1bSDebojyoti Ghosh {
8362302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
8372302aa1bSDebojyoti Ghosh   GLEETableau    tab;
8382302aa1bSDebojyoti Ghosh   PetscInt       s,r;
8392302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8402302aa1bSDebojyoti Ghosh   DM             dm;
8412302aa1bSDebojyoti Ghosh 
8422302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8432302aa1bSDebojyoti Ghosh   if (!glee->tableau) {
8442302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,TSGLEEDefaultType);CHKERRQ(ierr);
8452302aa1bSDebojyoti Ghosh   }
8462302aa1bSDebojyoti Ghosh   tab  = glee->tableau;
8472302aa1bSDebojyoti Ghosh   s    = tab->s;
8482302aa1bSDebojyoti Ghosh   r    = tab->r;
8492302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,r,&glee->Y);CHKERRQ(ierr);
8502302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,r,&glee->X);CHKERRQ(ierr);
8512302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,s,&glee->YStage);CHKERRQ(ierr);
8522302aa1bSDebojyoti Ghosh   ierr = VecDuplicateVecs(ts->vec_sol,s,&glee->YdotStage);CHKERRQ(ierr);
8532302aa1bSDebojyoti Ghosh   ierr = VecDuplicate(ts->vec_sol,&glee->Ydot);CHKERRQ(ierr);
8540a01e1b2SEmil Constantinescu   ierr = VecDuplicate(ts->vec_sol,&glee->yGErr);CHKERRQ(ierr);
855657c1e31SEmil Constantinescu   ierr = VecZeroEntries(glee->yGErr);CHKERRQ(ierr);
8562302aa1bSDebojyoti Ghosh   ierr = VecDuplicate(ts->vec_sol,&glee->W);CHKERRQ(ierr);
857ec0e3ee2SEmil Constantinescu   ierr = PetscMalloc2(s,&glee->swork,r,&glee->rwork);CHKERRQ(ierr);
8582302aa1bSDebojyoti Ghosh   ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
8592302aa1bSDebojyoti Ghosh   ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_TSGLEE,DMRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
8602302aa1bSDebojyoti Ghosh   ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_TSGLEE,DMSubDomainRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
8612302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8622302aa1bSDebojyoti Ghosh }
8632302aa1bSDebojyoti Ghosh 
8642302aa1bSDebojyoti Ghosh PetscErrorCode TSStartingMethod_GLEE(TS ts)
8652302aa1bSDebojyoti Ghosh {
8662302aa1bSDebojyoti Ghosh   TS_GLEE        *glee = (TS_GLEE*)ts->data;
8676e2e232bSDebojyoti Ghosh   GLEETableau    tab  = glee->tableau;
8686e2e232bSDebojyoti Ghosh   PetscInt       r=tab->r,i;
8696e2e232bSDebojyoti Ghosh   PetscReal      *S=tab->S;
8702302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8712302aa1bSDebojyoti Ghosh 
8722302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8732302aa1bSDebojyoti Ghosh   for (i=0; i<r; i++) {
8742302aa1bSDebojyoti Ghosh     ierr = VecZeroEntries(glee->Y[i]);CHKERRQ(ierr);
8752302aa1bSDebojyoti Ghosh     ierr = VecAXPY(glee->Y[i],S[i],ts->vec_sol);CHKERRQ(ierr);
8762302aa1bSDebojyoti Ghosh   }
8772302aa1bSDebojyoti Ghosh 
8782302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
8792302aa1bSDebojyoti Ghosh }
8802302aa1bSDebojyoti Ghosh 
8812302aa1bSDebojyoti Ghosh /*------------------------------------------------------------*/
8822302aa1bSDebojyoti Ghosh 
8836b234c65SEmil Constantinescu static PetscErrorCode TSSetFromOptions_GLEE(PetscOptionItems *PetscOptionsObject,TS ts)
8842302aa1bSDebojyoti Ghosh {
8852302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
8862302aa1bSDebojyoti Ghosh   char           gleetype[256];
8872302aa1bSDebojyoti Ghosh 
8882302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
8892302aa1bSDebojyoti Ghosh   ierr = PetscOptionsHead(PetscOptionsObject,"GLEE ODE solver options");CHKERRQ(ierr);
8902302aa1bSDebojyoti Ghosh   {
8912302aa1bSDebojyoti Ghosh     GLEETableauLink link;
8922302aa1bSDebojyoti Ghosh     PetscInt        count,choice;
8932302aa1bSDebojyoti Ghosh     PetscBool       flg;
8942302aa1bSDebojyoti Ghosh     const char      **namelist;
8952302aa1bSDebojyoti Ghosh 
8962302aa1bSDebojyoti Ghosh     ierr = PetscStrncpy(gleetype,TSGLEEDefaultType,sizeof(gleetype));CHKERRQ(ierr);
8972302aa1bSDebojyoti Ghosh     for (link=GLEETableauList,count=0; link; link=link->next,count++) ;
898f489ac74SBarry Smith     ierr = PetscMalloc1(count,(char***)&namelist);CHKERRQ(ierr);
8992302aa1bSDebojyoti Ghosh     for (link=GLEETableauList,count=0; link; link=link->next,count++) namelist[count] = link->tab.name;
9002302aa1bSDebojyoti Ghosh     ierr = PetscOptionsEList("-ts_glee_type","Family of GLEE method","TSGLEESetType",(const char*const*)namelist,count,gleetype,&choice,&flg);CHKERRQ(ierr);
9012302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,flg ? namelist[choice] : gleetype);CHKERRQ(ierr);
9022302aa1bSDebojyoti Ghosh     ierr = PetscFree(namelist);CHKERRQ(ierr);
9032302aa1bSDebojyoti Ghosh   }
9042302aa1bSDebojyoti Ghosh   ierr = PetscOptionsTail();CHKERRQ(ierr);
9052302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9062302aa1bSDebojyoti Ghosh }
9072302aa1bSDebojyoti Ghosh 
9082302aa1bSDebojyoti Ghosh static PetscErrorCode TSView_GLEE(TS ts,PetscViewer viewer)
9092302aa1bSDebojyoti Ghosh {
9102302aa1bSDebojyoti Ghosh   TS_GLEE        *glee   = (TS_GLEE*)ts->data;
9112302aa1bSDebojyoti Ghosh   GLEETableau    tab  = glee->tableau;
9122302aa1bSDebojyoti Ghosh   PetscBool      iascii;
9132302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9142302aa1bSDebojyoti Ghosh 
9152302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9162302aa1bSDebojyoti Ghosh   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
9172302aa1bSDebojyoti Ghosh   if (iascii) {
9182302aa1bSDebojyoti Ghosh     TSGLEEType gleetype;
9192302aa1bSDebojyoti Ghosh     char       buf[512];
9202302aa1bSDebojyoti Ghosh     ierr = TSGLEEGetType(ts,&gleetype);CHKERRQ(ierr);
921efd4aadfSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  GLEE type %s\n",gleetype);CHKERRQ(ierr);
9222302aa1bSDebojyoti Ghosh     ierr = PetscFormatRealArray(buf,sizeof(buf),"% 8.6f",tab->s,tab->c);CHKERRQ(ierr);
9232302aa1bSDebojyoti Ghosh     ierr = PetscViewerASCIIPrintf(viewer,"  Abscissa     c = %s\n",buf);CHKERRQ(ierr);
9242302aa1bSDebojyoti Ghosh     /* Note: print out r as well */
9252302aa1bSDebojyoti Ghosh   }
9262302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9272302aa1bSDebojyoti Ghosh }
9282302aa1bSDebojyoti Ghosh 
9292302aa1bSDebojyoti Ghosh static PetscErrorCode TSLoad_GLEE(TS ts,PetscViewer viewer)
9302302aa1bSDebojyoti Ghosh {
9312302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9322302aa1bSDebojyoti Ghosh   SNES           snes;
9332302aa1bSDebojyoti Ghosh   TSAdapt        tsadapt;
9342302aa1bSDebojyoti Ghosh 
9352302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9362302aa1bSDebojyoti Ghosh   ierr = TSGetAdapt(ts,&tsadapt);CHKERRQ(ierr);
9372302aa1bSDebojyoti Ghosh   ierr = TSAdaptLoad(tsadapt,viewer);CHKERRQ(ierr);
9382302aa1bSDebojyoti Ghosh   ierr = TSGetSNES(ts,&snes);CHKERRQ(ierr);
9392302aa1bSDebojyoti Ghosh   ierr = SNESLoad(snes,viewer);CHKERRQ(ierr);
9402302aa1bSDebojyoti Ghosh   /* function and Jacobian context for SNES when used with TS is always ts object */
9412302aa1bSDebojyoti Ghosh   ierr = SNESSetFunction(snes,NULL,NULL,ts);CHKERRQ(ierr);
9422302aa1bSDebojyoti Ghosh   ierr = SNESSetJacobian(snes,NULL,NULL,NULL,ts);CHKERRQ(ierr);
9432302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9442302aa1bSDebojyoti Ghosh }
9452302aa1bSDebojyoti Ghosh 
9462302aa1bSDebojyoti Ghosh /*@C
9472302aa1bSDebojyoti Ghosh   TSGLEESetType - Set the type of GLEE scheme
9482302aa1bSDebojyoti Ghosh 
9492302aa1bSDebojyoti Ghosh   Logically collective
9502302aa1bSDebojyoti Ghosh 
951*d8d19677SJose E. Roman   Input Parameters:
9522302aa1bSDebojyoti Ghosh +  ts - timestepping context
9532302aa1bSDebojyoti Ghosh -  gleetype - type of GLEE-scheme
9542302aa1bSDebojyoti Ghosh 
9552302aa1bSDebojyoti Ghosh   Level: intermediate
9562302aa1bSDebojyoti Ghosh 
9572302aa1bSDebojyoti Ghosh .seealso: TSGLEEGetType(), TSGLEE
9582302aa1bSDebojyoti Ghosh @*/
9592302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEESetType(TS ts,TSGLEEType gleetype)
9602302aa1bSDebojyoti Ghosh {
9612302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9622302aa1bSDebojyoti Ghosh 
9632302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9642302aa1bSDebojyoti Ghosh   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
965b92453a8SLisandro Dalcin   PetscValidCharPointer(gleetype,2);
9662302aa1bSDebojyoti Ghosh   ierr = PetscTryMethod(ts,"TSGLEESetType_C",(TS,TSGLEEType),(ts,gleetype));CHKERRQ(ierr);
9672302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9682302aa1bSDebojyoti Ghosh }
9692302aa1bSDebojyoti Ghosh 
9702302aa1bSDebojyoti Ghosh /*@C
9712302aa1bSDebojyoti Ghosh   TSGLEEGetType - Get the type of GLEE scheme
9722302aa1bSDebojyoti Ghosh 
9732302aa1bSDebojyoti Ghosh   Logically collective
9742302aa1bSDebojyoti Ghosh 
9752302aa1bSDebojyoti Ghosh   Input Parameter:
9762302aa1bSDebojyoti Ghosh .  ts - timestepping context
9772302aa1bSDebojyoti Ghosh 
9782302aa1bSDebojyoti Ghosh   Output Parameter:
9792302aa1bSDebojyoti Ghosh .  gleetype - type of GLEE-scheme
9802302aa1bSDebojyoti Ghosh 
9812302aa1bSDebojyoti Ghosh   Level: intermediate
9822302aa1bSDebojyoti Ghosh 
9832302aa1bSDebojyoti Ghosh .seealso: TSGLEESetType()
9842302aa1bSDebojyoti Ghosh @*/
9852302aa1bSDebojyoti Ghosh PetscErrorCode TSGLEEGetType(TS ts,TSGLEEType *gleetype)
9862302aa1bSDebojyoti Ghosh {
9872302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9882302aa1bSDebojyoti Ghosh 
9892302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
9902302aa1bSDebojyoti Ghosh   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
9912302aa1bSDebojyoti Ghosh   ierr = PetscUseMethod(ts,"TSGLEEGetType_C",(TS,TSGLEEType*),(ts,gleetype));CHKERRQ(ierr);
9922302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
9932302aa1bSDebojyoti Ghosh }
9942302aa1bSDebojyoti Ghosh 
9952302aa1bSDebojyoti Ghosh PetscErrorCode  TSGLEEGetType_GLEE(TS ts,TSGLEEType *gleetype)
9962302aa1bSDebojyoti Ghosh {
9972302aa1bSDebojyoti Ghosh   TS_GLEE     *glee = (TS_GLEE*)ts->data;
9982302aa1bSDebojyoti Ghosh   PetscErrorCode ierr;
9992302aa1bSDebojyoti Ghosh 
10002302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10012302aa1bSDebojyoti Ghosh   if (!glee->tableau) {
10022302aa1bSDebojyoti Ghosh     ierr = TSGLEESetType(ts,TSGLEEDefaultType);CHKERRQ(ierr);
10032302aa1bSDebojyoti Ghosh   }
10042302aa1bSDebojyoti Ghosh   *gleetype = glee->tableau->name;
10052302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10062302aa1bSDebojyoti Ghosh }
10072302aa1bSDebojyoti Ghosh PetscErrorCode  TSGLEESetType_GLEE(TS ts,TSGLEEType gleetype)
10082302aa1bSDebojyoti Ghosh {
10092302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10102302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
10112302aa1bSDebojyoti Ghosh   PetscBool       match;
10122302aa1bSDebojyoti Ghosh   GLEETableauLink link;
10132302aa1bSDebojyoti Ghosh 
10142302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10152302aa1bSDebojyoti Ghosh   if (glee->tableau) {
10162302aa1bSDebojyoti Ghosh     ierr = PetscStrcmp(glee->tableau->name,gleetype,&match);CHKERRQ(ierr);
10172302aa1bSDebojyoti Ghosh     if (match) PetscFunctionReturn(0);
10182302aa1bSDebojyoti Ghosh   }
10192302aa1bSDebojyoti Ghosh   for (link = GLEETableauList; link; link=link->next) {
10202302aa1bSDebojyoti Ghosh     ierr = PetscStrcmp(link->tab.name,gleetype,&match);CHKERRQ(ierr);
10212302aa1bSDebojyoti Ghosh     if (match) {
10222302aa1bSDebojyoti Ghosh       ierr = TSReset_GLEE(ts);CHKERRQ(ierr);
10232302aa1bSDebojyoti Ghosh       glee->tableau = &link->tab;
10242302aa1bSDebojyoti Ghosh       PetscFunctionReturn(0);
10252302aa1bSDebojyoti Ghosh     }
10262302aa1bSDebojyoti Ghosh   }
10272302aa1bSDebojyoti Ghosh   SETERRQ1(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_UNKNOWN_TYPE,"Could not find '%s'",gleetype);
10282302aa1bSDebojyoti Ghosh }
10292302aa1bSDebojyoti Ghosh 
10302302aa1bSDebojyoti Ghosh static PetscErrorCode  TSGetStages_GLEE(TS ts,PetscInt *ns,Vec **Y)
10312302aa1bSDebojyoti Ghosh {
10322302aa1bSDebojyoti Ghosh   TS_GLEE *glee = (TS_GLEE*)ts->data;
10332302aa1bSDebojyoti Ghosh 
10342302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10350429704eSStefano Zampini   if (ns) *ns = glee->tableau->s;
1036d5509560SEmil Constantinescu   if (Y)  *Y  = glee->YStage;
10372302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10382302aa1bSDebojyoti Ghosh }
10392302aa1bSDebojyoti Ghosh 
1040b2bf4f3aSDebojyoti Ghosh PetscErrorCode TSGetSolutionComponents_GLEE(TS ts,PetscInt *n,Vec *Y)
10412302aa1bSDebojyoti Ghosh {
10422302aa1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10432302aa1bSDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
10446e2e232bSDebojyoti Ghosh   PetscErrorCode  ierr;
10452302aa1bSDebojyoti Ghosh 
10462302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
10474cdd57e5SDebojyoti Ghosh   if (!Y) *n = tab->r;
10482302aa1bSDebojyoti Ghosh   else {
10494cdd57e5SDebojyoti Ghosh     if ((*n >= 0) && (*n < tab->r)) {
10504cdd57e5SDebojyoti Ghosh       ierr = VecCopy(glee->Y[*n],*Y);CHKERRQ(ierr);
10519657682dSDebojyoti Ghosh     } else SETERRQ3(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_OUTOFRANGE,"Second argument (%d) out of range[%d,%d].",*n,0,tab->r-1);
10522302aa1bSDebojyoti Ghosh   }
10532302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
10542302aa1bSDebojyoti Ghosh }
10552302aa1bSDebojyoti Ghosh 
10564cdd57e5SDebojyoti Ghosh PetscErrorCode TSGetAuxSolution_GLEE(TS ts,Vec *X)
10574cdd57e5SDebojyoti Ghosh {
10584cdd57e5SDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10594cdd57e5SDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
10604cdd57e5SDebojyoti Ghosh   PetscReal       *F    = tab->Fembed;
10614cdd57e5SDebojyoti Ghosh   PetscInt        r     = tab->r;
10624cdd57e5SDebojyoti Ghosh   Vec             *Y    = glee->Y;
1063ec0e3ee2SEmil Constantinescu   PetscScalar     *wr   = glee->rwork;
1064ec0e3ee2SEmil Constantinescu   PetscInt        i;
10654cdd57e5SDebojyoti Ghosh   PetscErrorCode  ierr;
10664cdd57e5SDebojyoti Ghosh 
10674cdd57e5SDebojyoti Ghosh   PetscFunctionBegin;
10684cdd57e5SDebojyoti Ghosh   ierr = VecZeroEntries(*X);CHKERRQ(ierr);
1069ec0e3ee2SEmil Constantinescu   for (i=0; i<r; i++) wr[i] = F[i];
1070ec0e3ee2SEmil Constantinescu   ierr = VecMAXPY((*X),r,wr,Y);CHKERRQ(ierr);
10714cdd57e5SDebojyoti Ghosh   PetscFunctionReturn(0);
10724cdd57e5SDebojyoti Ghosh }
10734cdd57e5SDebojyoti Ghosh 
10740a01e1b2SEmil Constantinescu PetscErrorCode TSGetTimeError_GLEE(TS ts,PetscInt n,Vec *X)
10754cdd57e5SDebojyoti Ghosh {
10764cdd57e5SDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
10774cdd57e5SDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
10784cdd57e5SDebojyoti Ghosh   PetscReal       *F    = tab->Ferror;
10794cdd57e5SDebojyoti Ghosh   PetscInt        r     = tab->r;
10804cdd57e5SDebojyoti Ghosh   Vec             *Y    = glee->Y;
1081ec0e3ee2SEmil Constantinescu   PetscScalar     *wr   = glee->rwork;
1082ec0e3ee2SEmil Constantinescu   PetscInt        i;
10834cdd57e5SDebojyoti Ghosh   PetscErrorCode  ierr;
10844cdd57e5SDebojyoti Ghosh 
10854cdd57e5SDebojyoti Ghosh   PetscFunctionBegin;
10864cdd57e5SDebojyoti Ghosh   ierr = VecZeroEntries(*X);CHKERRQ(ierr);
1087657c1e31SEmil Constantinescu   if (n==0) {
1088ec0e3ee2SEmil Constantinescu     for (i=0; i<r; i++) wr[i] = F[i];
1089ec0e3ee2SEmil Constantinescu     ierr = VecMAXPY((*X),r,wr,Y);CHKERRQ(ierr);
10900a01e1b2SEmil Constantinescu   } else if (n==-1) {
1091657c1e31SEmil Constantinescu     *X=glee->yGErr;
10920a01e1b2SEmil Constantinescu   }
10934cdd57e5SDebojyoti Ghosh   PetscFunctionReturn(0);
10944cdd57e5SDebojyoti Ghosh }
10954cdd57e5SDebojyoti Ghosh 
109657df6a1bSDebojyoti Ghosh PetscErrorCode TSSetTimeError_GLEE(TS ts,Vec X)
109757df6a1bSDebojyoti Ghosh {
109857df6a1bSDebojyoti Ghosh   TS_GLEE         *glee = (TS_GLEE*)ts->data;
109957df6a1bSDebojyoti Ghosh   GLEETableau     tab   = glee->tableau;
110057df6a1bSDebojyoti Ghosh   PetscReal       *S    = tab->Serror;
110157df6a1bSDebojyoti Ghosh   PetscInt        r     = tab->r,i;
110257df6a1bSDebojyoti Ghosh   Vec             *Y    = glee->Y;
110357df6a1bSDebojyoti Ghosh   PetscErrorCode  ierr;
110457df6a1bSDebojyoti Ghosh 
110557df6a1bSDebojyoti Ghosh   PetscFunctionBegin;
11069657682dSDebojyoti Ghosh   if (r != 2) SETERRQ2(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"TSSetTimeError_GLEE not supported for '%s' with r=%D.",tab->name,tab->r);
110757df6a1bSDebojyoti Ghosh   for (i=1; i<r; i++) {
110857df6a1bSDebojyoti Ghosh     ierr = VecCopy(ts->vec_sol,Y[i]);CHKERRQ(ierr);
110957df6a1bSDebojyoti Ghosh     ierr = VecAXPBY(Y[i],S[0],S[1],X);CHKERRQ(ierr);
1110642ca4e8SEmil Constantinescu     ierr = VecCopy(X,glee->yGErr);CHKERRQ(ierr);
111157df6a1bSDebojyoti Ghosh   }
111257df6a1bSDebojyoti Ghosh   PetscFunctionReturn(0);
111357df6a1bSDebojyoti Ghosh }
111457df6a1bSDebojyoti Ghosh 
1115b3a6b972SJed Brown static PetscErrorCode TSDestroy_GLEE(TS ts)
1116b3a6b972SJed Brown {
1117b3a6b972SJed Brown   PetscErrorCode ierr;
1118b3a6b972SJed Brown 
1119b3a6b972SJed Brown   PetscFunctionBegin;
1120b3a6b972SJed Brown   ierr = TSReset_GLEE(ts);CHKERRQ(ierr);
1121b3a6b972SJed Brown   if (ts->dm) {
1122b3a6b972SJed Brown     ierr = DMCoarsenHookRemove(ts->dm,DMCoarsenHook_TSGLEE,DMRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
1123b3a6b972SJed Brown     ierr = DMSubDomainHookRemove(ts->dm,DMSubDomainHook_TSGLEE,DMSubDomainRestrictHook_TSGLEE,ts);CHKERRQ(ierr);
1124b3a6b972SJed Brown   }
1125b3a6b972SJed Brown   ierr = PetscFree(ts->data);CHKERRQ(ierr);
1126b3a6b972SJed Brown   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEEGetType_C",NULL);CHKERRQ(ierr);
1127b3a6b972SJed Brown   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEESetType_C",NULL);CHKERRQ(ierr);
1128b3a6b972SJed Brown   PetscFunctionReturn(0);
1129b3a6b972SJed Brown }
1130b3a6b972SJed Brown 
11312302aa1bSDebojyoti Ghosh /* ------------------------------------------------------------ */
11322302aa1bSDebojyoti Ghosh /*MC
11332302aa1bSDebojyoti Ghosh       TSGLEE - ODE and DAE solver using General Linear with Error Estimation schemes
11342302aa1bSDebojyoti Ghosh 
11352302aa1bSDebojyoti Ghosh   The user should provide the right hand side of the equation
11362302aa1bSDebojyoti Ghosh   using TSSetRHSFunction().
11372302aa1bSDebojyoti Ghosh 
11382302aa1bSDebojyoti Ghosh   Notes:
11392302aa1bSDebojyoti Ghosh   The default is TSGLEE35, it can be changed with TSGLEESetType() or -ts_glee_type
11402302aa1bSDebojyoti Ghosh 
11412302aa1bSDebojyoti Ghosh   Level: beginner
11422302aa1bSDebojyoti Ghosh 
11432302aa1bSDebojyoti Ghosh .seealso:  TSCreate(), TS, TSSetType(), TSGLEESetType(), TSGLEEGetType(),
11442302aa1bSDebojyoti Ghosh            TSGLEE23, TTSGLEE24, TSGLEE35, TSGLEE25I, TSGLEEEXRK2A,
11452302aa1bSDebojyoti Ghosh            TSGLEERK32G1, TSGLEERK285EX, TSGLEEType, TSGLEERegister()
11462302aa1bSDebojyoti Ghosh 
11472302aa1bSDebojyoti Ghosh M*/
11482302aa1bSDebojyoti Ghosh PETSC_EXTERN PetscErrorCode TSCreate_GLEE(TS ts)
11492302aa1bSDebojyoti Ghosh {
11502302aa1bSDebojyoti Ghosh   TS_GLEE         *th;
11512302aa1bSDebojyoti Ghosh   PetscErrorCode  ierr;
11522302aa1bSDebojyoti Ghosh 
11532302aa1bSDebojyoti Ghosh   PetscFunctionBegin;
11542302aa1bSDebojyoti Ghosh   ierr = TSGLEEInitializePackage();CHKERRQ(ierr);
11552302aa1bSDebojyoti Ghosh 
11562302aa1bSDebojyoti Ghosh   ts->ops->reset                  = TSReset_GLEE;
11572302aa1bSDebojyoti Ghosh   ts->ops->destroy                = TSDestroy_GLEE;
11582302aa1bSDebojyoti Ghosh   ts->ops->view                   = TSView_GLEE;
11592302aa1bSDebojyoti Ghosh   ts->ops->load                   = TSLoad_GLEE;
11602302aa1bSDebojyoti Ghosh   ts->ops->setup                  = TSSetUp_GLEE;
11612302aa1bSDebojyoti Ghosh   ts->ops->step                   = TSStep_GLEE;
11622302aa1bSDebojyoti Ghosh   ts->ops->interpolate            = TSInterpolate_GLEE;
11632302aa1bSDebojyoti Ghosh   ts->ops->evaluatestep           = TSEvaluateStep_GLEE;
11642302aa1bSDebojyoti Ghosh   ts->ops->setfromoptions         = TSSetFromOptions_GLEE;
11652302aa1bSDebojyoti Ghosh   ts->ops->getstages              = TSGetStages_GLEE;
11662302aa1bSDebojyoti Ghosh   ts->ops->snesfunction           = SNESTSFormFunction_GLEE;
11672302aa1bSDebojyoti Ghosh   ts->ops->snesjacobian           = SNESTSFormJacobian_GLEE;
1168b2bf4f3aSDebojyoti Ghosh   ts->ops->getsolutioncomponents  = TSGetSolutionComponents_GLEE;
11694cdd57e5SDebojyoti Ghosh   ts->ops->getauxsolution         = TSGetAuxSolution_GLEE;
11704cdd57e5SDebojyoti Ghosh   ts->ops->gettimeerror           = TSGetTimeError_GLEE;
117157df6a1bSDebojyoti Ghosh   ts->ops->settimeerror           = TSSetTimeError_GLEE;
11722302aa1bSDebojyoti Ghosh   ts->ops->startingmethod         = TSStartingMethod_GLEE;
1173b80d5313SLisandro Dalcin   ts->default_adapt_type          = TSADAPTGLEE;
11742302aa1bSDebojyoti Ghosh 
1175efd4aadfSBarry Smith   ts->usessnes = PETSC_TRUE;
1176efd4aadfSBarry Smith 
11772302aa1bSDebojyoti Ghosh   ierr = PetscNewLog(ts,&th);CHKERRQ(ierr);
11782302aa1bSDebojyoti Ghosh   ts->data = (void*)th;
11792302aa1bSDebojyoti Ghosh 
11802302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEEGetType_C",TSGLEEGetType_GLEE);CHKERRQ(ierr);
11812302aa1bSDebojyoti Ghosh   ierr = PetscObjectComposeFunction((PetscObject)ts,"TSGLEESetType_C",TSGLEESetType_GLEE);CHKERRQ(ierr);
11822302aa1bSDebojyoti Ghosh   PetscFunctionReturn(0);
11832302aa1bSDebojyoti Ghosh }
1184