an efficient C++ finite element environment
|
|
Go to the documentation of this file.
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
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;
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;
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;
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;
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);
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;
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;
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;
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) {
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);
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
Float side_measure(size_type loc_isid) const
static const variant_type e
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 ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static const variant_type H
see the triangle page for the full documentation
static size_type n_sub_face(variant_type variant)
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
static size_type n_node(variant_type variant, size_type order)
const size_t edge[n_edge][2]
static size_type n_subgeo(size_type side_dim)
static size_type n_subgeo(size_type side_dim)
point_basic< size_t >::size_type size_type
const reference_element::size_type geo_element_T_fac2edg_idx[4][3]
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static void init_local_nnode_by_variant(size_type order, std::array< size_type, reference_element::max_variant > &loc_nnod_by_variant)
static Float side_measure(size_type loc_isid)
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
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)
static int face2edge_orient(size_type loc_iface, size_type loc_iface_jedg)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static size_type n_subgeo(size_type side_dim)
static const point_basic< Float > & vertex(size_type iloc)
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
static iorheo::force_initialization dummy
const int geo_element_T_fac2edg_orient[4][3]
static Float side_measure(size_type loc_isid)
size_type n_subgeo(size_type subgeo_dim) const
static const point_basic< Float > & vertex(size_type iloc)
static Float side_measure(size_type loc_isid)
static const point_basic< Float > & vertex(size_type iloc)
static const variant_type T
triangle - reference element
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
const reference_element::size_type geo_element_P_fac2edg_idx[5][4]
static const size_type _dimension[max_variant]
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
static const point_basic< Float > & vertex(size_type iloc)
const reference_element::size_type geo_element_H_fac2edg_idx[6][4]
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 subgeo_local_node(size_type order, size_type side_dim, size_type loc_isid, size_type loc_jsidnod)
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
#define _RHEOLEF_reference_element_case(VARIANT)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
see the reference_element page for the full documentation
point_basic< size_t >::size_type size_type
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
const int geo_element_P_fac2edg_orient[5][4]
quadrangle - reference element
prism - reference element
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
const point vertex[n_vertex]
#define _RHEOLEF_geo_element_auto_case(VARIANT)
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)
see the prism page for the full documentation
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 const char _name[max_variant]
point_basic< size_t >::size_type size_type
Float measure(reference_element hat_K)
variant_type variant() const
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)
static void side_normal(size_type loc_isid, point_basic< Float > &hat_n)
static size_type n_subgeo(size_type side_dim)
point_basic< size_t >::size_type size_type
static const point_basic< Float > & vertex(size_type iloc)
tetrahedron - reference element
static size_type n_subgeo(size_type side_dim)
#define fatal_macro(message)
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)
This file is part of Rheolef.
#define error_macro(message)
static const size_type _n_vertex[max_variant]
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static size_type subgeo_local_node(variant_type variant, size_type order, size_type subgeo_dim, size_type loc_isid, size_type loc_jsidnod)
const size_t face[n_face][4]
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 n_subgeo(size_type side_dim)
see the Float page for the full documentation
static const point_basic< Float > & vertex(size_type iloc)
static const variant_type max_variant
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
static const variant_type p
static const variant_type q
static Float side_measure(size_type loc_isid)
static const variant_type P
see the tetrahedron page for the full documentation
point_basic< size_t >::size_type size_type
hexahedron - reference element
const int geo_element_H_fac2edg_orient[6][4]
static Float side_measure(size_type loc_isid)
static const variant_type t
static const point_basic< Float > & vertex(size_type iloc)
see the quadrangle page for the full documentation
reference_element - reference element
static Float side_measure(size_type loc_isid)
double Float
see the Float page for the full documentation
void side_normal(size_type loc_isid, point_basic< Float > &hat_n) const
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
const point_basic< Float > & vertex(size_type iloc) const
static size_type first_inod_by_variant(size_type order, size_type subgeo_variant)
std::vector< int >::size_type size_type
static size_type subgeo_n_node(size_type order, size_type side_dim, size_type loc_isid)
static size_type n_sub_edge(variant_type variant)
static size_type subgeo_n_node(variant_type variant, size_type order, size_type subgeo_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 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)
size_type n_vertex() const
see the hexahedron page for the full documentation
static size_type first_inod_by_variant(variant_type variant, size_type order, variant_type subgeo_variant)
see the edge page for the full documentation
static size_type face2edge(size_type loc_iface, size_type loc_iface_jedg)