1 #ifndef _RHEOLEF_BERNSTEIN_ICC
2 #define _RHEOLEF_BERNSTEIN_ICC
30 #include "rheolef/reference_element.h"
40 precompute_factorial (
42 std::vector<T>& factorial)
45 factorial.resize (degree+1);
48 factorial[i] = factorial[i-1]*i;
57 precompute_power_bernstein (
58 reference_element hat_K,
66 switch (hat_K.variant()) {
74 default: error_macro (
"unsupported element: "<<hat_K.name());
76 for (
size_t mu = 0;
mu < n_comp;
mu++) {
79 if (degree == 0)
return;
80 switch (hat_K.variant()) {
90 lambda[1][2] = 1-x[0]-x[1];
96 lambda[1][3] = 1-x[0]-x[1]-x[2];
111 lambda[1][2] = 1-x[0]-x[1];
129 for (
size_t i = 2; i <= degree; i++) {
130 for (
size_t mu = 0;
mu < n_comp;
mu++) {
146 template<
class T,
class U>
149 eval_bernstein_internal (
150 reference_element hat_K,
153 const std::vector<T>& factorial,
154 const point_basic<size_t>&
m,
157 switch (hat_K.variant()) {
162 T deno = factorial[
m[0]]
163 *factorial[degree-
m[0]];
164 T c = factorial[degree]/deno;
165 return c*lambda_m[
m[0]][0]
166 *lambda_m[degree-
m[0]][1];
169 T deno = factorial[
m[0] ]
171 *factorial[degree-
m[0]-
m[1]];
172 T c = factorial[degree]/deno;
173 return c*lambda_m[
m[0] ][0]
175 *lambda_m[degree-
m[0]-
m[1]][2];
178 T deno = factorial[
m[0] ]
181 *factorial[degree-
m[0]-
m[1]-
m[2]];
182 T c = factorial[degree]/deno;
183 return c*lambda_m[
m[0] ][0]
186 *lambda_m[degree-
m[0]-
m[1]-
m[2]][3];
189 T deno = factorial[
m[0]]
190 *factorial[degree-
m[0]]
192 *factorial[degree-
m[1]];
193 T c = sqr(factorial[degree])/deno;
194 return c*lambda_m[
m[0]][0]
195 *lambda_m[degree-
m[0]][1]
197 *lambda_m[degree-
m[1]][3];
200 T deno = factorial[
m[0]]
201 *factorial[degree-
m[0]]
203 *factorial[degree-
m[1]]
205 *factorial[degree-
m[2]];
206 T c =
pow(factorial[degree],3)/deno;
207 return c*lambda_m[
m[0]][0]
208 *lambda_m[degree-
m[0]][1]
210 *lambda_m[degree-
m[1]][3]
212 *lambda_m[degree-
m[2]][5];
215 T deno = factorial[
m[0] ]
217 *factorial[degree-
m[0]-
m[1]]
219 *factorial[degree-
m[2]];
220 T c = sqr(factorial[degree])/deno;
221 return c*lambda_m[
m[0] ][0]
223 *lambda_m[degree-
m[0]-
m[1]][2]
225 *lambda_m[degree-
m[2] ][4];
228 error_macro (
"unsupported element: "<<hat_K.name());
field::size_type size_type
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
This file is part of Rheolef.
space_mult_list< T, M > pow(const space_basic< T, M > &X, size_t n)