22 #include "libmesh/fe.h"
23 #include "libmesh/elem.h"
37 libmesh_error_msg(
"XYZ polynomials require the element because the centroid is needed.");
45 const Order libmesh_dbg_var(order),
47 const Point & point_in,
48 const bool libmesh_dbg_var(add_p_level))
55 for (
unsigned int p = 0; p < elem->
n_nodes(); p++)
56 for (
unsigned int d = 0; d < 3; d++)
59 max_distance(d) = std::max(
distance, max_distance(d));
62 const Real x = point_in(0);
63 const Real y = point_in(1);
64 const Real z = point_in(2);
65 const Real xc = centroid(0);
66 const Real yc = centroid(1);
67 const Real zc = centroid(2);
68 const Real distx = max_distance(0);
69 const Real disty = max_distance(1);
70 const Real distz = max_distance(2);
71 const Real dx = (x - xc)/distx;
72 const Real dy = (y - yc)/disty;
73 const Real dz = (z - zc)/distz;
78 const unsigned int totalorder = order + add_p_level * elem->
p_level();
80 libmesh_assert_less (i, (totalorder+1) * (totalorder+2) *
198 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
199 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
200 unsigned int block=o, nz = 0;
201 for (; block < i2; block += (o-nz+1)) { nz++; }
202 const unsigned int nx = block - i2;
203 const unsigned int ny = o - nx - nz;
205 for (
unsigned int index=0; index != nx; index++)
207 for (
unsigned int index=0; index != ny; index++)
209 for (
unsigned int index=0; index != nz; index++)
214 #else // LIBMESH_DIM != 3
217 libmesh_not_implemented();
230 libmesh_error_msg(
"XYZ polynomials require the element \nbecause the centroid is needed.");
238 const Order libmesh_dbg_var(order),
239 const unsigned int i,
240 const unsigned int j,
241 const Point & point_in,
242 const bool libmesh_dbg_var(add_p_level))
247 libmesh_assert_less (j, 3);
251 for (
unsigned int p = 0; p < elem->
n_nodes(); p++)
252 for (
unsigned int d = 0; d < 3; d++)
255 max_distance(d) = std::max(
distance, max_distance(d));
258 const Real x = point_in(0);
259 const Real y = point_in(1);
260 const Real z = point_in(2);
261 const Real xc = centroid(0);
262 const Real yc = centroid(1);
263 const Real zc = centroid(2);
264 const Real distx = max_distance(0);
265 const Real disty = max_distance(1);
266 const Real distz = max_distance(2);
267 const Real dx = (x - xc)/distx;
268 const Real dy = (y - yc)/disty;
269 const Real dz = (z - zc)/distz;
274 const unsigned int totalorder = static_cast<Order>(order + add_p_level * elem->
p_level());
276 libmesh_assert_less (i, (totalorder+1) * (totalorder+2) *
321 return 3.*dx*dx/distx;
324 return 2.*dx*dy/distx;
333 return 2.*dx*dz/distx;
352 return 4.*dx*dx*dx/distx;
355 return 3.*dx*dx*dy/distx;
358 return 2.*dx*dy*dy/distx;
361 return dy*dy*dy/distx;
367 return 3.*dx*dx*dz/distx;
370 return 2.*dx*dy*dz/distx;
373 return dy*dy*dz/distx;
379 return 2.*dx*dz*dz/distx;
382 return dy*dz*dz/distx;
388 return dz*dz*dz/distx;
398 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
399 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
400 unsigned int block=o, nz = 0;
401 for (; block < i2; block += (o-nz+1)) { nz++; }
402 const unsigned int nx = block - i2;
403 const unsigned int ny = o - nx - nz;
405 for (
unsigned int index=1; index < nx; index++)
407 for (
unsigned int index=0; index != ny; index++)
409 for (
unsigned int index=0; index != nz; index++)
462 return 2.*dx*dy/disty;
465 return 3.*dy*dy/disty;
474 return 2.*dy*dz/disty;
490 return dx*dx*dx/disty;
493 return 2.*dx*dx*dy/disty;
496 return 3.*dx*dy*dy/disty;
499 return 4.*dy*dy*dy/disty;
505 return dx*dx*dz/disty;
508 return 2.*dx*dy*dz/disty;
511 return 3.*dy*dy*dz/disty;
517 return dx*dz*dz/disty;
520 return 2.*dy*dz*dz/disty;
526 return dz*dz*dz/disty;
533 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
534 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
535 unsigned int block=o, nz = 0;
536 for (; block < i2; block += (o-nz+1)) { nz++; }
537 const unsigned int nx = block - i2;
538 const unsigned int ny = o - nx - nz;
540 for (
unsigned int index=0; index != nx; index++)
542 for (
unsigned int index=1; index < ny; index++)
544 for (
unsigned int index=0; index != nz; index++)
612 return 2.*dx*dz/distz;
615 return 2.*dy*dz/distz;
618 return 3.*dz*dz/distz;
637 return dx*dx*dx/distz;
640 return dx*dx*dy/distz;
643 return dx*dy*dy/distz;
646 return dy*dy*dy/distz;
649 return 2.*dx*dx*dz/distz;
652 return 2.*dx*dy*dz/distz;
655 return 2.*dy*dy*dz/distz;
658 return 3.*dx*dz*dz/distz;
661 return 3.*dy*dz*dz/distz;
664 return 4.*dz*dz*dz/distz;
668 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
669 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
670 unsigned int block=o, nz = 0;
671 for (; block < i2; block += (o-nz+1)) { nz++; }
672 const unsigned int nx = block - i2;
673 const unsigned int ny = o - nx - nz;
675 for (
unsigned int index=0; index != nx; index++)
677 for (
unsigned int index=0; index != ny; index++)
679 for (
unsigned int index=1; index < nz; index++)
687 libmesh_error_msg(
"Invalid j = " << j);
690 #else // LIBMESH_DIM != 3
693 libmesh_not_implemented();
698 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
707 libmesh_error_msg(
"XYZ polynomials require the element \nbecause the centroid is needed.");
715 const Order libmesh_dbg_var(order),
716 const unsigned int i,
717 const unsigned int j,
718 const Point & point_in,
719 const bool libmesh_dbg_var(add_p_level))
724 libmesh_assert_less (j, 6);
729 for (
unsigned int d = 0; d < 3; d++)
732 max_distance(d) = std::max(
distance, max_distance(d));
735 const Real x = point_in(0);
736 const Real y = point_in(1);
737 const Real z = point_in(2);
738 const Real xc = centroid(0);
739 const Real yc = centroid(1);
740 const Real zc = centroid(2);
741 const Real distx = max_distance(0);
742 const Real disty = max_distance(1);
743 const Real distz = max_distance(2);
744 const Real dx = (x - xc)/distx;
745 const Real dy = (y - yc)/disty;
746 const Real dz = (z - zc)/distz;
747 const Real dist2x =
pow(distx,2.);
748 const Real dist2y =
pow(disty,2.);
749 const Real dist2z =
pow(distz,2.);
750 const Real distxy = distx * disty;
751 const Real distxz = distx * distz;
752 const Real distyz = disty * distz;
757 const unsigned int totalorder = static_cast<Order>(order + add_p_level * elem->
p_level());
759 libmesh_assert_less (i, (totalorder+1) * (totalorder+2) *
813 return 12.*dx*dx/dist2x;
816 return 6.*dx*dy/dist2x;
819 return 2.*dy*dy/dist2x;
826 return 6.*dx*dz/dist2x;
829 return 2.*dy*dz/dist2x;
836 return 2.*dz*dz/dist2x;
847 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
848 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
849 unsigned int block=o, nz = 0;
850 for (; block < i2; block += (o-nz+1)) { nz++; }
851 const unsigned int nx = block - i2;
852 const unsigned int ny = o - nx - nz;
853 Real val = nx * (nx - 1);
854 for (
unsigned int index=2; index < nx; index++)
856 for (
unsigned int index=0; index != ny; index++)
858 for (
unsigned int index=0; index != nz; index++)
920 return 3.*dx*dx/distxy;
923 return 4.*dx*dy/distxy;
926 return 3.*dy*dy/distxy;
933 return 2.*dx*dz/distxy;
936 return 2.*dy*dz/distxy;
953 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
954 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
955 unsigned int block=o, nz = 0;
956 for (; block < i2; block += (o-nz+1)) { nz++; }
957 const unsigned int nx = block - i2;
958 const unsigned int ny = o - nx - nz;
960 for (
unsigned int index=1; index < nx; index++)
962 for (
unsigned int index=1; index < ny; index++)
964 for (
unsigned int index=0; index != nz; index++)
1004 return 2.*dx/dist2y;
1006 return 6.*dy/dist2y;
1013 return 2.*dz/dist2y;
1026 return 2.*dx*dx/dist2y;
1029 return 6.*dx*dy/dist2y;
1032 return 12.*dy*dy/dist2y;
1039 return 2.*dx*dz/dist2y;
1042 return 6.*dy*dz/dist2y;
1049 return 2.*dz*dz/dist2y;
1058 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1059 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1060 unsigned int block=o, nz = 0;
1061 for (; block < i2; block += (o-nz+1)) { nz++; }
1062 const unsigned int nx = block - i2;
1063 const unsigned int ny = o - nx - nz;
1064 Real val = ny * (ny - 1);
1065 for (
unsigned int index=0; index != nx; index++)
1067 for (
unsigned int index=2; index < ny; index++)
1069 for (
unsigned int index=0; index != nz; index++)
1111 return 2.*dx/distxz;
1120 return 2.*dz/distxz;
1135 return 3.*dx*dx/distxz;
1138 return 2.*dx*dy/distxz;
1141 return dy*dy/distxz;
1147 return 4.*dx*dz/distxz;
1150 return 2.*dy*dz/distxz;
1156 return 3.*dz*dz/distxz;
1164 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1165 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1166 unsigned int block=o, nz = 0;
1167 for (; block < i2; block += (o-nz+1)) { nz++; }
1168 const unsigned int nx = block - i2;
1169 const unsigned int ny = o - nx - nz;
1171 for (
unsigned int index=1; index < nx; index++)
1173 for (
unsigned int index=0; index != ny; index++)
1175 for (
unsigned int index=1; index < nz; index++)
1220 return 2.*dy/distyz;
1226 return 2.*dz/distyz;
1241 return dx*dx/distyz;
1244 return 2.*dx*dy/distyz;
1247 return 3.*dy*dy/distyz;
1253 return 2.*dx*dz/distyz;
1256 return 4.*dy*dz/distyz;
1262 return 3.*dz*dz/distyz;
1269 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1270 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1271 unsigned int block=o, nz = 0;
1272 for (; block < i2; block += (o-nz+1)) { nz++; }
1273 const unsigned int nx = block - i2;
1274 const unsigned int ny = o - nx - nz;
1276 for (
unsigned int index=0; index != nx; index++)
1278 for (
unsigned int index=1; index < ny; index++)
1280 for (
unsigned int index=1; index < nz; index++)
1323 return 2.*dx/dist2z;
1326 return 2.*dy/dist2z;
1329 return 6.*dz/dist2z;
1344 return 2.*dx*dx/dist2z;
1347 return 2.*dx*dy/dist2z;
1350 return 2.*dy*dy/dist2z;
1353 return 6.*dx*dz/dist2z;
1356 return 6.*dy*dz/dist2z;
1359 return 12.*dz*dz/dist2z;
1363 for (; i >= (o+1)*(o+2)*(o+3)/6; o++) { }
1364 unsigned int i2 = i - (o*(o+1)*(o+2)/6);
1365 unsigned int block=o, nz = 0;
1366 for (; block < i2; block += (o-nz+1)) { nz++; }
1367 const unsigned int nx = block - i2;
1368 const unsigned int ny = o - nx - nz;
1369 Real val = nz * (nz - 1);
1370 for (
unsigned int index=0; index != nx; index++)
1372 for (
unsigned int index=0; index != ny; index++)
1374 for (
unsigned int index=2; index < nz; index++)
1382 libmesh_error_msg(
"Invalid j = " << j);
1385 #else // LIBMESH_DIM != 3
1388 libmesh_not_implemented();