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++)
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);
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);
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)
void ErrorVector unsigned int
This is the base class from which all geometric element types are derived.
const Point & point(const unsigned int i) const
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.
unsigned int p_level() const
Point vertex_average() const
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
OrderWrapper order
The approximation order of the element (at 0 p-refinement level).
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
static OutputShape shape_second_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
static OutputShape shape_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
A Point defines a location in LIBMESH_DIM dimensional Real space.
The libMesh namespace provides an interface to certain functionality in the library.
LIBMESH_DEFAULT_VECTORIZED_FE(template<>Real FE< 0, BERNSTEIN)
ElemType
Defines an enum for geometric element types.
void libmesh_ignore(const Args &...)
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...
Real distance(const Point &p)
const dof_id_type n_nodes