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++)
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);
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);
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)
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)