40 std::size_t max_degree = 0;
41 for (
const auto &poly : polys)
45 const auto degree_0 = degrees[0];
46 std::size_t degree_d = 0;
47 for (
unsigned int d = 1;
d < dim + 1; ++
d)
48 degree_d =
std::max(degree_d, degrees[
d]);
50 max_degree =
std::max(max_degree, degree_d + degree_0);
62 std::vector<PolyType> polys;
157 const std::vector<PolyType> &polynomials)
168 for (std::size_t i = 0; i < polynomials.size(); ++i)
171 for (
unsigned int d = 0;
d < dim; ++
d)
175 for (
unsigned int d0 = 0; d0 < dim; ++d0)
176 for (
unsigned int d1 = 0; d1 < dim; ++d1)
180 for (
unsigned int d0 = 0; d0 < dim; ++d0)
181 for (
unsigned int d1 = 0; d1 < dim; ++d1)
182 for (
unsigned int d2 = 0; d2 < dim; ++d2)
187 for (
unsigned int d0 = 0; d0 < dim; ++d0)
188 for (
unsigned int d1 = 0; d1 < dim; ++d1)
189 for (
unsigned int d2 = 0; d2 < dim; ++d2)
190 for (
unsigned int d3 = 0; d3 < dim; ++d3)
202 std::vector<double> &
values,
210 Assert(grads.size() == this->n() || grads.empty(),
212 Assert(grad_grads.size() == this->n() || grad_grads.empty(),
214 Assert(third_derivatives.size() == this->n() || third_derivatives.empty(),
216 Assert(fourth_derivatives.size() == this->n() || fourth_derivatives.empty(),
219 for (std::size_t i = 0; i < polys.size(); ++i)
221 if (
values.size() == this->n())
222 values[i] = polys[i].value(unit_point);
225 if (grads.size() == this->n())
226 for (
unsigned int d = 0;
d < dim; ++
d)
227 grads[i][
d] = poly_grads[i][
d].value(unit_point);
230 if (grad_grads.size() == this->n())
231 for (
unsigned int d0 = 0; d0 < dim; ++d0)
232 for (
unsigned int d1 = 0; d1 < dim; ++d1)
233 grad_grads[i][d0][d1] = poly_hessians[i][d0][d1].value(unit_point);
236 if (third_derivatives.size() == this->n())
237 for (
unsigned int d0 = 0; d0 < dim; ++d0)
238 for (
unsigned int d1 = 0; d1 < dim; ++d1)
239 for (
unsigned int d2 = 0; d2 < dim; ++d2)
240 third_derivatives[i][d0][d1][d2] =
241 poly_third_derivatives[i][d0][d1][d2].value(unit_point);
244 if (fourth_derivatives.size() == this->n())
245 for (
unsigned int d0 = 0; d0 < dim; ++d0)
246 for (
unsigned int d1 = 0; d1 < dim; ++d1)
247 for (
unsigned int d2 = 0; d2 < dim; ++d2)
248 for (
unsigned int d3 = 0; d3 < dim; ++d3)
249 fourth_derivatives[i][d0][d1][d2][d3] =
250 poly_fourth_derivatives[i][d0][d1][d2][d3].value(unit_point);
262 return polys[i].value(p);
273 for (
unsigned int d = 0;
d < dim; ++
d)
274 result[
d] = poly_grads[i][
d].value(p);
286 for (
unsigned int d0 = 0; d0 < dim; ++d0)
287 for (
unsigned int d1 = 0; d1 < dim; ++d1)
288 result[d0][d1] = poly_hessians[i][d0][d1].value(p);
301 for (
unsigned int d0 = 0; d0 < dim; ++d0)
302 for (
unsigned int d1 = 0; d1 < dim; ++d1)
303 for (
unsigned int d2 = 0; d2 < dim; ++d2)
304 result[d0][d1][d2] = poly_third_derivatives[i][d0][d1][d2].value(p);
317 for (
unsigned int d0 = 0; d0 < dim; ++d0)
318 for (
unsigned int d1 = 0; d1 < dim; ++d1)
319 for (
unsigned int d2 = 0; d2 < dim; ++d2)
320 for (
unsigned int d3 = 0; d3 < dim; ++d3)
321 result[d0][d1][d2][d3] =
322 poly_fourth_derivatives[i][d0][d1][d2][d3].value(p);
334 return compute_1st_derivative(i, p);
344 return compute_2nd_derivative(i, p);
350 std::unique_ptr<ScalarPolynomialsBase<dim>>
353 return std::make_unique<BarycentricPolynomials<dim>>(*this);
371 std::size_t poly_memory = 0;
372 for (
const auto &poly : polys)
373 poly_memory += poly.memory_consumption();
Tensor< 1, dim > compute_grad(const unsigned int i, const Point< dim > &p) const override
virtual std::size_t memory_consumption() const override
Tensor< 2, dim > compute_grad_grad(const unsigned int i, const Point< dim > &p) const override
std::vector< GradType > poly_grads
std::string name() const override
Tensor< 3, dim > compute_3rd_derivative(const unsigned int i, const Point< dim > &p) const override
Tensor< 1, dim > compute_1st_derivative(const unsigned int i, const Point< dim > &p) const override
void evaluate(const Point< dim > &unit_point, std::vector< double > &values, std::vector< Tensor< 1, dim >> &grads, std::vector< Tensor< 2, dim >> &grad_grads, std::vector< Tensor< 3, dim >> &third_derivatives, std::vector< Tensor< 4, dim >> &fourth_derivatives) const override
Tensor< 2, dim > compute_2nd_derivative(const unsigned int i, const Point< dim > &p) const override
std::vector< PolyType > polys
BarycentricPolynomials(const std::vector< BarycentricPolynomial< dim >> &polynomials)
double compute_value(const unsigned int i, const Point< dim > &p) const override
std::vector< ThirdDerivativesType > poly_third_derivatives
virtual std::unique_ptr< ScalarPolynomialsBase< dim > > clone() const override
Tensor< 4, dim > compute_4th_derivative(const unsigned int i, const Point< dim > &p) const override
std::vector< HessianType > poly_hessians
static BarycentricPolynomials< dim > get_fe_p_basis(const unsigned int degree)
std::vector< FourthDerivativesType > poly_fourth_derivatives
virtual std::size_t memory_consumption() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcDimensionMismatch2(std::size_t arg1, std::size_t arg2, std::size_t arg3)
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
unsigned int get_degree(const std::vector< typename BarycentricPolynomials< dim >::PolyType > &polys)