$extrastylesheet
inf_fe_legendre_eval.C
Go to the documentation of this file.
00001 // The libMesh Finite Element Library.
00002 // Copyright (C) 2002-2014 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
00003 
00004 // This library is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU Lesser General Public
00006 // License as published by the Free Software Foundation; either
00007 // version 2.1 of the License, or (at your option) any later version.
00008 
00009 // This library is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // Lesser General Public License for more details.
00013 
00014 // You should have received a copy of the GNU Lesser General Public
00015 // License along with this library; if not, write to the Free Software
00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017 
00018 
00019 // Local Includes
00020 #include "libmesh/libmesh_config.h"
00021 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
00022 #include "libmesh/inf_fe.h"
00023 #include "libmesh/inf_fe_macro.h"
00024 
00025 namespace libMesh
00026 {
00027 
00028 // Anonymous namespace for local helper functions
00029 namespace {
00030 
00031 Real legendre_eval(Real v,  unsigned i)
00032 {
00033   libmesh_assert (-1.-1.e-5 <= v && v < 1.);
00034 
00035   switch (i)
00036     {
00037     case 0:
00038       return 1.;
00039 
00040     case 1:
00041       return v+1.;
00042 
00043     case 2:
00044       return 1.5*v*v-1.5;
00045 
00046     case 3:
00047       return 1.+(-1.5+2.5*v*v)*v;
00048 
00049     case 4:
00050       return -.625+(-3.75+4.375*v*v)*v*v;
00051 
00052     case 5:
00053       return 1.+(1.875+(-8.75+7.875*v*v)*v*v)*v;
00054 
00055     case 6:
00056       return -1.3125+
00057         (6.5625+
00058          (-19.6875+14.4375*v*v)*v*v)*v*v;
00059 
00060     case 7:
00061       return 1.+
00062         (-2.1875+
00063          (19.6875+
00064           (-43.3125+26.8125*v*v)*v*v)*v*v)*v;
00065 
00066     case 8:
00067       return -.7265625+
00068         (-9.84375+
00069          (54.140625+
00070           (-93.84375+50.2734375*v*v)*v*v)*v*v)*v*v;
00071 
00072     case 9:
00073       return 1.+
00074         (2.4609375+
00075          (-36.09375+
00076           (140.765625+
00077            (-201.09375+94.9609375*v*v)*v*v)*v*v)*v*v)*v;
00078 
00079     case 10:
00080       return -1.24609375+
00081         (13.53515625+
00082          (-117.3046875+
00083           (351.9140625+
00084            (-427.32421875+180.42578125*v*v)*v*v)*v*v)*v*v)*v*v;
00085 
00086     case 11:
00087       return 1.+
00088         (-2.70703125+
00089          (58.65234375+
00090           (-351.9140625+
00091            (854.6484375+
00092             (-902.12890625+344.44921875*v*v)*v*v)*v*v)*v*v)*v*v)*v;
00093 
00094     case 12:
00095       return -.7744140625+
00096         (-17.595703125+
00097          (219.9462890625+
00098           (-997.08984375+
00099            (2029.7900390625+
00100             (-1894.470703125+660.1943359375*v*v)*v*v)*v*v)*v*v)*v*v)*v*v;
00101 
00102     case 13:
00103       return 1.+
00104         (2.9326171875+
00105          (-87.978515625+
00106           (747.8173828125+
00107            (-2706.38671875+
00108             (4736.1767578125+
00109              (-3961.166015625+1269.6044921875*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v;
00110 
00111     case 14:
00112       return -1.20947265625+
00113         (21.99462890625+
00114          (-373.90869140625+
00115           (2368.08837890625+
00116            (-7104.26513671875+
00117             (10893.20654296875+
00118              (-8252.42919921875+2448.52294921875*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v;
00119 
00120     case 15:
00121       return 1.+
00122         (-3.14208984375+
00123          (124.63623046875+
00124           (-1420.85302734375+
00125            (7104.26513671875+
00126             (-18155.34423828125+
00127              (24757.28759765625+
00128               (-17139.66064453125+4733.81103515625*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v;
00129 
00130     case 16:
00131       return -.803619384765625+
00132         (-26.707763671875+
00133          (592.0220947265625+
00134           (-4972.985595703125+
00135            (20424.76226806641+
00136             (-45388.36059570313+
00137              (55703.89709472656+
00138               (-35503.58276367188+9171.758880615234*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v;
00139 
00140     case 17:
00141       return 1.+
00142         (3.338470458984375+
00143          (-169.149169921875+
00144           (2486.492797851563+
00145            (-16339.80981445313+
00146             (56735.45074462891+
00147              (-111407.7941894531+
00148               (124262.5396728516+
00149                (-73374.07104492188+17804.00253295898*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v;
00150 
00151     case 18:
00152       return -1.185470581054688+
00153         (31.71546936035156+
00154          (-888.0331420898438+
00155           (9531.555725097656+
00156            (-51061.90567016602+
00157             (153185.717010498+
00158              (-269235.5026245117+
00159               (275152.766418457+
00160                (-151334.0215301514+34618.89381408691*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v;
00161 
00162 
00163     default:
00164       libmesh_error_msg("bad index i = " << i);
00165     }
00166 
00167   libmesh_error_msg("We'll never get here!");
00168   return 0.;
00169 } // legendre_eval()
00170 
00171 
00172 
00173 
00174 Real legendre_eval_deriv(Real v, unsigned i)
00175 {
00176   libmesh_assert (-1.-1.e-5 <= v && v < 1.);
00177 
00178   switch (i)
00179     {
00180     case 0:
00181       return 0.;
00182 
00183     case 1:
00184       return 1.;
00185 
00186     case 2:
00187       return 3.*v;
00188 
00189     case 3:
00190       return 7.5*v*v-1.5;
00191 
00192     case 4:
00193       return (-7.5+17.5*v*v)*v;
00194 
00195     case 5:
00196       return 1.875+(-26.25+39.375*v*v)*v*v;
00197 
00198     case 6:
00199       return
00200         (13.125+
00201          (-78.75+86.625*v*v)*v*v)*v;
00202 
00203     case 7:
00204       return -2.1875+
00205         (59.0625+
00206          (-216.5625+187.6875*v*v)*v*v)*v*v;
00207 
00208     case 8:
00209       return
00210         (-19.6875+
00211          (216.5625+
00212           (-563.0625+402.1875*v*v)*v*v)*v*v)*v;
00213 
00214     case 9:
00215       return 2.4609375+
00216         (-108.28125+
00217          (703.828125+
00218           (-1407.65625+854.6484375*v*v)*v*v)*v*v)*v*v;
00219 
00220     case 10:
00221       return
00222         (27.0703125+
00223          (-469.21875+
00224           (2111.484375+
00225            (-3418.59375+1804.2578125*v*v)*v*v)*v*v)*v*v)*v;
00226 
00227     case 11:
00228       return -2.70703125+
00229         (175.95703125+
00230          (-1759.5703125+
00231           (5982.5390625+
00232            (-8119.16015625+3788.94140625*v*v)*v*v)*v*v)*v*v)*v*v;
00233 
00234     case 12:
00235       return
00236         (-35.19140625+
00237          (879.78515625+
00238           (-5982.5390625+
00239            (16238.3203125+
00240             (-18944.70703125+7922.33203125*v*v)*v*v)*v*v)*v*v)*v*v)*v;
00241 
00242     case 13:
00243       return 2.9326171875+
00244         (-263.935546875+
00245          (3739.0869140625+
00246           (-18944.70703125+
00247            (42625.5908203125+
00248             (-43572.826171875+16504.8583984375*v*v)*v*v)*v*v)*v*v)*v*v)*v*v;
00249 
00250     case 14:
00251       return
00252         (43.9892578125+
00253          (-1495.634765625+
00254           (14208.5302734375+
00255            (-56834.12109375+
00256             (108932.0654296875+
00257              (-99029.150390625+34279.3212890625*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v;
00258 
00259     case 15:
00260       return -3.14208984375+
00261         (373.90869140625+
00262          (-7104.26513671875+
00263           (49729.85595703125+
00264            (-163398.0981445313+
00265             (272330.1635742188+
00266              (-222815.5883789063+71007.16552734375*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v;
00267 
00268     case 16:
00269       return
00270         (-53.41552734375+
00271          (2368.08837890625+
00272           (-29837.91357421875+
00273            (163398.0981445313+
00274             (-453883.6059570313+
00275              (668446.7651367188+
00276               (-497050.1586914063+146748.1420898438*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v;
00277 
00278     case 17:
00279       return 3.338470458984375+
00280         (-507.447509765625+
00281          (12432.46398925781+
00282           (-114378.6687011719+
00283            (510619.0567016602+
00284             (-1225485.736083984+
00285              (1615413.01574707+
00286               (-1100611.065673828+302668.0430603027*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v;
00287 
00288     case 18:
00289       return
00290         (63.43093872070313+
00291          (-3552.132568359375+
00292           (57189.33435058594+
00293            (-408495.2453613281+
00294             (1531857.17010498+
00295              (-3230826.031494141+
00296               (3852138.729858398+
00297                (-2421344.344482422+623140.0886535645*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v;
00298 
00299 
00300     default:
00301       libmesh_error_msg("bad index i = " << i);
00302     }
00303 
00304   libmesh_error_msg("We'll never get here!");
00305   return 0.;
00306 } // legendre_eval_deriv()
00307 
00308 } // anonymous namespace
00309 
00310 
00311 
00312 
00313 
00314   // Specialize the eval() function for 1, 2, and 3 dimensions and the CARTESIAN mapping type
00315   // to call the local helper function from the anonymous namespace.
00316 template <> Real InfFE<1,LEGENDRE,CARTESIAN>::eval(Real v, Order, unsigned i) { return legendre_eval(v, i); }
00317 template <> Real InfFE<2,LEGENDRE,CARTESIAN>::eval(Real v, Order, unsigned i) { return legendre_eval(v, i); }
00318 template <> Real InfFE<3,LEGENDRE,CARTESIAN>::eval(Real v, Order, unsigned i) { return legendre_eval(v, i); }
00319 
00320 // Specialize the eval_deriv() function for 1, 2, and 3 dimensions and the CARTESIAN mapping type
00321 // to call the local helper function from the anonymous namespace.
00322 template <> Real InfFE<1,LEGENDRE,CARTESIAN>::eval_deriv(Real v, Order, unsigned i) { return legendre_eval_deriv(v, i); }
00323 template <> Real InfFE<2,LEGENDRE,CARTESIAN>::eval_deriv(Real v, Order, unsigned i) { return legendre_eval_deriv(v, i); }
00324 template <> Real InfFE<3,LEGENDRE,CARTESIAN>::eval_deriv(Real v, Order, unsigned i) { return legendre_eval_deriv(v, i); }
00325 
00326 } // namespace libMesh
00327 
00328 
00329 #endif // LIBMESH_ENABLE_INFINITE_ELEMENTS