22#ifndef EXADG_STRUCTURE_SPATIAL_DISCRETIZATION_OPERATORS_CONTINUUM_MECHANICS_H_
23#define EXADG_STRUCTURE_SPATIAL_DISCRETIZATION_OPERATORS_CONTINUUM_MECHANICS_H_
26#include <deal.II/base/tensor.h>
27#include <deal.II/physics/transformations.h>
33template<
int dim,
typename Number,
typename TensorType>
34inline DEAL_II_ALWAYS_INLINE
36 add_identity(TensorType
tensor)
38 for(
unsigned int i = 0; i < dim; i++)
46template<
int dim,
typename Number,
typename TensorType>
47inline DEAL_II_ALWAYS_INLINE
49 subtract_identity(TensorType
tensor)
51 for(
unsigned int i = 0; i < dim; i++)
61template<
int dim,
typename Number>
62inline DEAL_II_ALWAYS_INLINE
63 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>>
64 compute_H_plus_HT(dealii::Tensor<2, dim, dealii::VectorizedArray<Number>>
const & H)
66 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>> result;
68 for(
unsigned int i = 0; i < dim; ++i)
70 for(
unsigned int j = i; j < dim; ++j)
72 result[i][j] = H[i][j] + H[j][i];
79 if constexpr(std::is_same_v<Number, double>)
81 dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> check = H + transpose(H);
82 dealii::VectorizedArray<Number> sum_err = 0.0;
83 for(
unsigned int i = 0; i < dim; ++i)
85 for(
unsigned int j = 0; j < dim; ++j)
87 sum_err += std::abs(check[i][j] - result[i][j]);
90 std::cout <<
"compute_H_plus_HT : sum_err = " << sum_err <<
"\n";
91 AssertThrow(sum_err.sum() < 1e-18,
92 dealii::ExcMessage(
"Check in `compute_H_plus_HT()` failed."));
101template<
int dim,
typename Number>
102inline DEAL_II_ALWAYS_INLINE
103 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>>
104 compute_HT_times_H(dealii::Tensor<2, dim, dealii::VectorizedArray<Number>>
const & H)
106 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>> result;
108 for(
unsigned int i = 0; i < dim; ++i)
110 for(
unsigned int j = i; j < dim; ++j)
112 for(
unsigned int k = 0; k < dim; ++k)
114 result[i][j] += H[k][i] * H[k][j];
122 if constexpr(std::is_same_v<Number, double>)
124 dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> check = transpose(H) * H;
125 dealii::VectorizedArray<Number> sum_err = 0.0;
126 for(
unsigned int i = 0; i < dim; ++i)
128 for(
unsigned int j = 0; j < dim; ++j)
130 sum_err += std::abs(check[i][j] - result[i][j]);
133 std::cout <<
"compute_HT_times_H : sum_err = " << sum_err <<
"\n";
134 AssertThrow(sum_err.sum() < 1e-18,
135 dealii::ExcMessage(
"Check in `compute_HT_times_H()` failed."));
144template<
int dim,
typename Number>
145inline DEAL_II_ALWAYS_INLINE
146 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>>
147 compute_H_times_HT(dealii::Tensor<2, dim, dealii::VectorizedArray<Number>>
const & H)
149 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>> result;
151 for(
unsigned int i = 0; i < dim; ++i)
153 for(
unsigned int j = i; j < dim; ++j)
155 for(
unsigned int k = 0; k < dim; ++k)
157 result[i][j] += H[i][k] * H[j][k] ;
165 if constexpr(std::is_same_v<Number, double>)
167 dealii::VectorizedArray<Number> sum_err = 0.0;
169 dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> check = H * transpose(H);
170 for(
unsigned int i = 0; i < dim; ++i)
172 for(
unsigned int j = 0; j < dim; ++j)
174 sum_err += std::abs(check[i][j] - result[i][j]);
177 std::cout <<
"compute_H_times_HT : sum_err = " << sum_err <<
"\n";
178 AssertThrow(sum_err.sum() < 1e-18,
179 dealii::ExcMessage(
"Check in `compute_H_times_HT()` failed."));
189template<
int dim,
typename Number>
190inline DEAL_II_ALWAYS_INLINE
191 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>>
192 compute_push_forward(dealii::VectorizedArray<Number>
const & J,
193 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>>
const & S,
194 dealii::Tensor<2, dim, dealii::VectorizedArray<Number>>
const & F)
198 dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> S_times_FT;
199 for(
unsigned int i = 0; i < dim; ++i)
201 for(
unsigned int j = 0; j < dim; ++j)
203 for(
unsigned int k = 0; k < dim; ++k)
205 S_times_FT[i][j] += S[i][k] * F[j][k] ;
211 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>> result;
212 for(
unsigned int i = 0; i < dim; ++i)
214 for(
unsigned int j = i; j < dim; ++j)
216 for(
unsigned int k = 0; k < dim; ++k)
218 result[i][j] += F[i][k] * S_times_FT[k][j];
229 if constexpr(std::is_same_v<Number, double>)
231 dealii::VectorizedArray<Number> sum_err = 0.0;
233 dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> check =
234 (1.0 / J) * F * S * transpose(F);
235 for(
unsigned int i = 0; i < dim; ++i)
237 for(
unsigned int j = 0; j < dim; ++j)
239 sum_err += std::abs(check[i][j] - result[i][j]);
242 std::cout <<
"compute_push_forward : sum_err = " << sum_err <<
"\n";
243 AssertThrow(sum_err.sum() < 1e-18,
244 dealii::ExcMessage(
"Check in `compute_push_forward()` failed."));
251template<
int dim,
typename Number>
252inline DEAL_II_ALWAYS_INLINE
253 dealii::Tensor<2, dim, dealii::VectorizedArray<Number>>
254 get_F(
const dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> & gradient_displacement)
256 return add_identity<dim, Number>(gradient_displacement);
259template<
int dim,
typename Number>
260inline DEAL_II_ALWAYS_INLINE
261 dealii::SymmetricTensor<2, dim, dealii::VectorizedArray<Number>>
262 get_E(
const dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> & gradient_displacement)
268 (compute_H_plus_HT(gradient_displacement) + compute_HT_times_H(gradient_displacement)));