14#include <dune/common/float_cmp.hh>
31namespace Ikarus::Materials::Impl {
40consteval auto createfreeVoigtIndices(
const std::array<MatrixIndexPair, size>& fixed) {
41 std::array<size_t, 6 - size> res{};
42 std::array<size_t, size> voigtFixedIndices;
43 std::ranges::transform(fixed, voigtFixedIndices.begin(), [](
auto pair) { return toVoigt(pair.row, pair.col); });
44 std::ranges::sort(voigtFixedIndices);
45 std::ranges::set_difference(std::ranges::iota_view(
size_t(0),
size_t(6)), voigtFixedIndices, res.begin());
46 std::ranges::sort(res);
57consteval auto createFixedVoigtIndices(
const std::array<MatrixIndexPair, size>& fixed) {
58 std::array<size_t, size> fixedIndices;
59 std::ranges::transform(fixed, fixedIndices.begin(), [](
auto pair) { return toVoigt(pair.row, pair.col); });
60 std::ranges::sort(fixedIndices);
71constexpr size_t countDiagonalIndices(
const std::array<MatrixIndexPair, size>& fixed) {
73 for (
auto v : fixed) {
86template <
typename Derived>
87decltype(
auto) maybeFromVoigt(
const Eigen::MatrixBase<Derived>& E) {
88 if constexpr (Concepts::EigenVector<Derived>) {
94template <
typename ScalarType>
95void checkPositiveOrAbort(ScalarType det) {
96 if (Dune::FloatCmp::le(
static_cast<double>(det), 0.0, 1e-10)) {
97 std::cerr <<
"Determinant of right Cauchy Green tensor C must be greater than zero. detC = " +
98 std::to_string(
static_cast<double>(det));
113template <
typename ScalarType,
typename Derived>
114auto principalStretches(
const Eigen::MatrixBase<Derived>& C,
int options = Eigen::ComputeEigenvectors) {
115 Eigen::SelfAdjointEigenSolver<Derived> eigensolver{};
117 eigensolver.compute(C, options);
119 if (eigensolver.info() != Eigen::Success)
120 DUNE_THROW(Dune::MathError,
"Failed to compute eigenvalues and eigenvectors of C.");
122 auto& eigenvalues = eigensolver.eigenvalues();
123 auto& eigenvectors = options == Eigen::ComputeEigenvectors ? eigensolver.eigenvectors() : Derived::Zero();
125 auto principalStretches = eigenvalues.cwiseSqrt().eval();
126 return std::make_pair(principalStretches, eigenvectors);
136template <Concepts::EigenVector3 Vector>
137inline Vector::Scalar determinantFromPrincipalValues(
const Vector& principalValues) {
138 return principalValues.prod();
149template <Concepts::EigenVector3 Vector>
150inline Vector deviatoricStretches(
const Vector& lambda) {
151 using ScalarType =
typename Vector::Scalar;
152 ScalarType J = determinantFromPrincipalValues(lambda);
153 ScalarType Jmod = pow(J, -1.0 / 3.0);
154 return Jmod * lambda;
164template <Concepts::EigenVector3 Vector>
165inline Vector invariants(
const Vector& lambda) {
166 using ScalarType =
typename Vector::Scalar;
167 auto lambdaSquared = lambda.array().square();
168 auto invariants = Vector::Zero().eval();
170 invariants[0] = lambdaSquared.sum();
172 lambdaSquared[0] * lambdaSquared[1] + lambdaSquared[1] * lambdaSquared[2] + lambdaSquared[0] * lambdaSquared[2];
173 invariants[2] = determinantFromPrincipalValues(lambdaSquared);
Helper for the Eigen::Tensor types.
auto fromVoigt(const Eigen::Matrix< ST, size, 1, Options, maxSize, 1 > &EVoigt, bool isStrain=true)
Converts a vector given in Voigt notation to a matrix.
Definition: tensorutils.hh:284
Definition: arrudaboyce.hh:27
Represents a pair of stress or strain matrix indices (row and column).
Definition: materialhelpers.hh:26
Eigen::Index col
Column index.
Definition: materialhelpers.hh:28
Eigen::Index row
Row index.
Definition: materialhelpers.hh:27