Loading [MathJax]/extensions/tex2jax.js
https://mooseframework.inl.gov
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
FactorizedRankTwoTensorTempl< T > Class Template Reference

FactorizedRankTwoTensorTempl is designed to perform the spectral decomposition of an underlying symmetric second order tensor and reuse its bases for future operations if possible. More...

#include <FactorizedRankTwoTensor.h>

Public Types

typedef T::value_type value_type
 For generic programming. More...
 

Public Member Functions

 FactorizedRankTwoTensorTempl ()=delete
 No default constructor. More...
 
 FactorizedRankTwoTensorTempl (const FactorizedRankTwoTensorTempl< T > &A)=default
 Copy constructor. More...
 
 FactorizedRankTwoTensorTempl (const T &A)
 Constructor if the factorization isn't known a priori. More...
 
 FactorizedRankTwoTensorTempl (const std::vector< typename T::value_type > &eigvals, const RankTwoTensorTempl< typename T::value_type > &eigvecs)
 
void print (std::ostream &stm=Moose::out) const
 
FactorizedRankTwoTensorTempl< T > rotated (const RankTwoTensorTempl< typename T::value_type > &R) const
 
FactorizedRankTwoTensorTempl< T > transpose () const
 Returns the transpose of _A. More...
 
FactorizedRankTwoTensorTempl< T > & operator*= (const typename T::value_type &a)
 performs _A *= a in place, also updates eigen values More...
 
template<typename T2 >
FactorizedRankTwoTensorTempl< T > operator* (const T2 &a) const
 returns _A * a, also updates eigen values More...
 
FactorizedRankTwoTensorTempl< T > & operator/= (const typename T::value_type &a)
 performs _A /= a in place, also updates eigen values More...
 
template<typename T2 >
FactorizedRankTwoTensorTempl< T > operator/ (const T2 &a) const
 returns _A / a, also updates eigen values More...
 
bool operator== (const T &A) const
 Defines logical equality with another second order tensor. More...
 
bool operator== (const FactorizedRankTwoTensorTempl< T > &A) const
 Defines logical equality with another FactorizedRankTwoTensorTempl<T> More...
 
FactorizedRankTwoTensorTempl< T > inverse () const
 inverse of _A More...
 
void addIa (const typename T::value_type &a)
 add identity times a to _A More...
 
T::value_type trace () const
 trace of _A More...
 
T::value_type det () const
 determinant of _A More...
 
template<typename T2 = T>
T2 get () const
 
template<typename T2 = T>
T2 get ()
 
const std::vector< typename T::value_type > & eigvals () const
 
std::vector< typename T::value_type > eigvals ()
 
const RankTwoTensorTempl< typename T::value_type > & eigvecs () const
 
RankTwoTensorTempl< typename T::value_type > eigvecs ()
 
FactorizedRankTwoTensorTempl< T > & operator= (const FactorizedRankTwoTensorTempl< T > &A)
 
FactorizedRankTwoTensorTempl< T > & operator= (const T &A)
 

Private Member Functions

RankTwoTensorTempl< typename T::value_type > assemble () const
 

Private Attributes

std::vector< typename T::value_type > _eigvals
 
RankTwoTensorTempl< typename T::value_type > _eigvecs
 

Detailed Description

template<typename T>
class FactorizedRankTwoTensorTempl< T >

FactorizedRankTwoTensorTempl is designed to perform the spectral decomposition of an underlying symmetric second order tensor and reuse its bases for future operations if possible.

FactorizedRankTwoTensorTempl templates on the underlying second order tensor. IMPORTANT: the underlying second order tensor must be symmetric. A check is only performed in debug mode.

Only operations that reuses the known factorization are provided. Otherwise, you will need to first retrieve the underlying RankTwoTensorTempl to perform the operation.

TODO? Although I am calling it factorization, it only really refers to eigenvalue decompositon at this point. I am not sure if in the future we need to add other types of similarity transformation.

Definition at line 17 of file FactorizedRankTwoTensor.h.

Member Typedef Documentation

◆ value_type

template<typename T>
typedef T::value_type FactorizedRankTwoTensorTempl< T >::value_type

For generic programming.

Definition at line 39 of file FactorizedRankTwoTensor.h.

Constructor & Destructor Documentation

◆ FactorizedRankTwoTensorTempl() [1/4]

template<typename T>
FactorizedRankTwoTensorTempl< T >::FactorizedRankTwoTensorTempl ( )
delete

No default constructor.

◆ FactorizedRankTwoTensorTempl() [2/4]

template<typename T>
FactorizedRankTwoTensorTempl< T >::FactorizedRankTwoTensorTempl ( const FactorizedRankTwoTensorTempl< T > &  A)
default

Copy constructor.

◆ FactorizedRankTwoTensorTempl() [3/4]

template<typename T>
FactorizedRankTwoTensorTempl< T >::FactorizedRankTwoTensorTempl ( const T &  A)
inline

Constructor if the factorization isn't known a priori.

Definition at line 48 of file FactorizedRankTwoTensor.h.

49  {
50  if (!A.isSymmetric())
51  mooseError("The tensor is not symmetric.");
52  A.symmetricEigenvaluesEigenvectors(_eigvals, _eigvecs);
53  }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:302
RankTwoTensorTempl< typename T::value_type > _eigvecs
std::vector< typename T::value_type > _eigvals

◆ FactorizedRankTwoTensorTempl() [4/4]

template<typename T>
FactorizedRankTwoTensorTempl< T >::FactorizedRankTwoTensorTempl ( const std::vector< typename T::value_type > &  eigvals,
const RankTwoTensorTempl< typename T::value_type > &  eigvecs 
)
inline

Definition at line 59 of file FactorizedRankTwoTensor.h.

62  {
63  }
const RankTwoTensorTempl< typename T::value_type > & eigvecs() const
RankTwoTensorTempl< typename T::value_type > _eigvecs
std::vector< typename T::value_type > _eigvals
const std::vector< typename T::value_type > & eigvals() const

Member Function Documentation

◆ addIa()

template<typename T >
void FactorizedRankTwoTensorTempl< T >::addIa ( const typename T::value_type &  a)

add identity times a to _A

Definition at line 97 of file FactorizedRankTwoTensor.C.

98 {
99  for (auto & eigval : _eigvals)
100  eigval += a;
101 }
std::vector< typename T::value_type > _eigvals

◆ assemble()

template<typename T>
RankTwoTensorTempl<typename T::value_type> FactorizedRankTwoTensorTempl< T >::assemble ( ) const
inlineprivate

Definition at line 130 of file FactorizedRankTwoTensor.h.

Referenced by FactorizedRankTwoTensorTempl< T >::get().

131  {
133  return _eigvals[0] * R2T::selfOuterProduct(_eigvecs.column(0)) +
134  _eigvals[1] * R2T::selfOuterProduct(_eigvecs.column(1)) +
135  _eigvals[2] * R2T::selfOuterProduct(_eigvecs.column(2));
136  }
RankTwoTensorTempl< typename T::value_type > _eigvecs
std::vector< typename T::value_type > _eigvals
libMesh::VectorValue< T > column(const unsigned int i) const
Get the i-th column of the second order tensor.

◆ det()

template<typename T >
T::value_type FactorizedRankTwoTensorTempl< T >::det ( ) const

determinant of _A

Definition at line 112 of file FactorizedRankTwoTensor.C.

113 {
114  return _eigvals[0] * _eigvals[1] * _eigvals[2];
115 }
std::vector< typename T::value_type > _eigvals

◆ eigvals() [1/2]

template<typename T>
const std::vector<typename T::value_type>& FactorizedRankTwoTensorTempl< T >::eigvals ( ) const
inline

Definition at line 76 of file FactorizedRankTwoTensor.h.

76 { return _eigvals; }
std::vector< typename T::value_type > _eigvals

◆ eigvals() [2/2]

template<typename T>
std::vector<typename T::value_type> FactorizedRankTwoTensorTempl< T >::eigvals ( )
inline

Definition at line 77 of file FactorizedRankTwoTensor.h.

77 { return _eigvals; }
std::vector< typename T::value_type > _eigvals

◆ eigvecs() [1/2]

template<typename T>
const RankTwoTensorTempl<typename T::value_type>& FactorizedRankTwoTensorTempl< T >::eigvecs ( ) const
inline

Definition at line 78 of file FactorizedRankTwoTensor.h.

78 { return _eigvecs; }
RankTwoTensorTempl< typename T::value_type > _eigvecs

◆ eigvecs() [2/2]

template<typename T>
RankTwoTensorTempl<typename T::value_type> FactorizedRankTwoTensorTempl< T >::eigvecs ( )
inline

Definition at line 79 of file FactorizedRankTwoTensor.h.

79 { return _eigvecs; }
RankTwoTensorTempl< typename T::value_type > _eigvecs

◆ get() [1/2]

template<typename T>
template<typename T2 = T>
T2 FactorizedRankTwoTensorTempl< T >::get ( ) const
inline

Definition at line 67 of file FactorizedRankTwoTensor.h.

Referenced by FactorizedRankTwoTensorTempl< T >::operator==().

68  {
69  return static_cast<T2>(assemble());
70  }
RankTwoTensorTempl< typename T::value_type > assemble() const

◆ get() [2/2]

template<typename T>
template<typename T2 = T>
T2 FactorizedRankTwoTensorTempl< T >::get ( )
inline

Definition at line 72 of file FactorizedRankTwoTensor.h.

73  {
74  return static_cast<T2>(assemble());
75  }
RankTwoTensorTempl< typename T::value_type > assemble() const

◆ inverse()

template<typename T >
FactorizedRankTwoTensorTempl< T > FactorizedRankTwoTensorTempl< T >::inverse ( ) const

inverse of _A

Definition at line 89 of file FactorizedRankTwoTensor.C.

90 {
91  return FactorizedRankTwoTensorTempl<T>({1 / _eigvals[0], 1 / _eigvals[1], 1 / _eigvals[2]},
92  _eigvecs);
93 }
RankTwoTensorTempl< typename T::value_type > _eigvecs
std::vector< typename T::value_type > _eigvals
FactorizedRankTwoTensorTempl is designed to perform the spectral decomposition of an underlying symme...

◆ operator*()

template<typename T >
template<typename T2 >
FactorizedRankTwoTensorTempl< T > FactorizedRankTwoTensorTempl< T >::operator* ( const T2 &  a) const

returns _A * a, also updates eigen values

Definition at line 264 of file FactorizedRankTwoTensor.h.

265 {
266  if constexpr (libMesh::ScalarTraits<T2>::value)
267  {
269  for (auto & eigval : A._eigvals)
270  eigval *= a;
271  return A;
272  }
273 }
std::vector< typename T::value_type > _eigvals
FactorizedRankTwoTensorTempl is designed to perform the spectral decomposition of an underlying symme...

◆ operator*=()

template<typename T >
FactorizedRankTwoTensorTempl< T > & FactorizedRankTwoTensorTempl< T >::operator*= ( const typename T::value_type &  a)

performs _A *= a in place, also updates eigen values

Definition at line 54 of file FactorizedRankTwoTensor.C.

55 {
56  for (auto & eigval : _eigvals)
57  eigval *= a;
58  return *this;
59 }
std::vector< typename T::value_type > _eigvals

◆ operator/()

template<typename T >
template<typename T2 >
FactorizedRankTwoTensorTempl< T > FactorizedRankTwoTensorTempl< T >::operator/ ( const T2 &  a) const

returns _A / a, also updates eigen values

Definition at line 278 of file FactorizedRankTwoTensor.h.

279 {
280  if constexpr (libMesh::ScalarTraits<T2>::value)
281  {
283  for (auto & eigval : A._eigvals)
284  eigval /= a;
285  return A;
286  }
287 }
std::vector< typename T::value_type > _eigvals
FactorizedRankTwoTensorTempl is designed to perform the spectral decomposition of an underlying symme...

◆ operator/=()

template<typename T >
FactorizedRankTwoTensorTempl< T > & FactorizedRankTwoTensorTempl< T >::operator/= ( const typename T::value_type &  a)

performs _A /= a in place, also updates eigen values

Definition at line 63 of file FactorizedRankTwoTensor.C.

64 {
65  for (auto & eigval : _eigvals)
66  eigval /= a;
67  return *this;
68 }
std::vector< typename T::value_type > _eigvals

◆ operator=() [1/2]

template<typename T >
FactorizedRankTwoTensorTempl< T > & FactorizedRankTwoTensorTempl< T >::operator= ( const FactorizedRankTwoTensorTempl< T > &  A)

Definition at line 37 of file FactorizedRankTwoTensor.C.

38 {
39  _eigvals = A._eigvals;
40  _eigvecs = A._eigvecs;
41  return *this;
42 }
RankTwoTensorTempl< typename T::value_type > _eigvecs
std::vector< typename T::value_type > _eigvals

◆ operator=() [2/2]

template<typename T >
FactorizedRankTwoTensorTempl< T > & FactorizedRankTwoTensorTempl< T >::operator= ( const T &  A)

Definition at line 46 of file FactorizedRankTwoTensor.C.

47 {
48  A.symmetricEigenvaluesEigenvectors(_eigvals, _eigvecs);
49  return *this;
50 }
RankTwoTensorTempl< typename T::value_type > _eigvecs
std::vector< typename T::value_type > _eigvals

◆ operator==() [1/2]

template<typename T >
bool FactorizedRankTwoTensorTempl< T >::operator== ( const T &  A) const

Defines logical equality with another second order tensor.

Definition at line 72 of file FactorizedRankTwoTensor.C.

73 {
74  T me = get();
75  return me == A;
76 }

◆ operator==() [2/2]

template<typename T >
bool FactorizedRankTwoTensorTempl< T >::operator== ( const FactorizedRankTwoTensorTempl< T > &  A) const

Defines logical equality with another FactorizedRankTwoTensorTempl<T>

Definition at line 80 of file FactorizedRankTwoTensor.C.

81 {
82  T me = get();
83  T you = A.get();
84  return me == you;
85 }

◆ print()

template<typename T >
void FactorizedRankTwoTensorTempl< T >::print ( std::ostream &  stm = Moose::out) const

Definition at line 16 of file FactorizedRankTwoTensor.C.

17 {
18  this->get().print(stm);
19 }
void print(std::ostream &stm=Moose::out) const

◆ rotated()

template<typename T >
FactorizedRankTwoTensorTempl< T > FactorizedRankTwoTensorTempl< T >::rotated ( const RankTwoTensorTempl< typename T::value_type > &  R) const

Definition at line 23 of file FactorizedRankTwoTensor.C.

24 {
26 }
RankTwoTensorTempl< typename T::value_type > _eigvecs
std::vector< typename T::value_type > _eigvals
FactorizedRankTwoTensorTempl is designed to perform the spectral decomposition of an underlying symme...

◆ trace()

template<typename T >
T::value_type FactorizedRankTwoTensorTempl< T >::trace ( ) const

trace of _A

Definition at line 105 of file FactorizedRankTwoTensor.C.

106 {
107  return _eigvals[0] + _eigvals[1] + _eigvals[2];
108 }
std::vector< typename T::value_type > _eigvals

◆ transpose()

template<typename T >
FactorizedRankTwoTensorTempl< T > FactorizedRankTwoTensorTempl< T >::transpose ( ) const

Returns the transpose of _A.

Definition at line 30 of file FactorizedRankTwoTensor.C.

31 {
32  return *this;
33 }

Member Data Documentation

◆ _eigvals

template<typename T>
std::vector<typename T::value_type> FactorizedRankTwoTensorTempl< T >::_eigvals
private

◆ _eigvecs

template<typename T>
RankTwoTensorTempl<typename T::value_type> FactorizedRankTwoTensorTempl< T >::_eigvecs
private

The documentation for this class was generated from the following files: