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 /*material_state_variables*/) const
73 {
74 }
75
80
87 virtual std::optional<std::tuple<
88 KelvinVector, std::unique_ptr<MaterialStateVariables>, KelvinMatrix>>
90 MaterialPropertyLib::VariableArray const& variable_array_prev,
91 MaterialPropertyLib::VariableArray const& variable_array,
92 double const t,
94 double const dt,
95 MaterialStateVariables const& material_state_variables) const = 0;
96
99 {
100 using Getter = std::function<std::vector<double> const&(
101 MaterialStateVariables const&, std::vector<double>& /*cache*/)>;
103 std::function<std::span<double>(MaterialStateVariables&)>;
104
106 std::string const name;
107
109 int const num_components = 0;
110
113
116 };
117
120 virtual std::vector<InternalVariable> getInternalVariables() const
121 {
122 return {};
123 }
124
130
131 virtual double getBulkModulus(
132 double const /*t*/,
134 KelvinMatrix const* const /*C*/ = nullptr) const
135 {
136 OGS_FATAL(
137 "getBulkModulus is not yet implemented for this Solid Material.");
138 }
139
143 double const /*t*/, double const /*dt*/,
144 ParameterLib::SpatialPosition const& /*x*/, double const /*T*/,
145 double const /*deviatoric_stress_norm*/) const
146 {
147 return 0.0;
148 }
149
151 double const t,
153 double const dt,
154 KelvinVector const& eps,
155 KelvinVector const& sigma,
156 MaterialStateVariables const& material_state_variables) const = 0;
157
158 virtual ~MechanicsBase() = default;
159};
160
161} // namespace Solids
162} // namespace MaterialLib
#define OGS_FATAL(...)
Definition Error.h:10
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