OGS
LinearElasticOrthotropic.cpp
Go to the documentation of this file.
1 
11 
12 #include <Eigen/LU>
13 
15 
16 namespace MPL = MaterialPropertyLib;
17 
18 namespace MaterialLib
19 {
20 namespace Solids
21 {
22 template <int DisplacementDim>
23 std::optional<std::tuple<typename MechanicsBase<DisplacementDim>::KelvinVector,
24  std::unique_ptr<typename MechanicsBase<
25  DisplacementDim>::MaterialStateVariables>,
28  MaterialPropertyLib::VariableArray const& variable_array_prev,
29  MaterialPropertyLib::VariableArray const& variable_array, double const t,
30  ParameterLib::SpatialPosition const& x, double const /*dt*/,
32  MaterialStateVariables const& /*material_state_variables*/) const
33 {
34  auto const& eps_m = std::get<MPL::SymmetricTensor<DisplacementDim>>(
35  variable_array[static_cast<int>(MPL::Variable::mechanical_strain)]);
36  auto const& eps_m_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
37  variable_array_prev[static_cast<int>(
38  MPL::Variable::mechanical_strain)]);
39  auto const& sigma_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
40  variable_array_prev[static_cast<int>(MPL::Variable::stress)]);
41  auto const& T = std::get<double>(
42  variable_array_prev[static_cast<int>(MPL::Variable::temperature)]);
43 
44  KelvinMatrix C = getElasticTensor(t, x, T);
45 
46  KelvinVector sigma = sigma_prev + C * (eps_m - eps_m_prev);
47 
48  return {std::make_tuple(
49  sigma,
50  std::make_unique<
52  C)};
53 }
54 
55 template <int DisplacementDim>
58  double const t, ParameterLib::SpatialPosition const& x,
59  double const /*T*/) const
60 {
61  using namespace MathLib::KelvinVector;
62 
63  auto const& mp = _mp.evaluate(t, x);
64  auto const E = [&mp](int const i) { return mp.E(i); };
65  auto const G = [&mp](int const i, int const j) { return mp.G(i, j); };
66  auto const nu = [&mp](int const i, int const j) { return mp.nu(i, j); };
67 
69  // clang-format off
70  S_ortho.template topLeftCorner<3, 3>() <<
71  1. / E(1), -nu(2, 1) / E(2), -nu(3, 1) / E(3),
72  -nu(1, 2) / E(1), 1. / E(2), -nu(3, 2) / E(3),
73  -nu(1, 3) / E(1), -nu(2, 3) / E(2), 1. / E(3);
74 
75  S_ortho.template bottomRightCorner<3, 3>().diagonal() <<
76  1. / (2 * G(1, 2)),
77  1. / (2 * G(2, 3)),
78  1. / (2 * G(1, 3));
79  // clang-format on
80 
81  KelvinMatrixType<3> const C_ortho = S_ortho.inverse();
82  auto const Q = [this, &x]() -> KelvinMatrixType<3>
83  {
84  if (!_local_coordinate_system)
85  {
87  }
88  Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
89  R.template topLeftCorner<DisplacementDim, DisplacementDim>().noalias() =
90  _local_coordinate_system->transformation<DisplacementDim>(x);
91  return fourthOrderRotationMatrix(R);
92  }();
93 
94  // Rotate the forth-order tenser in Kelvin mapping with Q*C_ortho*Q^T and
95  // return the top left corner block of size 4x4 for two-dimensional case or
96  // the full 6x6 matrix is returned in the three-dimensional case.
97  return (Q * C_ortho * Q.transpose())
98  .template topLeftCorner<kelvin_vector_dimensions(DisplacementDim),
99  kelvin_vector_dimensions(DisplacementDim)>();
100 }
101 
102 template class LinearElasticOrthotropic<2>;
103 template class LinearElasticOrthotropic<3>;
104 
105 } // namespace Solids
106 } // namespace MaterialLib
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
std::optional< std::tuple< typename MechanicsBase< DisplacementDim >::KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, typename MechanicsBase< DisplacementDim >::KelvinMatrix > > integrateStress(MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
KelvinMatrix getElasticTensor(double const t, ParameterLib::SpatialPosition const &x, double const T) const
std::array< VariableType, static_cast< int >(Variable::number_of_variables)> VariableArray
Definition: VariableType.h:108
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
KelvinMatrixType< DisplacementDim > fourthOrderRotationMatrix(Eigen::Matrix< double, DisplacementDim, DisplacementDim, Eigen::ColMajor, DisplacementDim, DisplacementDim > const &transformation)
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
Definition: MechanicsBase.h:77