1#ifndef _RHEOLEF_BERNSTEIN_ICC
2#define _RHEOLEF_BERNSTEIN_ICC
30#include "rheolef/reference_element.h"
42 std::vector<T>& factorial)
45 factorial.resize (degree+1);
48 factorial[i] = factorial[i-1]*i;
57precompute_power_bernstein (
58 reference_element hat_K,
60 const point_basic<T>& x,
62 std::vector<std::array<T,6> >&
lambda)
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++) {
146template<
class T,
class U>
149eval_bernstein_internal (
150 reference_element hat_K,
152 const std::vector<std::array<U,6> >& lambda_m,
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
#define error_macro(message)
This file is part of Rheolef.