OGS
IntegrationPointData.h
Go to the documentation of this file.
1 
11 #pragma once
12 
13 #include <memory>
14 
15 #include "MathLib/KelvinVector.h"
16 
17 namespace ProcessLib
18 {
19 namespace RichardsMechanics
20 {
21 template <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 ShapeMatrixTypeDisplacement::template MatrixType<
47  DisplacementDim, NPoints * DisplacementDim>
53 
54  typename ShapeMatrixTypeDisplacement::NodalRowVectorType N_u;
55  typename ShapeMatrixTypeDisplacement::GlobalDimNodalMatrixType dNdx_u;
56 
57  typename ShapeMatricesTypePressure::NodalRowVectorType N_p;
58  typename ShapeMatricesTypePressure::GlobalDimNodalMatrixType dNdx_p;
59 
60  typename ShapeMatricesTypePressure::GlobalDimVectorType v_darcy;
61 
62  double liquid_pressure_m = std::numeric_limits<double>::quiet_NaN();
63  double liquid_pressure_m_prev = std::numeric_limits<double>::quiet_NaN();
64  double saturation = std::numeric_limits<double>::quiet_NaN();
65  double saturation_prev = std::numeric_limits<double>::quiet_NaN();
66  double saturation_m = std::numeric_limits<double>::quiet_NaN();
67  double saturation_m_prev = std::numeric_limits<double>::quiet_NaN();
68  double porosity = std::numeric_limits<double>::quiet_NaN();
69  double porosity_prev = std::numeric_limits<double>::quiet_NaN();
70  double transport_porosity = std::numeric_limits<double>::quiet_NaN();
71  double transport_porosity_prev = std::numeric_limits<double>::quiet_NaN();
72  double dry_density_solid = std::numeric_limits<double>::quiet_NaN();
74  std::numeric_limits<double>::quiet_NaN();
76  std::numeric_limits<double>::quiet_NaN();
77 
79  std::unique_ptr<typename MaterialLib::Solids::MechanicsBase<
80  DisplacementDim>::MaterialStateVariables>
82  double integration_weight = std::numeric_limits<double>::quiet_NaN();
83 
85  {
86  eps_prev = eps;
87  eps_m_prev = eps_m;
95  material_state_variables->pushBackState();
96  }
97 
100  double const t,
101  ParameterLib::SpatialPosition const& x_position,
102  double const dt,
103  double const temperature)
104  {
105  namespace MPL = MaterialPropertyLib;
106 
107  MPL::VariableArray variable_array;
108  MPL::VariableArray variable_array_prev;
109 
110  auto const null_state = solid_material.createMaterialStateVariables();
111 
113 
114  variable_array[static_cast<int>(MPL::Variable::stress)].emplace<KV>(
115  KV::Zero());
116  variable_array[static_cast<int>(MPL::Variable::mechanical_strain)]
117  .emplace<KV>(KV::Zero());
118  variable_array[static_cast<int>(MPL::Variable::temperature)]
119  .emplace<double>(temperature);
120 
121  variable_array_prev[static_cast<int>(MPL::Variable::stress)]
122  .emplace<KV>(KV::Zero());
123  variable_array_prev[static_cast<int>(MPL::Variable::mechanical_strain)]
124  .emplace<KV>(KV::Zero());
125  variable_array_prev[static_cast<int>(MPL::Variable::temperature)]
126  .emplace<double>(temperature);
127 
128  auto&& solution =
129  solid_material.integrateStress(variable_array_prev, variable_array,
130  t, x_position, dt, *null_state);
131 
132  if (!solution)
133  {
134  OGS_FATAL("Computation of elastic tangent stiffness failed.");
135  }
136 
138  std::move(std::get<2>(*solution));
139 
140  return C;
141  }
142 
144  MaterialPropertyLib::VariableArray const& variable_array,
145  double const t,
146  ParameterLib::SpatialPosition const& x_position,
147  double const dt,
148  double const temperature)
149  {
150  MaterialPropertyLib::VariableArray variable_array_prev;
151  variable_array_prev[static_cast<int>(
155  variable_array_prev[static_cast<int>(MaterialPropertyLib::Variable::
158  eps_m_prev);
159  variable_array_prev[static_cast<int>(
161  .emplace<double>(temperature);
162 
163  auto&& solution = solid_material.integrateStress(
164  variable_array_prev, variable_array, t, x_position, dt,
166 
167  if (!solution)
168  {
169  OGS_FATAL("Computation of local constitutive relation failed.");
170  }
171 
173  std::tie(sigma_eff, material_state_variables, C) = std::move(*solution);
174 
175  return C;
176  }
177 
179 };
180 
181 } // namespace RichardsMechanics
182 } // namespace ProcessLib
#define OGS_FATAL(...)
Definition: Error.h:26
std::array< VariableType, static_cast< int >(Variable::number_of_variables)> VariableArray
Definition: VariableType.h:108
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
Definition: KelvinVector.h:48
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Definition: KelvinVector.h:23
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
Definition: KelvinVector.h:56
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
ShapeMatrixTypeDisplacement::template MatrixType< DisplacementDim, NPoints *DisplacementDim > N_u_op
std::unique_ptr< typename MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables > material_state_variables