66 template <
typename T2 = T>
71 template <
typename T2 = T>
82 void print(std::ostream & stm = Moose::out)
const;
100 template <
typename T2>
107 template <
typename T2>
120 void addIa(
const typename T::value_type & a);
123 typename T::value_type
trace()
const;
126 typename T::value_type
det()
const;
147#define FactorizedRankTwoTensorOperatorMapBody(operator) \
149 using std::log, std::exp, std::sqrt, std::cbrt, std::pow; \
150 std::vector<typename T::value_type> op_eigvals; \
151 for (const auto & eigval : A.eigvals()) \
152 op_eigvals.push_back(operator); \
153 return FactorizedRankTwoTensorTempl<T>(op_eigvals, A.eigvecs()); \
156#define FactorizedRankTwoTensorOperatorMapUnary(operatorname, operator) \
157 template <typename T> \
158 FactorizedRankTwoTensorTempl<T> operatorname(const FactorizedRankTwoTensorTempl<T> & A) \
160 FactorizedRankTwoTensorOperatorMapBody(operator) \
162 static_assert(true, "")
164#define FactorizedRankTwoTensorOperatorMapBinary(operatorname, operator) \
165 template <typename T, typename T2> \
166 FactorizedRankTwoTensorTempl<T> operatorname(const FactorizedRankTwoTensorTempl<T> & A, \
169 if constexpr (libMesh::ScalarTraits<T2>::value) \
171 FactorizedRankTwoTensorOperatorMapBody(operator) \
174 static_assert(true, "")
176#define FactorizedRankTwoTensorOperatorMapDerivativeBody(operator, derivative) \
178 using std::log, std::exp, std::sqrt, std::cbrt, std::pow; \
179 std::vector<typename T::value_type> op_eigvals, op_derivs; \
180 for (const auto & eigval : A.eigvals()) \
182 op_eigvals.push_back(operator); \
183 op_derivs.push_back(derivative); \
186 RankFourTensorTempl<typename T::value_type> P, Gab, Gba; \
187 typedef RankTwoTensorTempl<typename T::value_type> R2T; \
189 for (auto a : make_range(3)) \
191 const auto Ma = R2T::selfOuterProduct(A.eigvecs().column(a)); \
192 P += op_derivs[a] * Ma.outerProduct(Ma); \
195 for (auto a : make_range(3)) \
196 for (auto b : make_range(a)) \
198 const auto Ma = R2T::selfOuterProduct(A.eigvecs().column(a)); \
199 const auto Mb = R2T::selfOuterProduct(A.eigvecs().column(b)); \
201 usingTensorIndices(i_, j_, k_, l_); \
202 Gab = Ma.template times<i_, k_, j_, l_>(Mb) + Ma.template times<i_, l_, j_, k_>(Mb); \
203 Gba = Mb.template times<i_, k_, j_, l_>(Ma) + Mb.template times<i_, l_, j_, k_>(Ma); \
206 if (!MooseUtils::absoluteFuzzyEqual(A.eigvals()[a], A.eigvals()[b])) \
207 theta_ab = 0.5 * (op_eigvals[a] - op_eigvals[b]) / (A.eigvals()[a] - A.eigvals()[b]); \
209 theta_ab = 0.25 * (op_derivs[a] + op_derivs[b]); \
211 P += theta_ab * (Gab + Gba); \
216#define FactorizedRankTwoTensorOperatorMapDerivativeUnary(derivativename, operator, derivative) \
217 template <typename T> \
218 RankFourTensorTempl<typename T::value_type> derivativename( \
219 const FactorizedRankTwoTensorTempl<T> & A) \
221 FactorizedRankTwoTensorOperatorMapDerivativeBody(operator, derivative) \
223 static_assert(true, "")
225#define FactorizedRankTwoTensorOperatorMapDerivativeBinary(derivativename, operator, derivative) \
226 template <typename T, typename T2> \
227 RankFourTensorTempl<typename T::value_type> derivativename( \
228 const FactorizedRankTwoTensorTempl<T> & A, const T2 & arg) \
230 if constexpr (libMesh::ScalarTraits<T2>::value) \
232 FactorizedRankTwoTensorOperatorMapDerivativeBody(operator, derivative) \
235 static_assert(true, "")
255 arg *
pow(eigval, arg - 1));
260template <
typename T2>
274template <
typename T2>
FactorizedRankTwoTensorTempl< RankTwoTensor > FactorizedRankTwoTensor
FactorizedRankTwoTensorTempl< ADRankTwoTensor > ADFactorizedRankTwoTensor
FactorizedRankTwoTensorTempl< SymmetricRankTwoTensor > FactorizedSymmetricRankTwoTensor
FactorizedRankTwoTensorTempl< ADSymmetricRankTwoTensor > ADFactorizedSymmetricRankTwoTensor
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
FactorizedRankTwoTensorTempl is designed to perform the spectral decomposition of an underlying symme...
FactorizedRankTwoTensorTempl(const T &A)
Constructor if the factorization isn't known a priori.
std::vector< typename T::value_type > eigvals()
FactorizedRankTwoTensorTempl(const std::vector< typename T::value_type > &eigvals, const RankTwoTensorTempl< typename T::value_type > &eigvecs)
RankTwoTensorTempl< typename T::value_type > assemble() const
FactorizedRankTwoTensorTempl< T > & operator*=(const typename T::value_type &a)
performs _A *= a in place, also updates eigen values
const std::vector< typename T::value_type > & eigvals() const
FactorizedRankTwoTensorTempl< T > transpose() const
Returns the transpose of _A.
FactorizedRankTwoTensorTempl< T > operator*(const T2 &a) const
returns _A * a, also updates eigen values
T::value_type trace() const
trace of _A
FactorizedRankTwoTensorTempl(const FactorizedRankTwoTensorTempl< T > &A)=default
Copy constructor.
FactorizedRankTwoTensorTempl()=delete
No default constructor.
T::value_type value_type
For generic programming.
FactorizedRankTwoTensorTempl< T > & operator/=(const typename T::value_type &a)
performs _A /= a in place, also updates eigen values
FactorizedRankTwoTensorTempl< T > rotated(const RankTwoTensorTempl< typename T::value_type > &R) const
T::value_type det() const
determinant of _A
RankTwoTensorTempl< typename T::value_type > eigvecs()
std::vector< typename T::value_type > _eigvals
FactorizedRankTwoTensorTempl< T > inverse() const
inverse of _A
FactorizedRankTwoTensorTempl< T > operator/(const T2 &a) const
returns _A / a, also updates eigen values
FactorizedRankTwoTensorTempl< T > & operator=(const FactorizedRankTwoTensorTempl< T > &A)
bool operator==(const T &A) const
Defines logical equality with another second order tensor.
void addIa(const typename T::value_type &a)
add identity times a to _A
RankTwoTensorTempl< typename T::value_type > _eigvecs
const RankTwoTensorTempl< typename T::value_type > & eigvecs() const
void print(std::ostream &stm=Moose::out) const
RankTwoTensorTempl is designed to handle the Stress or Strain Tensor for a fully anisotropic material...
libMesh::VectorValue< T > column(const unsigned int i) const
Get the i-th column of the second order tensor.
FactorizedRankTwoTensorOperatorMapUnary(log, log(eigval))
FactorizedRankTwoTensorOperatorMapBinary(pow, pow(eigval, arg))
FactorizedRankTwoTensorOperatorMapDerivativeBinary(dpow, pow(eigval, arg), arg *pow(eigval, arg - 1))
FactorizedRankTwoTensorOperatorMapDerivativeUnary(dlog, log(eigval), 1/eigval)