OGS
ThermoRichardsMechanics/ConstitutiveStress_StrainTemperature/ConstitutiveSetting.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
6#include <Eigen/LU>
7
11
13{
15{
16template <int DisplacementDim>
18{
19 INFO(
20 "Checking correct model evaluation order in the constitutive setting.");
21
22 using namespace boost::mp11;
23
24 constexpr auto D = DisplacementDim;
25
26 using Inputs = mp_list<SpaceTimeData, MediaData, TemperatureData<D>,
28
29 using InputsAndPrevState = mp_append<Inputs, StatefulDataPrev<D>>;
30
31 bool const is_correct = ProcessLib::Graph::isEvalOrderCorrectRT<
32 ConstitutiveModels<DisplacementDim>, InputsAndPrevState>();
33
34 if (!is_correct)
35 {
36 OGS_FATAL("The constitutive setting has a wrong evaluation order.");
37 }
38
39 INFO("Model evaluation order is correct.");
40
41 return is_correct;
42}
43
44template <int DisplacementDim>
46 ConstitutiveModels<DisplacementDim>& models, double const t,
47 double const dt, ParameterLib::SpatialPosition const& x_position,
48 MediaData const& media_data, TemperatureData<DisplacementDim> const& T_data,
50 StatefulDataPrev<DisplacementDim>& prev_state) const
51{
52 [[maybe_unused]] static const bool model_order_correct =
54
55 // Set eps_m_prev from potentially non-zero eps and sigma_sw from
56 // restart.
57 SpaceTimeData const x_t{x_position, t, dt};
59 std::get<ElasticTangentStiffnessModel<DisplacementDim>>(models).eval(
60 x_t, T_data, C_el_data);
61
62 auto const& eps = std::get<StrainData<DisplacementDim>>(state).eps;
63 auto const& sigma_sw =
64 std::get<SwellingDataStateful<DisplacementDim>>(state).sigma_sw;
65 std::get<PrevState<MechanicalStrainData<DisplacementDim>>>(prev_state)
66 ->eps_m.noalias() =
67 media_data.solid.hasProperty(
69 ? eps + C_el_data.C_el.inverse() * sigma_sw
70 : eps;
71}
72
73template <int DisplacementDim>
75 ConstitutiveModels<DisplacementDim>& models, double const t,
76 double const dt, ParameterLib::SpatialPosition const& x_position,
77 MaterialPropertyLib::Medium const& medium,
80 KelvinVector<DisplacementDim> const& eps_arg,
82 StatefulDataPrev<DisplacementDim> const& prev_state,
87{
88 auto const aux_data = std::tuple{SpaceTimeData{x_position, t, dt},
89 MediaData{medium}, T_data, p_cap_data};
90
91 auto const mat_state_tuple = std::tie(mat_state);
92
93 // TODO will eps lag one iteration behind? (since it's not updated after
94 // solving the global equation system)
95 std::get<StrainData<DisplacementDim>>(state).eps.noalias() = eps_arg;
96
97 ProcessLib::Graph::evalAllInOrder(models, aux_data, cd, mat_state_tuple,
98 out, prev_state, state, tmp);
99
100 // TODO why not ordinary state tracking for BishopsPrevModel?
101
102 {
103 auto const& biot_data = std::get<BiotData>(tmp);
104 auto const& poro_data = std::get<PorosityData>(state);
105
106 if (biot_data() < poro_data.phi)
107 {
108 OGS_FATAL(
109 "ThermoRichardsMechanics: Biot-coefficient {} is smaller than "
110 "porosity {} in element {}.",
111 biot_data(), poro_data.phi, *x_position.getElementID());
112 }
113 }
114}
115
116template struct ConstitutiveSetting<2>;
117template struct ConstitutiveSetting<3>;
118
119} // namespace ConstitutiveStress_StrainTemperature
120} // namespace ProcessLib::ThermoRichardsMechanics
#define OGS_FATAL(...)
Definition Error.h:19
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:28
bool hasProperty(PropertyType const &p) const
Definition Phase.cpp:60
std::optional< std::size_t > getElementID() const
KV::KelvinVectorType< DisplacementDim > KelvinVector
void evalAllInOrder(Functions &fs, Tuples &... ts)
Definition Apply.h:288
std::tuple< ElasticTangentStiffnessModel< DisplacementDim >, BiotModel, SolidCompressibilityModel< DisplacementDim, SolidConstitutiveRelation< DisplacementDim > >, SaturationModel< DisplacementDim >, BishopsModel, BishopsPrevModel, PorosityModel< DisplacementDim >, SwellingModel< DisplacementDim >, SolidThermalExpansionModel< DisplacementDim >, SolidMechanicsModel< DisplacementDim >, LiquidDensityModel< DisplacementDim >, SolidDensityModel< DisplacementDim >, GravityModel< DisplacementDim >, LiquidViscosityModel< DisplacementDim >, TransportPorosityModel< DisplacementDim >, PermeabilityModel< DisplacementDim >, ThermoOsmosisModel< DisplacementDim >, DarcyLawModel< DisplacementDim >, TRMHeatStorageAndFluxModel< DisplacementDim >, TRMVaporDiffusionModel< DisplacementDim >, FluidThermalExpansionModel< DisplacementDim >, TRMStorageModel< DisplacementDim >, EqPModel< DisplacementDim >, EqTModel< DisplacementDim > > ConstitutiveModels
Constitutive models used for assembly.
std::tuple< DarcyLawData< DisplacementDim >, LiquidDensityData, LiquidViscosityData, SolidDensityData, PermeabilityData< DisplacementDim > > OutputData
Data that is needed for output purposes, but not directly for the assembly.
std::tuple< SaturationData, PorosityData, TransportPorosityData, StrainData< DisplacementDim >, SwellingDataStateful< DisplacementDim >, ProcessLib::ConstitutiveRelations::MechanicalStrainData< DisplacementDim >, ProcessLib::ConstitutiveRelations::EffectiveStressData< DisplacementDim > > StatefulData
Data whose state must be tracked by the TRM process.
std::tuple< SolidMechanicsDataStateless< DisplacementDim >, TotalStressData< DisplacementDim >, GravityData< DisplacementDim >, TRMHeatStorageAndFluxData< DisplacementDim >, TRMVaporDiffusionData< DisplacementDim >, TRMStorageData, EqPData< DisplacementDim >, EqTData< DisplacementDim >, ThermoOsmosisData< DisplacementDim > > ConstitutiveData
Data that is needed for the equation system assembly.
std::tuple< SwellingDataStateless< DisplacementDim >, ElasticTangentStiffnessData< DisplacementDim >, BiotData, SolidCompressibilityData, SaturationDataDeriv, BishopsData, PrevState< BishopsData >, SolidThermalExpansionData< DisplacementDim >, FluidThermalExpansionData, EquivalentPlasticStrainData > ConstitutiveTempData
void init(ConstitutiveModels< DisplacementDim > &models, double const t, double const dt, ParameterLib::SpatialPosition const &x_position, MediaData const &media_data, TemperatureData< DisplacementDim > const &T_data, StatefulData< DisplacementDim > &state, StatefulDataPrev< DisplacementDim > &prev_state) const
void eval(ConstitutiveModels< DisplacementDim > &models, double const t, double const dt, ParameterLib::SpatialPosition const &x_position, MaterialPropertyLib::Medium const &medium, TemperatureData< DisplacementDim > const &T_data, CapillaryPressureData< DisplacementDim > const &p_cap_data, KelvinVector< DisplacementDim > const &eps_arg, StatefulData< DisplacementDim > &state, StatefulDataPrev< DisplacementDim > const &prev_state, MaterialStateData< DisplacementDim > &mat_state, ConstitutiveTempData< DisplacementDim > &tmp, OutputData< DisplacementDim > &out, ConstitutiveData< DisplacementDim > &cd) const
Evaluate the constitutive setting.