23#include "rheolef/point.h"
71 return reference_element_variant (
_name,
name);
115#define _RHEOLEF_reference_element_case(VARIANT) \
116 case reference_element::VARIANT: \
117 return reference_element_##VARIANT::n_subgeo (subgeo_dim);
129#undef _RHEOLEF_reference_element_case
138#define _RHEOLEF_geo_element_auto_case(VARIANT) \
139 case reference_element::VARIANT: \
140 return reference_element_##VARIANT::subgeo_n_node (order, subgeo_dim, loc_isid);
152#undef _RHEOLEF_geo_element_auto_case
162#define _RHEOLEF_geo_element_auto_case(VARIANT) \
163 case reference_element::VARIANT: \
164 return reference_element_##VARIANT::subgeo_local_node (order, subgeo_dim, loc_isid, loc_jsidnod);
176#undef _RHEOLEF_geo_element_auto_case
184#define _RHEOLEF_geo_element_auto_case(VARIANT) \
185 case reference_element::VARIANT: \
186 return reference_element_##VARIANT##_first_inod_by_variant (order, subgeo_variant);
198#undef _RHEOLEF_geo_element_auto_case
203 return reference_element_n_node (
variant, order);
208 std::array<size_type,reference_element::max_variant>& sz)
210 reference_element_init_local_nnode_by_variant (order, sz);
215#define _RHEOLEF_geo_element_auto_case(VARIANT) \
216 case reference_element::VARIANT: \
217 return reference_element_##VARIANT::side_measure (loc_isid);
229#undef _RHEOLEF_geo_element_auto_case
234#define _RHEOLEF_geo_element_auto_case(VARIANT) \
235 case reference_element::VARIANT: \
236 reference_element_##VARIANT::side_normal (loc_isid, hat_n); break;
248#undef _RHEOLEF_geo_element_auto_case
253#define _RHEOLEF_geo_element_auto_case(VARIANT) \
254 case reference_element::VARIANT: \
255 return reference_element_##VARIANT::vertex (iloc);
268#undef _RHEOLEF_geo_element_auto_case
276 return (side_dim == 0) ? 1 : 0;
281 return (side_dim == 0) ? 1 : 0;
293 return reference_element_p_ilat2loc_inod (order, ilat);
300 return reference_element_p_first_inod_by_variant (order, subgeo_variant);
334 case 1:
return order+1;
342 case 0:
return loc_isid;
343 case 1:
return loc_jsidnod;
352 return reference_element_e_ilat2loc_inod (order, ilat);
359 return reference_element_e_first_inod_by_variant (order, subgeo_variant);
369 hat_n[0] = (loc_isid == 0) ? -1 : 1;
394 case 1:
return order+1;
395 case 2:
return ((order+1)*(order+2))/2;
403 case 0:
return loc_isid;
404 case 1:
if (loc_jsidnod < 2)
return (loc_isid + loc_jsidnod) % 3;
405 else return (order-1)*loc_isid + loc_jsidnod + 1;
406 case 2:
return loc_jsidnod;
415 return reference_element_t_ilat2loc_inod (order, ilat);
422 return reference_element_t_first_inod_by_variant (order, subgeo_variant);
427 return (loc_isid != 1) ? 1 : sqrt(
Float(2.));
462 case 1:
return order+1;
463 case 2:
return (order+1)*(order+1);
471 case 0:
return loc_isid;
472 case 1:
if (loc_jsidnod < 2)
return (loc_isid + loc_jsidnod) % 4;
473 else return (order-1)*loc_isid + loc_jsidnod + 2;
474 case 2:
return loc_jsidnod;
483 return reference_element_q_ilat2loc_inod (order, ilat);
490 return reference_element_q_first_inod_by_variant (order, subgeo_variant);
532 case 1:
return order+1;
533 case 2:
return (order+1)*(order+2)/2;
534 case 3:
return ((order+1)*(order+2)*(order+3))/6;
542 case 0:
return loc_isid;
543 case 1:
if (loc_jsidnod < 2) {
544 if (loc_isid < 3)
return (loc_isid + loc_jsidnod) % 3;
545 else return loc_jsidnod == 0 ? loc_isid - 3 : 3;
547 return loc_isid*(order-1) + loc_jsidnod + 2;
550 if (loc_jsidnod < 3) {
551 if (loc_isid == 3)
return loc_jsidnod + 1;
552 if (loc_jsidnod == 0)
return 0;
553 if (loc_jsidnod == 2)
return loc_isid + 1;
554 return ((loc_isid + 1) % 3) + 1;
557 size_type last_edge_node_iloc = 3 + 3*(order-1);
558 if (loc_jsidnod < last_edge_node_iloc) {
564 size_type loc_jedg = (loc_jsidnod-3) / order1;
565 size_type loc_kedg = (loc_jsidnod-3) % order1;
567 loc_kedg = order - loc_kedg - 2;
572 size_type ij_loc = (loc_jsidnod - last_edge_node_iloc);
573 return 4 + 6*(order-1) + loc_isid*(order-1)*(order-2)/2 + ij_loc;
575 case 3:
return loc_jsidnod;
584 return reference_element_T_ilat2loc_inod (order, ilat);
591 return reference_element_T_first_inod_by_variant (order, subgeo_variant);
606 return (loc_isid != 3) ? 0.5 : sqrt(
Float(3.))/2.;
644 case 1:
return order+1;
645 case 2:
return (loc_isid < 2) ? (order+1)*(order+2)/2 : (order+1)*(order+1);
646 case 3:
return ((order+1)*(order+1)*(order+2))/2;
654 case 0:
return loc_isid;
655 case 1:
if (loc_jsidnod < 2) {
658 return 6 + loc_isid*(order-1) + (loc_jsidnod - 2);
661 size_type n_vert_on_side = (loc_isid < 2) ? 3 : 4;
662 if (loc_jsidnod < n_vert_on_side) {
666 size_type last_edge_node_iloc = n_vert_on_side + n_vert_on_side*(order-1);
667 if (loc_jsidnod < last_edge_node_iloc) {
673 size_type loc_jedg = (loc_jsidnod - n_vert_on_side) / order1;
674 size_type loc_kedg = (loc_jsidnod - n_vert_on_side) % order1;
676 loc_kedg = order - loc_kedg - 2;
681 size_type ij_loc = (loc_jsidnod - last_edge_node_iloc);
684 shift_prev_faces = loc_isid*(order-1)*(order-2)/2;
686 shift_prev_faces = 2*(order-1)*(order-2)/2 + (loc_isid-2)*(order-1)*(order-1);
688 return 6 + 9*(order-1) + shift_prev_faces + ij_loc;
690 case 3:
return loc_jsidnod;
697 return reference_element_P_ilat2loc_inod (order, ilat);
704 return reference_element_P_first_inod_by_variant (order, subgeo_variant);
709 if (loc_isid <= 1)
return 0.5;
710 if (loc_isid == 3)
return 2*sqrt(
Float(2));
743 case 1:
return order+1;
744 case 2:
return (order+1)*(order+1);
745 case 3:
return (order+1)*(order+1)*(order+1);
753 case 0:
return loc_isid;
754 case 1:
if (loc_jsidnod < 2) {
755 if (loc_isid < 4)
return (loc_isid + loc_jsidnod) % 4;
756 else if (loc_isid < 8)
return loc_isid - 4 + loc_jsidnod*4;
757 else return loc_jsidnod == 0 ? loc_isid - 4 : (loc_isid - 7)%4 + 4;
759 return loc_isid*(order-1) + loc_jsidnod + 6;
762 if (loc_jsidnod < 4) {
766 size_type last_edge_node_iloc = 4 + 4*(order-1);
767 if (loc_jsidnod < last_edge_node_iloc) {
773 size_type loc_jedg = (loc_jsidnod-4) / order1;
774 size_type loc_kedg = (loc_jsidnod-4) % order1;
776 loc_kedg = order - loc_kedg - 2;
781 return 8 + 12*(order-1) + (order-1)*(order-1)*loc_isid + (loc_jsidnod - last_edge_node_iloc);
783 case 3:
return loc_jsidnod;
792 return reference_element_H_ilat2loc_inod (order, ilat);
799 return reference_element_H_first_inod_by_variant (order, subgeo_variant);
see the Float page for the full documentation
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
point_basic< size_t >::size_type size_type
static size_type n_subgeo(size_type side_dim)
static size_type subgeo_local_node(size_type order, size_type side_dim, size_type loc_isid, size_type loc_jsidnod)
static Float side_measure(size_type loc_isid)
static const point_basic< Float > & vertex(size_type iloc)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
static size_type subgeo_local_node(size_type order, size_type side_dim, size_type loc_isid, size_type loc_jsidnod)
point_basic< size_t >::size_type size_type
static size_type n_subgeo(size_type side_dim)
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
static Float side_measure(size_type loc_isid)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static const point_basic< Float > & vertex(size_type iloc)
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
static size_type subgeo_local_node(size_type order, size_type side_dim, size_type loc_isid, size_type loc_jsidnod)
static size_type face2edge(size_type loc_iface, size_type loc_iface_jedg)
static size_type n_subgeo(size_type side_dim)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
point_basic< size_t >::size_type size_type
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
static int face2edge_orient(size_type loc_iface, size_type loc_iface_jedg)
static Float side_measure(size_type loc_isid)
static const point_basic< Float > & vertex(size_type iloc)
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
static size_type n_subgeo(size_type side_dim)
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
static size_type subgeo_local_node(size_type order, size_type side_dim, size_type loc_isid, size_type loc_jsidnod)
point_basic< size_t >::size_type size_type
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static Float side_measure(size_type loc_isid)
static const point_basic< Float > & vertex(size_type iloc)
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
static size_type n_subgeo(size_type side_dim)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
point_basic< size_t >::size_type size_type
static size_type subgeo_local_node(size_type order, size_type side_dim, size_type loc_isid, size_type loc_jsidnod)
static Float side_measure(size_type loc_isid)
static const point_basic< Float > & vertex(size_type iloc)
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
static size_type n_subgeo(size_type side_dim)
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
static size_type subgeo_local_node(size_type order, size_type side_dim, size_type loc_isid, size_type loc_jsidnod)
point_basic< size_t >::size_type size_type
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static Float side_measure(size_type loc_isid)
static const point_basic< Float > & vertex(size_type iloc)
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
static size_type n_subgeo(size_type side_dim)
point_basic< size_t >::size_type size_type
static size_type subgeo_local_node(size_type order, size_type side_dim, size_type loc_isid, size_type loc_jsidnod)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static Float side_measure(size_type loc_isid)
static const point_basic< Float > & vertex(size_type iloc)
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
void side_normal(size_type loc_isid, point_basic< Float > &hat_n) const
const point_basic< Float > & vertex(size_type iloc) const
static const variant_type H
size_type n_vertex() const
static const variant_type q
static const variant_type e
static size_type subgeo_local_node(variant_type variant, size_type order, size_type subgeo_dim, size_type loc_isid, size_type loc_jsidnod)
reference_element(variant_type x=max_variant)
static const variant_type max_variant
static size_type n_sub_edge(variant_type variant)
static void init_local_nnode_by_variant(size_type order, std::array< size_type, reference_element::max_variant > &loc_nnod_by_variant)
static const char _name[max_variant]
static const variant_type p
Float side_measure(size_type loc_isid) const
static size_type n_sub_face(variant_type variant)
static const size_type _n_vertex[max_variant]
variant_type variant() const
static size_type first_inod_by_variant(variant_type variant, size_type order, variant_type subgeo_variant)
static size_type subgeo_n_node(variant_type variant, size_type order, size_type subgeo_dim, size_type loc_isid)
std::vector< int >::size_type size_type
static const size_type _dimension[max_variant]
static size_type n_node(variant_type variant, size_type order)
size_type n_subgeo(size_type subgeo_dim) const
static const variant_type T
static const variant_type P
static const variant_type t
double Float
see the Float page for the full documentation
#define error_macro(message)
#define fatal_macro(message)
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
hexahedron - reference element
const point vertex[n_vertex]
const size_t face[n_face][4]
const point vertex[n_vertex]
const size_t face[n_face][4]
const point vertex[n_vertex]
const size_t edge[n_edge][2]
const point vertex[n_vertex]
const point vertex[n_vertex]
const point vertex[n_vertex]
This file is part of Rheolef.
prism - reference element
quadrangle - reference element
#define _RHEOLEF_reference_element_case(VARIANT)
#define _RHEOLEF_geo_element_auto_case(VARIANT)
reference_element - reference element
const reference_element::size_type geo_element_T_fac2edg_idx[4][3]
const int geo_element_H_fac2edg_orient[6][4]
const int geo_element_T_fac2edg_orient[4][3]
const reference_element::size_type geo_element_P_fac2edg_idx[5][4]
const reference_element::size_type geo_element_H_fac2edg_idx[6][4]
const int geo_element_P_fac2edg_orient[5][4]
tetrahedron - reference element
triangle - reference element