inf_fe_legendre_eval.C
Go to the documentation of this file.00001 // The libMesh Finite Element Library. 00002 // Copyright (C) 2002-2012 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::err << "bad index i = " << i << std::endl; 00165 libmesh_error(); 00166 00167 } 00168 00169 // we never end up here. 00170 libmesh_error(); 00171 return 0.; 00172 } // legendre_eval() 00173 00174 00175 00176 00177 Real legendre_eval_deriv(Real v, unsigned i) 00178 { 00179 libmesh_assert (-1.-1.e-5 <= v && v < 1.); 00180 00181 switch (i) 00182 { 00183 case 0: 00184 return 0.; 00185 00186 case 1: 00187 return 1.; 00188 00189 case 2: 00190 return 3.*v; 00191 00192 case 3: 00193 return 7.5*v*v-1.5; 00194 00195 case 4: 00196 return (-7.5+17.5*v*v)*v; 00197 00198 case 5: 00199 return 1.875+(-26.25+39.375*v*v)*v*v; 00200 00201 case 6: 00202 return 00203 (13.125+ 00204 (-78.75+86.625*v*v)*v*v)*v; 00205 00206 case 7: 00207 return -2.1875+ 00208 (59.0625+ 00209 (-216.5625+187.6875*v*v)*v*v)*v*v; 00210 00211 case 8: 00212 return 00213 (-19.6875+ 00214 (216.5625+ 00215 (-563.0625+402.1875*v*v)*v*v)*v*v)*v; 00216 00217 case 9: 00218 return 2.4609375+ 00219 (-108.28125+ 00220 (703.828125+ 00221 (-1407.65625+854.6484375*v*v)*v*v)*v*v)*v*v; 00222 00223 case 10: 00224 return 00225 (27.0703125+ 00226 (-469.21875+ 00227 (2111.484375+ 00228 (-3418.59375+1804.2578125*v*v)*v*v)*v*v)*v*v)*v; 00229 00230 case 11: 00231 return -2.70703125+ 00232 (175.95703125+ 00233 (-1759.5703125+ 00234 (5982.5390625+ 00235 (-8119.16015625+3788.94140625*v*v)*v*v)*v*v)*v*v)*v*v; 00236 00237 case 12: 00238 return 00239 (-35.19140625+ 00240 (879.78515625+ 00241 (-5982.5390625+ 00242 (16238.3203125+ 00243 (-18944.70703125+7922.33203125*v*v)*v*v)*v*v)*v*v)*v*v)*v; 00244 00245 case 13: 00246 return 2.9326171875+ 00247 (-263.935546875+ 00248 (3739.0869140625+ 00249 (-18944.70703125+ 00250 (42625.5908203125+ 00251 (-43572.826171875+16504.8583984375*v*v)*v*v)*v*v)*v*v)*v*v)*v*v; 00252 00253 case 14: 00254 return 00255 (43.9892578125+ 00256 (-1495.634765625+ 00257 (14208.5302734375+ 00258 (-56834.12109375+ 00259 (108932.0654296875+ 00260 (-99029.150390625+34279.3212890625*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v; 00261 00262 case 15: 00263 return -3.14208984375+ 00264 (373.90869140625+ 00265 (-7104.26513671875+ 00266 (49729.85595703125+ 00267 (-163398.0981445313+ 00268 (272330.1635742188+ 00269 (-222815.5883789063+71007.16552734375*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v; 00270 00271 case 16: 00272 return 00273 (-53.41552734375+ 00274 (2368.08837890625+ 00275 (-29837.91357421875+ 00276 (163398.0981445313+ 00277 (-453883.6059570313+ 00278 (668446.7651367188+ 00279 (-497050.1586914063+146748.1420898438*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v; 00280 00281 case 17: 00282 return 3.338470458984375+ 00283 (-507.447509765625+ 00284 (12432.46398925781+ 00285 (-114378.6687011719+ 00286 (510619.0567016602+ 00287 (-1225485.736083984+ 00288 (1615413.01574707+ 00289 (-1100611.065673828+302668.0430603027*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v; 00290 00291 case 18: 00292 return 00293 (63.43093872070313+ 00294 (-3552.132568359375+ 00295 (57189.33435058594+ 00296 (-408495.2453613281+ 00297 (1531857.17010498+ 00298 (-3230826.031494141+ 00299 (3852138.729858398+ 00300 (-2421344.344482422+623140.0886535645*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v*v)*v; 00301 00302 00303 default: 00304 libMesh::err << "bad index i = " << i << std::endl; 00305 libmesh_error(); 00306 00307 } 00308 00309 // we never end up here. 00310 libmesh_error(); 00311 return 0.; 00312 } // legendre_eval_deriv() 00313 00314 } // anonymous namespace 00315 00316 00317 00318 00319 00320 // Specialize the eval() 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(Real v, Order, unsigned i) { return legendre_eval(v, i); } 00323 template <> Real InfFE<2,LEGENDRE,CARTESIAN>::eval(Real v, Order, unsigned i) { return legendre_eval(v, i); } 00324 template <> Real InfFE<3,LEGENDRE,CARTESIAN>::eval(Real v, Order, unsigned i) { return legendre_eval(v, i); } 00325 00326 // Specialize the eval_deriv() function for 1, 2, and 3 dimensions and the CARTESIAN mapping type 00327 // to call the local helper function from the anonymous namespace. 00328 template <> Real InfFE<1,LEGENDRE,CARTESIAN>::eval_deriv(Real v, Order, unsigned i) { return legendre_eval_deriv(v, i); } 00329 template <> Real InfFE<2,LEGENDRE,CARTESIAN>::eval_deriv(Real v, Order, unsigned i) { return legendre_eval_deriv(v, i); } 00330 template <> Real InfFE<3,LEGENDRE,CARTESIAN>::eval_deriv(Real v, Order, unsigned i) { return legendre_eval_deriv(v, i); } 00331 00332 } // namespace libMesh 00333 00334 00335 #endif // LIBMESH_ENABLE_INFINITE_ELEMENTS 00336
Site Created By: libMesh Developers
Last modified: February 05 2013 19:54:47 UTC
Hosted By: