OGS
IntegrationPointData.h
Go to the documentation of this file.
1 
11 #pragma once
12 
13 #include <limits>
14 #include <memory>
15 
18 #include "MathLib/KelvinVector.h"
20 
21 namespace ProcessLib
22 {
23 namespace ThermoRichardsMechanics
24 {
25 template <typename BMatricesType, typename ShapeMatrixTypeDisplacement,
26  typename ShapeMatricesTypePressure, int DisplacementDim, int NPoints>
28 {
34  solid_material.createMaterialStateVariables())
35  {
36  // Initialize current time step values
37  static const int kelvin_vector_size =
39  sigma_eff.setZero(kelvin_vector_size);
40  sigma_sw.setZero(kelvin_vector_size);
41  eps.setZero(kelvin_vector_size);
42  eps_m.setZero(kelvin_vector_size);
43 
44  // Previous time step values are not initialized and are set later.
45  eps_prev.resize(kelvin_vector_size);
46  eps_m_prev.resize(kelvin_vector_size);
47  sigma_eff_prev.resize(kelvin_vector_size);
48  }
49 
50  typename ShapeMatrixTypeDisplacement::template MatrixType<
51  DisplacementDim, NPoints * DisplacementDim>
57 
58  typename ShapeMatrixTypeDisplacement::NodalRowVectorType N_u;
59  typename ShapeMatrixTypeDisplacement::GlobalDimNodalMatrixType dNdx_u;
60 
61  typename ShapeMatricesTypePressure::NodalRowVectorType N_p;
62  typename ShapeMatricesTypePressure::GlobalDimNodalMatrixType dNdx_p;
63 
64  typename ShapeMatricesTypePressure::GlobalDimVectorType v_darcy;
65 
66  double saturation = std::numeric_limits<double>::quiet_NaN();
67  double saturation_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 
83  double integration_weight = std::numeric_limits<double>::quiet_NaN();
84 
86  {
87  eps_prev = eps;
88  eps_m_prev = eps_m;
94  material_state_variables->pushBackState();
95  }
96 
99  double const t, ParameterLib::SpatialPosition const& x_position,
100  double const dt, double const temperature_prev,
101  double const temperature)
102  {
103  namespace MPL = MaterialPropertyLib;
104 
105  MPL::VariableArray variable_array;
106  MPL::VariableArray variable_array_prev;
107 
108  auto const null_state = solid_material.createMaterialStateVariables();
109 
111 
112  variable_array[static_cast<int>(MPL::Variable::stress)].emplace<KV>(
113  KV::Zero());
114  variable_array[static_cast<int>(MPL::Variable::mechanical_strain)]
115  .emplace<KV>(KV::Zero());
116  variable_array[static_cast<int>(MPL::Variable::temperature)]
117  .emplace<double>(temperature);
118 
119  variable_array_prev[static_cast<int>(MPL::Variable::stress)]
120  .emplace<KV>(KV::Zero());
121  variable_array_prev[static_cast<int>(MPL::Variable::mechanical_strain)]
122  .emplace<KV>(KV::Zero());
123  variable_array_prev[static_cast<int>(MPL::Variable::temperature)]
124  .emplace<double>(temperature_prev);
125 
126  auto&& solution =
127  solid_material.integrateStress(variable_array_prev, variable_array,
128  t, x_position, dt, *null_state);
129 
130  if (!solution)
131  {
132  OGS_FATAL("Computation of elastic tangent stiffness failed.");
133  }
134 
136  std::move(std::get<2>(*solution));
137 
138  return C;
139  }
140 
142  MaterialPropertyLib::VariableArray const& variable_array,
143  double const t,
144  ParameterLib::SpatialPosition const& x_position,
145  double const dt,
146  double const temperature_prev)
147  {
148  MaterialPropertyLib::VariableArray variable_array_prev;
149  variable_array_prev[static_cast<int>(
153  variable_array_prev[static_cast<int>(MaterialPropertyLib::Variable::
156  eps_m_prev);
157  variable_array_prev[static_cast<int>(
159  .emplace<double>(temperature_prev);
160 
161  auto&& solution = solid_material.integrateStress(
162  variable_array_prev, variable_array, t, x_position, dt,
164 
165  if (!solution)
166  {
167  OGS_FATAL("Computation of local constitutive relation failed.");
168  }
169 
171  std::tie(sigma_eff, material_state_variables, C) = std::move(*solution);
172 
173  return C;
174  }
175 
177 };
178 
179 } // namespace ThermoRichardsMechanics
180 } // 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
ShapeMatricesTypePressure::GlobalDimNodalMatrixType dNdx_p
ShapeMatricesTypePressure::GlobalDimVectorType v_darcy
BMatricesType::KelvinMatrixType updateConstitutiveRelation(MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x_position, double const dt, double const temperature_prev)
std::unique_ptr< typename MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables > material_state_variables
MaterialLib::Solids::MechanicsBase< DisplacementDim > const & solid_material
ShapeMatricesTypePressure::NodalRowVectorType N_p
ShapeMatrixTypeDisplacement::NodalRowVectorType N_u
ShapeMatrixTypeDisplacement::GlobalDimNodalMatrixType dNdx_u
IntegrationPointData(MaterialLib::Solids::MechanicsBase< DisplacementDim > const &solid_material)
ShapeMatrixTypeDisplacement::template MatrixType< DisplacementDim, NPoints *DisplacementDim > N_u_op
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > computeElasticTangentStiffness(double const t, ParameterLib::SpatialPosition const &x_position, double const dt, double const temperature_prev, double const temperature)