$extrastylesheet
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