61 Assert(values.size() == this->n() || values.empty(),
63 Assert(grads.size() == this->n() || grads.empty(),
65 Assert(grad_grads.size() == this->n() || grad_grads.empty(),
67 Assert(third_derivatives.size() == this->n() || third_derivatives.empty(),
69 Assert(fourth_derivatives.size() == this->n() || fourth_derivatives.empty(),
73 (void)third_derivatives;
75 (void)fourth_derivatives;
78 const unsigned int n_sub = polynomial_space.n();
83 std::scoped_lock lock(mutex);
85 p_values.resize((values.empty()) ? 0 : n_sub);
86 p_grads.resize((grads.empty()) ? 0 : n_sub);
87 p_grad_grads.resize((grad_grads.empty()) ? 0 : n_sub);
91 polynomial_space.evaluate(unit_point,
96 p_fourth_derivatives);
99 for (
unsigned int i = 0; i < p_values.size(); ++i)
100 for (
unsigned int j = 0; j < dim; ++j)
101 values[i + j * n_sub][j] = p_values[i];
104 for (
unsigned int i = 0; i < p_grads.size(); ++i)
105 for (
unsigned int j = 0; j < dim; ++j)
106 grads[i + j * n_sub][j] = p_grads[i];
108 std::fill(grad_grads.begin(), grad_grads.end(),
Tensor<3, dim>());
109 for (
unsigned int i = 0; i < p_grad_grads.size(); ++i)
110 for (
unsigned int j = 0; j < dim; ++j)
111 grad_grads[i + j * n_sub][j] = p_grad_grads[i];
115 unsigned int start = dim * n_sub;
118 std::vector<std::vector<double>> monovali(dim, std::vector<double>(4));
119 std::vector<std::vector<double>> monovalk(dim, std::vector<double>(4));
127 "available for dim == 2, or dim == 3"));
131 for (
unsigned int d = 0; d < dim; ++d)
132 monomials[0].value(unit_point[d], monovali[d]);
133 if (values.size() != 0)
135 values[start][0] = monovali[0][0];
136 values[start][1] = -unit_point[1] * monovali[0][1];
137 values[start + 1][0] = unit_point[0] * monovali[1][1];
138 values[start + 1][1] = -monovali[1][0];
140 if (grads.size() != 0)
142 grads[start][0][0] = monovali[0][1];
143 grads[start][0][1] = 0.;
144 grads[start][1][0] = -unit_point[1] * monovali[0][2];
145 grads[start][1][1] = -monovali[0][1];
146 grads[start + 1][0][0] = monovali[1][1];
147 grads[start + 1][0][1] = unit_point[0] * monovali[1][2];
148 grads[start + 1][1][0] = 0.;
149 grads[start + 1][1][1] = -monovali[1][1];
151 if (grad_grads.size() != 0)
153 grad_grads[start][0][0][0] = monovali[0][2];
154 grad_grads[start][0][0][1] = 0.;
155 grad_grads[start][0][1][0] = 0.;
156 grad_grads[start][0][1][1] = 0.;
157 grad_grads[start][1][0][0] = -unit_point[1] * monovali[0][3];
158 grad_grads[start][1][0][1] = -monovali[0][2];
159 grad_grads[start][1][1][0] = -monovali[0][2];
160 grad_grads[start][1][1][1] = 0.;
161 grad_grads[start + 1][0][0][0] = 0;
162 grad_grads[start + 1][0][0][1] = monovali[1][2];
163 grad_grads[start + 1][0][1][0] = monovali[1][2];
164 grad_grads[start + 1][0][1][1] = unit_point[0] * monovali[1][3];
165 grad_grads[start + 1][1][0][0] = 0.;
166 grad_grads[start + 1][1][0][1] = 0.;
167 grad_grads[start + 1][1][1][0] = 0.;
168 grad_grads[start + 1][1][1][1] = -monovali[1][2];
178 const unsigned int n_curls = monomials.size() - 1;
179 for (
unsigned int i = 0; i < n_curls; ++i, start += dim)
181 for (
unsigned int d = 0; d < dim; ++d)
184 monomials[i + 1].value(unit_point[d], monovali[d]);
186 monomials[this->degree() - 1 - i].value(unit_point[d],
190 if (values.size() != 0)
194 unit_point[0] * monovali[1][1] * monovalk[2][0];
196 values[start][1] = -monovali[1][0] * monovalk[2][0];
197 values[start][2] = 0.;
200 values[start + 1][1] =
201 unit_point[1] * monovali[2][1] * monovalk[0][0];
203 values[start + 1][2] = -monovali[2][0] * monovalk[0][0];
204 values[start + 1][0] = 0.;
207 values[start + 2][2] =
208 unit_point[2] * monovali[0][1] * monovalk[1][0];
210 values[start + 2][0] = -monovali[0][0] * monovalk[1][0];
211 values[start + 2][1] = 0.;
214 if (grads.size() != 0)
216 grads[start][0][0] = monovali[1][1] * monovalk[2][0];
218 unit_point[0] * monovali[1][2] * monovalk[2][0];
220 unit_point[0] * monovali[1][1] * monovalk[2][1];
221 grads[start][1][0] = 0.;
222 grads[start][1][1] = -monovali[1][1] * monovalk[2][0];
223 grads[start][1][2] = -monovali[1][0] * monovalk[2][1];
224 grads[start][2][0] = 0.;
225 grads[start][2][1] = 0.;
226 grads[start][2][2] = 0.;
228 grads[start + 1][1][1] = monovali[2][1] * monovalk[0][0];
229 grads[start + 1][1][2] =
230 unit_point[1] * monovali[2][2] * monovalk[0][0];
231 grads[start + 1][1][0] =
232 unit_point[1] * monovali[2][1] * monovalk[0][1];
233 grads[start + 1][2][1] = 0.;
234 grads[start + 1][2][2] = -monovali[2][1] * monovalk[0][0];
235 grads[start + 1][2][0] = -monovali[2][0] * monovalk[0][1];
236 grads[start + 1][0][1] = 0.;
237 grads[start + 1][0][2] = 0.;
238 grads[start + 1][0][0] = 0.;
240 grads[start + 2][2][2] = monovali[0][1] * monovalk[1][0];
241 grads[start + 2][2][0] =
242 unit_point[2] * monovali[0][2] * monovalk[1][0];
243 grads[start + 2][2][1] =
244 unit_point[2] * monovali[0][1] * monovalk[1][1];
245 grads[start + 2][0][2] = 0.;
246 grads[start + 2][0][0] = -monovali[0][1] * monovalk[1][0];
247 grads[start + 2][0][1] = -monovali[0][0] * monovalk[1][1];
248 grads[start + 2][1][2] = 0.;
249 grads[start + 2][1][0] = 0.;
250 grads[start + 2][1][1] = 0.;
253 if (grad_grads.size() != 0)
255 grad_grads[start][0][0][0] = 0.;
256 grad_grads[start][0][0][1] = monovali[1][2] * monovalk[2][0];
257 grad_grads[start][0][0][2] = monovali[1][1] * monovalk[2][1];
258 grad_grads[start][0][1][0] = monovali[1][2] * monovalk[2][0];
259 grad_grads[start][0][1][1] =
260 unit_point[0] * monovali[1][3] * monovalk[2][0];
261 grad_grads[start][0][1][2] =
262 unit_point[0] * monovali[1][2] * monovalk[2][1];
263 grad_grads[start][0][2][0] = monovali[1][1] * monovalk[2][1];
264 grad_grads[start][0][2][1] =
265 unit_point[0] * monovali[1][2] * monovalk[2][1];
266 grad_grads[start][0][2][2] =
267 unit_point[0] * monovali[1][1] * monovalk[2][2];
268 grad_grads[start][1][0][0] = 0.;
269 grad_grads[start][1][0][1] = 0.;
270 grad_grads[start][1][0][2] = 0.;
271 grad_grads[start][1][1][0] = 0.;
272 grad_grads[start][1][1][1] = -monovali[1][2] * monovalk[2][0];
273 grad_grads[start][1][1][2] = -monovali[1][1] * monovalk[2][1];
274 grad_grads[start][1][2][0] = 0.;
275 grad_grads[start][1][2][1] = -monovali[1][1] * monovalk[2][1];
276 grad_grads[start][1][2][2] = -monovali[1][0] * monovalk[2][2];
277 grad_grads[start][2][0][0] = 0.;
278 grad_grads[start][2][0][1] = 0.;
279 grad_grads[start][2][0][2] = 0.;
280 grad_grads[start][2][1][0] = 0.;
281 grad_grads[start][2][1][1] = 0.;
282 grad_grads[start][2][1][2] = 0.;
283 grad_grads[start][2][2][0] = 0.;
284 grad_grads[start][2][2][1] = 0.;
285 grad_grads[start][2][2][2] = 0.;
287 grad_grads[start + 1][0][0][0] = 0.;
288 grad_grads[start + 1][0][0][1] = 0.;
289 grad_grads[start + 1][0][0][2] = 0.;
290 grad_grads[start + 1][0][1][0] = 0.;
291 grad_grads[start + 1][0][1][1] = 0.;
292 grad_grads[start + 1][0][1][2] = 0.;
293 grad_grads[start + 1][0][2][0] = 0.;
294 grad_grads[start + 1][0][2][1] = 0.;
295 grad_grads[start + 1][0][2][2] = 0.;
296 grad_grads[start + 1][1][0][0] =
297 unit_point[1] * monovali[2][1] * monovalk[0][2];
298 grad_grads[start + 1][1][0][1] = monovali[2][1] * monovalk[0][1];
299 grad_grads[start + 1][1][0][2] =
300 unit_point[1] * monovali[2][2] * monovalk[0][1];
301 grad_grads[start + 1][1][1][0] = monovalk[0][1] * monovali[2][1];
302 grad_grads[start + 1][1][1][1] = 0.;
303 grad_grads[start + 1][1][1][2] = monovalk[0][0] * monovali[2][2];
304 grad_grads[start + 1][1][2][0] =
305 unit_point[1] * monovalk[0][1] * monovali[2][2];
306 grad_grads[start + 1][1][2][1] = monovalk[0][0] * monovali[2][2];
307 grad_grads[start + 1][1][2][2] =
308 unit_point[1] * monovalk[0][0] * monovali[2][3];
309 grad_grads[start + 1][2][0][0] = -monovalk[0][2] * monovali[2][0];
310 grad_grads[start + 1][2][0][1] = 0.;
311 grad_grads[start + 1][2][0][2] = -monovalk[0][1] * monovali[2][1];
312 grad_grads[start + 1][2][1][0] = 0.;
313 grad_grads[start + 1][2][1][1] = 0.;
314 grad_grads[start + 1][2][1][2] = 0.;
315 grad_grads[start + 1][2][2][0] = -monovalk[0][1] * monovali[2][1];
316 grad_grads[start + 1][2][2][1] = 0.;
317 grad_grads[start + 1][2][2][2] = -monovalk[0][0] * monovali[2][2];
319 grad_grads[start + 2][0][0][0] = -monovali[0][2] * monovalk[1][0];
320 grad_grads[start + 2][0][0][1] = -monovali[0][1] * monovalk[1][1];
321 grad_grads[start + 2][0][0][2] = 0.;
322 grad_grads[start + 2][0][1][0] = -monovali[0][1] * monovalk[1][1];
323 grad_grads[start + 2][0][1][1] = -monovali[0][0] * monovalk[1][2];
324 grad_grads[start + 2][0][1][2] = 0.;
325 grad_grads[start + 2][0][2][0] = 0.;
326 grad_grads[start + 2][0][2][1] = 0.;
327 grad_grads[start + 2][0][2][2] = 0.;
328 grad_grads[start + 2][1][0][0] = 0.;
329 grad_grads[start + 2][1][0][1] = 0.;
330 grad_grads[start + 2][1][0][2] = 0.;
331 grad_grads[start + 2][1][1][0] = 0.;
332 grad_grads[start + 2][1][1][1] = 0.;
333 grad_grads[start + 2][1][1][2] = 0.;
334 grad_grads[start + 2][1][2][0] = 0.;
335 grad_grads[start + 2][1][2][1] = 0.;
336 grad_grads[start + 2][1][2][2] = 0.;
337 grad_grads[start + 2][2][0][0] =
338 unit_point[2] * monovali[0][3] * monovalk[1][0];
339 grad_grads[start + 2][2][0][1] =
340 unit_point[2] * monovali[0][2] * monovalk[1][1];
341 grad_grads[start + 2][2][0][2] = monovali[0][2] * monovalk[1][0];
342 grad_grads[start + 2][2][1][0] =
343 unit_point[2] * monovali[0][2] * monovalk[1][1];
344 grad_grads[start + 2][2][1][1] =
345 unit_point[2] * monovali[0][1] * monovalk[1][2];
346 grad_grads[start + 2][2][1][2] = monovali[0][1] * monovalk[1][1];
347 grad_grads[start + 2][2][2][0] = monovali[0][2] * monovalk[1][0];
348 grad_grads[start + 2][2][2][1] = monovali[0][1] * monovalk[1][1];
349 grad_grads[start + 2][2][2][2] = 0.;