OGS
ThermoHydroMechanics/IntegrationPointData.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 <memory>
7
13
14namespace ProcessLib
15{
17{
18template <typename BMatricesType, typename ShapeMatrixTypeDisplacement,
19 typename ShapeMatricesTypePressure, int DisplacementDim, int NPoints>
21{
27 solid_material.createMaterialStateVariables())
28 {
29 // Initialize current time step values
30 static const int kelvin_vector_size =
32 sigma_eff.setZero(kelvin_vector_size);
33 sigma_eff_ice.setZero(kelvin_vector_size);
34 eps.setZero(kelvin_vector_size);
35 eps0.setZero(kelvin_vector_size);
36 eps0_prev.setZero(kelvin_vector_size);
37 eps_m.setZero(kelvin_vector_size);
38 eps_m_prev.resize(kelvin_vector_size);
39 eps_m_ice.setZero(kelvin_vector_size);
40 eps_m_ice_prev.resize(kelvin_vector_size);
41
42 // Previous time step values are not initialized and are set later.
43 sigma_eff_prev.resize(kelvin_vector_size);
44 sigma_eff_ice_prev.resize(kelvin_vector_size);
45 }
46
47 typename BMatricesType::KelvinVectorType sigma_eff, sigma_eff_prev;
48 typename BMatricesType::KelvinVectorType eps, eps0, eps0_prev;
49 typename BMatricesType::KelvinVectorType eps_m, eps_m_prev;
50
51 typename BMatricesType::KelvinVectorType sigma_eff_ice, sigma_eff_ice_prev;
52 typename BMatricesType::KelvinVectorType eps_m_ice, eps_m_ice_prev;
53
54 typename ShapeMatrixTypeDisplacement::NodalRowVectorType N_u;
55 typename ShapeMatrixTypeDisplacement::GlobalDimNodalMatrixType dNdx_u;
56
57 // Scalar shape matrices for pressure and temperature.
58 typename ShapeMatricesTypePressure::NodalRowVectorType N;
59 typename ShapeMatricesTypePressure::GlobalDimNodalMatrixType dNdx;
60
62 std::unique_ptr<typename MaterialLib::Solids::MechanicsBase<
63 DisplacementDim>::MaterialStateVariables>
65
66 double phi_fr = std::numeric_limits<double>::quiet_NaN();
67 double phi_fr_prev = std::numeric_limits<double>::quiet_NaN();
69
70 double porosity;
71
81
84 double const t,
85 ParameterLib::SpatialPosition const& x_position,
86 double const dt,
87 double const temperature)
88 {
89 namespace MPL = MaterialPropertyLib;
90
91 MPL::VariableArray variable_array;
92 MPL::VariableArray variable_array_prev;
93
95
96 variable_array.stress.emplace<KV>(KV::Zero());
97 variable_array.mechanical_strain.emplace<KV>(KV::Zero());
98 variable_array.temperature = temperature;
99
100 variable_array_prev.stress.emplace<KV>(KV::Zero());
101 variable_array_prev.mechanical_strain.emplace<KV>(KV::Zero());
102 variable_array_prev.temperature = temperature;
103
104 auto&& solution = solid_material.integrateStress(
105 variable_array_prev, variable_array, t, x_position, dt,
107
108 if (!solution)
109 {
110 OGS_FATAL("Computation of elastic tangent stiffness failed.");
111 }
112
114 std::move(std::get<2>(*solution));
115
116 return C;
117 }
118
119 typename BMatricesType::KelvinMatrixType updateConstitutiveRelation(
120 MaterialPropertyLib::VariableArray const& variable_array,
121 double const t,
122 ParameterLib::SpatialPosition const& x_position,
123 double const dt,
124 double const temperature_prev)
125 {
126 MaterialPropertyLib::VariableArray variable_array_prev;
127 variable_array_prev.stress
130 variable_array_prev.mechanical_strain
132 eps_m_prev);
133 variable_array_prev.temperature = temperature_prev;
134
135 auto&& solution = solid_material.integrateStress(
136 variable_array_prev, variable_array, t, x_position, dt,
138
139 if (!solution)
140 OGS_FATAL("Computation of local constitutive relation failed.");
141
143 std::tie(sigma_eff, material_state_variables, C) = std::move(*solution);
144
145 return C;
146 }
147
151 ice_constitutive_relation,
152 double const t,
153 ParameterLib::SpatialPosition const& x_position,
154 double const dt,
155 double const temperature)
156 {
157 namespace MPL = MaterialPropertyLib;
158
159 MPL::VariableArray variable_array;
160 MPL::VariableArray variable_array_prev;
161
162 auto const null_state =
163 ice_constitutive_relation.createMaterialStateVariables();
164 ice_constitutive_relation.initializeInternalStateVariables(
165 t, x_position, *null_state);
166
168
169 variable_array.stress.emplace<KV>(KV::Zero());
170 variable_array.mechanical_strain.emplace<KV>(KV::Zero());
171 variable_array.temperature = temperature;
172
173 variable_array_prev.stress.emplace<KV>(KV::Zero());
174 variable_array_prev.mechanical_strain.emplace<KV>(KV::Zero());
175 variable_array_prev.temperature = temperature;
176
177 auto&& solution =
178 solid_material.integrateStress(variable_array_prev, variable_array,
179 t, x_position, dt, *null_state);
180
181 if (!solution)
182 {
183 OGS_FATAL("Computation of elastic tangent stiffness failed.");
184 }
185
187 std::move(std::get<2>(*solution));
188
189 return C;
190 }
191
192 typename BMatricesType::KelvinMatrixType updateConstitutiveRelationIce(
194 ice_constitutive_relation,
195 MaterialPropertyLib::VariableArray const& variable_array,
196 double const t,
197 ParameterLib::SpatialPosition const& x_position,
198 double const dt,
199 double const temperature_prev)
200 {
201 MaterialPropertyLib::VariableArray variable_array_prev;
202
203 variable_array_prev.stress
206 variable_array_prev.mechanical_strain
209 variable_array_prev.temperature = temperature_prev;
210
211 // Extend for non-linear ice materials if necessary.
212 auto const null_state =
213 ice_constitutive_relation.createMaterialStateVariables();
214 ice_constitutive_relation.initializeInternalStateVariables(
215 t, x_position, *null_state);
216 auto&& solution = ice_constitutive_relation.integrateStress(
217 variable_array_prev, variable_array, t, x_position, dt,
218 *null_state);
219
220 if (!solution)
221 OGS_FATAL("Computation of local constitutive relation failed.");
222
224 std::tie(sigma_eff_ice, material_state_variables, C_IR) =
225 std::move(*solution);
226
227 return C_IR;
228 }
230};
231
232template <int DisplacementDim>
234{
236 // Darcy velocity for output. Care must be taken for the deactivated
237 // elements.
238 DimVector velocity = DimVector::Constant(
239 DisplacementDim, std::numeric_limits<double>::quiet_NaN());
240
241 double fluid_density = std::numeric_limits<double>::quiet_NaN();
242 double viscosity = std::numeric_limits<double>::quiet_NaN();
243 double rho_fr = std::numeric_limits<double>::quiet_NaN();
244};
245
246template <int DisplacementDim>
285
286} // namespace ThermoHydroMechanics
287} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
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
typename ::detail::EigenMatrixType< N, 1 >::type VectorType
typename ::detail::EigenMatrixType< N, M >::type MatrixType
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 std::unique_ptr< MaterialStateVariables > createMaterialStateVariables() const
typename MatrixPolicyType::MatrixType< DisplacementDim, DisplacementDim > DimMatrix
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > solid_linear_thermal_expansion_coefficient
BMatricesType::KelvinMatrixType updateConstitutiveRelation(MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x_position, double const dt, double const temperature_prev)
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > computeElasticTangentStiffness(double const t, ParameterLib::SpatialPosition const &x_position, double const dt, double const temperature)
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > computeElasticTangentStiffnessIce(MaterialLib::Solids::MechanicsBase< DisplacementDim > const &ice_constitutive_relation, double const t, ParameterLib::SpatialPosition const &x_position, double const dt, double const temperature)
BMatricesType::KelvinMatrixType updateConstitutiveRelationIce(MaterialLib::Solids::MechanicsBase< DisplacementDim > const &ice_constitutive_relation, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x_position, double const dt, double const temperature_prev)
IntegrationPointData(MaterialLib::Solids::MechanicsBase< DisplacementDim > const &solid_material)