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 std::vector<typename T::value_type> op_eigvals; \ 150 for (const auto & eigval : A.eigvals()) \ 151 op_eigvals.push_back(operator); \ 152 return FactorizedRankTwoTensorTempl<T>(op_eigvals, A.eigvecs()); \ 155 #define FactorizedRankTwoTensorOperatorMapUnary(operatorname, operator) \ 156 template <typename T> \ 157 FactorizedRankTwoTensorTempl<T> operatorname(const FactorizedRankTwoTensorTempl<T> & A) \ 159 FactorizedRankTwoTensorOperatorMapBody(operator) \ 161 static_assert(true, "") 163 #define FactorizedRankTwoTensorOperatorMapBinary(operatorname, operator) \ 164 template <typename T, typename T2> \ 165 FactorizedRankTwoTensorTempl<T> operatorname(const FactorizedRankTwoTensorTempl<T> & A, \ 168 if constexpr (libMesh::ScalarTraits<T2>::value) \ 170 FactorizedRankTwoTensorOperatorMapBody(operator) \ 173 static_assert(true, "") 175 #define FactorizedRankTwoTensorOperatorMapDerivativeBody(operator, derivative) \ 177 std::vector<typename T::value_type> op_eigvals, op_derivs; \ 178 for (const auto & eigval : A.eigvals()) \ 180 op_eigvals.push_back(operator); \ 181 op_derivs.push_back(derivative); \ 184 RankFourTensorTempl<typename T::value_type> P, Gab, Gba; \ 185 typedef RankTwoTensorTempl<typename T::value_type> R2T; \ 187 for (auto a : make_range(3)) \ 189 const auto Ma = R2T::selfOuterProduct(A.eigvecs().column(a)); \ 190 P += op_derivs[a] * Ma.outerProduct(Ma); \ 193 for (auto a : make_range(3)) \ 194 for (auto b : make_range(a)) \ 196 const auto Ma = R2T::selfOuterProduct(A.eigvecs().column(a)); \ 197 const auto Mb = R2T::selfOuterProduct(A.eigvecs().column(b)); \ 199 usingTensorIndices(i_, j_, k_, l_); \ 200 Gab = Ma.template times<i_, k_, j_, l_>(Mb) + Ma.template times<i_, l_, j_, k_>(Mb); \ 201 Gba = Mb.template times<i_, k_, j_, l_>(Ma) + Mb.template times<i_, l_, j_, k_>(Ma); \ 204 if (!MooseUtils::absoluteFuzzyEqual(A.eigvals()[a], A.eigvals()[b])) \ 205 theta_ab = 0.5 * (op_eigvals[a] - op_eigvals[b]) / (A.eigvals()[a] - A.eigvals()[b]); \ 207 theta_ab = 0.25 * (op_derivs[a] + op_derivs[b]); \ 209 P += theta_ab * (Gab + Gba); \ 214 #define FactorizedRankTwoTensorOperatorMapDerivativeUnary(derivativename, operator, derivative) \ 215 template <typename T> \ 216 RankFourTensorTempl<typename T::value_type> derivativename( \ 217 const FactorizedRankTwoTensorTempl<T> & A) \ 219 FactorizedRankTwoTensorOperatorMapDerivativeBody(operator, derivative) \ 221 static_assert(true, "") 223 #define FactorizedRankTwoTensorOperatorMapDerivativeBinary(derivativename, operator, derivative) \ 224 template <typename T, typename T2> \ 225 RankFourTensorTempl<typename T::value_type> derivativename( \ 226 const FactorizedRankTwoTensorTempl<T> & A, const T2 & arg) \ 228 if constexpr (libMesh::ScalarTraits<T2>::value) \ 230 FactorizedRankTwoTensorOperatorMapDerivativeBody(operator, derivative) \ 233 static_assert(true, "") 261 template <
typename T>
262 template <
typename T2>
275 template <
typename T>
276 template <
typename T2>
T::value_type trace() const
trace of _A
std::vector< typename T::value_type > eigvals()
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 > & 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
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
const RankTwoTensorTempl< typename T::value_type > & eigvecs() const
RankTwoTensorTempl< typename T::value_type > _eigvecs
std::vector< typename T::value_type > _eigvals
FactorizedRankTwoTensorOperatorMapDerivativeUnary(dlog, std::log(eigval), 1/eigval)
FactorizedRankTwoTensorTempl< T > operator*(const T2 &a) const
returns _A * a, also updates eigen values
FactorizedRankTwoTensorTempl< ADSymmetricRankTwoTensor > ADFactorizedSymmetricRankTwoTensor
FactorizedRankTwoTensorTempl(const std::vector< typename T::value_type > &eigvals, const RankTwoTensorTempl< typename T::value_type > &eigvecs)
FactorizedRankTwoTensorTempl< T > transpose() const
Returns the transpose of _A.
FactorizedRankTwoTensorTempl< SymmetricRankTwoTensor > FactorizedSymmetricRankTwoTensor
FactorizedRankTwoTensorOperatorMapBinary(pow, std::pow(eigval, arg))
FactorizedRankTwoTensorTempl is designed to perform the spectral decomposition of an underlying symme...
RankTwoTensorTempl< typename T::value_type > eigvecs()
libMesh::VectorValue< T > column(const unsigned int i) const
Get the i-th column of the second order tensor.
const std::vector< typename T::value_type > & eigvals() const
FactorizedRankTwoTensorTempl< RankTwoTensor > FactorizedRankTwoTensor
FactorizedRankTwoTensorOperatorMapUnary(log, std::log(eigval))
FactorizedRankTwoTensorTempl()=delete
No default constructor.
void print(std::ostream &stm=Moose::out) const
void addIa(const typename T::value_type &a)
add identity times a to _A
FactorizedRankTwoTensorTempl(const T &A)
Constructor if the factorization isn't known a priori.
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
FactorizedRankTwoTensorTempl< T > & operator=(const FactorizedRankTwoTensorTempl< T > &A)
bool operator==(const T &A) const
Defines logical equality with another second order tensor.
RankTwoTensorTempl< typename T::value_type > assemble() const
MooseUnits pow(const MooseUnits &, int)
FactorizedRankTwoTensorTempl< T > inverse() const
inverse of _A
FactorizedRankTwoTensorOperatorMapDerivativeBinary(dpow, std::pow(eigval, arg), arg *std::pow(eigval, arg - 1))
FactorizedRankTwoTensorTempl< T > operator/(const T2 &a) const
returns _A / a, also updates eigen values
FactorizedRankTwoTensorTempl< ADRankTwoTensor > ADFactorizedRankTwoTensor