deal.II version GIT relicensing-6834-g5b78e6bcdf 2026-10-01 11:20:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
polynomials_rt_bubbles.cc
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2018 - 2025 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13
17
19
20#include <iomanip>
21#include <iostream>
22#include <memory>
23
25
26
27template <int dim>
29 : TensorPolynomialsBase<dim>(k, n_polynomials(k))
30 , raviart_thomas_space(k,
31 k - 1,
32 FE_RaviartThomas<dim>::get_lexicographic_numbering(k -
33 1))
34 , monomials(k + 2)
35{
36 Assert(dim >= 2, ExcImpossibleInDim(dim));
37
38 for (unsigned int i = 0; i < monomials.size(); ++i)
40}
41
42
43
44template <int dim>
45void
47 const Point<dim> &unit_point,
48 std::vector<Tensor<1, dim>> &values,
49 std::vector<Tensor<2, dim>> &grads,
50 std::vector<Tensor<3, dim>> &grad_grads,
51 std::vector<Tensor<4, dim>> &third_derivatives,
52 std::vector<Tensor<5, dim>> &fourth_derivatives) const
53{
54 Assert(values.size() == this->n() || values.empty(),
55 ExcDimensionMismatch(values.size(), this->n()));
56 Assert(grads.size() == this->n() || grads.empty(),
57 ExcDimensionMismatch(grads.size(), this->n()));
58 Assert(grad_grads.size() == this->n() || grad_grads.empty(),
59 ExcDimensionMismatch(grad_grads.size(), this->n()));
60 Assert(third_derivatives.size() == this->n() || third_derivatives.empty(),
61 ExcDimensionMismatch(third_derivatives.size(), this->n()));
62 Assert(fourth_derivatives.size() == this->n() || fourth_derivatives.empty(),
63 ExcDimensionMismatch(fourth_derivatives.size(), this->n()));
64
65 // Third and fourth derivatives are not implemented
66 (void)third_derivatives;
67 Assert(third_derivatives.empty(), ExcNotImplemented());
68 (void)fourth_derivatives;
69 Assert(fourth_derivatives.empty(), ExcNotImplemented());
70
71 const unsigned int n_sub = raviart_thomas_space.n();
72 const unsigned int my_degree = this->degree();
73
74 {
75 std::vector<Tensor<1, dim>> p_values(values.empty() ? 0 : n_sub);
76 std::vector<Tensor<2, dim>> p_grads(grads.empty() ? 0 : n_sub);
77 std::vector<Tensor<3, dim>> p_grad_grads(grad_grads.empty() ? 0 : n_sub);
78 std::vector<Tensor<4, dim>> p_third_derivatives;
79 std::vector<Tensor<5, dim>> p_fourth_derivatives;
80
81 // This is the Raviart-Thomas part of the space
82 raviart_thomas_space.evaluate(unit_point,
83 p_values,
84 p_grads,
85 p_grad_grads,
86 p_third_derivatives,
87 p_fourth_derivatives);
88 for (unsigned int i = 0; i < p_values.size(); ++i)
89 values[i] = p_values[i];
90 for (unsigned int i = 0; i < p_grads.size(); ++i)
91 grads[i] = p_grads[i];
92 for (unsigned int i = 0; i < p_grad_grads.size(); ++i)
93 grad_grads[i] = p_grad_grads[i];
94 }
95
96 // Next we compute the polynomials and derivatives
97 // of the curl part of the space
98 const unsigned int n_derivatives = 3;
99 double monoval_plus[dim][n_derivatives + 1];
100 double monoval_i[dim][n_derivatives + 1];
101
102
103 if constexpr (dim <= 1)
104 {
105 (void)monoval_plus;
106 (void)monoval_i;
107 }
108
109 unsigned int start = n_sub;
110 if constexpr (dim == 2)
111 {
112 // In 2d the curl part of the space is spanned by the vectors
113 // of two types. The first one is
114 // [ x^i * [y^(k+1)]' ]
115 // [ -[x^i]' * y^(k+1) ]
116 // The second one can be obtained from the first by a cyclic
117 // rotation of the coordinates.
118 // monoval_i = x^i,
119 // monoval_plus = x^(k+1)
120 for (unsigned int d = 0; d < dim; ++d)
121 monomials[my_degree + 1].value(unit_point[d],
122 n_derivatives,
123 monoval_plus[d]);
124
125 for (unsigned int i = 0; i <= my_degree; ++i, ++start)
126 {
127 for (unsigned int d = 0; d < dim; ++d)
128 monomials[i].value(unit_point[d], n_derivatives, monoval_i[d]);
129
130 if (values.size() != 0)
131 {
132 values[start][0] = monoval_i[0][0] * monoval_plus[1][1];
133 values[start][1] = -monoval_i[0][1] * monoval_plus[1][0];
134
135 values[start + my_degree + 1][0] =
136 -monoval_plus[0][0] * monoval_i[1][1];
137 values[start + my_degree + 1][1] =
138 monoval_plus[0][1] * monoval_i[1][0];
139 }
140
141 if (grads.size() != 0)
142 {
143 grads[start][0][0] = monoval_i[0][1] * monoval_plus[1][1];
144 grads[start][0][1] = monoval_i[0][0] * monoval_plus[1][2];
145 grads[start][1][0] = -monoval_i[0][2] * monoval_plus[1][0];
146 grads[start][1][1] = -monoval_i[0][1] * monoval_plus[1][1];
147
148 grads[start + my_degree + 1][0][0] =
149 -monoval_plus[0][1] * monoval_i[1][1];
150 grads[start + my_degree + 1][0][1] =
151 -monoval_plus[0][0] * monoval_i[1][2];
152 grads[start + my_degree + 1][1][0] =
153 monoval_plus[0][2] * monoval_i[1][0];
154 grads[start + my_degree + 1][1][1] =
155 monoval_plus[0][1] * monoval_i[1][1];
156 }
157
158 if (grad_grads.size() != 0)
159 {
160 grad_grads[start][0][0][0] = monoval_i[0][2] * monoval_plus[1][1];
161 grad_grads[start][0][0][1] = monoval_i[0][1] * monoval_plus[1][2];
162 grad_grads[start][0][1][0] = monoval_i[0][1] * monoval_plus[1][2];
163 grad_grads[start][0][1][1] = monoval_i[0][0] * monoval_plus[1][3];
164 grad_grads[start][1][0][0] =
165 -monoval_i[0][3] * monoval_plus[1][0];
166 grad_grads[start][1][0][1] =
167 -monoval_i[0][2] * monoval_plus[1][1];
168 grad_grads[start][1][1][0] =
169 -monoval_i[0][2] * monoval_plus[1][1];
170 grad_grads[start][1][1][1] =
171 -monoval_i[0][1] * monoval_plus[1][2];
172
173 grad_grads[start + my_degree + 1][0][0][0] =
174 -monoval_plus[0][2] * monoval_i[1][1];
175 grad_grads[start + my_degree + 1][0][0][1] =
176 -monoval_plus[0][1] * monoval_i[1][2];
177 grad_grads[start + my_degree + 1][0][1][0] =
178 -monoval_plus[0][1] * monoval_i[1][2];
179 grad_grads[start + my_degree + 1][0][1][1] =
180 -monoval_plus[0][0] * monoval_i[1][3];
181 grad_grads[start + my_degree + 1][1][0][0] =
182 monoval_plus[0][3] * monoval_i[1][0];
183 grad_grads[start + my_degree + 1][1][0][1] =
184 monoval_plus[0][2] * monoval_i[1][1];
185 grad_grads[start + my_degree + 1][1][1][0] =
186 monoval_plus[0][2] * monoval_i[1][1];
187 grad_grads[start + my_degree + 1][1][1][1] =
188 monoval_plus[0][1] * monoval_i[1][2];
189 }
190 }
191 Assert(start == this->n() - my_degree - 1, ExcInternalError());
192 }
193 else if constexpr (dim == 3)
194 {
195 double monoval[dim][n_derivatives + 1];
196 double monoval_j[dim][n_derivatives + 1];
197 double monoval_jplus[dim][n_derivatives + 1];
198
199 // In 3d the first type of basis vector is
200 // [ x^i * y^j * z^k * (j+k+2) ]
201 // [ -[x^i]' * y^(j+1) * z^k ]
202 // [ -[x^i]' * y^j * z^(k+1) ],
203 // For the second type of basis vector y and z
204 // are swapped. Then for each of these,
205 // two more are obtained by the cyclic rotation
206 // of the coordinates.
207 // monoval = x^k, monoval_plus = x^(k+1)
208 // monoval_* = x^*, monoval_jplus = x^(j+1)
209 for (unsigned int d = 0; d < dim; ++d)
210 {
211 monomials[my_degree + 1].value(unit_point[d],
212 n_derivatives,
213 monoval_plus[d]);
214 monomials[my_degree].value(unit_point[d], n_derivatives, monoval[d]);
215 }
216
217 const unsigned int n_curls = (my_degree + 1) * (2 * my_degree + 1);
218 // Span of @f$\tilde{B}@f$
219 for (unsigned int i = 0; i <= my_degree; ++i)
220 {
221 for (unsigned int d = 0; d < dim; ++d)
222 monomials[i].value(unit_point[d], n_derivatives, monoval_i[d]);
223
224 for (unsigned int j = 0; j <= my_degree; ++j)
225 {
226 for (unsigned int d = 0; d < dim; ++d)
227 {
228 monomials[j].value(unit_point[d],
229 n_derivatives,
230 monoval_j[d]);
231 monomials[j + 1].value(unit_point[d],
232 n_derivatives,
233 monoval_jplus[d]);
234 }
235
236 if (values.size() != 0)
237 {
238 values[start][0] = monoval_i[0][0] * monoval_j[1][0] *
239 monoval[2][0] *
240 static_cast<double>(j + my_degree + 2);
241 values[start][1] =
242 -monoval_i[0][1] * monoval_jplus[1][0] * monoval[2][0];
243 values[start][2] =
244 -monoval_i[0][1] * monoval_j[1][0] * monoval_plus[2][0];
245
246 values[start + n_curls][0] =
247 -monoval_jplus[0][0] * monoval_i[1][1] * monoval[2][0];
248 values[start + n_curls][1] =
249 monoval_j[0][0] * monoval_i[1][0] * monoval[2][0] *
250 static_cast<double>(j + my_degree + 2);
251 values[start + n_curls][2] =
252 -monoval_j[0][0] * monoval_i[1][1] * monoval_plus[2][0];
253
254 values[start + 2 * n_curls][0] =
255 -monoval_jplus[0][0] * monoval[1][0] * monoval_i[2][1];
256 values[start + 2 * n_curls][1] =
257 -monoval_j[0][0] * monoval_plus[1][0] * monoval_i[2][1];
258 values[start + 2 * n_curls][2] =
259 monoval_j[0][0] * monoval[1][0] * monoval_i[2][0] *
260 static_cast<double>(j + my_degree + 2);
261
262 // Only unique triples of powers (i j k)
263 // and (i k j) are allowed, 0 <= i,j <= k
264 if (j != my_degree)
265 {
266 values[start + 1][0] =
267 monoval_i[0][0] * monoval[1][0] * monoval_j[2][0] *
268 static_cast<double>(j + my_degree + 2);
269 values[start + 1][1] =
270 -monoval_i[0][1] * monoval_plus[1][0] * monoval_j[2][0];
271 values[start + 1][2] =
272 -monoval_i[0][1] * monoval[1][0] * monoval_jplus[2][0];
273
274 values[start + n_curls + 1][0] =
275 -monoval_plus[0][0] * monoval_i[1][1] * monoval_j[2][0];
276 values[start + n_curls + 1][1] =
277 monoval[0][0] * monoval_i[1][0] * monoval_j[2][0] *
278 static_cast<double>(j + my_degree + 2);
279 values[start + n_curls + 1][2] =
280 -monoval[0][0] * monoval_i[1][1] * monoval_jplus[2][0];
281
282 values[start + 2 * n_curls + 1][0] =
283 -monoval_plus[0][0] * monoval_j[1][0] * monoval_i[2][1];
284 values[start + 2 * n_curls + 1][1] =
285 -monoval[0][0] * monoval_jplus[1][0] * monoval_i[2][1];
286 values[start + 2 * n_curls + 1][2] =
287 monoval[0][0] * monoval_j[1][0] * monoval_i[2][0] *
288 static_cast<double>(j + my_degree + 2);
289 }
290 }
291
292 if (grads.size() != 0)
293 {
294 grads[start][0][0] = monoval_i[0][1] * monoval_j[1][0] *
295 monoval[2][0] *
296 static_cast<double>(j + my_degree + 2);
297 grads[start][0][1] = monoval_i[0][0] * monoval_j[1][1] *
298 monoval[2][0] *
299 static_cast<double>(j + my_degree + 2);
300 grads[start][0][2] = monoval_i[0][0] * monoval_j[1][0] *
301 monoval[2][1] *
302 static_cast<double>(j + my_degree + 2);
303 grads[start][1][0] =
304 -monoval_i[0][2] * monoval_jplus[1][0] * monoval[2][0];
305 grads[start][1][1] =
306 -monoval_i[0][1] * monoval_jplus[1][1] * monoval[2][0];
307 grads[start][1][2] =
308 -monoval_i[0][1] * monoval_jplus[1][0] * monoval[2][1];
309 grads[start][2][0] =
310 -monoval_i[0][2] * monoval_j[1][0] * monoval_plus[2][0];
311 grads[start][2][1] =
312 -monoval_i[0][1] * monoval_j[1][1] * monoval_plus[2][0];
313 grads[start][2][2] =
314 -monoval_i[0][1] * monoval_j[1][0] * monoval_plus[2][1];
315
316 grads[start + n_curls][0][0] =
317 -monoval_jplus[0][1] * monoval_i[1][1] * monoval[2][0];
318 grads[start + n_curls][0][1] =
319 -monoval_jplus[0][0] * monoval_i[1][2] * monoval[2][0];
320 grads[start + n_curls][0][2] =
321 -monoval_jplus[0][0] * monoval_i[1][1] * monoval[2][1];
322 grads[start + n_curls][1][0] =
323 monoval_j[0][1] * monoval_i[1][0] * monoval[2][0] *
324 static_cast<double>(j + my_degree + 2);
325 grads[start + n_curls][1][1] =
326 monoval_j[0][0] * monoval_i[1][1] * monoval[2][0] *
327 static_cast<double>(j + my_degree + 2);
328 grads[start + n_curls][1][2] =
329 monoval_j[0][0] * monoval_i[1][0] * monoval[2][1] *
330 static_cast<double>(j + my_degree + 2);
331 grads[start + n_curls][2][0] =
332 -monoval_j[0][1] * monoval_i[1][1] * monoval_plus[2][0];
333 grads[start + n_curls][2][1] =
334 -monoval_j[0][0] * monoval_i[1][2] * monoval_plus[2][0];
335 grads[start + n_curls][2][2] =
336 -monoval_j[0][0] * monoval_i[1][1] * monoval_plus[2][1];
337
338 grads[start + 2 * n_curls][0][0] =
339 -monoval_jplus[0][1] * monoval[1][0] * monoval_i[2][1];
340 grads[start + 2 * n_curls][0][1] =
341 -monoval_jplus[0][0] * monoval[1][1] * monoval_i[2][1];
342 grads[start + 2 * n_curls][0][2] =
343 -monoval_jplus[0][0] * monoval[1][0] * monoval_i[2][2];
344 grads[start + 2 * n_curls][1][0] =
345 -monoval_j[0][1] * monoval_plus[1][0] * monoval_i[2][1];
346 grads[start + 2 * n_curls][1][1] =
347 -monoval_j[0][0] * monoval_plus[1][1] * monoval_i[2][1];
348 grads[start + 2 * n_curls][1][2] =
349 -monoval_j[0][0] * monoval_plus[1][0] * monoval_i[2][2];
350 grads[start + 2 * n_curls][2][0] =
351 monoval_j[0][1] * monoval[1][0] * monoval_i[2][0] *
352 static_cast<double>(j + my_degree + 2);
353 grads[start + 2 * n_curls][2][1] =
354 monoval_j[0][0] * monoval[1][1] * monoval_i[2][0] *
355 static_cast<double>(j + my_degree + 2);
356 grads[start + 2 * n_curls][2][2] =
357 monoval_j[0][0] * monoval[1][0] * monoval_i[2][1] *
358 static_cast<double>(j + my_degree + 2);
359
360 if (j != my_degree)
361 {
362 grads[start + 1][0][0] =
363 monoval_i[0][1] * monoval[1][0] * monoval_j[2][0] *
364 static_cast<double>(j + my_degree + 2);
365 grads[start + 1][0][1] =
366 monoval_i[0][0] * monoval[1][1] * monoval_j[2][0] *
367 static_cast<double>(j + my_degree + 2);
368 grads[start + 1][0][2] =
369 monoval_i[0][0] * monoval[1][0] * monoval_j[2][1] *
370 static_cast<double>(j + my_degree + 2);
371 grads[start + 1][1][0] =
372 -monoval_i[0][2] * monoval_plus[1][0] * monoval_j[2][0];
373 grads[start + 1][1][1] =
374 -monoval_i[0][1] * monoval_plus[1][1] * monoval_j[2][0];
375 grads[start + 1][1][2] =
376 -monoval_i[0][1] * monoval_plus[1][0] * monoval_j[2][1];
377 grads[start + 1][2][0] =
378 -monoval_i[0][2] * monoval[1][0] * monoval_jplus[2][0];
379 grads[start + 1][2][1] =
380 -monoval_i[0][1] * monoval[1][1] * monoval_jplus[2][0];
381 grads[start + 1][2][2] =
382 -monoval_i[0][1] * monoval[1][0] * monoval_jplus[2][1];
383
384 grads[start + n_curls + 1][0][0] =
385 -monoval_plus[0][1] * monoval_i[1][1] * monoval_j[2][0];
386 grads[start + n_curls + 1][0][1] =
387 -monoval_plus[0][0] * monoval_i[1][2] * monoval_j[2][0];
388 grads[start + n_curls + 1][0][2] =
389 -monoval_plus[0][0] * monoval_i[1][1] * monoval_j[2][1];
390 grads[start + n_curls + 1][1][0] =
391 monoval[0][1] * monoval_i[1][0] * monoval_j[2][0] *
392 static_cast<double>(j + my_degree + 2);
393 grads[start + n_curls + 1][1][1] =
394 monoval[0][0] * monoval_i[1][1] * monoval_j[2][0] *
395 static_cast<double>(j + my_degree + 2);
396 grads[start + n_curls + 1][1][2] =
397 monoval[0][0] * monoval_i[1][0] * monoval_j[2][1] *
398 static_cast<double>(j + my_degree + 2);
399 grads[start + n_curls + 1][2][0] =
400 -monoval[0][1] * monoval_i[1][1] * monoval_jplus[2][0];
401 grads[start + n_curls + 1][2][1] =
402 -monoval[0][0] * monoval_i[1][2] * monoval_jplus[2][0];
403 grads[start + n_curls + 1][2][2] =
404 -monoval[0][0] * monoval_i[1][1] * monoval_jplus[2][1];
405
406 grads[start + 2 * n_curls + 1][0][0] =
407 -monoval_plus[0][1] * monoval_j[1][0] * monoval_i[2][1];
408 grads[start + 2 * n_curls + 1][0][1] =
409 -monoval_plus[0][0] * monoval_j[1][1] * monoval_i[2][1];
410 grads[start + 2 * n_curls + 1][0][2] =
411 -monoval_plus[0][0] * monoval_j[1][0] * monoval_i[2][2];
412 grads[start + 2 * n_curls + 1][1][0] =
413 -monoval[0][1] * monoval_jplus[1][0] * monoval_i[2][1];
414 grads[start + 2 * n_curls + 1][1][1] =
415 -monoval[0][0] * monoval_jplus[1][1] * monoval_i[2][1];
416 grads[start + 2 * n_curls + 1][1][2] =
417 -monoval[0][0] * monoval_jplus[1][0] * monoval_i[2][2];
418 grads[start + 2 * n_curls + 1][2][0] =
419 monoval[0][1] * monoval_j[1][0] * monoval_i[2][0] *
420 static_cast<double>(j + my_degree + 2);
421 grads[start + 2 * n_curls + 1][2][1] =
422 monoval[0][0] * monoval_j[1][1] * monoval_i[2][0] *
423 static_cast<double>(j + my_degree + 2);
424 grads[start + 2 * n_curls + 1][2][2] =
425 monoval[0][0] * monoval_j[1][0] * monoval_i[2][1] *
426 static_cast<double>(j + my_degree + 2);
427 }
428 }
429
430 if (grad_grads.size() != 0)
431 {
432 grad_grads[start][0][0][0] =
433 monoval_i[0][2] * monoval_j[1][0] * monoval[2][0] *
434 static_cast<double>(j + my_degree + 2);
435 grad_grads[start][0][0][1] =
436 monoval_i[0][1] * monoval_j[1][1] * monoval[2][0] *
437 static_cast<double>(j + my_degree + 2);
438 grad_grads[start][0][0][2] =
439 monoval_i[0][1] * monoval_j[1][0] * monoval[2][1] *
440 static_cast<double>(j + my_degree + 2);
441 grad_grads[start][0][1][0] =
442 monoval_i[0][1] * monoval_j[1][1] * monoval[2][0] *
443 static_cast<double>(j + my_degree + 2);
444 grad_grads[start][0][1][1] =
445 monoval_i[0][0] * monoval_j[1][2] * monoval[2][0] *
446 static_cast<double>(j + my_degree + 2);
447 grad_grads[start][0][1][2] =
448 monoval_i[0][0] * monoval_j[1][1] * monoval[2][1] *
449 static_cast<double>(j + my_degree + 2);
450 grad_grads[start][0][2][0] =
451 monoval_i[0][1] * monoval_j[1][0] * monoval[2][1] *
452 static_cast<double>(j + my_degree + 2);
453 grad_grads[start][0][2][1] =
454 monoval_i[0][0] * monoval_j[1][1] * monoval[2][1] *
455 static_cast<double>(j + my_degree + 2);
456 grad_grads[start][0][2][2] =
457 monoval_i[0][0] * monoval_j[1][0] * monoval[2][2] *
458 static_cast<double>(j + my_degree + 2);
459 grad_grads[start][1][0][0] =
460 -monoval_i[0][3] * monoval_jplus[1][0] * monoval[2][0];
461 grad_grads[start][1][0][1] =
462 -monoval_i[0][2] * monoval_jplus[1][1] * monoval[2][0];
463 grad_grads[start][1][0][2] =
464 -monoval_i[0][2] * monoval_jplus[1][0] * monoval[2][1];
465 grad_grads[start][1][1][0] =
466 -monoval_i[0][2] * monoval_jplus[1][1] * monoval[2][0];
467 grad_grads[start][1][1][1] =
468 -monoval_i[0][1] * monoval_jplus[1][2] * monoval[2][0];
469 grad_grads[start][1][1][2] =
470 -monoval_i[0][1] * monoval_jplus[1][1] * monoval[2][1];
471 grad_grads[start][1][2][0] =
472 -monoval_i[0][2] * monoval_jplus[1][0] * monoval[2][1];
473 grad_grads[start][1][2][1] =
474 -monoval_i[0][1] * monoval_jplus[1][1] * monoval[2][1];
475 grad_grads[start][1][2][2] =
476 -monoval_i[0][1] * monoval_jplus[1][0] * monoval[2][2];
477 grad_grads[start][2][0][0] =
478 -monoval_i[0][3] * monoval_j[1][0] * monoval_plus[2][0];
479 grad_grads[start][2][0][1] =
480 -monoval_i[0][2] * monoval_j[1][1] * monoval_plus[2][0];
481 grad_grads[start][2][0][2] =
482 -monoval_i[0][2] * monoval_j[1][0] * monoval_plus[2][1];
483 grad_grads[start][2][1][0] =
484 -monoval_i[0][2] * monoval_j[1][1] * monoval_plus[2][0];
485 grad_grads[start][2][1][1] =
486 -monoval_i[0][1] * monoval_j[1][2] * monoval_plus[2][0];
487 grad_grads[start][2][1][2] =
488 -monoval_i[0][1] * monoval_j[1][1] * monoval_plus[2][1];
489 grad_grads[start][2][2][0] =
490 -monoval_i[0][2] * monoval_j[1][0] * monoval_plus[2][1];
491 grad_grads[start][2][2][1] =
492 -monoval_i[0][1] * monoval_j[1][1] * monoval_plus[2][1];
493 grad_grads[start][2][2][2] =
494 -monoval_i[0][1] * monoval_j[1][0] * monoval_plus[2][2];
495
496 grad_grads[start + n_curls][0][0][0] =
497 -monoval_jplus[0][2] * monoval_i[1][1] * monoval[2][0];
498 grad_grads[start + n_curls][0][0][1] =
499 -monoval_jplus[0][1] * monoval_i[1][2] * monoval[2][0];
500 grad_grads[start + n_curls][0][0][2] =
501 -monoval_jplus[0][1] * monoval_i[1][1] * monoval[2][1];
502 grad_grads[start + n_curls][0][1][0] =
503 -monoval_jplus[0][1] * monoval_i[1][2] * monoval[2][0];
504 grad_grads[start + n_curls][0][1][1] =
505 -monoval_jplus[0][0] * monoval_i[1][3] * monoval[2][0];
506 grad_grads[start + n_curls][0][1][2] =
507 -monoval_jplus[0][0] * monoval_i[1][2] * monoval[2][1];
508 grad_grads[start + n_curls][0][2][0] =
509 -monoval_jplus[0][1] * monoval_i[1][1] * monoval[2][1];
510 grad_grads[start + n_curls][0][2][1] =
511 -monoval_jplus[0][0] * monoval_i[1][2] * monoval[2][1];
512 grad_grads[start + n_curls][0][2][2] =
513 -monoval_jplus[0][0] * monoval_i[1][1] * monoval[2][2];
514 grad_grads[start + n_curls][1][0][0] =
515 monoval_j[0][2] * monoval_i[1][0] * monoval[2][0] *
516 static_cast<double>(j + my_degree + 2);
517 grad_grads[start + n_curls][1][0][1] =
518 monoval_j[0][1] * monoval_i[1][1] * monoval[2][0] *
519 static_cast<double>(j + my_degree + 2);
520 grad_grads[start + n_curls][1][0][2] =
521 monoval_j[0][1] * monoval_i[1][0] * monoval[2][1] *
522 static_cast<double>(j + my_degree + 2);
523 grad_grads[start + n_curls][1][1][0] =
524 monoval_j[0][1] * monoval_i[1][1] * monoval[2][0] *
525 static_cast<double>(j + my_degree + 2);
526 grad_grads[start + n_curls][1][1][1] =
527 monoval_j[0][0] * monoval_i[1][2] * monoval[2][0] *
528 static_cast<double>(j + my_degree + 2);
529 grad_grads[start + n_curls][1][1][2] =
530 monoval_j[0][0] * monoval_i[1][1] * monoval[2][1] *
531 static_cast<double>(j + my_degree + 2);
532 grad_grads[start + n_curls][1][2][0] =
533 monoval_j[0][1] * monoval_i[1][0] * monoval[2][1] *
534 static_cast<double>(j + my_degree + 2);
535 grad_grads[start + n_curls][1][2][1] =
536 monoval_j[0][0] * monoval_i[1][1] * monoval[2][1] *
537 static_cast<double>(j + my_degree + 2);
538 grad_grads[start + n_curls][1][2][2] =
539 monoval_j[0][0] * monoval_i[1][0] * monoval[2][2] *
540 static_cast<double>(j + my_degree + 2);
541 grad_grads[start + n_curls][2][0][0] =
542 -monoval_j[0][2] * monoval_i[1][1] * monoval_plus[2][0];
543 grad_grads[start + n_curls][2][0][1] =
544 -monoval_j[0][1] * monoval_i[1][2] * monoval_plus[2][0];
545 grad_grads[start + n_curls][2][0][2] =
546 -monoval_j[0][1] * monoval_i[1][1] * monoval_plus[2][1];
547 grad_grads[start + n_curls][2][1][0] =
548 -monoval_j[0][1] * monoval_i[1][2] * monoval_plus[2][0];
549 grad_grads[start + n_curls][2][1][1] =
550 -monoval_j[0][0] * monoval_i[1][3] * monoval_plus[2][0];
551 grad_grads[start + n_curls][2][1][2] =
552 -monoval_j[0][0] * monoval_i[1][2] * monoval_plus[2][1];
553 grad_grads[start + n_curls][2][2][0] =
554 -monoval_j[0][1] * monoval_i[1][1] * monoval_plus[2][1];
555 grad_grads[start + n_curls][2][2][1] =
556 -monoval_j[0][0] * monoval_i[1][2] * monoval_plus[2][1];
557 grad_grads[start + n_curls][2][2][2] =
558 -monoval_j[0][0] * monoval_i[1][1] * monoval_plus[2][2];
559
560 grad_grads[start + 2 * n_curls][0][0][0] =
561 -monoval_jplus[0][2] * monoval[1][0] * monoval_i[2][1];
562 grad_grads[start + 2 * n_curls][0][0][1] =
563 -monoval_jplus[0][1] * monoval[1][1] * monoval_i[2][1];
564 grad_grads[start + 2 * n_curls][0][0][2] =
565 -monoval_jplus[0][1] * monoval[1][0] * monoval_i[2][2];
566 grad_grads[start + 2 * n_curls][0][1][0] =
567 -monoval_jplus[0][1] * monoval[1][1] * monoval_i[2][1];
568 grad_grads[start + 2 * n_curls][0][1][1] =
569 -monoval_jplus[0][0] * monoval[1][2] * monoval_i[2][1];
570 grad_grads[start + 2 * n_curls][0][1][2] =
571 -monoval_jplus[0][0] * monoval[1][1] * monoval_i[2][2];
572 grad_grads[start + 2 * n_curls][0][2][0] =
573 -monoval_jplus[0][1] * monoval[1][0] * monoval_i[2][2];
574 grad_grads[start + 2 * n_curls][0][2][1] =
575 -monoval_jplus[0][0] * monoval[1][1] * monoval_i[2][2];
576 grad_grads[start + 2 * n_curls][0][2][2] =
577 -monoval_jplus[0][0] * monoval[1][0] * monoval_i[2][3];
578 grad_grads[start + 2 * n_curls][1][0][0] =
579 -monoval_j[0][2] * monoval_plus[1][0] * monoval_i[2][1];
580 grad_grads[start + 2 * n_curls][1][0][1] =
581 -monoval_j[0][1] * monoval_plus[1][1] * monoval_i[2][1];
582 grad_grads[start + 2 * n_curls][1][0][2] =
583 -monoval_j[0][1] * monoval_plus[1][0] * monoval_i[2][2];
584 grad_grads[start + 2 * n_curls][1][1][0] =
585 -monoval_j[0][1] * monoval_plus[1][1] * monoval_i[2][1];
586 grad_grads[start + 2 * n_curls][1][1][1] =
587 -monoval_j[0][0] * monoval_plus[1][2] * monoval_i[2][1];
588 grad_grads[start + 2 * n_curls][1][1][2] =
589 -monoval_j[0][0] * monoval_plus[1][1] * monoval_i[2][2];
590 grad_grads[start + 2 * n_curls][1][2][0] =
591 -monoval_j[0][1] * monoval_plus[1][0] * monoval_i[2][2];
592 grad_grads[start + 2 * n_curls][1][2][1] =
593 -monoval_j[0][0] * monoval_plus[1][1] * monoval_i[2][2];
594 grad_grads[start + 2 * n_curls][1][2][2] =
595 -monoval_j[0][0] * monoval_plus[1][0] * monoval_i[2][3];
596 grad_grads[start + 2 * n_curls][2][0][0] =
597 monoval_j[0][2] * monoval[1][0] * monoval_i[2][0] *
598 static_cast<double>(j + my_degree + 2);
599 grad_grads[start + 2 * n_curls][2][0][1] =
600 monoval_j[0][1] * monoval[1][1] * monoval_i[2][0] *
601 static_cast<double>(j + my_degree + 2);
602 grad_grads[start + 2 * n_curls][2][0][2] =
603 monoval_j[0][1] * monoval[1][0] * monoval_i[2][1] *
604 static_cast<double>(j + my_degree + 2);
605 grad_grads[start + 2 * n_curls][2][1][0] =
606 monoval_j[0][1] * monoval[1][1] * monoval_i[2][0] *
607 static_cast<double>(j + my_degree + 2);
608 grad_grads[start + 2 * n_curls][2][1][1] =
609 monoval_j[0][0] * monoval[1][2] * monoval_i[2][0] *
610 static_cast<double>(j + my_degree + 2);
611 grad_grads[start + 2 * n_curls][2][1][2] =
612 monoval_j[0][0] * monoval[1][1] * monoval_i[2][1] *
613 static_cast<double>(j + my_degree + 2);
614 grad_grads[start + 2 * n_curls][2][2][0] =
615 monoval_j[0][1] * monoval[1][0] * monoval_i[2][1] *
616 static_cast<double>(j + my_degree + 2);
617 grad_grads[start + 2 * n_curls][2][2][1] =
618 monoval_j[0][0] * monoval[1][1] * monoval_i[2][1] *
619 static_cast<double>(j + my_degree + 2);
620 grad_grads[start + 2 * n_curls][2][2][2] =
621 monoval_j[0][0] * monoval[1][0] * monoval_i[2][2] *
622 static_cast<double>(j + my_degree + 2);
623
624 if (j != my_degree)
625 {
626 grad_grads[start + 1][0][0][0] =
627 monoval_i[0][2] * monoval[1][0] * monoval_j[2][0] *
628 static_cast<double>(j + my_degree + 2);
629 grad_grads[start + 1][0][0][1] =
630 monoval_i[0][1] * monoval[1][1] * monoval_j[2][0] *
631 static_cast<double>(j + my_degree + 2);
632 grad_grads[start + 1][0][0][2] =
633 monoval_i[0][1] * monoval[1][0] * monoval_j[2][1] *
634 static_cast<double>(j + my_degree + 2);
635 grad_grads[start + 1][0][1][0] =
636 monoval_i[0][1] * monoval[1][1] * monoval_j[2][0] *
637 static_cast<double>(j + my_degree + 2);
638 grad_grads[start + 1][0][1][1] =
639 monoval_i[0][0] * monoval[1][2] * monoval_j[2][0] *
640 static_cast<double>(j + my_degree + 2);
641 grad_grads[start + 1][0][1][2] =
642 monoval_i[0][0] * monoval[1][1] * monoval_j[2][1] *
643 static_cast<double>(j + my_degree + 2);
644 grad_grads[start + 1][0][2][0] =
645 monoval_i[0][1] * monoval[1][0] * monoval_j[2][1] *
646 static_cast<double>(j + my_degree + 2);
647 grad_grads[start + 1][0][2][1] =
648 monoval_i[0][0] * monoval[1][1] * monoval_j[2][1] *
649 static_cast<double>(j + my_degree + 2);
650 grad_grads[start + 1][0][2][2] =
651 monoval_i[0][0] * monoval[1][0] * monoval_j[2][2] *
652 static_cast<double>(j + my_degree + 2);
653 grad_grads[start + 1][1][0][0] =
654 -monoval_i[0][3] * monoval_plus[1][0] * monoval_j[2][0];
655 grad_grads[start + 1][1][0][1] =
656 -monoval_i[0][2] * monoval_plus[1][1] * monoval_j[2][0];
657 grad_grads[start + 1][1][0][2] =
658 -monoval_i[0][2] * monoval_plus[1][0] * monoval_j[2][1];
659 grad_grads[start + 1][1][1][0] =
660 -monoval_i[0][2] * monoval_plus[1][1] * monoval_j[2][0];
661 grad_grads[start + 1][1][1][1] =
662 -monoval_i[0][1] * monoval_plus[1][2] * monoval_j[2][0];
663 grad_grads[start + 1][1][1][2] =
664 -monoval_i[0][1] * monoval_plus[1][1] * monoval_j[2][1];
665 grad_grads[start + 1][1][2][0] =
666 -monoval_i[0][2] * monoval_plus[1][0] * monoval_j[2][1];
667 grad_grads[start + 1][1][2][1] =
668 -monoval_i[0][1] * monoval_plus[1][1] * monoval_j[2][1];
669 grad_grads[start + 1][1][2][2] =
670 -monoval_i[0][1] * monoval_plus[1][0] * monoval_j[2][2];
671 grad_grads[start + 1][2][0][0] =
672 -monoval_i[0][3] * monoval[1][0] * monoval_jplus[2][0];
673 grad_grads[start + 1][2][0][1] =
674 -monoval_i[0][2] * monoval[1][1] * monoval_jplus[2][0];
675 grad_grads[start + 1][2][0][2] =
676 -monoval_i[0][2] * monoval[1][0] * monoval_jplus[2][1];
677 grad_grads[start + 1][2][1][0] =
678 -monoval_i[0][2] * monoval[1][1] * monoval_jplus[2][0];
679 grad_grads[start + 1][2][1][1] =
680 -monoval_i[0][1] * monoval[1][2] * monoval_jplus[2][0];
681 grad_grads[start + 1][2][1][2] =
682 -monoval_i[0][1] * monoval[1][1] * monoval_jplus[2][1];
683 grad_grads[start + 1][2][2][0] =
684 -monoval_i[0][2] * monoval[1][0] * monoval_jplus[2][1];
685 grad_grads[start + 1][2][2][1] =
686 -monoval_i[0][1] * monoval[1][1] * monoval_jplus[2][1];
687 grad_grads[start + 1][2][2][2] =
688 -monoval_i[0][1] * monoval[1][0] * monoval_jplus[2][2];
689
690 grad_grads[start + n_curls + 1][0][0][0] =
691 -monoval_plus[0][2] * monoval_i[1][1] * monoval_j[2][0];
692 grad_grads[start + n_curls + 1][0][0][1] =
693 -monoval_plus[0][1] * monoval_i[1][2] * monoval_j[2][0];
694 grad_grads[start + n_curls + 1][0][0][2] =
695 -monoval_plus[0][1] * monoval_i[1][1] * monoval_j[2][1];
696 grad_grads[start + n_curls + 1][0][1][0] =
697 -monoval_plus[0][1] * monoval_i[1][2] * monoval_j[2][0];
698 grad_grads[start + n_curls + 1][0][1][1] =
699 -monoval_plus[0][0] * monoval_i[1][3] * monoval_j[2][0];
700 grad_grads[start + n_curls + 1][0][1][2] =
701 -monoval_plus[0][0] * monoval_i[1][2] * monoval_j[2][1];
702 grad_grads[start + n_curls + 1][0][2][0] =
703 -monoval_plus[0][1] * monoval_i[1][1] * monoval_j[2][1];
704 grad_grads[start + n_curls + 1][0][2][1] =
705 -monoval_plus[0][0] * monoval_i[1][2] * monoval_j[2][1];
706 grad_grads[start + n_curls + 1][0][2][2] =
707 -monoval_plus[0][0] * monoval_i[1][1] * monoval_j[2][2];
708 grad_grads[start + n_curls + 1][1][0][0] =
709 monoval[0][2] * monoval_i[1][0] * monoval_j[2][0] *
710 static_cast<double>(j + my_degree + 2);
711 grad_grads[start + n_curls + 1][1][0][1] =
712 monoval[0][1] * monoval_i[1][1] * monoval_j[2][0] *
713 static_cast<double>(j + my_degree + 2);
714 grad_grads[start + n_curls + 1][1][0][2] =
715 monoval[0][1] * monoval_i[1][0] * monoval_j[2][1] *
716 static_cast<double>(j + my_degree + 2);
717 grad_grads[start + n_curls + 1][1][1][0] =
718 monoval[0][1] * monoval_i[1][1] * monoval_j[2][0] *
719 static_cast<double>(j + my_degree + 2);
720 grad_grads[start + n_curls + 1][1][1][1] =
721 monoval[0][0] * monoval_i[1][2] * monoval_j[2][0] *
722 static_cast<double>(j + my_degree + 2);
723 grad_grads[start + n_curls + 1][1][1][2] =
724 monoval[0][0] * monoval_i[1][1] * monoval_j[2][1] *
725 static_cast<double>(j + my_degree + 2);
726 grad_grads[start + n_curls + 1][1][2][0] =
727 monoval[0][1] * monoval_i[1][0] * monoval_j[2][1] *
728 static_cast<double>(j + my_degree + 2);
729 grad_grads[start + n_curls + 1][1][2][1] =
730 monoval[0][0] * monoval_i[1][1] * monoval_j[2][1] *
731 static_cast<double>(j + my_degree + 2);
732 grad_grads[start + n_curls + 1][1][2][2] =
733 monoval[0][0] * monoval_i[1][0] * monoval_j[2][2] *
734 static_cast<double>(j + my_degree + 2);
735 grad_grads[start + n_curls + 1][2][0][0] =
736 -monoval[0][2] * monoval_i[1][1] * monoval_jplus[2][0];
737 grad_grads[start + n_curls + 1][2][0][1] =
738 -monoval[0][1] * monoval_i[1][2] * monoval_jplus[2][0];
739 grad_grads[start + n_curls + 1][2][0][2] =
740 -monoval[0][1] * monoval_i[1][1] * monoval_jplus[2][1];
741 grad_grads[start + n_curls + 1][2][1][0] =
742 -monoval[0][1] * monoval_i[1][2] * monoval_jplus[2][0];
743 grad_grads[start + n_curls + 1][2][1][1] =
744 -monoval[0][0] * monoval_i[1][3] * monoval_jplus[2][0];
745 grad_grads[start + n_curls + 1][2][1][2] =
746 -monoval[0][0] * monoval_i[1][2] * monoval_jplus[2][1];
747 grad_grads[start + n_curls + 1][2][2][0] =
748 -monoval[0][1] * monoval_i[1][1] * monoval_jplus[2][1];
749 grad_grads[start + n_curls + 1][2][2][1] =
750 -monoval[0][0] * monoval_i[1][2] * monoval_jplus[2][1];
751 grad_grads[start + n_curls + 1][2][2][2] =
752 -monoval[0][0] * monoval_i[1][1] * monoval_jplus[2][2];
753
754 grad_grads[start + 2 * n_curls + 1][0][0][0] =
755 -monoval_plus[0][2] * monoval_j[1][0] * monoval_i[2][1];
756 grad_grads[start + 2 * n_curls + 1][0][0][1] =
757 -monoval_plus[0][1] * monoval_j[1][1] * monoval_i[2][1];
758 grad_grads[start + 2 * n_curls + 1][0][0][2] =
759 -monoval_plus[0][1] * monoval_j[1][0] * monoval_i[2][2];
760 grad_grads[start + 2 * n_curls + 1][0][1][0] =
761 -monoval_plus[0][1] * monoval_j[1][1] * monoval_i[2][1];
762 grad_grads[start + 2 * n_curls + 1][0][1][1] =
763 -monoval_plus[0][0] * monoval_j[1][2] * monoval_i[2][1];
764 grad_grads[start + 2 * n_curls + 1][0][1][2] =
765 -monoval_plus[0][0] * monoval_j[1][1] * monoval_i[2][2];
766 grad_grads[start + 2 * n_curls + 1][0][2][0] =
767 -monoval_plus[0][1] * monoval_j[1][0] * monoval_i[2][2];
768 grad_grads[start + 2 * n_curls + 1][0][2][1] =
769 -monoval_plus[0][0] * monoval_j[1][1] * monoval_i[2][2];
770 grad_grads[start + 2 * n_curls + 1][0][2][2] =
771 -monoval_plus[0][0] * monoval_j[1][0] * monoval_i[2][3];
772 grad_grads[start + 2 * n_curls + 1][1][0][0] =
773 -monoval[0][2] * monoval_jplus[1][0] * monoval_i[2][1];
774 grad_grads[start + 2 * n_curls + 1][1][0][1] =
775 -monoval[0][1] * monoval_jplus[1][1] * monoval_i[2][1];
776 grad_grads[start + 2 * n_curls + 1][1][0][2] =
777 -monoval[0][1] * monoval_jplus[1][0] * monoval_i[2][2];
778 grad_grads[start + 2 * n_curls + 1][1][1][0] =
779 -monoval[0][1] * monoval_jplus[1][1] * monoval_i[2][1];
780 grad_grads[start + 2 * n_curls + 1][1][1][1] =
781 -monoval[0][0] * monoval_jplus[1][2] * monoval_i[2][1];
782 grad_grads[start + 2 * n_curls + 1][1][1][2] =
783 -monoval[0][0] * monoval_jplus[1][1] * monoval_i[2][2];
784 grad_grads[start + 2 * n_curls + 1][1][2][0] =
785 -monoval[0][1] * monoval_jplus[1][0] * monoval_i[2][2];
786 grad_grads[start + 2 * n_curls + 1][1][2][1] =
787 -monoval[0][0] * monoval_jplus[1][1] * monoval_i[2][2];
788 grad_grads[start + 2 * n_curls + 1][1][2][2] =
789 -monoval[0][0] * monoval_jplus[1][0] * monoval_i[2][3];
790 grad_grads[start + 2 * n_curls + 1][2][0][0] =
791 monoval[0][2] * monoval_j[1][0] * monoval_i[2][0] *
792 static_cast<double>(j + my_degree + 2);
793 grad_grads[start + 2 * n_curls + 1][2][0][1] =
794 monoval[0][1] * monoval_j[1][1] * monoval_i[2][0] *
795 static_cast<double>(j + my_degree + 2);
796 grad_grads[start + 2 * n_curls + 1][2][0][2] =
797 monoval[0][1] * monoval_j[1][0] * monoval_i[2][1] *
798 static_cast<double>(j + my_degree + 2);
799 grad_grads[start + 2 * n_curls + 1][2][1][0] =
800 monoval[0][1] * monoval_j[1][1] * monoval_i[2][0] *
801 static_cast<double>(j + my_degree + 2);
802 grad_grads[start + 2 * n_curls + 1][2][1][1] =
803 monoval[0][0] * monoval_j[1][2] * monoval_i[2][0] *
804 static_cast<double>(j + my_degree + 2);
805 grad_grads[start + 2 * n_curls + 1][2][1][2] =
806 monoval[0][0] * monoval_j[1][1] * monoval_i[2][1] *
807 static_cast<double>(j + my_degree + 2);
808 grad_grads[start + 2 * n_curls + 1][2][2][0] =
809 monoval[0][1] * monoval_j[1][0] * monoval_i[2][1] *
810 static_cast<double>(j + my_degree + 2);
811 grad_grads[start + 2 * n_curls + 1][2][2][1] =
812 monoval[0][0] * monoval_j[1][1] * monoval_i[2][1] *
813 static_cast<double>(j + my_degree + 2);
814 grad_grads[start + 2 * n_curls + 1][2][2][2] =
815 monoval[0][0] * monoval_j[1][0] * monoval_i[2][2] *
816 static_cast<double>(j + my_degree + 2);
817 }
818 }
819
820 if (j == my_degree)
821 start += 1;
822 else
823 start += 2;
824 }
825 }
826 Assert(start == this->n() - 2 * n_curls, ExcInternalError());
827 }
828}
829
830
831
832template <int dim>
833unsigned int
835{
836 if (dim == 1 || dim == 2 || dim == 3)
837 return dim * Utilities::fixed_power<dim>(k + 1);
838
840 return 0;
841}
842
843
844template <int dim>
845std::unique_ptr<TensorPolynomialsBase<dim>>
847{
848 return std::make_unique<PolynomialsRT_Bubbles<dim>>(*this);
849}
850
851
852template class PolynomialsRT_Bubbles<1>;
853template class PolynomialsRT_Bubbles<2>;
854template class PolynomialsRT_Bubbles<3>;
855
856
Definition point.h:111
virtual std::unique_ptr< TensorPolynomialsBase< dim > > clone() const override
PolynomialsRT_Bubbles(const unsigned int k)
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
static unsigned int n_polynomials(const unsigned int degree)
std::vector< Polynomials::Polynomial< double > > monomials
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)