71 #ifndef REF_ELEMENT_HH_ 72 #define REF_ELEMENT_HH_ 138 IdxVector(std::array<unsigned int,Size> data_in);
140 IdxVector(std::initializer_list<unsigned int> data_in);
142 unsigned int operator[](unsigned int idx) const;
146 template<std::
size_t Size>
156 template <
unsigned int OutDim,
unsigned int InDim>
162 template<
unsigned int dim>
182 static LocalPoint node_coords(
unsigned int nid);
188 static LocalPoint normal_vector(
unsigned int sid);
196 static BaryPoint clip(
const BaryPoint &barycentric);
201 static unsigned int normal_orientation(
unsigned int sid);
203 static double side_measure(
unsigned int sid);
211 static unsigned int oposite_node(
unsigned int sid);
217 static unsigned int line_between_faces(
unsigned int f1,
unsigned int f2);
220 static const unsigned int n_sides = dim + 1;
221 static const unsigned int n_nodes = dim + 1;
222 static const unsigned int n_nodes_per_side = dim;
223 static const unsigned int n_lines_per_node = dim;
224 static const unsigned int n_nodes_per_line = 2;
225 static const unsigned int n_sides_per_line = 2;
226 static const unsigned int n_sides_per_node = dim;
229 static const unsigned int n_lines_per_side = (
unsigned int)((dim * (dim - 1)) / 2);
232 static const unsigned int n_lines = (
unsigned int)((dim * (dim + 1)) / 2);
266 static constexpr
unsigned int n_side_permutations = (dim+1)*(2*dim*dim-5*dim+6)/6;
278 static unsigned int permutation_index(
unsigned int p[n_nodes_per_side]);
284 static BaryPoint local_to_bary(
const LocalPoint& lp);
290 static LocalPoint bary_to_local(
const BaryPoint& bp);
297 static BarycentricUnitVec make_bary_unit_vec();
304 static FaceBaryPoint barycentric_on_face(
const BaryPoint &barycentric,
unsigned int i_face);
308 static CentersList centers_of_subelements(
unsigned int sub_dim);
314 static std::pair<unsigned int, unsigned int> zeros_positions(
const BaryPoint &barycentric,
315 double tolerance = std::numeric_limits<double>::epsilon()*2);
325 template<
unsigned int subdim>
static unsigned int topology_idx(
unsigned int zeros_positions);
332 template<
unsigned int subdim>
static unsigned int count();
341 template<
unsigned int subdim>
static arma::mat::fixed<dim+1,subdim+1> bary_coords(
unsigned int sid);
347 template<
unsigned int subdim>
static BaryPoint interpolate(arma::vec::fixed<subdim+1> coord,
int sub_simplex_idx);
353 static BaryPoint line_barycentric_interpolation(BaryPoint first_coords,
354 BaryPoint second_coords,
355 double first_theta,
double second_theta,
double theta);
388 template <
template <
unsigned int OutDim,
unsigned int InDim>
class TInteraction,
unsigned int OutDim,
unsigned int InDim>
389 static const IdxVector< (InDim>OutDim ? InDim+1 : dim-InDim) > interact( TInteraction<OutDim,InDim> interaction );
394 template<
unsigned int OutDim,
unsigned int InDim>
395 static const IdxVector< (InDim>OutDim ? InDim+1 : dim-InDim) > interact_(
unsigned int index);
471 template<
unsigned int dim>
472 template<
unsigned int subdim>
inline 475 arma::mat::fixed<dim+1,subdim+1> bary_c;
477 for(
unsigned int i = 0; i < subdim+1; i++){
478 unsigned int nid = interact_<0,subdim>(sid)[i];
479 bary_c.col(i).zeros();
480 bary_c.col(i)(nid) = 1;
487 template<
unsigned int dim>
inline 490 ASSERT_LT_DBG(nid, n_nodes).error(
"Node number is out of range!");
492 arma::vec::fixed<dim> p;
502 template<
unsigned int dim>
503 template<
unsigned int subdim>
560 template<
unsigned int dim>
561 template<
unsigned int subdim>
564 for(
unsigned int i=0; i < RefElement<dim>::count<subdim>(); i++){
565 if(zeros_positions == topology_zeros_[subdim][i])
return i;
567 ASSERT(0).error(
"Undefined zero pattern.");
578 template<>
template<>
inline const IdxVector<2> RefElement<1>::interact_<0,1>(
unsigned int i)
580 return line_nodes_[i];}
585 return line_nodes_[i];}
590 return line_nodes_[i];}
593 template<>
template<>
inline const IdxVector<1> RefElement<1>::interact_<1,0>(
unsigned int i)
595 return node_lines_[i];}
598 template<>
template<>
inline const IdxVector<2> RefElement<2>::interact_<1,0>(
unsigned int i)
600 return node_lines_[i];}
603 template<>
template<>
inline const IdxVector<3> RefElement<3>::interact_<1,0>(
unsigned int i)
605 return node_lines_[i];}
608 template<>
template<>
inline const IdxVector<3> RefElement<3>::interact_<0,2>(
unsigned int i)
610 return side_nodes_[i];}
613 template<>
template<>
inline const IdxVector<3> RefElement<3>::interact_<2,0>(
unsigned int i)
615 return node_sides_[i];}
618 template<>
template<>
inline const IdxVector<2> RefElement<3>::interact_<2,1>(
unsigned int i)
620 return line_sides_[i];}
623 template<>
template<>
inline const IdxVector<3> RefElement<3>::interact_<1,2>(
unsigned int i)
625 return side_lines_[i];}
627 template<
unsigned int dim>
template<
unsigned int OutDim,
unsigned int InDim>
630 ASSERT(
false)(dim)(OutDim)(InDim)(i).error(
"Not implemented.");
637 template<
unsigned int dim>
638 template <
template <
unsigned int OutDim,
unsigned int InDim>
class TInteraction,
unsigned int OutDim,
unsigned int InDim>
641 return interact_<OutDim,InDim>(interaction.i_);
static const std::vector< IdxVector< n_sides_per_line > > line_sides_
[n_lines] For given line, returns sides indices. For dim == 3.
Armor::ArmaVec< double, dim > FaceBaryPoint
static arma::mat::fixed< dim+1, subdim+1 > bary_coords(unsigned int sid)
static const std::vector< IdxVector< n_nodes_per_side > > side_nodes_
[n_sides] For given side, returns nodes indices. For dim == 3.
static const std::vector< IdxVector< n_lines_per_node > > node_lines_
[n_nodes] For given node, returns lines indices.
static BaryPoint interpolate(arma::vec::fixed< subdim+1 > coord, int sub_simplex_idx)
std::vector< BaryPoint > BarycentricUnitVec
arma::vec::fixed< dim > LocalPoint
static const std::vector< IdxVector< n_nodes_per_line > > line_nodes_
[n_lines] For given line, returns its nodes indices.
static const std::vector< std::vector< std::vector< unsigned int > > > nodes_of_subelements
Armor::ArmaVec< double, dim+1 > BaryPoint
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
static LocalPoint node_coords(unsigned int nid)
Interaction(unsigned int i)
const std::vector< LocalPoint > & CentersList
std::array< unsigned int, Size > IdxVector
typename arma::Col< Type >::template fixed< nr > ArmaVec
static const std::vector< std::vector< unsigned int > > side_permutations
static unsigned int topology_idx(unsigned int zeros_positions)
static const std::vector< IdxVector< n_lines_per_side > > side_lines_
[n_sides] For given side, returns lines indices. For dim == 3.
static const std::vector< IdxVector< n_sides_per_node > > node_sides_
[n_nodes] For given node, returns sides indices. For dim == 3.
#define ASSERT_LT_DBG(a, b)
Definition of comparative assert macro (Less Than) only for debug mode.