32 , polynomial_space(
Polynomials::Legendre::generate_complete_basis(k))
33 , monomials((dim == 2) ? (1) : (k + 2))
34 , p_values(polynomial_space.n())
35 , p_grads(polynomial_space.n())
36 , p_grad_grads(polynomial_space.n())
44 for (
unsigned int i = 0; i <
monomials.size(); ++i)
64 Assert(values.size() == this->n() || values.size() == 0,
66 Assert(grads.size() == this->n() || grads.size() == 0,
68 Assert(grad_grads.size() == this->n() || grad_grads.size() == 0,
70 Assert(third_derivatives.size() == this->n() || third_derivatives.size() == 0,
72 Assert(fourth_derivatives.size() == this->n() ||
73 fourth_derivatives.size() == 0,
77 (void)third_derivatives;
79 (void)fourth_derivatives;
82 const unsigned int n_sub = polynomial_space.n();
90 std::lock_guard<std::mutex> lock(mutex);
92 p_values.resize((values.size() == 0) ? 0 : n_sub);
93 p_grads.resize((grads.size() == 0) ? 0 : n_sub);
94 p_grad_grads.resize((grad_grads.size() == 0) ? 0 : n_sub);
101 polynomial_space.evaluate(unit_point,
106 p_fourth_derivatives);
109 for (
unsigned int i = 0; i < p_values.size(); ++i)
110 for (
unsigned int j = 0; j < dim; ++j)
111 values[i + j * n_sub][j] = p_values[i];
114 for (
unsigned int i = 0; i < p_grads.size(); ++i)
115 for (
unsigned int j = 0; j < dim; ++j)
116 grads[i + j * n_sub][j] = p_grads[i];
118 std::fill(grad_grads.begin(), grad_grads.end(),
Tensor<3, dim>());
119 for (
unsigned int i = 0; i < p_grad_grads.size(); ++i)
120 for (
unsigned int j = 0; j < dim; ++j)
121 grad_grads[i + j * n_sub][j] = p_grad_grads[i];
126 unsigned int start = dim * n_sub;
131 std::vector<std::vector<double>> monovali(dim, std::vector<double>(4));
132 std::vector<std::vector<double>> monovalk(dim, std::vector<double>(4));
136 for (
unsigned int d = 0;
d < dim; ++
d)
137 monomials[0].
value(unit_point(
d), monovali[
d]);
138 if (values.size() != 0)
140 values[start][0] = monovali[0][0];
141 values[start][1] = -unit_point(1) * monovali[0][1];
142 values[start + 1][0] = unit_point(0) * monovali[1][1];
143 values[start + 1][1] = -monovali[1][0];
145 if (grads.size() != 0)
147 grads[start][0][0] = monovali[0][1];
148 grads[start][0][1] = 0.;
149 grads[start][1][0] = -unit_point(1) * monovali[0][2];
150 grads[start][1][1] = -monovali[0][1];
151 grads[start + 1][0][0] = monovali[1][1];
152 grads[start + 1][0][1] = unit_point(0) * monovali[1][2];
153 grads[start + 1][1][0] = 0.;
154 grads[start + 1][1][1] = -monovali[1][1];
156 if (grad_grads.size() != 0)
158 grad_grads[start][0][0][0] = monovali[0][2];
159 grad_grads[start][0][0][1] = 0.;
160 grad_grads[start][0][1][0] = 0.;
161 grad_grads[start][0][1][1] = 0.;
162 grad_grads[start][1][0][0] = -unit_point(1) * monovali[0][3];
163 grad_grads[start][1][0][1] = -monovali[0][2];
164 grad_grads[start][1][1][0] = -monovali[0][2];
165 grad_grads[start][1][1][1] = 0.;
166 grad_grads[start + 1][0][0][0] = 0;
167 grad_grads[start + 1][0][0][1] = monovali[1][2];
168 grad_grads[start + 1][0][1][0] = monovali[1][2];
169 grad_grads[start + 1][0][1][1] = unit_point(0) * monovali[1][3];
170 grad_grads[start + 1][1][0][0] = 0.;
171 grad_grads[start + 1][1][0][1] = 0.;
172 grad_grads[start + 1][1][1][0] = 0.;
173 grad_grads[start + 1][1][1][1] = -monovali[1][2];
188 const unsigned int n_curls = monomials.size() - 1;
189 for (
unsigned int i = 0; i < n_curls; ++i, start += dim)
191 for (
unsigned int d = 0;
d < dim; ++
d)
194 monomials[i + 1].value(unit_point(
d), monovali[
d]);
196 monomials[this->degree() - 1 - i].value(unit_point(
d),
199 if (values.size() != 0)
203 unit_point(0) * monovali[1][1] * monovalk[2][0];
205 values[start][1] = -monovali[1][0] * monovalk[2][0];
206 values[start][2] = 0.;
209 values[start + 1][1] =
210 unit_point(1) * monovali[2][1] * monovalk[0][0];
212 values[start + 1][2] = -monovali[2][0] * monovalk[0][0];
213 values[start + 1][0] = 0.;
216 values[start + 2][2] =
217 unit_point(2) * monovali[0][1] * monovalk[1][0];
219 values[start + 2][0] = -monovali[0][0] * monovalk[1][0];
220 values[start + 2][1] = 0.;
222 if (grads.size() != 0)
224 grads[start][0][0] = monovali[1][1] * monovalk[2][0];
226 unit_point(0) * monovali[1][2] * monovalk[2][0];
228 unit_point(0) * monovali[1][1] * monovalk[2][1];
229 grads[start][1][0] = 0.;
230 grads[start][1][1] = -monovali[1][1] * monovalk[2][0];
231 grads[start][1][2] = -monovali[1][0] * monovalk[2][1];
232 grads[start][2][0] = 0.;
233 grads[start][2][1] = 0.;
234 grads[start][2][2] = 0.;
236 grads[start + 1][1][1] = monovali[2][1] * monovalk[0][0];
237 grads[start + 1][1][2] =
238 unit_point(1) * monovali[2][2] * monovalk[0][0];
239 grads[start + 1][1][0] =
240 unit_point(1) * monovali[2][1] * monovalk[0][1];
241 grads[start + 1][2][1] = 0.;
242 grads[start + 1][2][2] = -monovali[2][1] * monovalk[0][0];
243 grads[start + 1][2][0] = -monovali[2][0] * monovalk[0][1];
244 grads[start + 1][0][1] = 0.;
245 grads[start + 1][0][2] = 0.;
246 grads[start + 1][0][0] = 0.;
248 grads[start + 2][2][2] = monovali[0][1] * monovalk[1][0];
249 grads[start + 2][2][0] =
250 unit_point(2) * monovali[0][2] * monovalk[1][0];
251 grads[start + 2][2][1] =
252 unit_point(2) * monovali[0][1] * monovalk[1][1];
253 grads[start + 2][0][2] = 0.;
254 grads[start + 2][0][0] = -monovali[0][1] * monovalk[1][0];
255 grads[start + 2][0][1] = -monovali[0][0] * monovalk[1][1];
256 grads[start + 2][1][2] = 0.;
257 grads[start + 2][1][0] = 0.;
258 grads[start + 2][1][1] = 0.;
260 if (grad_grads.size() != 0)
262 grad_grads[start][0][0][0] = 0.;
263 grad_grads[start][0][0][1] = monovali[1][2] * monovalk[2][0];
264 grad_grads[start][0][0][2] = monovali[1][1] * monovalk[2][1];
265 grad_grads[start][0][1][0] = monovali[1][2] * monovalk[2][0];
266 grad_grads[start][0][1][1] =
267 unit_point(0) * monovali[1][3] * monovalk[2][0];
268 grad_grads[start][0][1][2] =
269 unit_point(0) * monovali[1][2] * monovalk[2][1];
270 grad_grads[start][0][2][0] = monovali[1][1] * monovalk[2][1];
271 grad_grads[start][0][2][1] =
272 unit_point(0) * monovali[1][2] * monovalk[2][1];
273 grad_grads[start][0][2][2] =
274 unit_point(0) * monovali[1][1] * monovalk[2][2];
275 grad_grads[start][1][0][0] = 0.;
276 grad_grads[start][1][0][1] = 0.;
277 grad_grads[start][1][0][2] = 0.;
278 grad_grads[start][1][1][0] = 0.;
279 grad_grads[start][1][1][1] = -monovali[1][2] * monovalk[2][0];
280 grad_grads[start][1][1][2] = -monovali[1][1] * monovalk[2][1];
281 grad_grads[start][1][2][0] = 0.;
282 grad_grads[start][1][2][1] = -monovali[1][1] * monovalk[2][1];
283 grad_grads[start][1][2][2] = -monovali[1][0] * monovalk[2][2];
284 grad_grads[start][2][0][0] = 0.;
285 grad_grads[start][2][0][1] = 0.;
286 grad_grads[start][2][0][2] = 0.;
287 grad_grads[start][2][1][0] = 0.;
288 grad_grads[start][2][1][1] = 0.;
289 grad_grads[start][2][1][2] = 0.;
290 grad_grads[start][2][2][0] = 0.;
291 grad_grads[start][2][2][1] = 0.;
292 grad_grads[start][2][2][2] = 0.;
294 grad_grads[start + 1][0][0][0] = 0.;
295 grad_grads[start + 1][0][0][1] = 0.;
296 grad_grads[start + 1][0][0][2] = 0.;
297 grad_grads[start + 1][0][1][0] = 0.;
298 grad_grads[start + 1][0][1][1] = 0.;
299 grad_grads[start + 1][0][1][2] = 0.;
300 grad_grads[start + 1][0][2][0] = 0.;
301 grad_grads[start + 1][0][2][1] = 0.;
302 grad_grads[start + 1][0][2][2] = 0.;
303 grad_grads[start + 1][1][0][0] =
304 unit_point(1) * monovali[2][1] * monovalk[0][2];
305 grad_grads[start + 1][1][0][1] = monovali[2][1] * monovalk[0][1];
306 grad_grads[start + 1][1][0][2] =
307 unit_point(1) * monovali[2][2] * monovalk[0][1];
308 grad_grads[start + 1][1][1][0] = monovalk[0][1] * monovali[2][1];
309 grad_grads[start + 1][1][1][1] = 0.;
310 grad_grads[start + 1][1][1][2] = monovalk[0][0] * monovali[2][2];
311 grad_grads[start + 1][1][2][0] =
312 unit_point(1) * monovalk[0][1] * monovali[2][2];
313 grad_grads[start + 1][1][2][1] = monovalk[0][0] * monovali[2][2];
314 grad_grads[start + 1][1][2][2] =
315 unit_point(1) * monovalk[0][0] * monovali[2][3];
316 grad_grads[start + 1][2][0][0] = -monovalk[0][2] * monovali[2][0];
317 grad_grads[start + 1][2][0][1] = 0.;
318 grad_grads[start + 1][2][0][2] = -monovalk[0][1] * monovali[2][1];
319 grad_grads[start + 1][2][1][0] = 0.;
320 grad_grads[start + 1][2][1][1] = 0.;
321 grad_grads[start + 1][2][1][2] = 0.;
322 grad_grads[start + 1][2][2][0] = -monovalk[0][1] * monovali[2][1];
323 grad_grads[start + 1][2][2][1] = 0.;
324 grad_grads[start + 1][2][2][2] = -monovalk[0][0] * monovali[2][2];
326 grad_grads[start + 2][0][0][0] = -monovali[0][2] * monovalk[1][0];
327 grad_grads[start + 2][0][0][1] = -monovali[0][1] * monovalk[1][1];
328 grad_grads[start + 2][0][0][2] = 0.;
329 grad_grads[start + 2][0][1][0] = -monovali[0][1] * monovalk[1][1];
330 grad_grads[start + 2][0][1][1] = -monovali[0][0] * monovalk[1][2];
331 grad_grads[start + 2][0][1][2] = 0.;
332 grad_grads[start + 2][0][2][0] = 0.;
333 grad_grads[start + 2][0][2][1] = 0.;
334 grad_grads[start + 2][0][2][2] = 0.;
335 grad_grads[start + 2][1][0][0] = 0.;
336 grad_grads[start + 2][1][0][1] = 0.;
337 grad_grads[start + 2][1][0][2] = 0.;
338 grad_grads[start + 2][1][1][0] = 0.;
339 grad_grads[start + 2][1][1][1] = 0.;
340 grad_grads[start + 2][1][1][2] = 0.;
341 grad_grads[start + 2][1][2][0] = 0.;
342 grad_grads[start + 2][1][2][1] = 0.;
343 grad_grads[start + 2][1][2][2] = 0.;
344 grad_grads[start + 2][2][0][0] =
345 unit_point(2) * monovali[0][3] * monovalk[1][0];
346 grad_grads[start + 2][2][0][1] =
347 unit_point(2) * monovali[0][2] * monovalk[1][1];
348 grad_grads[start + 2][2][0][2] = monovali[0][2] * monovalk[1][0];
349 grad_grads[start + 2][2][1][0] =
350 unit_point(2) * monovali[0][2] * monovalk[1][1];
351 grad_grads[start + 2][2][1][1] =
352 unit_point(2) * monovali[0][1] * monovalk[1][2];
353 grad_grads[start + 2][2][1][2] = monovali[0][1] * monovalk[1][1];
354 grad_grads[start + 2][2][2][0] = monovali[0][2] * monovalk[1][0];
355 grad_grads[start + 2][2][2][1] = monovali[0][1] * monovalk[1][1];
356 grad_grads[start + 2][2][2][2] = 0.;
438 return (k + 1) * (k + 2) + 2;
440 return ((k + 1) * (k + 2) * (k + 3)) / 2 + 3 * (k + 1);
447 std::unique_ptr<TensorPolynomialsBase<dim>>
450 return std_cxx14::make_unique<PolynomialsBDM<dim>>(*this);