$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 // C++ inlcludes 00020 00021 // Local includes 00022 #include "libmesh/fe.h" 00023 #include "libmesh/elem.h" 00024 #include "libmesh/utility.h" 00025 00026 00027 namespace libMesh 00028 { 00029 00030 00031 00032 template <> 00033 Real FE<1,HIERARCHIC>::shape(const ElemType, 00034 const Order libmesh_dbg_var(order), 00035 const unsigned int i, 00036 const Point& p) 00037 { 00038 libmesh_assert_less (i, order+1u); 00039 00040 // Declare that we are using our own special power function 00041 // from the Utility namespace. This saves typing later. 00042 using Utility::pow; 00043 00044 const Real xi = p(0); 00045 00046 Real returnval = 1.; 00047 00048 switch (i) 00049 { 00050 case 0: 00051 returnval = .5*(1. - xi); 00052 break; 00053 case 1: 00054 returnval = .5*(1. + xi); 00055 break; 00056 // All even-terms have the same form. 00057 // (xi^p - 1.)/p! 00058 case 2: 00059 returnval = (xi*xi - 1.)/2.; 00060 break; 00061 case 4: 00062 returnval = (pow<4>(xi) - 1.)/24.; 00063 break; 00064 case 6: 00065 returnval = (pow<6>(xi) - 1.)/720.; 00066 break; 00067 00068 // All odd-terms have the same form. 00069 // (xi^p - xi)/p! 00070 case 3: 00071 returnval = (xi*xi*xi - xi)/6.; 00072 break; 00073 case 5: 00074 returnval = (pow<5>(xi) - xi)/120.; 00075 break; 00076 case 7: 00077 returnval = (pow<7>(xi) - xi)/5040.; 00078 break; 00079 default: 00080 Real denominator = 1.; 00081 for (unsigned int n=1; n <= i; ++n) 00082 { 00083 returnval *= xi; 00084 denominator *= n; 00085 } 00086 // Odd: 00087 if (i % 2) 00088 returnval = (returnval - xi)/denominator; 00089 // Even: 00090 else 00091 returnval = (returnval - 1.)/denominator; 00092 break; 00093 } 00094 00095 return returnval; 00096 } 00097 00098 00099 00100 template <> 00101 Real FE<1,HIERARCHIC>::shape(const Elem* elem, 00102 const Order order, 00103 const unsigned int i, 00104 const Point& p) 00105 { 00106 libmesh_assert(elem); 00107 00108 return FE<1,HIERARCHIC>::shape(elem->type(), static_cast<Order>(order + elem->p_level()), i, p); 00109 } 00110 00111 00112 00113 template <> 00114 Real FE<1,HIERARCHIC>::shape_deriv(const ElemType, 00115 const Order libmesh_dbg_var(order), 00116 const unsigned int i, 00117 const unsigned int libmesh_dbg_var(j), 00118 const Point& p) 00119 { 00120 // only d()/dxi in 1D! 00121 00122 libmesh_assert_equal_to (j, 0); 00123 libmesh_assert_less (i, order+1u); 00124 00125 // Declare that we are using our own special power function 00126 // from the Utility namespace. This saves typing later. 00127 using Utility::pow; 00128 00129 const Real xi = p(0); 00130 00131 Real returnval = 1.; 00132 00133 switch (i) 00134 { 00135 case 0: 00136 returnval = -.5; 00137 break; 00138 case 1: 00139 returnval = .5; 00140 break; 00141 // All even-terms have the same form. 00142 // xi^(p-1)/(p-1)! 00143 case 2: 00144 returnval = xi; 00145 break; 00146 case 4: 00147 returnval = pow<3>(xi)/6.; 00148 break; 00149 case 6: 00150 returnval = pow<5>(xi)/120.; 00151 break; 00152 // All odd-terms have the same form. 00153 // (p*xi^(p-1) - 1.)/p! 00154 case 3: 00155 returnval = (3*xi*xi - 1.)/6.; 00156 break; 00157 case 5: 00158 returnval = (5.*pow<4>(xi) - 1.)/120.; 00159 break; 00160 case 7: 00161 returnval = (7.*pow<6>(xi) - 1.)/5040.; 00162 break; 00163 default: 00164 Real denominator = 1.; 00165 for (unsigned int n=1; n != i; ++n) 00166 { 00167 returnval *= xi; 00168 denominator *= n; 00169 } 00170 // Odd: 00171 if (i % 2) 00172 returnval = (i * returnval - 1.)/denominator/i; 00173 // Even: 00174 else 00175 returnval = returnval/denominator; 00176 break; 00177 } 00178 00179 return returnval; 00180 } 00181 00182 00183 00184 template <> 00185 Real FE<1,HIERARCHIC>::shape_deriv(const Elem* elem, 00186 const Order order, 00187 const unsigned int i, 00188 const unsigned int j, 00189 const Point& p) 00190 { 00191 libmesh_assert(elem); 00192 00193 return FE<1,HIERARCHIC>::shape_deriv(elem->type(), 00194 static_cast<Order>(order + elem->p_level()), i, j, p); 00195 } 00196 00197 00198 00199 template <> 00200 Real FE<1,HIERARCHIC>::shape_second_deriv(const ElemType, 00201 const Order libmesh_dbg_var(order), 00202 const unsigned int i, 00203 const unsigned int libmesh_dbg_var(j), 00204 const Point& p) 00205 { 00206 // only d2()/d2xi in 1D! 00207 00208 libmesh_assert_equal_to (j, 0); 00209 libmesh_assert_less (i, order+1u); 00210 00211 // Declare that we are using our own special power function 00212 // from the Utility namespace. This saves typing later. 00213 using Utility::pow; 00214 00215 const Real xi = p(0); 00216 00217 Real returnval = 1.; 00218 00219 switch (i) 00220 { 00221 case 0: 00222 case 1: 00223 returnval = 0; 00224 break; 00225 // All terms have the same form. 00226 // xi^(p-2)/(p-2)! 00227 case 2: 00228 returnval = 1; 00229 break; 00230 case 3: 00231 returnval = xi; 00232 break; 00233 case 4: 00234 returnval = pow<2>(xi)/2.; 00235 break; 00236 case 5: 00237 returnval = pow<3>(xi)/6.; 00238 break; 00239 case 6: 00240 returnval = pow<4>(xi)/24.; 00241 break; 00242 case 7: 00243 returnval = pow<5>(xi)/120.; 00244 break; 00245 00246 default: 00247 Real denominator = 1.; 00248 for (unsigned int n=1; n != i; ++n) 00249 { 00250 returnval *= xi; 00251 denominator *= n; 00252 } 00253 // Odd: 00254 if (i % 2) 00255 returnval = (i * returnval - 1.)/denominator/i; 00256 // Even: 00257 else 00258 returnval = returnval/denominator; 00259 break; 00260 } 00261 00262 return returnval; 00263 } 00264 00265 00266 00267 template <> 00268 Real FE<1,HIERARCHIC>::shape_second_deriv(const Elem* elem, 00269 const Order order, 00270 const unsigned int i, 00271 const unsigned int j, 00272 const Point& p) 00273 { 00274 libmesh_assert(elem); 00275 00276 return FE<1,HIERARCHIC>::shape_second_deriv(elem->type(), 00277 static_cast<Order>(order + elem->p_level()), i, j, p); 00278 } 00279 00280 } // namespace libMesh