Rheolef  7.2
an efficient C++ finite element environment
 
Loading...
Searching...
No Matches
Pk_get_local_idof_on_side.icc
Go to the documentation of this file.
1#ifndef _RHEOLEF_PK_GET_LOCAL_IDOF_ON_SIDE_ICC
2#define _RHEOLEF_PK_GET_LOCAL_IDOF_ON_SIDE_ICC
23//
24// evaluate the Dubiner-Sherwin basis on a point of the reference element
25// see SheKar-2005, pages 52 (1d) & 114 (2d) & app. D
26//
27// author: Pierre.Saramito@imag.fr
28//
29// date: 5 september 2017
30//
31#include "rheolef/reference_element.h"
32#include "rheolef/reference_element_face_transformation.h"
33
34namespace rheolef { namespace details {
35
36// TODO: .h and .cc instead of copying multiple binary code
37static
38void
39Pk_get_local_idof_on_side (
40 reference_element tilde_K,
41 const side_information_type& sid,
42 size_t k,
43 Eigen::Matrix<size_t,Eigen::Dynamic,1>& loc_idof)
44{
46 check_macro (sid.shift == 0, "sid.shift !=0 : not yet, sorry"); // TODO: honor also 3d sid.shift
47 switch (tilde_K.variant()) {
49 loc_idof.resize (0);
50 return;
51 }
53 loc_idof.resize (2);
54 loc_idof [0] = 0;
55 loc_idof [1] = 1;
56 return;
57 }
59 size_type loc_ndof = k+1;
60 loc_idof.resize (loc_ndof);
61 size_type loc_sid_idof = 0;
62 for (size_type u = 0; u <= k; ++u, ++loc_sid_idof) {
63 point_basic<size_type> side_ilat (u);
64 point_basic<size_type> ilat = reference_element_face_transformation (tilde_K, sid, k, side_ilat);
65 loc_idof [loc_sid_idof] = reference_element_t::ilat2loc_inod (k, ilat);
66 }
67 return;
68 }
70 size_type loc_ndof = k+1;
71 loc_idof.resize (loc_ndof);
72 size_type loc_sid_idof = 0;
73 for (size_type u = 0; u <= k; ++u, ++loc_sid_idof) {
74 point_basic<size_type> side_ilat (u);
75 point_basic<size_type> ilat = reference_element_face_transformation (tilde_K, sid, k, side_ilat);
76 loc_idof [loc_sid_idof] = reference_element_q::ilat2loc_inod (k, ilat);
77 }
78 return;
79 }
81 size_type loc_ndof = (k+1)*(k+2)/2;
82 loc_idof.resize (loc_ndof);
83 size_type loc_sid_idof = 0;
84 for (size_type u = 0; u <= k; ++u) {
85 for (size_type v = 0; v <= k-u; ++v, ++loc_sid_idof) {
86 point_basic<size_type> side_ilat (u,v);
87 point_basic<size_type> ilat = reference_element_face_transformation (tilde_K, sid, k, side_ilat);
88 loc_idof [loc_sid_idof] = reference_element_T::ilat2loc_inod (k, ilat);
89 }}
90 return;
91 }
93 size_type loc_ndof = (k+1)*(k+1);
94 loc_idof.resize (loc_ndof);
95 size_type loc_sid_idof = 0;
96 for (size_type u = 0; u <= k; ++u) {
97 for (size_type v = 0; v <= k; ++v, ++loc_sid_idof) {
98 point_basic<size_type> side_ilat (u,v);
99 point_basic<size_type> ilat = reference_element_face_transformation (tilde_K, sid, k, side_ilat);
100 loc_idof [loc_sid_idof] = reference_element_H::ilat2loc_inod (k, ilat);
101 }}
102 return;
103 }
105 reference_element hat_S = tilde_K.side (sid.loc_isid);
106 size_type loc_ndof = (hat_S.variant() == reference_element::t) ? (k+1)*(k+2)/2 : (k+1)*(k+1);
107 loc_idof.resize (loc_ndof);
108 size_type loc_sid_idof = 0;
109 for (size_type u = 0; u <= k; ++u) {
110 size_type vf = (hat_S.variant() == reference_element::t) ? k-u : k;
111 for (size_type v = 0; v <= vf; ++v, ++loc_sid_idof) {
112 point_basic<size_type> side_ilat (u,v);
113 point_basic<size_type> ilat = reference_element_face_transformation (tilde_K, sid, k, side_ilat);
114 loc_idof [loc_sid_idof] = reference_element_P::ilat2loc_inod (k, ilat);
115 }
116 }
117 return;
118 }
119 default: error_macro ("get_local_idof_on_side: element "<<tilde_K.name()<<" not yet supported");
120 }
121}
122
123}} // namespace rheolef::details
124#endif // _RHEOLEF_PK_GET_LOCAL_IDOF_ON_SIDE_ICC
field::size_type size_type
Definition branch.cc:430
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static const variant_type H
static const variant_type q
static const variant_type e
static const variant_type p
std::vector< int >::size_type size_type
static const variant_type T
static const variant_type P
static const variant_type t
#define error_macro(message)
Definition dis_macros.h:49
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
This file is part of Rheolef.
point_basic< T > reference_element_face_transformation(reference_element tilde_K, const side_information_type &sid, const point_basic< T > &sid_hat_x)
Definition leveque.h:25