Go to the documentation of this file.
21 #include "libmesh/libmesh_config.h"
23 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
25 #include "libmesh/fe_interface.h"
26 #include "libmesh/inf_fe.h"
32 #define inf_fe_family_mapping_switch(dim, func_and_args, prefix, suffix) \
34 switch (fe_t.radial_family) \
37 switch(fe_t.inf_map) \
40 prefix InfFE<dim,INFINITE_MAP,CARTESIAN>::func_and_args suffix \
43 libmesh_not_implemented(); \
45 libmesh_error_msg("Invalid radial mapping " << fe_t.inf_map); \
48 switch(fe_t.inf_map) \
51 prefix InfFE<dim,JACOBI_20_00,CARTESIAN>::func_and_args suffix \
54 libmesh_not_implemented(); \
56 libmesh_error_msg("Invalid radial mapping " << fe_t.inf_map); \
59 switch(fe_t.inf_map) \
62 prefix InfFE<dim,JACOBI_30_00,CARTESIAN>::func_and_args suffix \
65 libmesh_not_implemented(); \
67 libmesh_error_msg("Invalid radial mapping " << fe_t.inf_map); \
70 switch(fe_t.inf_map) \
73 prefix InfFE<dim,LEGENDRE,CARTESIAN>::func_and_args suffix \
76 libmesh_not_implemented(); \
78 libmesh_error_msg("Invalid radial mapping " << fe_t.inf_map); \
81 switch(fe_t.inf_map) \
84 prefix InfFE<dim,LAGRANGE,CARTESIAN>::func_and_args suffix \
87 libmesh_not_implemented(); \
89 libmesh_error_msg("Invalid radial mapping " << fe_t.inf_map); \
92 libmesh_error_msg("Invalid radial family = " << fe_t.radial_family); \
126 libmesh_error_msg(
"Unsupported dim = " <<
dim);
158 libmesh_error_msg(
"Unsupported dim = " <<
dim);
168 const unsigned int n)
190 libmesh_error_msg(
"Unsupported dim = " <<
dim);
222 libmesh_error_msg(
"Unsupported dim = " <<
dim);
232 const std::vector<Number> & elem_soln,
233 std::vector<Number> & nodal_soln)
244 libmesh_error_msg(
"ERROR: INFINITE_MAP is not a valid shape family for radial approximation.");
256 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
271 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
286 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
301 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
307 libmesh_error_msg(
"ERROR: Bad FEType.radial_family= " << fe_t.
radial_family);
322 libmesh_error_msg(
"ERROR: INFINITE_MAP is not a valid shape family for radial approximation.");
334 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
349 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
364 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
379 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
385 libmesh_error_msg(
"ERROR: Bad FEType.radial_family= " << fe_t.
radial_family);
400 libmesh_error_msg(
"ERROR: INFINITE_MAP is not a valid shape family for radial approximation.");
412 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
427 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
442 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
457 libmesh_error_msg(
"ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
465 libmesh_error_msg(
"ERROR: Bad FEType.radial_family= " << fe_t.
radial_family);
472 libmesh_error_msg(
"Invalid dim = " <<
dim);
497 libmesh_error_msg(
"Invalid dim = " <<
dim);
502 libmesh_not_implemented_msg(
"ERROR: Spherical and Ellipsoidal IFEMs not (yet) implemented.");
504 libmesh_error_msg(
"Invalid map = " << fe_t.
inf_map);
514 const Real tolerance,
529 libmesh_not_implemented_msg(
"ERROR: Spherical and Ellipsoidal IFEMs not (yet) implemented.");
540 libmesh_error_msg(
"Invalid map = " << fe_t.
inf_map);
555 libmesh_not_implemented_msg(
"ERROR: Spherical and Ellipsoidal IFEMs not (yet) implemented.");
566 libmesh_error_msg(
"Invalid map = " << fe_t.
inf_map);
581 libmesh_not_implemented_msg(
"ERROR: Spherical and Ellipsoidal IFEMs not (yet) implemented.");
592 libmesh_error_msg(
"Invalid map = " << fe_t.
inf_map);
597 libmesh_error_msg(
"Invalid dim = " <<
dim);
606 const std::vector<Point> & physical_points,
607 std::vector<Point> & reference_points,
608 const Real tolerance,
623 libmesh_error_msg(
"Invalid map = " << fe_t.
inf_map);
638 libmesh_error_msg(
"Invalid map = " << fe_t.
inf_map);
653 libmesh_error_msg(
"Invalid map = " << fe_t.
inf_map);
658 libmesh_error_msg(
"Invalid dim = " <<
dim);
678 const unsigned int i,
709 libmesh_error_msg(
"Invalid radial family = " << fe_t.
radial_family);
735 libmesh_error_msg(
"Invalid radial family = " << fe_t.
radial_family);
761 libmesh_error_msg(
"Invalid radial family = " << fe_t.
radial_family);
766 libmesh_error_msg(
"Invalid dim = " <<
dim);
776 const unsigned int i,
807 libmesh_error_msg(
"Invalid radial family = " << fe_t.
radial_family);
833 libmesh_error_msg(
"Invalid radial family = " << fe_t.
radial_family);
859 libmesh_error_msg(
"Invalid radial family = " << fe_t.
radial_family);
864 libmesh_error_msg(
"Invalid dim = " <<
dim);
871 const unsigned int i,
872 const unsigned int j,
879 inf_fe_family_mapping_switch(1,
shape_deriv(fe_t, elem, i, j, p),
return, ;);
882 inf_fe_family_mapping_switch(2,
shape_deriv(fe_t, elem, i, j, p),
return, ;);
885 inf_fe_family_mapping_switch(3,
shape_deriv(fe_t, elem, i, j, p),
return, ;);
888 libmesh_error_msg(
"Invalid dim = " <<
dim);
896 const unsigned int i,
897 const unsigned int j,
904 inf_fe_family_mapping_switch(1,
shape_deriv(fe_t, t, i, j, p),
return, ;);
907 inf_fe_family_mapping_switch(2,
shape_deriv(fe_t, t, i, j, p),
return, ;);
910 inf_fe_family_mapping_switch(3,
shape_deriv(fe_t, t, i, j, p),
return, ;);
913 libmesh_error_msg(
"Invalid dim = " <<
dim);
956 libmesh_error_msg(
"Invalid radial family = " << fe_t.
radial_family);
989 libmesh_error_msg(
"Invalid radial family = " << fe_t.
radial_family);
1022 libmesh_error_msg(
"Invalid radial family = " << fe_t.
radial_family);
1030 libmesh_error_msg(
"Invalid dim = " <<
dim);
1037 #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
InfMapType inf_map
The coordinate mapping type of the infinite element.
FEFamily radial_family
The type of approximation in radial direction.
class FEComputeData hides arbitrary data to be passed to and from children of FEBase through the FEIn...
static void ifem_nodal_soln(const unsigned int dim, const FEType &fe_t, const Elem *elem, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
static unsigned int ifem_n_dofs(const unsigned int dim, const FEType &fe_t, const ElemType t)
static unsigned int ifem_n_dofs_per_elem(const unsigned int dim, const FEType &fe_t, const ElemType t)
The libMesh namespace provides an interface to certain functionality in the library.
static unsigned int n_dofs(const FEType &fet, const ElemType inf_elem_type)
static void nodal_soln(const FEType &fet, const Elem *elem, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
Usually, this method would build the nodal soln from the element soln.
static Point map(const Elem *inf_elem, const Point &reference_point)
static void nodal_soln(const unsigned int dim, const FEType &fe_t, const Elem *elem, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
Build the nodal soln from the element soln.
static Real ifem_shape_deriv(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const unsigned int j, const Point &p)
A Point defines a location in LIBMESH_DIM dimensional Real space.
static unsigned int ifem_n_dofs_at_node(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int n)
virtual unsigned int n_shape_functions() const override
static unsigned int ifem_n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
static Real ifem_shape(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const Point &p)
static bool on_reference_element(const Point &p, const ElemType t, const Real eps=TOLERANCE)
static Point inverse_map(const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true)
static Real shape_deriv(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const unsigned int j, const Point &p)
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
static bool ifem_on_reference_element(const Point &p, const ElemType t, const Real eps)
static Real shape(const FEType &fet, const ElemType t, const unsigned int i, const Point &p)
This is the base class from which all geometric element types are derived.
IterBase * data
Ideally this private member data should have protected access.
static Point ifem_inverse_map(const unsigned int dim, const FEType &fe_t, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true)
static unsigned int n_dofs_at_node(const FEType &fet, const ElemType inf_elem_type, const unsigned int n)
static void compute_data(const FEType &fe_t, const Elem *inf_elem, FEComputeData &data)
Generalized version of shape(), takes an Elem *.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static void ifem_compute_data(const unsigned int dim, const FEType &fe_t, const Elem *elem, FEComputeData &data)
ElemType
Defines an enum for geometric element types.
static unsigned int n_dofs_per_elem(const FEType &fet, const ElemType inf_elem_type)
static Point ifem_map(const unsigned int dim, const FEType &fe_t, const Elem *elem, const Point &p)