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))
46 Point avg = elem->vertex_average();
47 Point max_distance = Point(0.,0.,0.);
48 for (
const Point & p : elem->node_ref_range())
49 for (
unsigned int d = 0; d < 2; d++)
52 max_distance(d) = std::max(
distance, max_distance(d));
55 const Real x = point_in(0);
56 const Real y = point_in(1);
57 const Real xc = avg(0);
58 const Real yc = avg(1);
59 const Real distx = max_distance(0);
60 const Real disty = max_distance(1);
61 const Real dx = (x - xc)/distx;
62 const Real dy = (y - yc)/disty;
67 const unsigned int totalorder = order + add_p_level * elem->p_level();
69 libmesh_assert_less (i, (totalorder+1)*(totalorder+2)/2);
127 for (; i >= (o+1)*(o+2)/2; o++) { }
128 unsigned int i2 = i - (o*(o+1)/2);
130 for (
unsigned int index=i2; index != o; index++)
132 for (
unsigned int index=0; index != i2; index++)
137 #else // LIBMESH_DIM <= 1 140 libmesh_not_implemented();
153 libmesh_error_msg(
"XYZ polynomials require the element.");
162 const unsigned int i,
164 const bool add_p_level)
175 const Order libmesh_dbg_var(order),
176 const unsigned int i,
177 const unsigned int j,
178 const Point & point_in,
179 const bool libmesh_dbg_var(add_p_level))
184 libmesh_assert_less (j, 2);
190 for (
unsigned int d = 0; d < 2; d++)
193 max_distance(d) = std::max(
distance, max_distance(d));
196 const Real x = point_in(0);
197 const Real y = point_in(1);
198 const Real xc = avg(0);
199 const Real yc = avg(1);
200 const Real distx = max_distance(0);
201 const Real disty = max_distance(1);
202 const Real dx = (x - xc)/distx;
203 const Real dy = (y - yc)/disty;
208 const unsigned int totalorder = order + add_p_level * elem->
p_level();
210 libmesh_assert_less (i, (totalorder+1)*(totalorder+2)/2);
244 return 3.*dx*dx/distx;
247 return 2.*dx*dy/distx;
257 return 4.*dx*dx*dx/distx;
260 return 3.*dx*dx*dy/distx;
263 return 2.*dx*dy*dy/distx;
266 return dy*dy*dy/distx;
273 for (; i >= (o+1)*(o+2)/2; o++) { }
274 unsigned int i2 = i - (o*(o+1)/2);
276 for (
unsigned int index=i2+1; index < o; index++)
278 for (
unsigned int index=0; index != i2; index++)
319 return 2.*dx*dy/disty;
322 return 3.*dy*dy/disty;
329 return dx*dx*dx/disty;
332 return 2.*dx*dx*dy/disty;
335 return 3.*dx*dy*dy/disty;
338 return 4.*dy*dy*dy/disty;
342 for (; i >= (o+1)*(o+2)/2; o++) { }
343 unsigned int i2 = i - (o*(o+1)/2);
345 for (
unsigned int index=i2; index != o; index++)
347 for (
unsigned int index=1; index <= i2; index++)
355 libmesh_error_msg(
"Invalid j = " << j);
358 #else // LIBMESH_DIM <= 1 361 libmesh_not_implemented();
373 libmesh_error_msg(
"XYZ polynomials require the element.");
381 const unsigned int i,
382 const unsigned int j,
384 const bool add_p_level)
391 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 395 const Order libmesh_dbg_var(order),
396 const unsigned int i,
397 const unsigned int j,
398 const Point & point_in,
399 const bool libmesh_dbg_var(add_p_level))
403 libmesh_assert_less_equal (j, 2);
409 for (
unsigned int d = 0; d < 2; d++)
412 max_distance(d) = std::max(
distance, max_distance(d));
415 const Real x = point_in(0);
416 const Real y = point_in(1);
417 const Real xc = avg(0);
418 const Real yc = avg(1);
419 const Real distx = max_distance(0);
420 const Real disty = max_distance(1);
421 const Real dx = (x - xc)/distx;
422 const Real dy = (y - yc)/disty;
423 const Real dist2x =
pow(distx,2.);
424 const Real dist2y =
pow(disty,2.);
425 const Real distxy = distx * disty;
430 const unsigned int totalorder = order + add_p_level * elem->
p_level();
432 libmesh_assert_less (i, (totalorder+1)*(totalorder+2)/2);
471 return 12.*dx*dx/dist2x;
474 return 6.*dx*dy/dist2x;
477 return 2.*dy*dy/dist2x;
485 for (; i >= (o+1)*(o+2)/2; o++) { }
486 unsigned int i2 = i - (o*(o+1)/2);
487 Real val = (o - i2) * (o - i2 - 1);
488 for (
unsigned int index=i2+2; index < o; index++)
490 for (
unsigned int index=0; index != i2; index++)
536 return 3.*dx*dx/distxy;
539 return 4.*dx*dy/distxy;
542 return 3.*dy*dy/distxy;
549 for (; i >= (o+1)*(o+2)/2; o++) { }
550 unsigned int i2 = i - (o*(o+1)/2);
551 Real val = (o - i2) * i2;
552 for (
unsigned int index=i2+1; index < o; index++)
554 for (
unsigned int index=1; index < i2; index++)
600 return 2.*dx*dx/dist2y;
603 return 6.*dx*dy/dist2y;
606 return 12.*dy*dy/dist2y;
610 for (; i >= (o+1)*(o+2)/2; o++) { }
611 unsigned int i2 = i - (o*(o+1)/2);
612 Real val = i2 * (i2 - 1);
613 for (
unsigned int index=i2; index != o; index++)
615 for (
unsigned int index=2; index < i2; index++)
622 libmesh_error_msg(
"Invalid shape function derivative j = " << j);
625 #else // LIBMESH_DIM <= 1 628 libmesh_not_implemented();
640 libmesh_error_msg(
"XYZ polynomials require the element.");
649 const unsigned int i,
650 const unsigned int j,
652 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