version 0.4.1
materialhelpers.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2025 The Ikarus Developers mueller@ibb.uni-stuttgart.de
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#pragma once
5
12#include <ranges>
13
14#include <dune/common/float_cmp.hh>
15
16#include <Eigen/Dense>
17
20
21namespace Ikarus::Materials {
26{
27 Eigen::Index row;
28 Eigen::Index col;
29};
30} // namespace Ikarus::Materials
31namespace Ikarus::Materials::Impl {
32
39template <size_t size>
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);
47 return res;
48}
49
56template <size_t size>
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);
61 return fixedIndices;
62}
63
70template <size_t size>
71constexpr size_t countDiagonalIndices(const std::array<MatrixIndexPair, size>& fixed) {
72 size_t count = 0;
73 for (auto v : fixed) {
74 if (v.col == v.row)
75 ++count;
76 }
77 return count;
78}
79
86template <typename Derived>
87decltype(auto) maybeFromVoigt(const Eigen::MatrixBase<Derived>& E) {
88 if constexpr (Concepts::EigenVector<Derived>) { // receiving vector means Voigt notation
89 return fromVoigt(E.derived(), true);
90 } else
91 return E.derived();
92}
93
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));
99 abort();
100 }
101}
102
113template <typename ScalarType, typename Derived>
114auto principalStretches(const Eigen::MatrixBase<Derived>& C, int options = Eigen::ComputeEigenvectors) {
115 Eigen::SelfAdjointEigenSolver<Derived> eigensolver{};
116
117 eigensolver.compute(C, options);
118
119 if (eigensolver.info() != Eigen::Success)
120 DUNE_THROW(Dune::MathError, "Failed to compute eigenvalues and eigenvectors of C.");
121
122 auto& eigenvalues = eigensolver.eigenvalues();
123 auto& eigenvectors = options == Eigen::ComputeEigenvectors ? eigensolver.eigenvectors() : Derived::Zero();
124
125 auto principalStretches = eigenvalues.cwiseSqrt().eval();
126 return std::make_pair(principalStretches, eigenvectors);
127}
128
136template <Concepts::EigenVector3 Vector>
137inline Vector::Scalar determinantFromPrincipalValues(const Vector& principalValues) {
138 return principalValues.prod();
139}
140
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;
155}
156
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();
169
170 invariants[0] = lambdaSquared.sum();
171 invariants[1] =
172 lambdaSquared[0] * lambdaSquared[1] + lambdaSquared[1] * lambdaSquared[2] + lambdaSquared[0] * lambdaSquared[2];
173 invariants[2] = determinantFromPrincipalValues(lambdaSquared);
174
175 return invariants;
176}
177} // namespace Ikarus::Materials::Impl
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
Several concepts.