26 template <
int DisplacementDim>
39 double const degradation,
44 static int const KelvinVectorSize =
52 auto const& P_dev = Invariants::deviatoric_projection;
53 KelvinVector
const epsd_curr = P_dev * eps;
56 double const eps_curr_trace = Invariants::trace(eps);
58 KelvinMatrix C_tensile = KelvinMatrix::Zero();
59 KelvinMatrix C_compressive = KelvinMatrix::Zero();
61 if (eps_curr_trace >= 0)
63 double const strain_energy_tensile =
65 mu * epsd_curr.transpose() * epsd_curr;
66 KelvinVector
const sigma_tensile =
69 C_tensile.template topLeftCorner<3, 3>().setConstant(
bulk_modulus);
70 C_tensile.noalias() += 2 * mu * P_dev * KelvinMatrix::Identity();
71 double const elastic_energy = degradation * strain_energy_tensile;
72 KelvinVector
const sigma_real =
73 degradation * sigma_tensile;
74 return std::make_tuple(sigma_real, sigma_tensile, C_tensile,
75 C_compressive, strain_energy_tensile,
78 double const strain_energy_tensile = mu * epsd_curr.transpose() * epsd_curr;
79 KelvinVector
const sigma_tensile = 2 * mu * epsd_curr;
80 KelvinVector
const sigma_compressive =
82 C_tensile.noalias() = 2 * mu * P_dev * KelvinMatrix::Identity();
83 C_compressive.template topLeftCorner<3, 3>().setConstant(
bulk_modulus);
84 double const elastic_energy =
86 mu * epsd_curr.transpose() * epsd_curr;
87 KelvinVector
const sigma_real =
88 degradation * sigma_tensile + sigma_compressive;
89 return std::make_tuple(sigma_real, sigma_tensile, C_tensile, C_compressive,
90 strain_energy_tensile, elastic_energy);
std::tuple< MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, double, double > calculateDegradedStress(double const degradation, double const bulk_modulus, double const mu, MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps)
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType