23#include "libmesh/utility.h"
24#include "libmesh/vector_value.h"
25#include "libmesh/tensor_value.h"
49 mooseAssert(N == 3,
"RankThreeTensor is currently only tested for 3 dimensions.");
51 for (
auto i : make_range(N3))
64 mooseError(
"Unknown RankThreeTensor initialization pattern.");
71 fillFromInputVector(input, fill_method);
78 for (
auto i : make_range(N3))
86 for (
auto i : make_range(N3))
95 for (
auto i : make_range(N3))
96 _vals[i] = a.
_vals[i];
107 for (
auto i : make_range(N))
110 unsigned int i1 = i * N2;
111 for (
unsigned int j1 = 0; j1 < N2; j1 += N)
112 for (
auto k : make_range(N))
113 sum += _vals[i1 + j1 + k] * a.
_coords[j1 + k];
126 for (
auto i : make_range(N))
127 for (
auto j : make_range(N))
130 unsigned int i1 = i * N2;
131 unsigned int j1 = j * N;
132 for (
auto k : make_range(N))
133 sum += _vals[i1 + j1 + k] * a(k);
146 for (
auto i : make_range(N3))
147 result.
_vals[i] = _vals[i] * b;
156 for (
auto i : make_range(N3))
168 for (
auto i : make_range(N3))
169 result.
_vals[i] = _vals[i] / b;
178 for (
auto i : make_range(N3))
188 for (
auto i : make_range(N3))
189 _vals[i] += a.
_vals[i];
200 for (
auto i : make_range(N3))
210 for (
auto i : make_range(N3))
211 _vals[i] -= a.
_vals[i];
222 for (
auto i : make_range(N3))
234 for (
auto i : make_range(N3))
235 result.
_vals[i] = -_vals[i];
246 for (
auto i : make_range(N3))
247 l2 += Utility::pow<2>(_vals[i]);
259 if (fill_method == automatic)
261 if (input.size() == 27)
262 fill_method = general;
263 else if (input.size() == 3)
264 fill_method = plane_normal;
266 mooseError(
"Unsupported automatic fill method, use 27 values for 'general' and 3 for "
267 "'plane_normal', the supplied size was ",
272 if (fill_method == general)
273 fillGeneralFromInputVector(input);
275 else if (fill_method == plane_normal)
277 if (input.size() != 3)
278 mooseError(
"To use fillFromPlaneNormal, your input must have size 3, the supplied size was ",
286 mooseError(
"fillFromInputVector called with unknown fill_method of ", fill_method);
293 unsigned int index = 0;
294 for (
auto i : make_range(N))
296 const T a = input(i);
297 for (
auto j : make_range(N))
299 const T b = input(j);
300 for (
auto k : make_range(N))
302 const T c = input(k);
304 sum = -2.0 * a * b * c;
309 _vals[index++] = sum / 2.0;
321 unsigned int index = 0;
322 for (
auto i : make_range(N))
323 for (
auto j : make_range(N))
324 for (
auto k : make_range(N))
325 for (
auto l : make_range(N))
327 for (
auto m : make_range(N))
328 for (
auto n : make_range(N))
329 result.
_vals[index] += (*
this)(m, i, j) * a(m, n) * (*this)(n, k, l);
342 unsigned int index = 0;
343 for (
auto i : make_range(N))
344 for (
auto j : make_range(N))
345 for (
auto k : make_range(N))
348 unsigned int index2 = 0;
349 for (
auto m : make_range(N))
352 for (
auto n : make_range(N))
355 for (
auto o : make_range(N))
356 sum += ab * R(k, o) * old.
_vals[index2++];
359 _vals[index++] = sum;
367 if (input.size() != 27)
369 "To use fillGeneralFromInputVector, your input must have size 27, the supplied size was ",
373 for (
auto i : make_range(N3))
383 for (
auto i : make_range(N))
384 for (
auto j : make_range(N2))
385 result(i) += _vals[i * N2 + j] * b.
_coords[j];
394 for (
auto i : make_range(N))
396 stm <<
"a(" << i <<
", j, k) = \n";
397 for (
auto j : make_range(N))
399 for (
auto k : make_range(N))
400 stm << std::setw(15) << (*this)(i, j, k) <<
' ';
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
RankFourTensorTempl is designed to handle any N-dimensional fourth order tensor, C.
T _vals[N4]
The values of the rank-four tensor stored by index=(((i * LIBMESH_DIM + j) * LIBMESH_DIM + k) * LIBME...
RankThreeTensor is designed to handle any N-dimensional third order tensor, r.
FillMethod
To fill up the 27 entries in the 3rd-order tensor, fillFromInputVector is called with one of the foll...
void print(std::ostream &stm=Moose::out) const
Print the rank three tensor.
libMesh::VectorValue< T > operator*(const RankTwoTensorTempl< T > &a) const
b_i = r_ijk * a_jk
RankThreeTensorTempl< T > operator-() const
-r_ijk
T _vals[N3]
The values of the rank-three tensor stored by index=((i * LIBMESH_DIM + j) * LIBMESH_DIM + k)
InitMethod
Initialization method.
RankThreeTensorTempl< T > & operator-=(const RankThreeTensorTempl< T > &a)
r_ijk -= a_ijk
RankThreeTensorTempl< T > & operator/=(const T a)
r_ijk /= a for all i, j, k
RankThreeTensorTempl< T > & operator*=(const T a)
r_ijk *= a
RankThreeTensorTempl< T > & operator=(const T &value)
Assignment-from-scalar operator.
void fillFromInputVector(const std::vector< T > &input, FillMethod fill_method=automatic)
fillFromInputVector takes some number of inputs to fill the Rank-3 tensor.
RankThreeTensorTempl< T > operator/(const T a) const
r_ijk/a
void zero()
Zeros out the tensor.
libMesh::VectorValue< T > doubleContraction(const RankTwoTensorTempl< T > &b) const
Creates a vector from the double contraction of a rank three and rank two tensor.
void rotate(const T2 &R)
Rotate the tensor using r_ijk = R_im R_in R_ko r_mno.
T L2norm() const
\sqrt(r_ijk*r_ijk)
RankThreeTensorTempl< T > & operator+=(const RankThreeTensorTempl< T > &a)
r_ijk += a_ijk for all i, j, k
void fillFromPlaneNormal(const libMesh::VectorValue< T > &input)
Fills RankThreeTensor from plane normal vectors ref.
RankFourTensorTempl< T > mixedProductRankFour(const RankTwoTensorTempl< T > &a) const
Creates fourth order tensor D_{ijkl}=A_{mij}*b_{mn}*A_{nkl} where A is rank 3 and b is rank 2.
static MooseEnum fillMethodEnum()
Static method for use in validParams for getting the "fill_method".
RankThreeTensorTempl< T > operator+(const RankThreeTensorTempl< T > &a) const
r_ijkl + a_ijk
friend class RankThreeTensorTempl
void fillGeneralFromInputVector(const std::vector< T > &input)
RankTwoTensorTempl is designed to handle the Stress or Strain Tensor for a fully anisotropic material...
T _coords[LIBMESH_DIM *LIBMESH_DIM]
void mooseSetToZero< RankThreeTensor >(RankThreeTensor &v)
void mooseSetToZero< ADRankThreeTensor >(ADRankThreeTensor &v)