$extrastylesheet
fe_l2_hierarchic_shape_1D.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 // 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,L2_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,L2_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,L2_HIERARCHIC>::shape(elem->type(), static_cast<Order>(order + elem->p_level()), i, p);
00109 }
00110 
00111 
00112 
00113 template <>
00114 Real FE<1,L2_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,L2_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,L2_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,L2_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,L2_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,L2_HIERARCHIC>::shape_second_deriv(elem->type(),
00277                                                  static_cast<Order>(order + elem->p_level()), i, j, p);
00278 }
00279 
00280 } // namespace libMesh