OGS
IntegrationPointData.h
Go to the documentation of this file.
1
11#pragma once
12
13#include <memory>
14
16
17namespace ProcessLib
18{
19namespace RichardsMechanics
20{
21template <typename BMatricesType, typename ShapeMatrixTypeDisplacement,
22 typename ShapeMatricesTypePressure, int DisplacementDim, int NPoints>
24{
30 solid_material.createMaterialStateVariables())
31 {
32 // Initialize current time step values
33 static const int kelvin_vector_size =
35 sigma_eff.setZero(kelvin_vector_size);
36 sigma_sw.setZero(kelvin_vector_size);
37 eps.setZero(kelvin_vector_size);
38 eps_m.setZero(kelvin_vector_size);
39
40 // Previous time step values are not initialized and are set later.
41 eps_prev.resize(kelvin_vector_size);
42 eps_m_prev.resize(kelvin_vector_size);
43 sigma_eff_prev.resize(kelvin_vector_size);
44 }
45
46 typename BMatricesType::KelvinVectorType sigma_eff, sigma_eff_prev;
47 typename BMatricesType::KelvinVectorType sigma_sw, sigma_sw_prev;
48 typename BMatricesType::KelvinVectorType eps, eps_prev;
49 typename BMatricesType::KelvinVectorType eps_m, eps_m_prev;
50
51 typename ShapeMatrixTypeDisplacement::NodalRowVectorType N_u;
52 typename ShapeMatrixTypeDisplacement::GlobalDimNodalMatrixType dNdx_u;
53
54 typename ShapeMatricesTypePressure::NodalRowVectorType N_p;
55 typename ShapeMatricesTypePressure::GlobalDimNodalMatrixType dNdx_p;
56
57 typename ShapeMatricesTypePressure::GlobalDimVectorType v_darcy;
58
59 double liquid_pressure_m = std::numeric_limits<double>::quiet_NaN();
60 double liquid_pressure_m_prev = std::numeric_limits<double>::quiet_NaN();
61 double saturation = std::numeric_limits<double>::quiet_NaN();
62 double saturation_prev = std::numeric_limits<double>::quiet_NaN();
63 double saturation_m = std::numeric_limits<double>::quiet_NaN();
64 double saturation_m_prev = std::numeric_limits<double>::quiet_NaN();
65 double porosity = std::numeric_limits<double>::quiet_NaN();
66 double porosity_prev = std::numeric_limits<double>::quiet_NaN();
67 double transport_porosity = std::numeric_limits<double>::quiet_NaN();
68 double transport_porosity_prev = std::numeric_limits<double>::quiet_NaN();
69 double dry_density_solid = std::numeric_limits<double>::quiet_NaN();
71 std::numeric_limits<double>::quiet_NaN();
73 std::numeric_limits<double>::quiet_NaN();
74
76 std::unique_ptr<typename MaterialLib::Solids::MechanicsBase<
77 DisplacementDim>::MaterialStateVariables>
79 double integration_weight = std::numeric_limits<double>::quiet_NaN();
80
94
97 double const t,
98 ParameterLib::SpatialPosition const& x_position,
99 double const dt,
100 double const temperature)
101 {
102 namespace MPL = MaterialPropertyLib;
103
104 MPL::VariableArray variable_array;
105 MPL::VariableArray variable_array_prev;
106
108
109 variable_array.stress.emplace<KV>(KV::Zero());
110 variable_array.mechanical_strain.emplace<KV>(KV::Zero());
111 variable_array.temperature = temperature;
112
113 variable_array_prev.stress.emplace<KV>(KV::Zero());
114 variable_array_prev.mechanical_strain.emplace<KV>(KV::Zero());
115 variable_array_prev.temperature = temperature;
116
117 auto&& solution = solid_material.integrateStress(
118 variable_array_prev, variable_array, t, x_position, dt,
120
121 if (!solution)
122 {
123 OGS_FATAL("Computation of elastic tangent stiffness failed.");
124 }
125
127 std::move(std::get<2>(*solution));
128
129 return C;
130 }
131
132 typename BMatricesType::KelvinMatrixType updateConstitutiveRelation(
133 MaterialPropertyLib::VariableArray const& variable_array,
134 double const t,
135 ParameterLib::SpatialPosition const& x_position,
136 double const dt,
137 double const temperature)
138 {
139 MaterialPropertyLib::VariableArray variable_array_prev;
140 variable_array_prev.stress
143 variable_array_prev.mechanical_strain
145 eps_m_prev);
146 variable_array_prev.temperature = temperature;
147
148 auto&& solution = solid_material.integrateStress(
149 variable_array_prev, variable_array, t, x_position, dt,
151
152 if (!solution)
153 {
154 OGS_FATAL("Computation of local constitutive relation failed.");
155 }
156
158 std::tie(sigma_eff, material_state_variables, C) = std::move(*solution);
159
160 return C;
161 }
162
164};
165
166} // namespace RichardsMechanics
167} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:26
std::variant< std::monostate, Eigen::Matrix< double, 4, 1 >, Eigen::Matrix< double, 6, 1 > > mechanical_strain
std::variant< std::monostate, Eigen::Matrix< double, 4, 1 >, Eigen::Matrix< double, 6, 1 > > stress
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
ShapeMatrixTypeDisplacement::NodalRowVectorType N_u
ShapeMatricesTypePressure::GlobalDimNodalMatrixType dNdx_p
ShapeMatrixTypeDisplacement::GlobalDimNodalMatrixType dNdx_u
ShapeMatricesTypePressure::GlobalDimVectorType v_darcy
ShapeMatricesTypePressure::NodalRowVectorType N_p
BMatricesType::KelvinMatrixType updateConstitutiveRelation(MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x_position, double const dt, double const temperature)
IntegrationPointData(MaterialLib::Solids::MechanicsBase< DisplacementDim > const &solid_material)
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > computeElasticTangentStiffness(double const t, ParameterLib::SpatialPosition const &x_position, double const dt, double const temperature)
MaterialLib::Solids::MechanicsBase< DisplacementDim > const & solid_material
std::unique_ptr< typename MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables > material_state_variables