Rheolef  7.1
an efficient C++ finite element environment
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 
34 namespace rheolef { namespace details {
35 
36 // TODO: .h and .cc instead of copying multiple binary code
37 static
38 void
39 Pk_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()) {
48  case reference_element::p: {
49  loc_idof.resize (0);
50  return;
51  }
52  case reference_element::e: {
53  loc_idof.resize (2);
54  loc_idof [0] = 0;
55  loc_idof [1] = 1;
56  return;
57  }
58  case reference_element::t: {
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  }
69  case reference_element::q: {
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  }
80  case reference_element::T: {
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  }
92  case reference_element::H: {
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  }
104  case reference_element::P: {
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:425
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
size_t size_type
Definition: basis_get.cc:76
#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
Float u(const point &x)