include/meltpooldg/utilities/dealii_tensor.hpp Source File

Developer Documentation: include/meltpooldg/utilities/dealii_tensor.hpp Source File
Developer Documentation
dealii_tensor.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/tensor.h>
4#include <deal.II/base/vectorization.h>
5
6#include <cstddef>
7#include <type_traits>
8
9namespace dealii
10{
11 template <typename number, std::size_t N>
12 Tensor<1, 1, VectorizedArray<number, N>>
13 operator+=(const Tensor<1, 1, VectorizedArray<number, N>> &vec,
14 const VectorizedArray<number, N> &scalar)
15 {
16 auto temp = vec;
17 temp[0] += scalar;
18
19 return temp;
20 }
21
22 template <typename number, std::size_t N>
23 Tensor<1, 1, VectorizedArray<number, N>>
24 operator+=(const VectorizedArray<number, N> &scalar,
25 const Tensor<1, 1, VectorizedArray<number, N>> &vec)
26 {
27 auto temp = vec;
28 temp[0] += scalar;
29
30 return temp;
31 }
32
33 template <typename number, std::size_t N>
34 Tensor<1, 1, VectorizedArray<number, N>>
35 operator-=(const Tensor<1, 1, VectorizedArray<number, N>> &vec,
36 const VectorizedArray<number, N> &scalar)
37 {
38 auto temp = vec;
39 temp[0] -= scalar;
40
41 return temp;
42 }
43
44 template <typename number, std::size_t N>
45 Tensor<1, 1, VectorizedArray<number, N>>
46 operator-=(const VectorizedArray<number, N> &scalar,
47 const Tensor<1, 1, VectorizedArray<number, N>> &vec)
48 {
49 auto temp = -vec;
50 temp[0] += scalar;
51
52 return temp;
53 }
54} // namespace dealii
55
56namespace MeltPoolDG
57{
58 template <typename number, std::size_t N>
59 dealii::VectorizedArray<number, N>
60 scalar_product(const dealii::VectorizedArray<number, N> &scalar,
61 const dealii::Tensor<1, 1, dealii::VectorizedArray<number, N>> &vec)
62 {
63 return vec[0] * scalar;
64 }
65
66 template <typename number, std::size_t N>
67 dealii::VectorizedArray<number, N>
68 scalar_product(const dealii::Tensor<1, 1, dealii::VectorizedArray<number, N>> &vec,
69 const dealii::VectorizedArray<number, N> &scalar)
70 {
71 return vec[0] * scalar;
72 }
73
78 template <int n_rows, int n_columns, typename number>
79 dealii::Tensor<1, n_rows, number>
81 const dealii::Tensor<1, n_rows, dealii::Tensor<1, n_columns, number>> &matrix,
82 const dealii::Tensor<1, n_columns, number> &vector)
83 {
84 dealii::Tensor<1, n_rows, number> result;
85 for (unsigned int i = 0; i < n_rows; ++i)
86 for (unsigned int j = 0; j < n_columns; ++j)
87 result[i] += matrix[i][j] * vector[j];
88 return result;
89 }
90
91 template <int a, int b, int c, typename number>
92 dealii::Tensor<1, a, dealii::Tensor<1, c, number>>
93 matrix_matrix_product(const dealii::Tensor<1, a, dealii::Tensor<1, b, number>> &matrix1,
94 const dealii::Tensor<1, b, dealii::Tensor<1, c, number>> &matrix2)
95 {
96 dealii::Tensor<1, a, dealii::Tensor<1, c, number>> result;
97 for (unsigned int i = 0; i < a; ++i)
98 for (unsigned int j = 0; j < c; ++j)
99 for (unsigned int k = 0; k < b; ++k)
100 result[i][j] += matrix1[i][k] * matrix2[k][j];
101 return result;
102 }
103
118 template <int dim_1, int dim_2, typename number>
119 dealii::Tensor<1, dim_1, dealii::VectorizedArray<number>>
121 const dealii::Tensor<1, dim_1, dealii::Tensor<1, dim_2, dealii::VectorizedArray<number>>>
122 &tensor,
123 const dealii::Tensor<1, dim_2, dealii::VectorizedArray<number>> &vector)
124 {
125 dealii::Tensor<1, dim_1, dealii::VectorizedArray<number>> result;
126
127 for (unsigned int i = 0; i < dim_1; ++i)
128 result[i] = tensor[i] * vector;
129
130 return result;
131 }
132
150 template <int dim_1, int dim_2, typename number>
151 dealii::Tensor<1, dim_1, number>
153 const dealii::Tensor<1, dim_1, dealii::Tensor<1, dim_2, number>> &tensor_1,
154 const dealii::Tensor<1, dim_1, dealii::Tensor<1, dim_2, number>> &tensor_2,
155 const dealii::Tensor<1, dim_2, number> &vector)
156 {
157 dealii::Tensor<1, dim_1, number> result;
158
159 for (unsigned int i = 0; i < dim_1; ++i)
160 result[i] = (tensor_1[i] + tensor_2[i]) * vector;
161
162 return 0.5 * result;
163 }
164
165 template <int dim, typename number>
166 dealii::Tensor<1, dim, dealii::VectorizedArray<number>>
167 normalize(const dealii::VectorizedArray<number> &in, const number zero = 1e-16)
168 {
169 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> vec;
170
171 for (unsigned int v = 0; v < dealii::VectorizedArray<number>::size(); ++v)
172 vec[0][v] = in[v] >= zero ? 1.0 : -1.0;
173
174 return vec;
175 }
176
177 template <int dim, typename number>
178 dealii::Tensor<1, dim, dealii::VectorizedArray<number>>
179 normalize(const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &in,
180 const number zero = 1e-16)
181 {
182 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> vec;
183
184 const auto n_norm = in.norm();
185
186 for (unsigned int v = 0; v < dealii::VectorizedArray<number>::size(); ++v)
187 if (n_norm[v] > zero)
188 for (unsigned int d = 0; d < dim; ++d)
189 vec[d][v] = in[d][v] / n_norm[v];
190 else
191 for (unsigned int d = 0; d < dim; ++d)
192 vec[d][v] = in[d][v] / zero;
193
194 return vec;
195 }
196
201 template <int T1_dim, int T2_dim, typename number>
202 dealii::Tensor<1, T1_dim, dealii::Tensor<1, T2_dim, number>>
203 dyadic_product(const number *a_start, const number *b_start)
204 {
205 dealii::Tensor<1, T1_dim, dealii::Tensor<1, T2_dim, number>> c;
206 for (unsigned int i = 0; i < T1_dim; ++i)
207 {
208 for (unsigned int j = 0; j < T2_dim; ++j)
209 {
210 c[i][j] = *(a_start + i) * *(b_start + j);
211 }
212 }
213 return c;
214 }
215
219 template <int T1_dim, int T2_dim, typename number>
220 dealii::Tensor<1, T1_dim, dealii::Tensor<1, T2_dim, number>>
221 dyadic_product(const dealii::Tensor<1, T1_dim, number> &a,
222 const dealii::Tensor<1, T2_dim, number> &b)
223 {
224 return dyadic_product<T1_dim, T2_dim, number>(&a[0], &b[0]);
225 }
226
230 template <int T1_dim, int T2_dim, typename number>
231 dealii::Tensor<1, T2_dim, dealii::Tensor<1, T1_dim, number>>
232 transpose(const dealii::Tensor<1, T1_dim, dealii::Tensor<1, T2_dim, number>> &in)
233 {
234 dealii::Tensor<1, T2_dim, dealii::Tensor<1, T1_dim, number>> out;
235 for (unsigned int i = 0; i < T1_dim; ++i)
236 for (unsigned int j = 0; j < T2_dim; ++j)
237 out[j][i] = in[i][j];
238 return out;
239 }
240
244 template <int dim, typename number>
245 number
246 trace(const dealii::Tensor<1, dim, dealii::Tensor<1, dim, number>> &in)
247 {
248 number tr(0.0);
249 for (unsigned int i = 0; i < dim; ++i)
250 tr += in[i][i];
251 return tr;
252 }
253
254 template <int dim, typename number>
255 number
256 trace(const dealii::Tensor<2, dim, number> &in)
257 {
258 number tr(0.0);
259 for (unsigned int i = 0; i < dim; ++i)
260 tr += in[i][i];
261 return tr;
262 }
263
267 template <int dim, typename number>
268 dealii::Tensor<1, dim, dealii::Tensor<1, dim, number>>
270 {
271 dealii::Tensor<1, dim, dealii::Tensor<1, dim, number>> out;
272 for (unsigned int i = 0; i < dim; ++i)
273 out[i][i] = number(1.0);
274 return out;
275 }
276
280 template <int dim1, int dim2, typename number>
281 dealii::Tensor<1, dim1, dealii::Tensor<1, dim2, number>>
282 jump(const dealii::Tensor<1, dim1, number> &tensor_m,
283 const dealii::Tensor<1, dim1, number> &tensor_p,
284 const dealii::Tensor<1, dim2, number> &normal)
285 {
286 dealii::Tensor<1, dim1, dealii::Tensor<1, dim2, number>> jump;
287 for (unsigned int i = 0; i < dim1; ++i)
288 for (unsigned int j = 0; j < dim2; ++j)
289 jump[i][j] = (tensor_m[i] - tensor_p[i]) * normal[j];
290 return jump;
291 }
292
293 /*
294 * Trait to detect whether a type is a specialization of `dealii::Tensor`. The trait consists of
295 * a primary template defaulting to `false` and a specialized version for `dealii::Tensor` types
296 * inheriting from `std::true_type`.
297 */
298 template <typename>
299 struct is_dealii_tensor : std::false_type
300 {};
301
302 template <int rank, int components, typename number>
303 struct is_dealii_tensor<dealii::Tensor<rank, components, number>> : std::true_type
304 {};
305
306
307} // namespace MeltPoolDG
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17
dealii::Tensor< 1, T1_dim, dealii::Tensor< 1, T2_dim, number > > dyadic_product(const number *a_start, const number *b_start)
Definition dealii_tensor.hpp:203
dealii::Tensor< 1, a, dealii::Tensor< 1, c, number > > matrix_matrix_product(const dealii::Tensor< 1, a, dealii::Tensor< 1, b, number > > &matrix1, const dealii::Tensor< 1, b, dealii::Tensor< 1, c, number > > &matrix2)
Definition dealii_tensor.hpp:93
dealii::Tensor< 1, dim, dealii::Tensor< 1, dim, number > > identity()
Definition dealii_tensor.hpp:269
dealii::Tensor< 1, dim_1, number > contract_average_tensor_with_vector(const dealii::Tensor< 1, dim_1, dealii::Tensor< 1, dim_2, number > > &tensor_1, const dealii::Tensor< 1, dim_1, dealii::Tensor< 1, dim_2, number > > &tensor_2, const dealii::Tensor< 1, dim_2, number > &vector)
Definition dealii_tensor.hpp:152
dealii::VectorizedArray< number, N > scalar_product(const dealii::VectorizedArray< number, N > &scalar, const dealii::Tensor< 1, 1, dealii::VectorizedArray< number, N > > &vec)
Definition dealii_tensor.hpp:60
dealii::Tensor< 1, dim1, dealii::Tensor< 1, dim2, number > > jump(const dealii::Tensor< 1, dim1, number > &tensor_m, const dealii::Tensor< 1, dim1, number > &tensor_p, const dealii::Tensor< 1, dim2, number > &normal)
Definition dealii_tensor.hpp:282
dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > normalize(const dealii::VectorizedArray< number > &in, const number zero=1e-16)
Definition dealii_tensor.hpp:167
dealii::Tensor< 1, dim_1, dealii::VectorizedArray< number > > contract_tensor_with_vector(const dealii::Tensor< 1, dim_1, dealii::Tensor< 1, dim_2, dealii::VectorizedArray< number > > > &tensor, const dealii::Tensor< 1, dim_2, dealii::VectorizedArray< number > > &vector)
Definition dealii_tensor.hpp:120
dealii::Tensor< 1, T2_dim, dealii::Tensor< 1, T1_dim, number > > transpose(const dealii::Tensor< 1, T1_dim, dealii::Tensor< 1, T2_dim, number > > &in)
Definition dealii_tensor.hpp:232
number trace(const dealii::Tensor< 1, dim, dealii::Tensor< 1, dim, number > > &in)
Definition dealii_tensor.hpp:246
dealii::Tensor< 1, n_rows, number > matrix_vector_product(const dealii::Tensor< 1, n_rows, dealii::Tensor< 1, n_columns, number > > &matrix, const dealii::Tensor< 1, n_columns, number > &vector)
Definition dealii_tensor.hpp:80
Definition dealii_tensor.hpp:10
Tensor< 1, 1, VectorizedArray< number, N > > operator-=(const Tensor< 1, 1, VectorizedArray< number, N > > &vec, const VectorizedArray< number, N > &scalar)
Definition dealii_tensor.hpp:35
Tensor< 1, 1, VectorizedArray< number, N > > operator+=(const Tensor< 1, 1, VectorizedArray< number, N > > &vec, const VectorizedArray< number, N > &scalar)
Definition dealii_tensor.hpp:13
Definition dealii_tensor.hpp:300