Rheolef  7.1
an efficient C++ finite element environment
monomial.icc
Go to the documentation of this file.
1 #ifndef _RHEOLEF_MONOMIAL_ICC
2 #define _RHEOLEF_MONOMIAL_ICC
3 //
24 // monomial basis, as initial local FEM basis
25 // see also bernstein and dubiner that are better conditionned
26 //
27 // author: Pierre.Saramito@imag.fr
28 //
29 // date: 2 september 2017
30 //
31 // note: initially copied from rheolef/fem/lib/Pk.cc
32 //
33 #include "rheolef/reference_element.h"
34 #include "basis_ordering.icc"
35 
36 namespace rheolef {
37 
38 // mx[k][i] = x[i]^k, k=0..degree, i=0..d-1
39 template<class T>
40 static
41 void
42 precompute_power_monomial (
43  reference_element hat_K,
44  size_t d,
45  const point_basic<T>& x,
46  size_t degree,
47  Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1>& xm)
48 {
49  xm.resize (degree+1);
50  for (size_t mu = 0; mu < d; mu++) {
51  xm[0][mu] = 1;
52  }
53  if (degree == 0) return;
54  xm[1] = x;
55  for (size_t i = 2; i <= degree; i++) {
56  for (size_t mu = 0; mu < d; mu++) {
57  xm[i][mu] = xm[i-1][mu]*xm[1][mu];
58  }
59  }
60 }
61 // ----------------------------------------------
62 // monomial basis evaluation
63 // result = prod_{i=0}^{d-1} x[i]^m[i]
64 // use predomputed x[i]^m for efficiency
65 // ----------------------------------------------
66 template<class T>
67 static
68 T
69 eval_monomial_internal (
70  reference_element hat_K,
71  size_t d,
72  const Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1>& xm,
73  const point_basic<size_t>& m) // power_index
74 {
75  T result;
76  if (d == 2) {
77  result = xm[m[0]][0]
78  *xm[m[1]][1];
79  } else if (d == 3) {
80  result = xm[m[0]][0]
81  *xm[m[1]][1]
82  *xm[m[2]][2];
83  } else if (d == 1) {
84  result = xm[m[0]][0];
85  } else { // d == 0
86  result = 1;
87  }
88  return result;
89 }
90 
91 }// namespace rheolef
92 #endif // _RHEOLEF_MONOMIAL_ICC
mkgeo_ball.d
int d
Definition: mkgeo_ball.sh:154
mkgeo_sector.m
m
Definition: mkgeo_sector.sh:118
rheolef
This file is part of Rheolef.
Definition: compiler_eigen.h:37
rheolef::point_basic< T >
point_basic< T >
Definition: piola_fem.h:135
mkgeo_contraction.mu
mu
Definition: mkgeo_contraction.sh:193
basis_ordering.icc
T
Expr1::float_type T
Definition: field_expr.h:261