OGS
MechanicsBase.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 <functional>
7#include <memory>
8#include <optional>
9#include <span>
10#include <tuple>
11#include <vector>
12
13#include "BaseLib/Error.h"
16
17namespace ParameterLib
18{
19class SpatialPosition;
20}
21
22namespace MeshLib
23{
24class Element;
25}
26
27namespace MaterialLib
28{
29namespace Solids
30{
39
45template <int DisplacementDim>
47{
54 {
55 virtual ~MaterialStateVariables() = default;
56 virtual void pushBackState(){};
57 virtual double getEquivalentPlasticStrain() const { return 0.0; }
58 };
59
62 virtual std::unique_ptr<MaterialStateVariables>
64 {
65 return std::make_unique<MaterialStateVariables>();
66 }
67
69 double const /*t*/,
72 {
73 }
74
79
86 virtual std::optional<std::tuple<
87 KelvinVector, std::unique_ptr<MaterialStateVariables>, KelvinMatrix>>
89 MaterialPropertyLib::VariableArray const& variable_array_prev,
90 MaterialPropertyLib::VariableArray const& variable_array,
91 double const t,
93 double const dt,
94 MaterialStateVariables const& material_state_variables) const = 0;
95
98 {
99 using Getter = std::function<std::vector<double> const&(
100 MaterialStateVariables const&, std::vector<double>& /*cache*/)>;
102 std::function<std::span<double>(MaterialStateVariables&)>;
103
105 std::string const name;
106
108 int const num_components;
109
112
115 };
116
119 virtual std::vector<InternalVariable> getInternalVariables() const
120 {
121 return {};
122 }
123
129
130 virtual double getBulkModulus(
131 double const /*t*/,
133 KelvinMatrix const* const /*C*/ = nullptr) const
134 {
135 OGS_FATAL(
136 "getBulkModulus is not yet implemented for this Solid Material.");
137 }
138
142 double const /*t*/, double const /*dt*/,
143 ParameterLib::SpatialPosition const& /*x*/, double const /*T*/,
144 double const /*deviatoric_stress_norm*/) const
145 {
146 return 0.0;
147 }
148
150 double const t,
152 double const dt,
153 KelvinVector const& eps,
154 KelvinVector const& sigma,
155 MaterialStateVariables const& material_state_variables) const = 0;
156
157 virtual ~MechanicsBase() = default;
158};
159
160} // namespace Solids
161} // namespace MaterialLib
#define OGS_FATAL(...)
Definition Error.h:19
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
Helper type for providing access to internal variables.
Getter const getter
function accessing the internal variable
std::string const name
name of the internal variable
std::function< std::span< double >(MaterialStateVariables &)> WriteAccess
int const num_components
number of components of the internal variable
std::function< std::vector< double > const &( MaterialStateVariables const &, std::vector< double > &)> Getter
WriteAccess const reference
function accessing the internal variable
virtual ConstitutiveModel getConstitutiveModel() const
Gets the type of constitutive model.
virtual std::vector< InternalVariable > getInternalVariables() const
virtual std::optional< std::tuple< KelvinVector, std::unique_ptr< MaterialStateVariables >, KelvinMatrix > > integrateStress(MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, MaterialStateVariables const &material_state_variables) const =0
virtual void initializeInternalStateVariables(double const, ParameterLib::SpatialPosition const &, typename MechanicsBase< DisplacementDim >::MaterialStateVariables &) const
virtual double getBulkModulus(double const, ParameterLib::SpatialPosition const &, KelvinMatrix const *const =nullptr) const
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
virtual std::unique_ptr< MaterialStateVariables > createMaterialStateVariables() const
virtual double getTemperatureRelatedCoefficient(double const, double const, ParameterLib::SpatialPosition const &, double const, double const) const
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
virtual double computeFreeEnergyDensity(double const t, ParameterLib::SpatialPosition const &x, double const dt, KelvinVector const &eps, KelvinVector const &sigma, MaterialStateVariables const &material_state_variables) const =0