23#include "rheolef/point.h"
66 return hat_K_measure [hat_K.
variant()];
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;
374 return edge::vertex[iloc];
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.));
442 return triangle::vertex[iloc];
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);
511 return quadrangle::vertex[iloc];
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.;
623 return tetrahedron::vertex[iloc];
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) {
656 return prism::edge [loc_isid] [loc_jsidnod];
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) {
663 return prism::face [loc_isid] [loc_jsidnod];
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));
721 return prism::vertex[iloc];
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) {
763 return hexahedron::face [loc_isid][loc_jsidnod];
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);
822 return hexahedron::vertex[iloc];
see the Float page for the full documentation
see the edge page for the full documentation
see the hexahedron page for the full documentation
see the prism page for the full documentation
see the quadrangle 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)
see the reference_element page for the full documentation
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)
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
see the tetrahedron page for the full documentation
see the triangle 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
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