22 #include "libmesh/fe.h"    24 #include "libmesh/elem.h"    25 #include "libmesh/int_range.h"    37                       const Order libmesh_dbg_var(order),
    39                       const Point & point_in,
    40                       const bool libmesh_dbg_var(add_p_level))
    45   Point avg = elem->vertex_average();
    46   Point max_distance = Point(0.,0.,0.);
    48     for (
unsigned int d = 0; d < 3; d++)
    50         const Real distance = std::abs(avg(d) - elem->point(p)(d));
    51         max_distance(d) = std::max(
distance, max_distance(d));
    54   const Real x  = point_in(0);
    55   const Real y  = point_in(1);
    56   const Real z  = point_in(2);
    57   const Real xc = avg(0);
    58   const Real yc = avg(1);
    59   const Real zc = avg(2);
    60   const Real distx = max_distance(0);
    61   const Real disty = max_distance(1);
    62   const Real distz = max_distance(2);
    63   const Real dx = (x - xc)/distx;
    64   const Real dy = (y - yc)/disty;
    65   const Real dz = (z - zc)/distz;
    70   const unsigned int totalorder = order + add_p_level * elem->p_level();
    72   libmesh_assert_less (i, (totalorder+1) * (totalorder+2) *
   190       for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
   191       unsigned int i2 = i - (o*(o+1)*(o+2)/6);
   192       unsigned int block=o, nz = 0;
   193       for (; block < i2; block += (o-nz+1)) { nz++; }
   194       const unsigned int nx = block - i2;
   195       const unsigned int ny = o - nx - nz;
   197       for (
unsigned int index=0; index != nx; index++)
   199       for (
unsigned int index=0; index != ny; index++)
   201       for (
unsigned int index=0; index != nz; index++)
   206 #else // LIBMESH_DIM != 3   209   libmesh_not_implemented();
   221   libmesh_error_msg(
"XYZ polynomials require the element.");
   230                       const unsigned int i,
   232                       const bool add_p_level)
   243                             const Order libmesh_dbg_var(order),
   244                             const unsigned int i,
   245                             const unsigned int j,
   246                             const Point & point_in,
   247                             const bool libmesh_dbg_var(add_p_level))
   252   libmesh_assert_less (j, 3);
   257     for (
unsigned int d = 0; d < 3; d++)
   260         max_distance(d) = std::max(
distance, max_distance(d));
   263   const Real x  = point_in(0);
   264   const Real y  = point_in(1);
   265   const Real z  = point_in(2);
   266   const Real xc = avg(0);
   267   const Real yc = avg(1);
   268   const Real zc = avg(2);
   269   const Real distx = max_distance(0);
   270   const Real disty = max_distance(1);
   271   const Real distz = max_distance(2);
   272   const Real dx = (x - xc)/distx;
   273   const Real dy = (y - yc)/disty;
   274   const Real dz = (z - zc)/distz;
   279   const unsigned int totalorder = order + add_p_level*elem->
p_level();
   281   libmesh_assert_less (i, (totalorder+1) * (totalorder+2) *
   326             return 3.*dx*dx/distx;
   329             return 2.*dx*dy/distx;
   338             return 2.*dx*dz/distx;
   357             return 4.*dx*dx*dx/distx;
   360             return 3.*dx*dx*dy/distx;
   363             return 2.*dx*dy*dy/distx;
   366             return dy*dy*dy/distx;
   372             return 3.*dx*dx*dz/distx;
   375             return 2.*dx*dy*dz/distx;
   378             return dy*dy*dz/distx;
   384             return 2.*dx*dz*dz/distx;
   387             return dy*dz*dz/distx;
   393             return dz*dz*dz/distx;
   403             for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
   404             unsigned int i2 = i - (o*(o+1)*(o+2)/6);
   405             unsigned int block=o, nz = 0;
   406             for (; block < i2; block += (o-nz+1)) { nz++; }
   407             const unsigned int nx = block - i2;
   408             const unsigned int ny = o - nx - nz;
   410             for (
unsigned int index=1; index < nx; index++)
   412             for (
unsigned int index=0; index != ny; index++)
   414             for (
unsigned int index=0; index != nz; index++)
   467             return 2.*dx*dy/disty;
   470             return 3.*dy*dy/disty;
   479             return 2.*dy*dz/disty;
   495             return dx*dx*dx/disty;
   498             return 2.*dx*dx*dy/disty;
   501             return 3.*dx*dy*dy/disty;
   504             return 4.*dy*dy*dy/disty;
   510             return dx*dx*dz/disty;
   513             return 2.*dx*dy*dz/disty;
   516             return 3.*dy*dy*dz/disty;
   522             return dx*dz*dz/disty;
   525             return 2.*dy*dz*dz/disty;
   531             return dz*dz*dz/disty;
   538             for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
   539             unsigned int i2 = i - (o*(o+1)*(o+2)/6);
   540             unsigned int block=o, nz = 0;
   541             for (; block < i2; block += (o-nz+1)) { nz++; }
   542             const unsigned int nx = block - i2;
   543             const unsigned int ny = o - nx - nz;
   545             for (
unsigned int index=0; index != nx; index++)
   547             for (
unsigned int index=1; index < ny; index++)
   549             for (
unsigned int index=0; index != nz; index++)
   617             return 2.*dx*dz/distz;
   620             return 2.*dy*dz/distz;
   623             return 3.*dz*dz/distz;
   642             return dx*dx*dx/distz;
   645             return dx*dx*dy/distz;
   648             return dx*dy*dy/distz;
   651             return dy*dy*dy/distz;
   654             return 2.*dx*dx*dz/distz;
   657             return 2.*dx*dy*dz/distz;
   660             return 2.*dy*dy*dz/distz;
   663             return 3.*dx*dz*dz/distz;
   666             return 3.*dy*dz*dz/distz;
   669             return 4.*dz*dz*dz/distz;
   673             for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
   674             unsigned int i2 = i - (o*(o+1)*(o+2)/6);
   675             unsigned int block=o, nz = 0;
   676             for (; block < i2; block += (o-nz+1)) { nz++; }
   677             const unsigned int nx = block - i2;
   678             const unsigned int ny = o - nx - nz;
   680             for (
unsigned int index=0; index != nx; index++)
   682             for (
unsigned int index=0; index != ny; index++)
   684             for (
unsigned int index=1; index < nz; index++)
   692       libmesh_error_msg(
"Invalid j = " << j);
   695 #else // LIBMESH_DIM != 3   698   libmesh_not_implemented();
   710   libmesh_error_msg(
"XYZ polynomials require the element.");
   719                             const unsigned int i,
   720                             const unsigned int j,
   722                             const bool add_p_level)
   728 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES   733                                    const Order libmesh_dbg_var(order),
   734                                    const unsigned int i,
   735                                    const unsigned int j,
   736                                    const Point & point_in,
   737                                    const bool libmesh_dbg_var(add_p_level))
   742   libmesh_assert_less (j, 6);
   747     for (
unsigned int d = 0; d < 3; d++)
   750         max_distance(d) = std::max(
distance, max_distance(d));
   753   const Real x  = point_in(0);
   754   const Real y  = point_in(1);
   755   const Real z  = point_in(2);
   756   const Real xc = avg(0);
   757   const Real yc = avg(1);
   758   const Real zc = avg(2);
   759   const Real distx = max_distance(0);
   760   const Real disty = max_distance(1);
   761   const Real distz = max_distance(2);
   762   const Real dx = (x - xc)/distx;
   763   const Real dy = (y - yc)/disty;
   764   const Real dz = (z - zc)/distz;
   765   const Real dist2x = 
pow(distx,2.);
   766   const Real dist2y = 
pow(disty,2.);
   767   const Real dist2z = 
pow(distz,2.);
   768   const Real distxy = distx * disty;
   769   const Real distxz = distx * distz;
   770   const Real distyz = disty * distz;
   775   const unsigned int totalorder = order + add_p_level*elem->
p_level();
   777   libmesh_assert_less (i, (totalorder+1) * (totalorder+2) *
   831             return 12.*dx*dx/dist2x;
   834             return 6.*dx*dy/dist2x;
   837             return 2.*dy*dy/dist2x;
   844             return 6.*dx*dz/dist2x;
   847             return 2.*dy*dz/dist2x;
   854             return 2.*dz*dz/dist2x;
   865             for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
   866             unsigned int i2 = i - (o*(o+1)*(o+2)/6);
   867             unsigned int block=o, nz = 0;
   868             for (; block < i2; block += (o-nz+1)) { nz++; }
   869             const unsigned int nx = block - i2;
   870             const unsigned int ny = o - nx - nz;
   871             Real val = nx * (nx - 1);
   872             for (
unsigned int index=2; index < nx; index++)
   874             for (
unsigned int index=0; index != ny; index++)
   876             for (
unsigned int index=0; index != nz; index++)
   938             return 3.*dx*dx/distxy;
   941             return 4.*dx*dy/distxy;
   944             return 3.*dy*dy/distxy;
   951             return 2.*dx*dz/distxy;
   954             return 2.*dy*dz/distxy;
   971             for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
   972             unsigned int i2 = i - (o*(o+1)*(o+2)/6);
   973             unsigned int block=o, nz = 0;
   974             for (; block < i2; block += (o-nz+1)) { nz++; }
   975             const unsigned int nx = block - i2;
   976             const unsigned int ny = o - nx - nz;
   978             for (
unsigned int index=1; index < nx; index++)
   980             for (
unsigned int index=1; index < ny; index++)
   982             for (
unsigned int index=0; index != nz; index++)
  1022             return 2.*dx/dist2y;
  1024             return 6.*dy/dist2y;
  1031             return 2.*dz/dist2y;
  1044             return 2.*dx*dx/dist2y;
  1047             return 6.*dx*dy/dist2y;
  1050             return 12.*dy*dy/dist2y;
  1057             return 2.*dx*dz/dist2y;
  1060             return 6.*dy*dz/dist2y;
  1067             return 2.*dz*dz/dist2y;
  1076             for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
  1077             unsigned int i2 = i - (o*(o+1)*(o+2)/6);
  1078             unsigned int block=o, nz = 0;
  1079             for (; block < i2; block += (o-nz+1)) { nz++; }
  1080             const unsigned int nx = block - i2;
  1081             const unsigned int ny = o - nx - nz;
  1082             Real val = ny * (ny - 1);
  1083             for (
unsigned int index=0; index != nx; index++)
  1085             for (
unsigned int index=2; index < ny; index++)
  1087             for (
unsigned int index=0; index != nz; index++)
  1129             return 2.*dx/distxz;
  1138             return 2.*dz/distxz;
  1153             return 3.*dx*dx/distxz;
  1156             return 2.*dx*dy/distxz;
  1159             return dy*dy/distxz;
  1165             return 4.*dx*dz/distxz;
  1168             return 2.*dy*dz/distxz;
  1174             return 3.*dz*dz/distxz;
  1182             for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
  1183             unsigned int i2 = i - (o*(o+1)*(o+2)/6);
  1184             unsigned int block=o, nz = 0;
  1185             for (; block < i2; block += (o-nz+1)) { nz++; }
  1186             const unsigned int nx = block - i2;
  1187             const unsigned int ny = o - nx - nz;
  1189             for (
unsigned int index=1; index < nx; index++)
  1191             for (
unsigned int index=0; index != ny; index++)
  1193             for (
unsigned int index=1; index < nz; index++)
  1238             return 2.*dy/distyz;
  1244             return 2.*dz/distyz;
  1259             return dx*dx/distyz;
  1262             return 2.*dx*dy/distyz;
  1265             return 3.*dy*dy/distyz;
  1271             return 2.*dx*dz/distyz;
  1274             return 4.*dy*dz/distyz;
  1280             return 3.*dz*dz/distyz;
  1287             for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
  1288             unsigned int i2 = i - (o*(o+1)*(o+2)/6);
  1289             unsigned int block=o, nz = 0;
  1290             for (; block < i2; block += (o-nz+1)) { nz++; }
  1291             const unsigned int nx = block - i2;
  1292             const unsigned int ny = o - nx - nz;
  1294             for (
unsigned int index=0; index != nx; index++)
  1296             for (
unsigned int index=1; index < ny; index++)
  1298             for (
unsigned int index=1; index < nz; index++)
  1341             return 2.*dx/dist2z;
  1344             return 2.*dy/dist2z;
  1347             return 6.*dz/dist2z;
  1362             return 2.*dx*dx/dist2z;
  1365             return 2.*dx*dy/dist2z;
  1368             return 2.*dy*dy/dist2z;
  1371             return 6.*dx*dz/dist2z;
  1374             return 6.*dy*dz/dist2z;
  1377             return 12.*dz*dz/dist2z;
  1381             for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
  1382             unsigned int i2 = i - (o*(o+1)*(o+2)/6);
  1383             unsigned int block=o, nz = 0;
  1384             for (; block < i2; block += (o-nz+1)) { nz++; }
  1385             const unsigned int nx = block - i2;
  1386             const unsigned int ny = o - nx - nz;
  1387             Real val = nz * (nz - 1);
  1388             for (
unsigned int index=0; index != nx; index++)
  1390             for (
unsigned int index=0; index != ny; index++)
  1392             for (
unsigned int index=2; index < nz; index++)
  1400       libmesh_error_msg(
"Invalid j = " << j);
  1403 #else // LIBMESH_DIM != 3  1406   libmesh_not_implemented();
  1418   libmesh_error_msg(
"XYZ polynomials require the element.");
  1426                                    const unsigned int i,
  1427                                    const unsigned int j,
  1429                                    const bool add_p_level)
 class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
ElemType
Defines an enum for geometric element types. 
Order
defines an enum for polynomial orders. 
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
This is the base class from which all geometric element types are derived. 
static OutputShape shape_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
unsigned int p_level() const
OrderWrapper order
The approximation order of the element. 
The libMesh namespace provides an interface to certain functionality in the library. 
Real distance(const Point &p)
LIBMESH_DEFAULT_VECTORIZED_FE(template<>Real FE< 0, BERNSTEIN)
void libmesh_ignore(const Args &...)
virtual unsigned int n_nodes() const =0
SimpleRange< NodeRefIter > node_ref_range()
Returns a range with all nodes of an element, usable in range-based for loops. 
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
A Point defines a location in LIBMESH_DIM dimensional Real space. 
const Point & point(const unsigned int i) const
static OutputShape shape_second_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
Point vertex_average() const