81 const unsigned int normal_degree,
82 const unsigned int tangential_degree,
83 const std::vector<unsigned int> &polynomial_ordering)
85 n_polynomials(normal_degree, tangential_degree))
86 , normal_degree(normal_degree)
87 , tangential_degree(tangential_degree)
89 create_aniso_polynomials(dim, normal_degree, tangential_degree))
90 , lexicographic_to_hierarchic(polynomial_ordering)
91 , hierarchic_to_lexicographic(
92 Utilities::invert_permutation(lexicographic_to_hierarchic))
103 for (
unsigned int i = 0; i <
n_pols; ++i)
150 Assert(values.size() == this->n() || values.empty(),
152 Assert(grads.size() == this->n() || grads.empty(),
154 Assert(grad_grads.size() == this->n() || grad_grads.empty(),
156 Assert(third_derivatives.size() == this->n() || third_derivatives.empty(),
158 Assert(fourth_derivatives.size() == this->n() || fourth_derivatives.empty(),
161 std::vector<double> p_values;
162 std::vector<Tensor<1, dim>> p_grads;
163 std::vector<Tensor<2, dim>> p_grad_grads;
164 std::vector<Tensor<3, dim>> p_third_derivatives;
165 std::vector<Tensor<4, dim>> p_fourth_derivatives;
167 const unsigned int n_sub = polynomial_space.n();
168 p_values.resize((values.empty()) ? 0 : n_sub);
169 p_grads.resize((grads.empty()) ? 0 : n_sub);
170 p_grad_grads.resize((grad_grads.empty()) ? 0 : n_sub);
171 p_third_derivatives.resize((third_derivatives.empty()) ? 0 : n_sub);
172 p_fourth_derivatives.resize((fourth_derivatives.empty()) ? 0 : n_sub);
174 for (
unsigned int d = 0; d < dim; ++d)
182 for (
unsigned int c = 0; c < dim; ++c)
183 p[c] = unit_point[(c + d) % dim];
185 polynomial_space.evaluate(p,
190 p_fourth_derivatives);
192 for (
unsigned int i = 0; i < p_values.size(); ++i)
196 val[d] = p_values[renumber_aniso[d][i]];
197 values[lexicographic_to_hierarchic[i + d * n_sub]] = val;
200 for (
unsigned int i = 0; i < p_grads.size(); ++i)
203 for (
unsigned int d1 = 0; d1 < dim; ++d1)
204 out[d][(d1 + d) % dim] = p_grads[renumber_aniso[d][i]][d1];
205 grads[lexicographic_to_hierarchic[i + d * n_sub]] = out;
208 for (
unsigned int i = 0; i < p_grad_grads.size(); ++i)
211 for (
unsigned int d1 = 0; d1 < dim; ++d1)
212 for (
unsigned int d2 = 0; d2 < dim; ++d2)
213 out[d][(d1 + d) % dim][(d2 + d) % dim] =
214 p_grad_grads[renumber_aniso[d][i]][d1][d2];
215 grad_grads[lexicographic_to_hierarchic[i + d * n_sub]] = out;
218 for (
unsigned int i = 0; i < p_third_derivatives.size(); ++i)
221 for (
unsigned int d1 = 0; d1 < dim; ++d1)
222 for (
unsigned int d2 = 0; d2 < dim; ++d2)
223 for (
unsigned int d3 = 0; d3 < dim; ++d3)
224 out[d][(d1 + d) % dim][(d2 + d) % dim][(d3 + d) % dim] =
225 p_third_derivatives[renumber_aniso[d][i]][d1][d2][d3];
226 third_derivatives[lexicographic_to_hierarchic[i + d * n_sub]] = 0;
229 for (
unsigned int i = 0; i < p_fourth_derivatives.size(); ++i)
232 for (
unsigned int d1 = 0; d1 < dim; ++d1)
233 for (
unsigned int d2 = 0; d2 < dim; ++d2)
234 for (
unsigned int d3 = 0; d3 < dim; ++d3)
235 for (
unsigned int d4 = 0; d4 < dim; ++d4)
236 out[d][(d1 + d) % dim][(d2 + d) % dim][(d3 + d) %
237 dim][(d4 + d) % dim] =
238 p_fourth_derivatives[renumber_aniso[d][i]][d1][d2][d3][d4];
239 fourth_derivatives[lexicographic_to_hierarchic[i + d * n_sub]] = out;
299 const std::vector<std::vector<Point<1>>> points_aniso =
300 create_anisotropic_support_points(dim, normal_degree, tangential_degree);
301 const unsigned int n_sub = polynomial_space.n();
302 std::vector<Point<dim>> points(dim * n_sub);
303 points.resize(n_polynomials(normal_degree, tangential_degree));
304 for (
unsigned int d = 0; d < dim; ++d)
305 for (
unsigned int i = 0; i < n_sub; ++i)
307 unsigned int renumbered_index = renumber_aniso[d][i];
308 std::array<unsigned int, dim> indices_points_anisotropic;
309 indices_points_anisotropic[0] = renumbered_index % (normal_degree + 1);
312 renumbered_index /= (normal_degree + 1);
313 indices_points_anisotropic[1] =
314 renumbered_index % (tangential_degree + 1);
317 indices_points_anisotropic[2] =
318 renumbered_index / (tangential_degree + 1);
319 for (
unsigned int c = 0; c < dim; ++c)
321 points[lexicographic_to_hierarchic[i + d * n_sub]][(c + d) % dim] =
322 points_aniso[c][indices_points_anisotropic[c]][0];
void evaluate(const Point< dim > &unit_point, std::vector< Tensor< 1, dim > > &values, std::vector< Tensor< 2, dim > > &grads, std::vector< Tensor< 3, dim > > &grad_grads, std::vector< Tensor< 4, dim > > &third_derivatives, std::vector< Tensor< 5, dim > > &fourth_derivatives) const override
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)