3#include <deal.II/base/tensor.h>
4#include <deal.II/base/vectorization.h>
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)
22 template <
typename number, std::
size_t N>
23 Tensor<1, 1, VectorizedArray<number, N>>
25 const Tensor<1, 1, VectorizedArray<number, N>> &vec)
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)
44 template <
typename number, std::
size_t N>
45 Tensor<1, 1, VectorizedArray<number, N>>
47 const Tensor<1, 1, VectorizedArray<number, N>> &vec)
58 template <
typename number, std::
size_t N>
59 dealii::VectorizedArray<number, N>
61 const dealii::Tensor<1, 1, dealii::VectorizedArray<number, N>> &vec)
63 return vec[0] * scalar;
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)
71 return vec[0] * scalar;
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)
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];
91 template <
int a,
int b,
int c,
typename number>
92 dealii::Tensor<1, a, dealii::Tensor<1, c, number>>
94 const dealii::Tensor<1, b, dealii::Tensor<1, c, number>> &matrix2)
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];
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>>>
123 const dealii::Tensor<1, dim_2, dealii::VectorizedArray<number>> &vector)
125 dealii::Tensor<1, dim_1, dealii::VectorizedArray<number>> result;
127 for (
unsigned int i = 0; i < dim_1; ++i)
128 result[i] = tensor[i] * vector;
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)
157 dealii::Tensor<1, dim_1, number> result;
159 for (
unsigned int i = 0; i < dim_1; ++i)
160 result[i] = (tensor_1[i] + tensor_2[i]) * vector;
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)
169 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> vec;
171 for (
unsigned int v = 0; v < dealii::VectorizedArray<number>::size(); ++v)
172 vec[0][v] = in[v] >= zero ? 1.0 : -1.0;
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)
182 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> vec;
184 const auto n_norm = in.norm();
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];
191 for (
unsigned int d = 0; d < dim; ++d)
192 vec[d][v] = in[d][v] / zero;
201 template <
int T1_dim,
int T2_dim,
typename number>
202 dealii::Tensor<1, T1_dim, dealii::Tensor<1, T2_dim, number>>
205 dealii::Tensor<1, T1_dim, dealii::Tensor<1, T2_dim, number>> c;
206 for (
unsigned int i = 0; i < T1_dim; ++i)
208 for (
unsigned int j = 0; j < T2_dim; ++j)
210 c[i][j] = *(a_start + i) * *(b_start + j);
219 template <
int T1_dim,
int T2_dim,
typename number>
220 dealii::Tensor<1, T1_dim, dealii::Tensor<1, T2_dim, number>>
222 const dealii::Tensor<1, T2_dim, number> &b)
224 return dyadic_product<T1_dim, T2_dim, number>(&a[0], &b[0]);
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)
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];
244 template <
int dim,
typename number>
246 trace(
const dealii::Tensor<1, dim, dealii::Tensor<1, dim, number>> &in)
249 for (
unsigned int i = 0; i < dim; ++i)
254 template <
int dim,
typename number>
256 trace(
const dealii::Tensor<2, dim, number> &in)
259 for (
unsigned int i = 0; i < dim; ++i)
267 template <
int dim,
typename number>
268 dealii::Tensor<1, dim, dealii::Tensor<1, dim, number>>
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);
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)
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];
302 template <
int rank,
int components,
typename number>
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