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