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