OGS
LinearElasticIsotropicSoftening.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 LinearElasticIsotropicSoftening : 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 =
64
66 P const& strength)
67 : _mp(std::move(material_properties)), _strength(std::move(strength))
68 {
69 }
70
72 double const /*t*/,
74 double const /*dt*/,
75 KelvinVector const& eps,
76 KelvinVector const& sigma,
78 MaterialStateVariables const& /* material_state_variables */)
79 const override
80 {
81 return eps.dot(sigma) / 2;
82 }
83
84 std::optional<
85 std::tuple<typename MechanicsBase<DisplacementDim>::KelvinVector,
86 std::unique_ptr<typename MechanicsBase<
87 DisplacementDim>::MaterialStateVariables>,
90 MaterialPropertyLib::VariableArray const& variable_array_prev,
91 MaterialPropertyLib::VariableArray const& variable_array,
92 double const t, ParameterLib::SpatialPosition const& x,
93 double const /*dt*/,
95 material_state_variables) const override;
96
97 KelvinMatrix getElasticTensor(double const t,
99 double const T) const;
100
102
103 double getBulkModulus(double const t,
105 KelvinMatrix const* const /*C*/) const override
106 {
107 return _mp.bulk_modulus(t, x);
108 }
109
110protected:
112 P const& _strength;
113};
114
115extern template class LinearElasticIsotropicSoftening<2>;
116extern template class LinearElasticIsotropicSoftening<3>;
117
118} // namespace Solids
119} // namespace MaterialLib
double lambda(double const t, X const &x) const
Lamé's first parameter.
double mu(double const t, X const &x) const
Lamé's second parameter, the shear modulus.
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
KelvinMatrix getElasticTensor(double const t, ParameterLib::SpatialPosition const &x, double const T) const
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
LinearElasticIsotropicSoftening(MaterialProperties material_properties, P const &strength)
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
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