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
107 auto const null_state = solid_material.createMaterialStateVariables();
108 solid_material.initializeInternalStateVariables(t, x_position,
109 *null_state);
110
112
113 variable_array.stress.emplace<KV>(KV::Zero());
114 variable_array.mechanical_strain.emplace<KV>(KV::Zero());
115 variable_array.temperature = temperature;
116
117 variable_array_prev.stress.emplace<KV>(KV::Zero());
118 variable_array_prev.mechanical_strain.emplace<KV>(KV::Zero());
119 variable_array_prev.temperature = temperature;
120
121 auto&& solution =
122 solid_material.integrateStress(variable_array_prev, variable_array,
123 t, x_position, dt, *null_state);
124
125 if (!solution)
126 {
127 OGS_FATAL("Computation of elastic tangent stiffness failed.");
128 }
129
131 std::move(std::get<2>(*solution));
132
133 return C;
134 }
135
136 typename BMatricesType::KelvinMatrixType updateConstitutiveRelation(
137 MaterialPropertyLib::VariableArray const& variable_array,
138 double const t,
139 ParameterLib::SpatialPosition const& x_position,
140 double const dt,
141 double const temperature)
142 {
143 MaterialPropertyLib::VariableArray variable_array_prev;
144 variable_array_prev.stress
147 variable_array_prev.mechanical_strain
149 eps_m_prev);
150 variable_array_prev.temperature = temperature;
151
152 auto&& solution = solid_material.integrateStress(
153 variable_array_prev, variable_array, t, x_position, dt,
155
156 if (!solution)
157 {
158 OGS_FATAL("Computation of local constitutive relation failed.");
159 }
160
162 std::tie(sigma_eff, material_state_variables, C) = std::move(*solution);
163
164 return C;
165 }
166
168};
169
170} // namespace RichardsMechanics
171} // 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