OGS
MFront.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 "MFrontGeneric.h"
7#include "Variable.h"
8
9namespace MaterialLib
10{
11namespace Solids
12{
13namespace MFront
14{
15template <int DisplacementDim>
16class MFront : private MFrontGeneric<DisplacementDim,
17 boost::mp11::mp_list<Strain>,
18 boost::mp11::mp_list<Stress>,
19 boost::mp11::mp_list<Temperature>>,
20 public MechanicsBase<DisplacementDim>
21{
22 using Base = MFrontGeneric<DisplacementDim,
23 boost::mp11::mp_list<Strain>,
24 boost::mp11::mp_list<Stress>,
25 boost::mp11::mp_list<Temperature>>;
28
29public:
30 using Base::Base;
31
32 std::unique_ptr<
38
40 double const t,
43 material_state_variables) const override
44 {
45 Base::initializeInternalStateVariables(t, x, material_state_variables);
46 }
47
48 std::optional<std::tuple<KelvinVector,
49 std::unique_ptr<typename MechanicsBase<
50 DisplacementDim>::MaterialStateVariables>,
53 MaterialPropertyLib::VariableArray const& variable_array_prev,
54 MaterialPropertyLib::VariableArray const& variable_array,
55 double const t,
57 double const dt,
59 material_state_variables) const override
60 {
61 auto res = Base::integrateStress(variable_array_prev,
62 variable_array,
63 t,
64 x,
65 dt,
66 material_state_variables);
67
68 if (!res)
69 {
70 return std::nullopt;
71 }
72
73 auto& [stress_data, state, tangent_operator_data] = *res;
74 auto const view = this->createThermodynamicForcesView();
75
76 auto const C =
77 blocks_view_.block(stress, strain, tangent_operator_data);
78
79 return std::optional<
80 std::tuple<KelvinVector,
81 std::unique_ptr<typename MechanicsBase<
82 DisplacementDim>::MaterialStateVariables>,
83 KelvinMatrix>>{std::in_place,
84 view.block(stress, stress_data),
85 std::move(state), C};
86 }
87
88 std::vector<typename MechanicsBase<DisplacementDim>::InternalVariable>
89 getInternalVariables() const override
90 {
91 return Base ::getInternalVariables();
92 }
93
94 double getBulkModulus(double const t,
96 KelvinMatrix const* const C) const override
97 {
98 return Base::getBulkModulus(t, x, C);
99 }
100
102 double const t,
104 double const dt,
105 KelvinVector const& eps,
106 KelvinVector const& sigma,
108 material_state_variables) const override
109 {
111 t, x, dt, eps, sigma, material_state_variables);
112 }
113
114private:
116 DisplacementDim,
118 boost::mp11::mp_list<Stress>,
119 boost::mp11::mp_list<Temperature>>::type>
121};
122
123extern template class MFront<2>;
124extern template class MFront<3>;
125
126} // namespace MFront
127} // namespace Solids
128} // namespace MaterialLib
std::optional< std::tuple< OGSMFrontThermodynamicForcesData, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, OGSMFrontTangentOperatorData > > integrateStress(MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const
double computeFreeEnergyDensity(double const, ParameterLib::SpatialPosition const &, double const, KelvinVector const &, KelvinVector const &, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &) const
void initializeInternalStateVariables(double const t, ParameterLib::SpatialPosition const &x, typename MechanicsBase< DisplacementDim >::MaterialStateVariables &material_state_variables) const
MFrontGeneric(mgis::behaviour::Behaviour &&behaviour, std::vector< ParameterLib::Parameter< double > const * > &&material_properties, std::map< std::string, ParameterLib::Parameter< double > const * > &&state_variables_initial_properties, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system)
std::optional< std::tuple< KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, KelvinMatrix > > integrateStress(MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
Definition MFront.h:52
std::vector< typename MechanicsBase< DisplacementDim >::InternalVariable > getInternalVariables() const override
Definition MFront.h:89
typename Base::KelvinMatrix KelvinMatrix
Definition MFront.h:27
void initializeInternalStateVariables(double const t, ParameterLib::SpatialPosition const &x, typename MechanicsBase< DisplacementDim >::MaterialStateVariables &material_state_variables) const override
Definition MFront.h:39
double getBulkModulus(double const t, ParameterLib::SpatialPosition const &x, KelvinMatrix const *const C) const override
Definition MFront.h:94
OGSMFrontTangentOperatorBlocksView< DisplacementDim, ForcesGradsCombinations< boost::mp11::mp_list< Strain >, boost::mp11::mp_list< Stress >, boost::mp11::mp_list< Temperature > >::type > blocks_view_
Definition MFront.h:120
double computeFreeEnergyDensity(double const t, ParameterLib::SpatialPosition const &x, double const dt, KelvinVector const &eps, KelvinVector const &sigma, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
Definition MFront.h:101
std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables > createMaterialStateVariables() const override
Definition MFront.h:34
typename Base::KelvinVector KelvinVector
Definition MFront.h:26
MFrontGeneric< DisplacementDim, boost::mp11::mp_list< Strain >, boost::mp11::mp_list< Stress >, boost::mp11::mp_list< Temperature > > Base
Definition MFront.h:22
static constexpr Strain strain
Instance that can be used for overload resolution/template type deduction.
Definition Variable.h:113
static constexpr Stress stress
Definition Variable.h:176