https://mooseframework.inl.gov
RankFourTensor.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include "Moose.h"
13 #include "MooseTypes.h"
14 #include "ADRankTwoTensorForward.h"
17 #include "MooseError.h"
18 
19 #include "libmesh/libmesh.h"
20 #include "libmesh/tuple_of.h"
21 #include "libmesh/int_range.h"
22 
23 #include "metaphysicl/raw_type.h"
24 
25 #include <petscsys.h>
26 
27 #include <Eigen/Core>
28 #include <Eigen/Dense>
29 
30 using libMesh::tuple_of;
31 namespace libMesh
32 {
33 template <typename>
34 class TensorValue;
35 template <typename>
36 class TypeTensor;
37 template <typename>
38 class VectorValue;
39 }
40 
41 // Forward declarations
42 class MooseEnum;
43 
44 namespace MathUtils
45 {
46 template <typename T>
47 void mooseSetToZero(T & v);
48 
53 template <>
55 template <>
57 }
58 
64 template <typename T>
66 {
67 public:
69  static constexpr unsigned int N = Moose::dim;
70  static constexpr unsigned int N2 = N * N;
71  static constexpr unsigned int N3 = N * N * N;
72  static constexpr unsigned int N4 = N * N * N * N;
74 
76  typedef T value_type;
77 
80  {
86  };
87 
94  {
106  };
107 
108  template <template <typename> class Tensor, typename Scalar>
110  {
111  static const bool value = false;
112  };
113  template <typename Scalar>
115  {
117  };
118  template <typename Scalar>
119  struct TwoTensorMultTraits<TensorValue, Scalar>
120  {
122  };
123  template <typename Scalar>
124  struct TwoTensorMultTraits<TypeTensor, Scalar>
125  {
127  };
128 
131 
134 
136  RankFourTensorTempl(const std::vector<T> &, FillMethod);
137 
139  RankFourTensorTempl(const RankFourTensorTempl<T> & a) = default;
140 
144  template <typename T2>
146 
150  template <typename T2>
152  {
153  for (const auto a : make_range(SymmetricRankFourTensorTempl<T2>::N))
154  for (const auto b : make_range(SymmetricRankFourTensorTempl<T2>::N))
155  {
157  const auto i = idx[0];
158  const auto j = idx[1];
159  const auto k = idx[2];
160  const auto l = idx[3];
161 
162  // Rijkl = Rjikl = Rijlk = Rjilk
163  (*this)(i, j, k, l) = t(a, b) / SymmetricRankFourTensorTempl<T2>::mandelFactor(a, b);
164  (*this)(j, i, k, l) = t(a, b) / SymmetricRankFourTensorTempl<T2>::mandelFactor(a, b);
165  (*this)(i, j, l, k) = t(a, b) / SymmetricRankFourTensorTempl<T2>::mandelFactor(a, b);
166  (*this)(j, i, l, k) = t(a, b) / SymmetricRankFourTensorTempl<T2>::mandelFactor(a, b);
167  }
168  }
169 
170  // Named constructors
175  {
177  };
178 
180  inline T & operator()(unsigned int i, unsigned int j, unsigned int k, unsigned int l)
181  {
182  return _vals[i * N3 + j * N2 + k * N + l];
183  }
184 
189  inline const T & operator()(unsigned int i, unsigned int j, unsigned int k, unsigned int l) const
190  {
191  return _vals[i * N3 + j * N2 + k * N + l];
192  }
193 
195  void zero();
196 
198  void print(std::ostream & stm = Moose::out) const;
199 
200  friend std::ostream & operator<<(std::ostream & os, const RankFourTensorTempl<T> & t)
201  {
202  t.print(os);
203  return os;
204  }
205 
207  void printReal(std::ostream & stm = Moose::out) const;
208 
211 
217  template <typename Scalar>
219  RankFourTensorTempl &>::type
220  operator=(const Scalar & libmesh_dbg_var(p))
221  {
222  libmesh_assert_equal_to(p, Scalar(0));
223  this->zero();
224  return *this;
225  }
226 
228  template <template <typename> class Tensor, typename T2>
229  auto operator*(const Tensor<T2> & a) const ->
230  typename std::enable_if<TwoTensorMultTraits<Tensor, T2>::value,
232 
234  template <typename T2>
235  auto operator*(const T2 & a) const ->
236  typename std::enable_if<libMesh::ScalarTraits<T2>::value,
238 
240  RankFourTensorTempl<T> & operator*=(const T & a);
241 
243  template <typename T2>
244  auto operator/(const T2 & a) const ->
245  typename std::enable_if<libMesh::ScalarTraits<T2>::value,
246  RankFourTensorTempl<decltype(T() / T2())>>::type;
247 
249  RankFourTensorTempl<T> & operator/=(const T & a);
250 
253 
255  template <typename T2>
256  auto operator+(const RankFourTensorTempl<T2> & a) const
258 
261 
263  template <typename T2>
264  auto operator-(const RankFourTensorTempl<T2> & a) const
265  -> RankFourTensorTempl<decltype(T() - T2())>;
266 
269 
271  template <typename T2>
272  auto operator*(const RankFourTensorTempl<T2> & a) const
274 
276  T L2norm() const;
277 
283 
289 
294  void rotate(const TypeTensor<T> & R);
295 
301 
307 
313 
318  template <int m>
320 
333  void surfaceFillFromInputVector(const std::vector<T> & input);
334 
336  static MooseEnum fillMethodEnum();
337 
353  void fillFromInputVector(const std::vector<T> & input, FillMethod fill_method);
354 
356  void fillGeneralIsotropic(const T & i0, const T & i1, const T & i2);
357  void fillAntisymmetricIsotropic(const T & i0);
358  void fillSymmetricIsotropic(const T & i0, const T & i1);
359  void fillSymmetricIsotropicEandNu(const T & E, const T & nu);
361 
372  template <typename T2>
373  void fillSymmetric9FromInputVector(const T2 & input);
374 
383  template <typename T2>
384  void fillSymmetric21FromInputVector(const T2 & input);
385 
388 
390  T contractionIj(unsigned int, unsigned int, const RankTwoTensorTempl<T> &) const;
391 
393  T contractionKl(unsigned int, unsigned int, const RankTwoTensorTempl<T> &) const;
394 
396  T sum3x3() const;
397 
400 
403  const RankTwoTensorTempl<T> &,
404  const RankTwoTensorTempl<T> &) const;
407  const RankTwoTensorTempl<T> &,
408  const RankTwoTensorTempl<T> &) const;
411  const RankTwoTensorTempl<T> &,
412  const RankTwoTensorTempl<T> &) const;
415  const RankTwoTensorTempl<T> &,
416  const RankTwoTensorTempl<T> &) const;
417 
426 
428  bool isSymmetric() const;
429 
431  bool isIsotropic() const;
432 
433 protected:
436  T _vals[N4];
437 
444  void fillAntisymmetricFromInputVector(const std::vector<T> & input);
445 
454  void fillGeneralIsotropicFromInputVector(const std::vector<T> & input);
455 
462  void fillAntisymmetricIsotropicFromInputVector(const std::vector<T> & input);
463 
471  void fillSymmetricIsotropicFromInputVector(const std::vector<T> & input);
472 
482  void fillSymmetricIsotropicEandNuFromInputVector(const std::vector<T> & input);
483 
491  void fillAxisymmetricRZFromInputVector(const std::vector<T> & input);
492 
498  void fillGeneralFromInputVector(const std::vector<T> & input);
499 
514  void fillPrincipalFromInputVector(const std::vector<T> & input);
515 
522  void fillGeneralOrthotropicFromInputVector(const std::vector<T> & input);
523 
524  template <class T2>
525  friend void dataStore(std::ostream &, RankFourTensorTempl<T2> &, void *);
526 
527  template <class T2>
528  friend void dataLoad(std::istream &, RankFourTensorTempl<T2> &, void *);
529 
530  template <typename T2>
531  friend class RankTwoTensorTempl;
532  template <typename T2>
533  friend class RankFourTensorTempl;
534  template <typename T2>
535  friend class RankThreeTensorTempl;
536 };
537 
538 namespace MetaPhysicL
539 {
540 template <typename T>
541 struct RawType<RankFourTensorTempl<T>>
542 {
544 
546  {
547  constexpr auto N = RankFourTensorTempl<T>::N;
548  value_type ret;
549  for (auto i : libMesh::make_range(N))
550  for (auto j : libMesh::make_range(N))
551  for (auto k : libMesh::make_range(N))
552  for (auto l : libMesh::make_range(N))
553  ret(i, j, k, l) = raw_value(in(i, j, k, l));
554 
555  return ret;
556  }
557 };
558 }
559 
560 template <typename T1, typename T2>
561 inline auto
562 operator*(const T1 & a, const RankFourTensorTempl<T2> & b) ->
563  typename std::enable_if<libMesh::ScalarTraits<T1>::value,
565 {
566  return b * a;
567 }
568 
569 template <typename T>
570 template <typename T2>
572 {
573  for (auto i : libMesh::make_range(N4))
574  _vals[i] = copy._vals[i];
575 }
576 
577 template <typename T>
578 template <typename T2>
579 auto
580 RankFourTensorTempl<T>::operator*(const T2 & b) const ->
581  typename std::enable_if<libMesh::ScalarTraits<T2>::value,
583 {
584  typedef decltype(T() * T2()) ValueType;
586 
587  for (auto i : libMesh::make_range(N4))
588  result._vals[i] = _vals[i] * b;
589 
590  return result;
591 }
592 
593 template <typename T>
594 template <typename T2>
595 auto
596 RankFourTensorTempl<T>::operator/(const T2 & b) const ->
597  typename std::enable_if<libMesh::ScalarTraits<T2>::value,
598  RankFourTensorTempl<decltype(T() / T2())>>::type
599 {
600  RankFourTensorTempl<decltype(T() / T2())> result;
601  for (auto i : libMesh::make_range(N4))
602  result._vals[i] = _vals[i] / b;
603  return result;
604 }
605 
606 template <typename T>
607 template <typename T2>
608 void
610 {
611  mooseAssert(input.size() == 9,
612  "To use fillSymmetric9FromInputVector, your input must have size 9.");
613  zero();
614 
615  (*this)(0, 0, 0, 0) = input[0]; // C1111
616  (*this)(1, 1, 1, 1) = input[3]; // C2222
617  (*this)(2, 2, 2, 2) = input[5]; // C3333
618 
619  (*this)(0, 0, 1, 1) = input[1]; // C1122
620  (*this)(1, 1, 0, 0) = input[1];
621 
622  (*this)(0, 0, 2, 2) = input[2]; // C1133
623  (*this)(2, 2, 0, 0) = input[2];
624 
625  (*this)(1, 1, 2, 2) = input[4]; // C2233
626  (*this)(2, 2, 1, 1) = input[4];
627 
628  (*this)(1, 2, 1, 2) = input[6]; // C2323
629  (*this)(2, 1, 2, 1) = input[6];
630  (*this)(2, 1, 1, 2) = input[6];
631  (*this)(1, 2, 2, 1) = input[6];
632 
633  (*this)(0, 2, 0, 2) = input[7]; // C1313
634  (*this)(2, 0, 2, 0) = input[7];
635  (*this)(2, 0, 0, 2) = input[7];
636  (*this)(0, 2, 2, 0) = input[7];
637 
638  (*this)(0, 1, 0, 1) = input[8]; // C1212
639  (*this)(1, 0, 1, 0) = input[8];
640  (*this)(1, 0, 0, 1) = input[8];
641  (*this)(0, 1, 1, 0) = input[8];
642 }
643 template <typename T>
644 template <typename T2>
645 void
647 {
648  mooseAssert(input.size() == 21,
649  "To use fillSymmetric21FromInputVector, your input must have size 21.");
650 
651  (*this)(0, 0, 0, 0) = input[0]; // C1111
652  (*this)(1, 1, 1, 1) = input[6]; // C2222
653  (*this)(2, 2, 2, 2) = input[11]; // C3333
654 
655  (*this)(0, 0, 1, 1) = input[1]; // C1122
656  (*this)(1, 1, 0, 0) = input[1];
657 
658  (*this)(0, 0, 2, 2) = input[2]; // C1133
659  (*this)(2, 2, 0, 0) = input[2];
660 
661  (*this)(1, 1, 2, 2) = input[7]; // C2233
662  (*this)(2, 2, 1, 1) = input[7];
663 
664  (*this)(0, 0, 0, 2) = input[4]; // C1113
665  (*this)(0, 0, 2, 0) = input[4];
666  (*this)(0, 2, 0, 0) = input[4];
667  (*this)(2, 0, 0, 0) = input[4];
668 
669  (*this)(0, 0, 0, 1) = input[5]; // C1112
670  (*this)(0, 0, 1, 0) = input[5];
671  (*this)(0, 1, 0, 0) = input[5];
672  (*this)(1, 0, 0, 0) = input[5];
673 
674  (*this)(1, 1, 1, 2) = input[8]; // C2223
675  (*this)(1, 1, 2, 1) = input[8];
676  (*this)(1, 2, 1, 1) = input[8];
677  (*this)(2, 1, 1, 1) = input[8];
678 
679  (*this)(1, 1, 1, 0) = input[10];
680  (*this)(1, 1, 0, 1) = input[10];
681  (*this)(1, 0, 1, 1) = input[10];
682  (*this)(0, 1, 1, 1) = input[10]; // C2212 //flipped for filling purposes
683 
684  (*this)(2, 2, 2, 1) = input[12];
685  (*this)(2, 2, 1, 2) = input[12];
686  (*this)(2, 1, 2, 2) = input[12];
687  (*this)(1, 2, 2, 2) = input[12]; // C3323 //flipped for filling purposes
688 
689  (*this)(2, 2, 2, 0) = input[13];
690  (*this)(2, 2, 0, 2) = input[13];
691  (*this)(2, 0, 2, 2) = input[13];
692  (*this)(0, 2, 2, 2) = input[13]; // C3313 //flipped for filling purposes
693 
694  (*this)(0, 0, 1, 2) = input[3]; // C1123
695  (*this)(0, 0, 2, 1) = input[3];
696  (*this)(1, 2, 0, 0) = input[3];
697  (*this)(2, 1, 0, 0) = input[3];
698 
699  (*this)(1, 1, 0, 2) = input[9];
700  (*this)(1, 1, 2, 0) = input[9];
701  (*this)(0, 2, 1, 1) = input[9]; // C2213 //flipped for filling purposes
702  (*this)(2, 0, 1, 1) = input[9];
703 
704  (*this)(2, 2, 0, 1) = input[14];
705  (*this)(2, 2, 1, 0) = input[14];
706  (*this)(0, 1, 2, 2) = input[14]; // C3312 //flipped for filling purposes
707  (*this)(1, 0, 2, 2) = input[14];
708 
709  (*this)(1, 2, 1, 2) = input[15]; // C2323
710  (*this)(2, 1, 2, 1) = input[15];
711  (*this)(2, 1, 1, 2) = input[15];
712  (*this)(1, 2, 2, 1) = input[15];
713 
714  (*this)(0, 2, 0, 2) = input[18]; // C1313
715  (*this)(2, 0, 2, 0) = input[18];
716  (*this)(2, 0, 0, 2) = input[18];
717  (*this)(0, 2, 2, 0) = input[18];
718 
719  (*this)(0, 1, 0, 1) = input[20]; // C1212
720  (*this)(1, 0, 1, 0) = input[20];
721  (*this)(1, 0, 0, 1) = input[20];
722  (*this)(0, 1, 1, 0) = input[20];
723 
724  (*this)(1, 2, 0, 2) = input[16];
725  (*this)(0, 2, 1, 2) = input[16]; // C2313 //flipped for filling purposes
726  (*this)(2, 1, 0, 2) = input[16];
727  (*this)(1, 2, 2, 0) = input[16];
728  (*this)(2, 0, 1, 2) = input[16];
729  (*this)(0, 2, 2, 1) = input[16];
730  (*this)(2, 1, 2, 0) = input[16];
731  (*this)(2, 0, 2, 1) = input[16];
732 
733  (*this)(1, 2, 0, 1) = input[17];
734  (*this)(0, 1, 1, 2) = input[17]; // C2312 //flipped for filling purposes
735  (*this)(2, 1, 0, 1) = input[17];
736  (*this)(1, 2, 1, 0) = input[17];
737  (*this)(1, 0, 1, 2) = input[17];
738  (*this)(0, 1, 2, 1) = input[17];
739  (*this)(2, 1, 1, 0) = input[17];
740  (*this)(1, 0, 2, 1) = input[17];
741 
742  (*this)(0, 2, 0, 1) = input[19];
743  (*this)(0, 1, 0, 2) = input[19]; // C1312 //flipped for filling purposes
744  (*this)(2, 0, 0, 1) = input[19];
745  (*this)(0, 2, 1, 0) = input[19];
746  (*this)(1, 0, 0, 2) = input[19];
747  (*this)(0, 1, 2, 0) = input[19];
748  (*this)(2, 0, 1, 0) = input[19];
749  (*this)(1, 0, 2, 0) = input[19];
750 }
751 
752 template <typename T>
755 {
756 
757  // The inverse of a 3x3x3x3 in the C_ijkl*A_klmn = de_im de_jn sense is
758  // simply the inverse of the 9x9 matrix of the tensor entries.
759  // So all we need to do is inverse _vals (with the appropriate row-major
760  // storage)
761 
762  RankFourTensorTempl<T> result;
763 
764  if constexpr (RankFourTensorTempl<T>::N4 * sizeof(T) > EIGEN_STACK_ALLOCATION_LIMIT)
765  {
766  // Allocate on the heap if you're going to exceed the stack size limit
767  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> mat(9, 9);
768  for (auto i : libMesh::make_range(9 * 9))
769  mat(i) = _vals[i];
770 
771  mat = mat.inverse();
772 
773  for (auto i : libMesh::make_range(9 * 9))
774  result._vals[i] = mat(i);
775  }
776  else
777  {
778  // Allocate on the stack if small enough
779  const Eigen::Map<const Eigen::Matrix<T, 9, 9, Eigen::RowMajor>> mat(&_vals[0]);
780  Eigen::Map<Eigen::Matrix<T, 9, 9, Eigen::RowMajor>> res(&result._vals[0]);
781  res = mat.inverse();
782  }
783 
784  return result;
785 }
786 
787 template <typename T>
788 template <int m>
791 {
793  static constexpr std::size_t z[4][3] = {{1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2}};
794  std::size_t x[4];
795  for (x[0] = 0; x[0] < N; ++x[0])
796  for (x[1] = 0; x[1] < N; ++x[1])
797  for (x[2] = 0; x[2] < N; ++x[2])
798  for (x[3] = 0; x[3] < N; ++x[3])
799  result(x[z[m][0]], x[z[m][1]], x[z[m][2]]) += (*this)(x[0], x[1], x[2], x[3]) * b(x[m]);
800 
801  return result;
802 }
RankFourTensorTempl is designed to handle any N-dimensional fourth order tensor, C.
RankFourTensorTempl< T > inverse() const
This returns A_ijkl such that C_ijkl*A_klmn = de_im de_jn i.e.
RankFourTensorTempl< T > singleProductJ(const RankTwoTensorTempl< T > &) const
Calculates C_imkl A_jm.
void mooseSetToZero(T &v)
Helper function templates to set a variable to zero.
Definition: MathUtils.h:372
void fillSymmetric9FromInputVector(const T2 &input)
fillSymmetric9FromInputVector takes 9 inputs to fill in the Rank-4 tensor with the appropriate crysta...
void fillGeneralFromInputVector(const std::vector< T > &input)
fillGeneralFromInputVector takes 81 inputs to fill the Rank-4 tensor No symmetries are explicitly mai...
void fillGeneralOrthotropicFromInputVector(const std::vector< T > &input)
fillGeneralOrhotropicFromInputVector takes 10 inputs to fill the Rank-4 tensor It defines a general o...
void fillAntisymmetricFromInputVector(const std::vector< T > &input)
fillAntisymmetricFromInputVector takes 6 inputs to fill the the antisymmetric Rank-4 tensor with the ...
RankFourTensorTempl< T > singleProductL(const RankTwoTensorTempl< T > &) const
Calculates C_ijkm A_lm.
RankFourTensorTempl< T > & operator=(const RankFourTensorTempl< T > &a)=default
copies values from a into this tensor
friend void dataStore(std::ostream &, RankFourTensorTempl< T2 > &, void *)
static RankFourTensorTempl< T > IdentityFour()
RankFourTensorTempl< T > tripleProductIjl(const RankTwoTensorTempl< T > &, const RankTwoTensorTempl< T > &, const RankTwoTensorTempl< T > &) const
Calculates C_mnkt A_im B_jn C_lt.
RankFourTensorTempl< T > & operator*=(const T &a)
C_ijkl *= a.
void fillSymmetric21FromInputVector(const T2 &input)
fillSymmetric21FromInputVector takes either 21 inputs to fill in the Rank-4 tensor with the appropria...
RankTwoTensorTempl< T > innerProductTranspose(const RankTwoTensorTempl< T > &) const
Inner product of the major transposed tensor with a rank two tensor.
static constexpr unsigned int N3
tuple_of< 4, unsigned int > index_type
static RankFourTensorTempl< T > Identity()
auto operator*(const T1 &a, const RankFourTensorTempl< T2 > &b) -> typename std::enable_if< libMesh::ScalarTraits< T1 >::value, RankFourTensorTempl< decltype(T1() *T2())>>::type
auto raw_value(const Eigen::Map< T > &in)
Definition: EigenADReal.h:73
friend void dataLoad(std::istream &, RankFourTensorTempl< T2 > &, void *)
static constexpr std::size_t dim
This is the dimension of all vector and tensor datastructures used in MOOSE.
Definition: Moose.h:154
void fillPrincipalFromInputVector(const std::vector< T > &input)
fillPrincipalFromInputVector takes 9 inputs to fill a Rank-4 tensor C1111 = input0 C1122 = input1 C11...
RankFourTensorTempl(const SymmetricRankFourTensorTempl< T2 > &t)
The conversion operator from a SymmetricRankFourTensorTempl
static constexpr Real mandelFactor(unsigned int i, unsigned int j)
returns the 1, sqrt(2), or 2 prefactor in the Mandel notation for the indices i,j ranging from 0-5...
void mooseSetToZero< ADRankFourTensor >(ADRankFourTensor &v)
We need to instantiate the following CompareTypes to tell the compiler that ADReal is a subtype of Ch...
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
std::basic_ostream< charT, traits > * os
Definition: InfixIterator.h:33
void fillFromInputVector(const std::vector< T > &input, FillMethod fill_method)
fillFromInputVector takes some number of inputs to fill the Rank-4 tensor.
const Number zero
static constexpr unsigned int N2
void surfaceFillFromInputVector(const std::vector< T > &input)
Fills the tensor entries ignoring the last dimension (ie, C_ijkl=0 if any of i, j, k, or l = 3).
static constexpr unsigned int N4
T contractionIj(unsigned int, unsigned int, const RankTwoTensorTempl< T > &) const
Sum C_ijkl M_kl for a given i,j.
void print(std::ostream &stm=Moose::out) const
Print the rank four tensor.
RankFourTensorTempl< T > & operator/=(const T &a)
C_ijkl /= a for all i, j, k, l.
RankThreeTensor is designed to handle any N-dimensional third order tensor, r.
auto operator*(const Tensor< T2 > &a) const -> typename std::enable_if< TwoTensorMultTraits< Tensor, T2 >::value, RankTwoTensorTempl< decltype(T() *T2())>>::type
C_ijkl*a_kl.
RankFourTensorTempl< T > tripleProductJkl(const RankTwoTensorTempl< T > &, const RankTwoTensorTempl< T > &, const RankTwoTensorTempl< T > &) const
Calculates C_imnt A_jm B_kn C_lt.
RankFourTensorTempl< T > tripleProductIjk(const RankTwoTensorTempl< T > &, const RankTwoTensorTempl< T > &, const RankTwoTensorTempl< T > &) const
Calculates C_mntl A_im B_jn C_kt.
void fillSymmetricIsotropic(const T &i0, const T &i1)
auto operator/(const T2 &a) const -> typename std::enable_if< libMesh::ScalarTraits< T2 >::value, RankFourTensorTempl< decltype(T()/T2())>>::type
C_ijkl/a.
auto operator+(const RankFourTensorTempl< T2 > &a) const -> RankFourTensorTempl< decltype(T()+T2())>
C_ijkl + a_ijkl.
void fillGeneralIsotropicFromInputVector(const std::vector< T > &input)
fillGeneralIsotropicFromInputVector takes 3 inputs to fill the Rank-4 tensor with symmetries C_ijkl =...
void zero()
Zeros out the tensor.
typename tuple_n< Index, T >::template type<> tuple_of
FillMethod
To fill up the 81 entries in the 4th-order tensor, fillFromInputVector is called with one of the foll...
T L2norm() const
sqrt(C_ijkl*C_ijkl)
void mooseSetToZero< RankFourTensor >(RankFourTensor &v)
Helper function template specialization to set an object to zero.
void fillSymmetricIsotropicEandNu(const T &E, const T &nu)
bool isSymmetric() const
checks if the tensor is symmetric
void fillGeneralIsotropic(const T &i0, const T &i1, const T &i2)
Vector-less fill API functions. See docs of the corresponding ...FromInputVector methods.
RankFourTensorTempl()
Default constructor; fills to zero.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33
void printReal(std::ostream &stm=Moose::out) const
Print the values of the rank four tensor.
T sum3x3() const
Calculates the sum of Ciijj for i and j varying from 0 to 2.
RankFourTensorTempl< T > transposeMajor() const
Transpose the tensor by swapping the first pair with the second pair of indices.
bool isIsotropic() const
checks if the tensor is isotropic
T _vals[N4]
The values of the rank-four tensor stored by index=(((i * LIBMESH_DIM + j) * LIBMESH_DIM + k) * LIBME...
void fillAxisymmetricRZFromInputVector(const std::vector< T > &input)
fillAxisymmetricRZFromInputVector takes 5 inputs to fill the axisymmetric Rank-4 tensor with the appr...
void rotate(const TypeTensor< T > &R)
Rotate the tensor using C_ijkl = R_im R_jn R_ko R_lp C_mnop.
void fillSymmetricIsotropicEandNuFromInputVector(const std::vector< T > &input)
fillSymmetricIsotropicEandNuFromInputVector is a variation of the fillSymmetricIsotropicFromInputVect...
libMesh::VectorValue< T > sum3x1() const
Calculates the vector a[i] = sum over j Ciijj for i and j varying from 0 to 2.
T contractionKl(unsigned int, unsigned int, const RankTwoTensorTempl< T > &) const
Sum M_ij C_ijkl for a given k,l.
T & operator()(unsigned int i, unsigned int j, unsigned int k, unsigned int l)
Gets the value for the indices specified. Takes indices ranging from 0-2 for i, j, k, and l.
libMesh::boostcopy::enable_if_c< libMesh::ScalarTraits< Scalar >::value, RankFourTensorTempl & >::type operator=(const Scalar &libmesh_dbg_var(p))
Assignment-from-scalar operator.
RankFourTensorTempl< T > transposeIj() const
Transpose the tensor by swapping the first two indeces.
void fillSymmetricIsotropicFromInputVector(const std::vector< T > &input)
fillSymmetricIsotropicFromInputVector takes 2 inputs to fill the the symmetric Rank-4 tensor with the...
NumberTensorValue Tensor
RankFourTensorTempl< T > singleProductI(const RankTwoTensorTempl< T > &) const
Calculates C_mjkl A_im.
RankTwoTensorTempl is designed to handle the Stress or Strain Tensor for a fully anisotropic material...
Definition: RankTwoTensor.h:87
RankThreeTensorTempl< T > contraction(const libMesh::VectorValue< T > &b) const
single contraction of a RankFourTensor with a vector over index m
InitMethod
Initialization method.
SymmetricRankFourTensorTempl is designed to handle an N-dimensional fourth order tensor with minor sy...
RankFourTensorTempl< T > operator-() const
-C_ijkl
IntRange< T > make_range(T beg, T end)
void fillAntisymmetricIsotropicFromInputVector(const std::vector< T > &input)
fillAntisymmetricIsotropicFromInputVector takes 1 input to fill the the antisymmetric Rank-4 tensor w...
static MooseEnum fillMethodEnum()
Static method for use in validParams for getting the "fill_method".
RankFourTensorTempl< T > singleProductK(const RankTwoTensorTempl< T > &) const
Calculates C_ijml A_km.
static constexpr unsigned int N
tensor dimension and powers of the dimension
RankFourTensorTempl< T > & operator+=(const RankFourTensorTempl< T > &a)
C_ijkl += a_ijkl for all i, j, k, l.
static value_type value(const RankFourTensorTempl< T > &in)
const T & operator()(unsigned int i, unsigned int j, unsigned int k, unsigned int l) const
Gets the value for the indices specified.
void fillAntisymmetricIsotropic(const T &i0)
RankFourTensorTempl< T > tripleProductIkl(const RankTwoTensorTempl< T > &, const RankTwoTensorTempl< T > &, const RankTwoTensorTempl< T > &) const
Calculates C_mjnt A_im B_kn C_lt.
static RankFourTensorTempl< T > IdentityDeviatoric()
Identity of type {ik} {jl} - {ij} {kl} / 3.
RankFourTensorTempl< T > transposeKl() const
Transpose the tensor by swapping the last two indeces.
RankFourTensorTempl< typename RawType< T >::value_type > value_type
RankFourTensorTempl< T > invSymm() const
This returns A_ijkl such that C_ijkl*A_klmn = 0.5*(de_im de_jn + de_in de_jm) This routine assumes th...
RankFourTensorTempl< T > & operator-=(const RankFourTensorTempl< T > &a)
C_ijkl -= a_ijkl.
unsigned int idx(const ElemType type, const unsigned int nx, const unsigned int i, const unsigned int j)