22 #include "libmesh/fe.h"
23 #include "libmesh/elem.h"
37 libmesh_error_msg(
"XYZ polynomials require the element \nbecause 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))
57 for (
unsigned int d = 0; d < 2; d++)
60 max_distance(d) = std::max(
distance, max_distance(d));
63 const Real x = point_in(0);
64 const Real y = point_in(1);
65 const Real xc = centroid(0);
66 const Real yc = centroid(1);
67 const Real distx = max_distance(0);
68 const Real disty = max_distance(1);
69 const Real dx = (x - xc)/distx;
70 const Real dy = (y - yc)/disty;
75 const unsigned int totalorder = order + add_p_level * elem->
p_level();
77 libmesh_assert_less (i, (totalorder+1)*(totalorder+2)/2);
135 for (; i >= (o+1)*(o+2)/2; o++) { }
136 unsigned int i2 = i - (o*(o+1)/2);
138 for (
unsigned int index=i2; index != o; index++)
140 for (
unsigned int index=0; index != i2; index++)
145 #else // LIBMESH_DIM <= 1
148 libmesh_not_implemented();
161 libmesh_error_msg(
"XYZ polynomials require the element \nbecause the centroid is needed.");
169 const Order libmesh_dbg_var(order),
170 const unsigned int i,
171 const unsigned int j,
172 const Point & point_in,
173 const bool libmesh_dbg_var(add_p_level))
178 libmesh_assert_less (j, 2);
184 for (
unsigned int d = 0; d < 2; d++)
187 max_distance(d) = std::max(
distance, max_distance(d));
190 const Real x = point_in(0);
191 const Real y = point_in(1);
192 const Real xc = centroid(0);
193 const Real yc = centroid(1);
194 const Real distx = max_distance(0);
195 const Real disty = max_distance(1);
196 const Real dx = (x - xc)/distx;
197 const Real dy = (y - yc)/disty;
202 const unsigned int totalorder = order + add_p_level * elem->
p_level();
204 libmesh_assert_less (i, (totalorder+1)*(totalorder+2)/2);
238 return 3.*dx*dx/distx;
241 return 2.*dx*dy/distx;
251 return 4.*dx*dx*dx/distx;
254 return 3.*dx*dx*dy/distx;
257 return 2.*dx*dy*dy/distx;
260 return dy*dy*dy/distx;
267 for (; i >= (o+1)*(o+2)/2; o++) { }
268 unsigned int i2 = i - (o*(o+1)/2);
270 for (
unsigned int index=i2+1; index < o; index++)
272 for (
unsigned int index=0; index != i2; index++)
313 return 2.*dx*dy/disty;
316 return 3.*dy*dy/disty;
323 return dx*dx*dx/disty;
326 return 2.*dx*dx*dy/disty;
329 return 3.*dx*dy*dy/disty;
332 return 4.*dy*dy*dy/disty;
336 for (; i >= (o+1)*(o+2)/2; o++) { }
337 unsigned int i2 = i - (o*(o+1)/2);
339 for (
unsigned int index=i2; index != o; index++)
341 for (
unsigned int index=1; index <= i2; index++)
349 libmesh_error_msg(
"Invalid j = " << j);
352 #else // LIBMESH_DIM <= 1
355 libmesh_not_implemented();
360 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
369 libmesh_error_msg(
"XYZ polynomials require the element \nbecause the centroid is needed.");
377 const Order libmesh_dbg_var(order),
378 const unsigned int i,
379 const unsigned int j,
380 const Point & point_in,
381 const bool libmesh_dbg_var(add_p_level))
385 libmesh_assert_less_equal (j, 2);
390 for (
unsigned int p = 0; p < elem->
n_nodes(); p++)
391 for (
unsigned int d = 0; d < 2; d++)
394 max_distance(d) = std::max(
distance, max_distance(d));
397 const Real x = point_in(0);
398 const Real y = point_in(1);
399 const Real xc = centroid(0);
400 const Real yc = centroid(1);
401 const Real distx = max_distance(0);
402 const Real disty = max_distance(1);
403 const Real dx = (x - xc)/distx;
404 const Real dy = (y - yc)/disty;
405 const Real dist2x =
pow(distx,2.);
406 const Real dist2y =
pow(disty,2.);
407 const Real distxy = distx * disty;
412 const unsigned int totalorder = order + add_p_level * elem->
p_level();
414 libmesh_assert_less (i, (totalorder+1)*(totalorder+2)/2);
453 return 12.*dx*dx/dist2x;
456 return 6.*dx*dy/dist2x;
459 return 2.*dy*dy/dist2x;
467 for (; i >= (o+1)*(o+2)/2; o++) { }
468 unsigned int i2 = i - (o*(o+1)/2);
469 Real val = (o - i2) * (o - i2 - 1);
470 for (
unsigned int index=i2+2; index < o; index++)
472 for (
unsigned int index=0; index != i2; index++)
518 return 3.*dx*dx/distxy;
521 return 4.*dx*dy/distxy;
524 return 3.*dy*dy/distxy;
531 for (; i >= (o+1)*(o+2)/2; o++) { }
532 unsigned int i2 = i - (o*(o+1)/2);
533 Real val = (o - i2) * i2;
534 for (
unsigned int index=i2+1; index < o; index++)
536 for (
unsigned int index=1; index < i2; index++)
582 return 2.*dx*dx/dist2y;
585 return 6.*dx*dy/dist2y;
588 return 12.*dy*dy/dist2y;
592 for (; i >= (o+1)*(o+2)/2; o++) { }
593 unsigned int i2 = i - (o*(o+1)/2);
594 Real val = i2 * (i2 - 1);
595 for (
unsigned int index=i2; index != o; index++)
597 for (
unsigned int index=2; index < i2; index++)
604 libmesh_error_msg(
"Invalid shape function derivative j = " << j);
607 #else // LIBMESH_DIM <= 1
610 libmesh_not_implemented();