OGS
LinearElasticIsotropicPhaseField.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include "MathLib/KelvinVector.h"
13 
14 namespace MaterialLib
15 {
16 namespace Solids
17 {
18 namespace Phasefield
19 {
26 template <int DisplacementDim>
28  DisplacementDim> /* sigma_real */,
30  DisplacementDim> /* sigma_tensile */,
32  DisplacementDim> /* C_tensile */,
34  DisplacementDim> /* C_compressive */,
35  double /* strain_energy_tensile */,
36  double /* elastic_energy */
37  >
39  double const degradation,
40  double const bulk_modulus,
41  double const mu,
43 {
44  static int const KelvinVectorSize =
46  using KelvinVector =
48  using KelvinMatrix =
51  // calculation of deviatoric parts
52  auto const& P_dev = Invariants::deviatoric_projection;
53  KelvinVector const epsd_curr = P_dev * eps;
54 
55  // Hydrostatic part for the stress and the tangent.
56  double const eps_curr_trace = Invariants::trace(eps);
57 
58  KelvinMatrix C_tensile = KelvinMatrix::Zero();
59  KelvinMatrix C_compressive = KelvinMatrix::Zero();
60 
61  if (eps_curr_trace >= 0)
62  {
63  double const strain_energy_tensile =
64  bulk_modulus / 2 * eps_curr_trace * eps_curr_trace +
65  mu * epsd_curr.transpose() * epsd_curr;
66  KelvinVector const sigma_tensile =
67  bulk_modulus * eps_curr_trace * Invariants::identity2 +
68  2 * mu * epsd_curr;
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; // + sigma_compressive, which is zero;
74  return std::make_tuple(sigma_real, sigma_tensile, C_tensile,
75  C_compressive, strain_energy_tensile,
76  elastic_energy);
77  }
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 =
81  bulk_modulus * eps_curr_trace * Invariants::identity2;
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 =
85  bulk_modulus / 2 * eps_curr_trace * eps_curr_trace +
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);
91 }
92 } // namespace Phasefield
93 } // namespace Solids
94 } // namespace MaterialLib
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
Definition: KelvinVector.h:48
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Definition: KelvinVector.h:23
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
Definition: KelvinVector.h:56