OGS
SolidModels/LinearElasticIsotropic.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include "MechanicsBase.h"
8
9namespace MaterialLib
10{
11namespace Solids
12{
13template <int DisplacementDim>
14class LinearElasticIsotropic : public MechanicsBase<DisplacementDim>
15{
16public:
19 {
22
23 public:
24 MaterialProperties(P const& youngs_modulus, P const& poissons_ratio)
25 : _youngs_modulus(youngs_modulus), _poissons_ratio(poissons_ratio)
26 {
27 }
28
30 double lambda(double const t, X const& x) const
31 {
32 return _youngs_modulus(t, x)[0] * _poissons_ratio(t, x)[0] /
33 (1 + _poissons_ratio(t, x)[0]) /
34 (1 - 2 * _poissons_ratio(t, x)[0]);
35 }
36
38 double mu(double const t, X const& x) const
39 {
40 return _youngs_modulus(t, x)[0] /
41 (2 * (1 + _poissons_ratio(t, x)[0]));
42 }
43
45 double bulk_modulus(double const t, X const& x) const
46 {
47 return _youngs_modulus(t, x)[0] /
48 (3 * (1 - 2 * _poissons_ratio(t, x)[0]));
49 }
50
51 private:
54 };
55
56public:
57 static int const KelvinVectorSize =
63
64 explicit LinearElasticIsotropic(MaterialProperties material_properties)
65 : _mp(std::move(material_properties))
66 {
67 }
68
70 double const /*t*/,
72 double const /*dt*/,
73 KelvinVector const& eps,
74 KelvinVector const& sigma,
76 MaterialStateVariables const& /* material_state_variables */)
77 const override
78 {
79 return eps.dot(sigma) / 2;
80 }
81
82 std::optional<
83 std::tuple<typename MechanicsBase<DisplacementDim>::KelvinVector,
84 std::unique_ptr<typename MechanicsBase<
85 DisplacementDim>::MaterialStateVariables>,
88 MaterialPropertyLib::VariableArray const& variable_array_prev,
89 MaterialPropertyLib::VariableArray const& variable_array,
90 double const t, ParameterLib::SpatialPosition const& x,
91 double const /*dt*/,
93 material_state_variables) const override;
94
95 KelvinMatrix getElasticTensor(double const t,
97 double const T) const;
98
100
101 double getBulkModulus(double const t,
103 KelvinMatrix const* const /*C*/) const override
104 {
105 return _mp.bulk_modulus(t, x);
106 }
107
108
109
110protected:
112};
113
114extern template class LinearElasticIsotropic<2>;
115extern template class LinearElasticIsotropic<3>;
116
117template <int DisplacementDim>
119elasticTangentStiffness(double const first_lame_parameter,
120 double const shear_modulus)
121{
122 using KelvinMatrix =
124
125 KelvinMatrix tangentStiffness = KelvinMatrix::Zero();
126 tangentStiffness.template topLeftCorner<3, 3>().setConstant(
127 first_lame_parameter);
128 tangentStiffness.noalias() += 2 * shear_modulus * KelvinMatrix::Identity();
129 return tangentStiffness;
130}
131
132} // namespace Solids
133} // namespace MaterialLib
double bulk_modulus(double const t, X const &x) const
the bulk modulus.
double mu(double const t, X const &x) const
Lamé's second parameter, the shear modulus.
double lambda(double const t, X const &x) const
Lamé's first parameter.
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
double computeFreeEnergyDensity(double const, ParameterLib::SpatialPosition const &, double const, KelvinVector const &eps, KelvinVector const &sigma, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &) const override
double getBulkModulus(double const t, ParameterLib::SpatialPosition const &x, KelvinMatrix const *const) const override
LinearElasticIsotropic(MaterialProperties material_properties)
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
KelvinMatrix getElasticTensor(double const t, ParameterLib::SpatialPosition const &x, double const T) const
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > elasticTangentStiffness(double const first_lame_parameter, double const shear_modulus)
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix