OGS
ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim > Class Template Reference

Detailed Description

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
class ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >

Definition at line 159 of file HydroMechanicsFEM.h.

#include <HydroMechanicsFEM.h>

Inheritance diagram for ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >:
[legend]
Collaboration diagram for ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >:
[legend]

Public Types

using ShapeMatricesTypeDisplacement
using ShapeMatricesTypePressure
using Invariants = MathLib::KelvinVector::Invariants<KelvinVectorSize>
using SymmetricTensor = Eigen::Matrix<double, KelvinVectorSize, 1>

Public Member Functions

 HydroMechanicsLocalAssembler (HydroMechanicsLocalAssembler const &)=delete
 HydroMechanicsLocalAssembler (HydroMechanicsLocalAssembler &&)=delete
 HydroMechanicsLocalAssembler (MeshLib::Element const &e, std::size_t const, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, HydroMechanicsProcessData< DisplacementDim > &process_data)
std::size_t setIPDataInitialConditions (std::string_view const name, double const *values, int const integration_order) override
 Returns number of read integration points.
void assemble (double const, double const, std::vector< double > const &, std::vector< double > const &, std::vector< double > &, std::vector< double > &, std::vector< double > &) override
void assembleWithJacobian (double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_rhs_data, std::vector< double > &local_Jac_data) override
void assembleWithJacobianForStaggeredScheme (const double t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, int const process_id, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data) override
void initializeConcrete () override
void postTimestepConcrete (Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, double const t, double const dt, int const process_id) override
void computeSecondaryVariableConcrete (double const t, double const dt, Eigen::VectorXd const &local_xs, Eigen::VectorXd const &local_x_prev) override
void postNonLinearSolverConcrete (Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, double const t, double const dt, int const process_id) override
void setInitialConditionsConcrete (Eigen::VectorXd const local_x, double const t, int const process_id) override
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix (const unsigned integration_point) const override
 Provides the shape matrix at the given integration point.
std::vector< double > getSigma () const override
std::vector< double > getEpsilon () const override
std::vector< double > getStrainRateVariable () const override
std::vector< double > const & getIntPtDarcyVelocity (const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
std::vector< double > const & getIntPtSigma (const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
std::vector< double > const & getIntPtEpsilon (const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
int getNumberOfVectorElementsForDeformation () const override
Public Member Functions inherited from ProcessLib::LocalAssemblerInterface
virtual ~LocalAssemblerInterface ()=default
virtual void setInitialConditions (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, int const process_id)
virtual void initialize (std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
virtual void preAssemble (double const, double const, std::vector< double > const &)
virtual void assembleForStaggeredScheme (double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, int const process_id, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data)
virtual void computeSecondaryVariable (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_prev, int const process_id)
virtual void preTimestep (std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table, GlobalVector const &x, double const t, double const delta_t)
virtual void postTimestep (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, double const t, double const dt, int const process_id)
void postNonLinearSolver (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, double const t, double const dt, int const process_id)
virtual Eigen::Vector3d getFlux (MathLib::Point3d const &, double const, std::vector< double > const &) const
virtual Eigen::Vector3d getFlux (MathLib::Point3d const &, double const, std::vector< std::vector< double > > const &) const
 Fits to staggered scheme.
Public Member Functions inherited from NumLib::ExtrapolatableElement
virtual ~ExtrapolatableElement ()=default

Static Public Attributes

static int const KelvinVectorSize
static constexpr auto & N_u_op

Private Types

using BMatricesType
using IpData

Private Member Functions

void assembleWithJacobianForDeformationEquations (const double t, double const dt, Eigen::VectorXd const &local_x, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
void assembleWithJacobianForPressureEquations (const double t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
unsigned getNumberOfIntegrationPoints () const override
int getMaterialID () const override
MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables const & getMaterialStateVariablesAt (unsigned integration_point) const override

Private Attributes

HydroMechanicsProcessData< DisplacementDim > & _process_data
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
NumLib::GenericIntegrationMethod const & _integration_method
MeshLib::Element const & _element
bool const _is_axially_symmetric
SecondaryData< typename ShapeMatricesTypeDisplacement::ShapeMatrices::ShapeType > _secondary_data

Static Private Attributes

static const int pressure_index = 0
static const int pressure_size = ShapeFunctionPressure::NPOINTS
static const int displacement_index = ShapeFunctionPressure::NPOINTS
static const int displacement_size

Member Typedef Documentation

◆ BMatricesType

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
using ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::BMatricesType
private

◆ Invariants

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
using ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::Invariants = MathLib::KelvinVector::Invariants<KelvinVectorSize>

Definition at line 172 of file HydroMechanicsFEM.h.

◆ IpData

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
using ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::IpData
private
Initial value:
ShapeMatricesTypePressure, DisplacementDim,
ShapeFunctionDisplacement::NPOINTS>
ShapeMatrixPolicyType< ShapeFunctionDisplacement, DisplacementDim > ShapeMatricesTypeDisplacement
ShapeMatrixPolicyType< ShapeFunctionPressure, DisplacementDim > ShapeMatricesTypePressure
BMatrixPolicyType< ShapeFunctionDisplacement, DisplacementDim > BMatricesType

Definition at line 386 of file HydroMechanicsFEM.h.

◆ ShapeMatricesTypeDisplacement

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
using ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::ShapeMatricesTypeDisplacement
Initial value:
EigenFixedShapeMatrixPolicy< ShapeFunction, GlobalDim > ShapeMatrixPolicyType

Definition at line 163 of file HydroMechanicsFEM.h.

◆ ShapeMatricesTypePressure

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
using ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::ShapeMatricesTypePressure

◆ SymmetricTensor

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
using ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::SymmetricTensor = Eigen::Matrix<double, KelvinVectorSize, 1>

Definition at line 174 of file HydroMechanicsFEM.h.

Constructor & Destructor Documentation

◆ HydroMechanicsLocalAssembler() [1/3]

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::HydroMechanicsLocalAssembler ( HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim > const & )
delete

◆ HydroMechanicsLocalAssembler() [2/3]

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::HydroMechanicsLocalAssembler ( HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim > && )
delete

◆ HydroMechanicsLocalAssembler() [3/3]

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::HydroMechanicsLocalAssembler ( MeshLib::Element const & e,
std::size_t const ,
NumLib::GenericIntegrationMethod const & integration_method,
bool const is_axially_symmetric,
HydroMechanicsProcessData< DisplacementDim > & process_data )

Definition at line 30 of file HydroMechanicsFEM-impl.h.

39 _element(e),
41{
42 unsigned const n_integration_points =
43 _integration_method.getNumberOfPoints();
44
47
48 auto const shape_matrices_u =
53
54 auto const shape_matrices_p =
58
59 auto const& solid_material =
61 _process_data.solid_materials, _process_data.material_ids,
62 e.getID());
63
64 for (unsigned ip = 0; ip < n_integration_points; ip++)
65 {
66 _ip_data.emplace_back(solid_material);
67 auto& ip_data = _ip_data[ip];
68 auto const& sm_u = shape_matrices_u[ip];
69 ip_data.integration_weight =
70 _integration_method.getWeightedPoint(ip).getWeight() *
71 sm_u.integralMeasure * sm_u.detJ;
72
73 // Initialize current time step values
74 static const int kelvin_vector_size =
76 ip_data.sigma_eff.setZero(kelvin_vector_size);
77 ip_data.eps.setZero(kelvin_vector_size);
78
79 // Previous time step values are not initialized and are set later.
80 ip_data.eps_prev.resize(kelvin_vector_size);
81 ip_data.sigma_eff_prev.resize(kelvin_vector_size);
82
83 ip_data.N_u = sm_u.N;
84 ip_data.dNdx_u = sm_u.dNdx;
85
87 ip_data.dNdx_p = shape_matrices_p[ip].dNdx;
88
90 }
91}
NumLib::GenericIntegrationMethod const & _integration_method
HydroMechanicsProcessData< DisplacementDim > & _process_data
SecondaryData< typename ShapeMatricesTypeDisplacement::ShapeMatrices::ShapeType > _secondary_data
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
auto & selectSolidConstitutiveRelation(SolidMaterialsMap const &constitutive_relations, MeshLib::PropertyVector< int > const *const material_ids, std::size_t const element_id)
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.

References _element, _integration_method, _ip_data, _is_axially_symmetric, _process_data, _secondary_data, MeshLib::Element::getID(), NumLib::initShapeMatrices(), MathLib::KelvinVector::kelvin_vector_dimensions(), and MaterialLib::Solids::selectSolidConstitutiveRelation().

Member Function Documentation

◆ assemble()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::assemble ( double const ,
double const ,
std::vector< double > const & ,
std::vector< double > const & ,
std::vector< double > & ,
std::vector< double > & ,
std::vector< double > &  )
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 196 of file HydroMechanicsFEM.h.

202 {
203 OGS_FATAL(
204 "HydroMechanicsLocalAssembler: assembly without jacobian is not "
205 "implemented.");
206 }
#define OGS_FATAL(...)
Definition Error.h:19

References OGS_FATAL.

◆ assembleWithJacobian()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::assembleWithJacobian ( double const t,
double const dt,
std::vector< double > const & local_x,
std::vector< double > const & local_x_prev,
std::vector< double > & local_rhs_data,
std::vector< double > & local_Jac_data )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 96 of file HydroMechanicsFEM-impl.h.

102{
104
107
108 auto u =
112
113 auto p_prev =
117 auto u_prev =
121
128
133
137
141
145
151
157
163
164 auto const& solid_material =
166 _process_data.solid_materials, _process_data.material_ids,
167 _element.getID());
168
170 x_position.setElementID(_element.getID());
171
172 unsigned const n_integration_points =
173 _integration_method.getNumberOfPoints();
174
175 auto const& b = _process_data.specific_body_force;
176 auto const& medium = _process_data.media_map.getMedium(_element.getID());
178 auto const& fluid = fluidPhase(*medium);
181 ? vars.gas_phase_pressure
182 : vars.liquid_phase_pressure;
183
184 auto const T_ref =
186 .template value<double>(vars, x_position, t, dt);
187 vars.temperature = T_ref;
188
189 auto const& identity2 = Invariants::identity2;
190
191 for (unsigned ip = 0; ip < n_integration_points; ip++)
192 {
193 auto const& w = _ip_data[ip].integration_weight;
194
195 auto const& N_u = _ip_data[ip].N_u;
196 auto const& dNdx_u = _ip_data[ip].dNdx_u;
197
198 auto const& N_p = _ip_data[ip].N_p;
199 auto const& dNdx_p = _ip_data[ip].dNdx_p;
200
201 x_position = {
202 std::nullopt, _element.getID(),
206 _element, N_u))};
207
208 auto const x_coord = x_position.getCoordinates().value()[0];
209
210 auto const B =
215
216 auto& eps = _ip_data[ip].eps;
217 eps.noalias() = B * u;
218 auto const& sigma_eff = _ip_data[ip].sigma_eff;
219
220 double const p_int_pt = N_p.dot(p);
221
223
224 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
225 t, x_position, dt, T_ref);
226 auto const K_S = solid_material.getBulkModulus(t, x_position, &C_el);
227
228 auto const alpha = medium->property(MPL::PropertyType::biot_coefficient)
229 .template value<double>(vars, x_position, t, dt);
230
231 auto const rho_sr =
233 .template value<double>(vars, x_position, t, dt);
234 auto const porosity =
236 .template value<double>(vars, x_position, t, dt);
237
238 auto const [rho_fr, mu] =
240 fluid, vars);
241
242 auto const beta_p =
244 .template dValue<double>(vars, _process_data.phase_variable,
245 x_position, t, dt) /
246 rho_fr;
247
248 // Set mechanical variables for the intrinsic permeability model
249 // For stress dependent permeability.
250 {
251 auto const sigma_total =
252 (_ip_data[ip].sigma_eff - alpha * p_int_pt * identity2).eval();
253
254 vars.total_stress.emplace<SymmetricTensor>(
256 sigma_total));
257 }
258 // For strain dependent permeability
259 vars.volumetric_strain = Invariants::trace(eps);
260 vars.equivalent_plastic_strain =
261 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
262 vars.mechanical_strain
264 eps);
265
268 .value(vars, x_position, t, dt));
269 auto const dkde = MPL::formEigenTensor<
271 (*medium)[MPL::PropertyType::permeability].dValue(
273
274 auto const K_over_mu = K / mu;
275
276 auto C = _ip_data[ip].updateConstitutiveRelation(vars, t, x_position,
277 dt, u, T_ref);
278
279 //
280 // displacement equation, displacement part
281 //
285 .noalias() += B.transpose() * C * B * w;
286
287 double const rho = rho_sr * (1 - porosity) + porosity * rho_fr;
289 .noalias() -=
290 (B.transpose() * sigma_eff - N_u_op(N_u).transpose() * rho * b) * w;
291
292 //
293 // displacement equation, pressure part
294 //
295 Kup.noalias() += B.transpose() * alpha * identity2 * N_p * w;
296
297 //
298 // pressure equation, pressure part.
299 //
300 laplace_p.noalias() +=
301 rho_fr * dNdx_p.transpose() * K_over_mu * dNdx_p * w;
302
303 storage_p.noalias() +=
304 rho_fr * N_p.transpose() * N_p * w *
305 ((alpha - porosity) * (1.0 - alpha) / K_S + porosity * beta_p);
306
307 // density dependence on pressure evaluated for Darcy-term,
308 // for laplace and storage terms this dependence is neglected
309 add_p_derivative.noalias() += rho_fr * beta_p * dNdx_p.transpose() *
310 K_over_mu *
311 (dNdx_p * p - 2.0 * rho_fr * b) * N_p * w;
312
313 local_rhs.template segment<pressure_size>(pressure_index).noalias() +=
314 dNdx_p.transpose() * rho_fr * rho_fr * K_over_mu * b * w;
315
316 //
317 // pressure equation, displacement part.
318 //
319 Kpu.noalias() +=
320 rho_fr * alpha * N_p.transpose() * identity2.transpose() * B * w;
321
322 Kpu_k.noalias() +=
323 dNdx_p.transpose() *
325 dNdx_p * p - rho_fr * b) *
326 dkde * B * rho_fr / mu * w;
327 }
328 // displacement equation, pressure part
332 .noalias() = -Kup;
333
334 if (_process_data.mass_lumping)
335 {
336 storage_p = storage_p.colwise().sum().eval().asDiagonal();
337
338 if constexpr (pressure_size == displacement_size)
339 {
340 Kpu = Kpu.colwise().sum().eval().asDiagonal();
341 Kpu_k = Kpu_k.colwise().sum().eval().asDiagonal();
342 }
343 }
344
345 // pressure equation, pressure part.
349 .noalias() += laplace_p + storage_p / dt + add_p_derivative;
350
351 // pressure equation, displacement part.
355 .noalias() += Kpu / dt + Kpu_k;
356
357 // pressure equation
358 local_rhs.template segment<pressure_size>(pressure_index).noalias() -=
359 laplace_p * p + storage_p * (p - p_prev) / dt + Kpu * (u - u_prev) / dt;
360
361 // displacement equation
363 .noalias() += Kup * p;
364}
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
Eigen::Matrix< double, KelvinVectorSize, 1 > SymmetricTensor
std::tuple< double, double > getFluidDensityAndViscosity(double const t, double const dt, ParameterLib::SpatialPosition const &pos, MaterialPropertyLib::Phase const &fluid_phase, MaterialPropertyLib::VariableArray &vars)
It computes fluid density and viscosity for single phase flow model.
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
Eigen::Matrix< double, DisplacementDim, kelvin_vector_dimensions(DisplacementDim)> liftVectorToKelvin(Eigen::Matrix< double, DisplacementDim, 1 > const &v)
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType
static Eigen::Matrix< double, KelvinVectorSize, 1 > const identity2
Kelvin mapping of 2nd order identity tensor.
static double trace(Eigen::Matrix< double, KelvinVectorSize, 1 > const &v)
Trace of the corresponding tensor.

References _element, _integration_method, _ip_data, _is_axially_symmetric, _process_data, MaterialPropertyLib::biot_coefficient, ProcessLib::LinearBMatrix::computeBMatrix(), MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), MaterialPropertyLib::density, displacement_index, displacement_size, MaterialPropertyLib::VariableArray::equivalent_plastic_strain, MaterialPropertyLib::formEigenTensor(), MaterialPropertyLib::Gas, MaterialPropertyLib::VariableArray::gas_phase_pressure, ParameterLib::SpatialPosition::getCoordinates(), MaterialPropertyLib::getFluidDensityAndViscosity(), MathLib::KelvinVector::Invariants< KelvinVectorSize >::identity2, NumLib::interpolateCoordinates(), MathLib::KelvinVector::kelvin_vector_dimensions(), MathLib::KelvinVector::kelvinVectorToSymmetricTensor(), MathLib::KelvinVector::liftVectorToKelvin(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::mechanical_strain, MaterialPropertyLib::VariableArray::mechanical_strain, N_u_op, MaterialPropertyLib::permeability, MaterialPropertyLib::porosity, pressure_index, pressure_size, MaterialPropertyLib::reference_temperature, MaterialLib::Solids::selectSolidConstitutiveRelation(), ParameterLib::SpatialPosition::setElementID(), MaterialPropertyLib::Solid, MaterialPropertyLib::VariableArray::temperature, MaterialPropertyLib::VariableArray::total_stress, MathLib::KelvinVector::Invariants< KelvinVectorSize >::trace(), and MaterialPropertyLib::VariableArray::volumetric_strain.

◆ assembleWithJacobianForDeformationEquations()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::assembleWithJacobianForDeformationEquations ( const double t,
double const dt,
Eigen::VectorXd const & local_x,
std::vector< double > & local_b_data,
std::vector< double > & local_Jac_data )
private

Assemble local matrices and vectors arise from the linearized discretized weak form of the residual of the momentum balance equation,

\[ \nabla (\sigma - \alpha_b p \mathrm{I}) = f \]

where \( \sigma\) is the effective stress tensor, \(p\) is the pore pressure, \(\alpha_b\) is the Biot constant, \(\mathrm{I}\) is the identity tensor, and \(f\) is the body force.

Parameters
tTime
dtTime increment
local_xNodal values of \(x\) of an element of all coupled processes.
local_b_dataRight hand side vector of an element.
local_Jac_dataElement Jacobian matrix for the Newton-Raphson method.

Definition at line 645 of file HydroMechanicsFEM-impl.h.

649{
650 auto const p = local_x.template segment<pressure_size>(pressure_index);
651 auto const u =
653
658
659 auto local_rhs =
663
665 x_position.setElementID(_element.getID());
666
667 auto const& medium = _process_data.media_map.getMedium(_element.getID());
669 auto const& fluid = fluidPhase(*medium);
672 ? vars.gas_phase_pressure
673 : vars.liquid_phase_pressure;
674
675 auto const T_ref =
677 .template value<double>(vars, x_position, t, dt);
678 vars.temperature = T_ref;
679
680 int const n_integration_points = _integration_method.getNumberOfPoints();
681 for (int ip = 0; ip < n_integration_points; ip++)
682 {
683 auto const& w = _ip_data[ip].integration_weight;
684
685 auto const& N_u = _ip_data[ip].N_u;
686 auto const& dNdx_u = _ip_data[ip].dNdx_u;
687
688 auto const& N_p = _ip_data[ip].N_p;
689
690 x_position = {
691 std::nullopt, _element.getID(),
695 _element, N_u))};
696
697 auto const x_coord = x_position.getCoordinates().value()[0];
698 auto const B =
703
704 auto& eps = _ip_data[ip].eps;
705 auto const& sigma_eff = _ip_data[ip].sigma_eff;
706
707 phase_pressure = N_p.dot(p);
708
709 auto const alpha = medium->property(MPL::PropertyType::biot_coefficient)
710 .template value<double>(vars, x_position, t, dt);
711 auto const rho_sr =
713 .template value<double>(vars, x_position, t, dt);
714 auto const porosity =
716 .template value<double>(vars, x_position, t, dt);
717
719 t, dt, x_position, fluid, vars);
720
721 auto const& b = _process_data.specific_body_force;
725
726 eps.noalias() = B * u;
727 vars.mechanical_strain
729 eps);
730
731 auto C = _ip_data[ip].updateConstitutiveRelation(vars, t, x_position,
732 dt, u, T_ref);
733
734 local_Jac.noalias() += B.transpose() * C * B * w;
735
736 double p_at_xi = 0.;
738
739 double const rho = rho_sr * (1 - porosity) + porosity * rho_fr;
740 local_rhs.noalias() -=
741 (B.transpose() * (sigma_eff - alpha * identity2 * p_at_xi) -
742 N_u_op(N_u).transpose() * rho * b) *
743 w;
744 }
745}
double getFluidDensity(double const t, double const dt, ParameterLib::SpatialPosition const &pos, Phase const &fluid_phase, VariableArray &vars)
It computes fluid density for single phase flow model.
void shapeFunctionInterpolate(const NodalValues &, const ShapeMatrix &)

References _element, _integration_method, _ip_data, _is_axially_symmetric, _process_data, MaterialPropertyLib::biot_coefficient, ProcessLib::LinearBMatrix::computeBMatrix(), MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), MaterialPropertyLib::density, displacement_index, displacement_size, MaterialPropertyLib::Gas, MaterialPropertyLib::VariableArray::gas_phase_pressure, MaterialPropertyLib::getFluidDensity(), NumLib::interpolateCoordinates(), MathLib::KelvinVector::kelvin_vector_dimensions(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::VariableArray::mechanical_strain, N_u_op, MaterialPropertyLib::porosity, pressure_index, MaterialPropertyLib::reference_temperature, ParameterLib::SpatialPosition::setElementID(), NumLib::detail::shapeFunctionInterpolate(), MaterialPropertyLib::Solid, and MaterialPropertyLib::VariableArray::temperature.

Referenced by assembleWithJacobianForStaggeredScheme().

◆ assembleWithJacobianForPressureEquations()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::assembleWithJacobianForPressureEquations ( const double t,
double const dt,
Eigen::VectorXd const & local_x,
Eigen::VectorXd const & local_x_prev,
std::vector< double > & local_b_data,
std::vector< double > & local_Jac_data )
private

Assemble local matrices and vectors arise from the linearized discretized weak form of the residual of the mass balance equation of single phase flow,

\[ \alpha \cdot{p} - \nabla (K (\nabla p + \rho g \nabla z) + \alpha_b \nabla \cdot \dot{u} = Q \]

where \( alpha\) is a coefficient may depend on storage or the fluid density change, \( \rho\) is the fluid density, \(g\) is the gravitational acceleration, \(z\) is the vertical coordinate, \(u\) is the displacement, and \(Q\) is the source/sink term.

Parameters
tTime
dtTime increment
local_xNodal values of \(x\) of an element of all coupled processes.
local_x_prevNodal values of \(x^{t-1}\) of an element of all coupled processes.
local_b_dataRight hand side vector of an element.
local_Jac_dataElement Jacobian matrix for the Newton-Raphson method.

Definition at line 466 of file HydroMechanicsFEM-impl.h.

471{
472 auto local_rhs =
476
478 pos.setElementID(this->_element.getID());
479
480 auto const p = local_x.template segment<pressure_size>(pressure_index);
481
482 auto const p_prev =
484
489
493
497
501
502 auto const& solid_material =
504 _process_data.solid_materials, _process_data.material_ids,
505 _element.getID());
506
508 x_position.setElementID(_element.getID());
509
510 auto const& medium = _process_data.media_map.getMedium(_element.getID());
511 auto const& fluid = fluidPhase(*medium);
514 ? vars.gas_phase_pressure
515 : vars.liquid_phase_pressure;
516
517 auto const T_ref =
519 .template value<double>(vars, x_position, t, dt);
520 vars.temperature = T_ref;
521
522 auto const& identity2 = Invariants::identity2;
523
524 auto const staggered_scheme =
525 std::get<Staggered>(_process_data.coupling_scheme);
527 staggered_scheme.fixed_stress_stabilization_parameter;
528 auto const fixed_stress_over_time_step =
529 staggered_scheme.fixed_stress_over_time_step;
530
531 int const n_integration_points = _integration_method.getNumberOfPoints();
532 for (int ip = 0; ip < n_integration_points; ip++)
533 {
534 auto const& w = _ip_data[ip].integration_weight;
535
536 auto const& N_p = _ip_data[ip].N_p;
537 auto const& dNdx_p = _ip_data[ip].dNdx_p;
538
539 x_position = {
540 std::nullopt, _element.getID(),
544 _element, _ip_data[ip].N_p))};
545
546 double const p_int_pt = N_p.dot(p);
547
549
550 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
551 t, x_position, dt, T_ref);
552 auto const K_S = solid_material.getBulkModulus(t, x_position, &C_el);
553
554 auto const alpha_b =
556 .template value<double>(vars, x_position, t, dt);
557
558 // Set mechanical variables for the intrinsic permeability model
559 // For stress dependent permeability.
560 auto const sigma_total =
561 (_ip_data[ip].sigma_eff - alpha_b * p_int_pt * identity2).eval();
562 vars.total_stress.emplace<SymmetricTensor>(
564
565 // For strain dependent permeability
566 vars.volumetric_strain = Invariants::trace(_ip_data[ip].eps);
567 vars.equivalent_plastic_strain =
568 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
569 vars.mechanical_strain
571 _ip_data[ip].eps);
572
575 .value(vars, x_position, t, dt));
576 auto const porosity =
578 .template value<double>(vars, x_position, t, dt);
579
580 auto const [rho_fr, mu] =
582 fluid, vars);
583
584 auto const beta_p =
586 .template dValue<double>(vars, _process_data.phase_variable,
587 x_position, t, dt) /
588 rho_fr;
589
590 auto const K_over_mu = K / mu;
591
592 laplace.noalias() +=
593 rho_fr * dNdx_p.transpose() * K_over_mu * dNdx_p * w;
594
595 // Artificial compressibility from the fixed stress splitting:
596 auto const beta_FS =
598
599 storage.noalias() += rho_fr * N_p.transpose() * N_p * w *
600 ((alpha_b - porosity) * (1.0 - alpha_b) / K_S +
602
603 auto const& b = _process_data.specific_body_force;
604
605 // bodyforce-driven Darcy flow
606 local_rhs.noalias() +=
607 dNdx_p.transpose() * rho_fr * rho_fr * K_over_mu * b * w;
608
609 // density dependence on pressure evaluated for Darcy-term,
610 // for laplace and storage terms this dependence is neglected (as is
611 // done for monolithic too)
612 add_p_derivative.noalias() += rho_fr * beta_p * dNdx_p.transpose() *
613 K_over_mu *
614 (dNdx_p * p - 2.0 * rho_fr * b) * N_p * w;
615
617 {
618 auto const& eps = _ip_data[ip].eps;
619 auto const& eps_prev = _ip_data[ip].eps_prev;
620 const double eps_v_dot =
622
623 // Constant portion of strain rate term:
624 double const strain_rate_b =
626 beta_FS * _ip_data[ip].strain_rate_variable;
627
628 local_rhs.noalias() -= strain_rate_b * rho_fr * N_p * w;
629 }
630 else
631 {
632 // Constant portion of strain rate term:
633 local_rhs.noalias() -=
634 alpha_b * _ip_data[ip].strain_rate_variable * rho_fr * N_p * w;
635 }
636 }
637 local_Jac.noalias() = laplace + storage / dt + add_p_derivative;
638
639 local_rhs.noalias() -= laplace * p + storage * (p - p_prev) / dt;
640}

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::biot_coefficient, MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), MaterialPropertyLib::density, MaterialPropertyLib::VariableArray::equivalent_plastic_strain, MaterialPropertyLib::formEigenTensor(), MaterialPropertyLib::Gas, MaterialPropertyLib::VariableArray::gas_phase_pressure, MaterialPropertyLib::getFluidDensityAndViscosity(), MathLib::KelvinVector::Invariants< KelvinVectorSize >::identity2, NumLib::interpolateCoordinates(), MathLib::KelvinVector::kelvinVectorToSymmetricTensor(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::VariableArray::mechanical_strain, MaterialPropertyLib::permeability, MaterialPropertyLib::porosity, pressure_index, pressure_size, MaterialPropertyLib::reference_temperature, MaterialLib::Solids::selectSolidConstitutiveRelation(), ParameterLib::SpatialPosition::setElementID(), MaterialPropertyLib::VariableArray::temperature, MaterialPropertyLib::VariableArray::total_stress, MathLib::KelvinVector::Invariants< KelvinVectorSize >::trace(), and MaterialPropertyLib::VariableArray::volumetric_strain.

Referenced by assembleWithJacobianForStaggeredScheme().

◆ assembleWithJacobianForStaggeredScheme()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::assembleWithJacobianForStaggeredScheme ( const double t,
double const dt,
Eigen::VectorXd const & local_x,
Eigen::VectorXd const & local_x_prev,
int const process_id,
std::vector< double > & local_b_data,
std::vector< double > & local_Jac_data )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 750 of file HydroMechanicsFEM-impl.h.

757{
758 // For the equations with pressure
759 if (process_id == _process_data.hydraulic_process_id)
760 {
763 return;
764 }
765
766 // For the equations with deformation
769}
void assembleWithJacobianForPressureEquations(const double t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
void assembleWithJacobianForDeformationEquations(const double t, double const dt, Eigen::VectorXd const &local_x, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)

References _process_data, assembleWithJacobianForDeformationEquations(), and assembleWithJacobianForPressureEquations().

◆ computeSecondaryVariableConcrete()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::computeSecondaryVariableConcrete ( double const t,
double const dt,
Eigen::VectorXd const & local_xs,
Eigen::VectorXd const & local_x_prev )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 1113 of file HydroMechanicsFEM-impl.h.

1117{
1118 auto const p = local_x.template segment<pressure_size>(pressure_index);
1119
1123 *_process_data.pressure_interpolated);
1124
1125 int const elem_id = _element.getID();
1126
1127 unsigned const n_integration_points =
1128 _integration_method.getNumberOfPoints();
1129
1130 auto const& medium = _process_data.media_map.getMedium(elem_id);
1133 ? vars.gas_phase_pressure
1134 : vars.liquid_phase_pressure;
1135
1139
1140 auto const& identity2 = Invariants::identity2;
1141
1142 for (unsigned ip = 0; ip < n_integration_points; ip++)
1143 {
1144 auto const& eps = _ip_data[ip].eps;
1145 sigma_eff_sum += _ip_data[ip].sigma_eff;
1146
1148 std::nullopt, _element.getID(),
1152 _element, _ip_data[ip].N_u))};
1153
1154 auto const alpha = medium->property(MPL::PropertyType::biot_coefficient)
1155 .template value<double>(vars, x_position, t, dt);
1156 double const p_int_pt = _ip_data[ip].N_p.dot(p);
1157
1159
1160 // Set mechanical variables for the intrinsic permeability model
1161 // For stress dependent permeability.
1162 {
1163 auto const sigma_total =
1164 (_ip_data[ip].sigma_eff - alpha * p_int_pt * identity2).eval();
1165 vars.total_stress.emplace<SymmetricTensor>(
1167 sigma_total));
1168 }
1169 // For strain dependent permeability
1170 vars.volumetric_strain = Invariants::trace(eps);
1171 vars.equivalent_plastic_strain =
1172 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
1173 vars.mechanical_strain
1175 eps);
1176
1179 .value(vars, x_position, t, dt));
1180 }
1181
1183 &(*_process_data.permeability)[elem_id * KelvinVectorSize],
1185
1189
1191
1193 &(*_process_data.principal_stress_values)[elem_id * 3], 3) =
1194 e_s.eigenvalues();
1195
1196 auto eigen_vectors = e_s.eigenvectors();
1197
1198 for (auto i = 0; i < 3; i++)
1199 {
1201 &(*_process_data.principal_stress_vector[i])[elem_id * 3], 3) =
1202 eigen_vectors.col(i);
1203 }
1204}
SymmetricTensor< GlobalDim > getSymmetricTensor(MaterialPropertyLib::PropertyDataType const &values)
Eigen::Matrix< double, 3, 3 > kelvinVectorToTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
KelvinVectorType< DisplacementDim > tensorToKelvin(Eigen::Matrix< double, 3, 3 > const &m)

References _element, _integration_method, _ip_data, _is_axially_symmetric, _process_data, MaterialPropertyLib::biot_coefficient, MaterialPropertyLib::VariableArray::equivalent_plastic_strain, MaterialPropertyLib::Gas, MaterialPropertyLib::VariableArray::gas_phase_pressure, MaterialPropertyLib::getSymmetricTensor(), MathLib::KelvinVector::Invariants< KelvinVectorSize >::identity2, NumLib::interpolateCoordinates(), NumLib::interpolateToHigherOrderNodes(), KelvinVectorSize, MathLib::KelvinVector::kelvinVectorToSymmetricTensor(), MathLib::KelvinVector::kelvinVectorToTensor(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::VariableArray::mechanical_strain, MaterialPropertyLib::permeability, pressure_index, MathLib::KelvinVector::tensorToKelvin(), MaterialPropertyLib::VariableArray::total_stress, MathLib::KelvinVector::Invariants< KelvinVectorSize >::trace(), and MaterialPropertyLib::VariableArray::volumetric_strain.

◆ getEpsilon()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
std::vector< double > ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getEpsilon ( ) const
overridevirtual

◆ getIntPtDarcyVelocity()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
std::vector< double > const & ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getIntPtDarcyVelocity ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
overridevirtual

Implements ProcessLib::HydroMechanics::LocalAssemblerInterface< DisplacementDim >.

Definition at line 369 of file HydroMechanicsFEM-impl.h.

375{
376 int const hydraulic_process_id = _process_data.hydraulic_process_id;
377 auto const indices =
379 assert(!indices.empty());
380 auto const local_x = x[hydraulic_process_id]->get(indices);
381
382 unsigned const n_integration_points =
383 _integration_method.getNumberOfPoints();
384 cache.clear();
388
391
393 x_position.setElementID(_element.getID());
394
395 auto const& medium = _process_data.media_map.getMedium(_element.getID());
396 auto const& fluid = fluidPhase(*medium);
399 ? vars.gas_phase_pressure
400 : vars.liquid_phase_pressure;
401
402 // TODO (naumov) Temporary value not used by current material models. Need
403 // extension of secondary variables interface.
405 vars.temperature =
407 .template value<double>(vars, x_position, t, dt);
408
409 auto const& identity2 = Invariants::identity2;
410
411 for (unsigned ip = 0; ip < n_integration_points; ip++)
412 {
413 x_position = {
414 std::nullopt, _element.getID(),
418 _element, _ip_data[ip].N_u))};
419
420 double const p_int_pt = _ip_data[ip].N_p.dot(p);
421
423
424 auto const alpha = medium->property(MPL::PropertyType::biot_coefficient)
425 .template value<double>(vars, x_position, t, dt);
426
427 // Set mechanical variables for the intrinsic permeability model
428 // For stress dependent permeability.
429 auto const sigma_total =
430 (_ip_data[ip].sigma_eff - alpha * p_int_pt * identity2).eval();
431 vars.total_stress.emplace<SymmetricTensor>(
433
434 // For strain dependent permeability
435 vars.volumetric_strain = Invariants::trace(_ip_data[ip].eps);
436 vars.equivalent_plastic_strain =
437 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
438 vars.mechanical_strain
440 _ip_data[ip].eps);
441
444 .value(vars, x_position, t, dt));
445
446 auto const [rho_fr, mu] =
448 fluid, vars);
449
450 auto const K_over_mu = K / mu;
451
452 auto const& b = _process_data.specific_body_force;
453
454 // Compute the velocity
455 auto const& dNdx_p = _ip_data[ip].dNdx_p;
456 cache_matrix.col(ip).noalias() =
457 -K_over_mu * dNdx_p * p + K_over_mu * rho_fr * b;
458 }
459
460 return cache;
461}
std::vector< GlobalIndexType > getIndices(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::biot_coefficient, MathLib::createZeroedMatrix(), MaterialPropertyLib::VariableArray::equivalent_plastic_strain, MaterialPropertyLib::formEigenTensor(), MaterialPropertyLib::Gas, MaterialPropertyLib::VariableArray::gas_phase_pressure, MaterialPropertyLib::getFluidDensityAndViscosity(), NumLib::getIndices(), MathLib::KelvinVector::Invariants< KelvinVectorSize >::identity2, NumLib::interpolateCoordinates(), MathLib::KelvinVector::kelvinVectorToSymmetricTensor(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::VariableArray::mechanical_strain, MaterialPropertyLib::permeability, pressure_index, pressure_size, MaterialPropertyLib::reference_temperature, ParameterLib::SpatialPosition::setElementID(), MaterialPropertyLib::VariableArray::temperature, MaterialPropertyLib::VariableArray::total_stress, MathLib::KelvinVector::Invariants< KelvinVectorSize >::trace(), and MaterialPropertyLib::VariableArray::volumetric_strain.

◆ getIntPtEpsilon()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
std::vector< double > const & ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getIntPtEpsilon ( const double ,
std::vector< GlobalVector * > const & ,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & ,
std::vector< double > & cache ) const
inlineoverridevirtual

◆ getIntPtSigma()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
std::vector< double > const & ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getIntPtSigma ( const double ,
std::vector< GlobalVector * > const & ,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & ,
std::vector< double > & cache ) const
inlineoverridevirtual

◆ getMaterialID()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
int ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getMaterialID ( ) const
overrideprivatevirtual

Implements ProcessLib::HydroMechanics::LocalAssemblerInterface< DisplacementDim >.

Definition at line 1219 of file HydroMechanicsFEM-impl.h.

1220{
1221 return _process_data.material_ids == nullptr
1222 ? 0
1223 : (*_process_data.material_ids)[_element.getID()];
1224}

References _element, _process_data, and getMaterialID().

Referenced by getMaterialID().

◆ getMaterialStateVariablesAt()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables const & ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getMaterialStateVariablesAt ( unsigned integration_point) const
overrideprivatevirtual

Implements ProcessLib::HydroMechanics::LocalAssemblerInterface< DisplacementDim >.

Definition at line 1231 of file HydroMechanicsFEM-impl.h.

1233{
1234 return *_ip_data[integration_point].material_state_variables;
1235}

References _ip_data.

◆ getNumberOfIntegrationPoints()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
unsigned ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getNumberOfIntegrationPoints ( ) const
overrideprivatevirtual

◆ getNumberOfVectorElementsForDeformation()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
int ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getNumberOfVectorElementsForDeformation ( ) const
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 317 of file HydroMechanicsFEM.h.

318 {
319 return displacement_size;
320 }

References displacement_size.

◆ getShapeMatrix()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
Eigen::Map< const Eigen::RowVectorXd > ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getShapeMatrix ( const unsigned integration_point) const
inlineoverridevirtual

Provides the shape matrix at the given integration point.

Implements NumLib::ExtrapolatableElement.

Definition at line 273 of file HydroMechanicsFEM.h.

275 {
276 auto const& N_u = _secondary_data.N_u[integration_point];
277
278 // assumes N is stored contiguously in memory
279 return Eigen::Map<const Eigen::RowVectorXd>(N_u.data(), N_u.size());
280 }

References _secondary_data.

◆ getSigma()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
std::vector< double > ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getSigma ( ) const
overridevirtual

◆ getStrainRateVariable()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
std::vector< double > ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::getStrainRateVariable ( ) const
overridevirtual

Implements ProcessLib::HydroMechanics::LocalAssemblerInterface< DisplacementDim >.

Definition at line 1095 of file HydroMechanicsFEM-impl.h.

1096{
1097 unsigned const n_integration_points =
1098 _integration_method.getNumberOfPoints();
1099
1101
1102 for (unsigned ip = 0; ip < n_integration_points; ++ip)
1103 {
1104 ip_strain_rate_variables[ip] = _ip_data[ip].strain_rate_variable;
1105 }
1106
1108}

References _integration_method, _ip_data, and getStrainRateVariable().

Referenced by getStrainRateVariable().

◆ initializeConcrete()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::initializeConcrete ( )
inlineoverridevirtual

Set initial stress from parameter.

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 220 of file HydroMechanicsFEM.h.

221 {
222 unsigned const n_integration_points =
223 _integration_method.getNumberOfPoints();
224
225 for (unsigned ip = 0; ip < n_integration_points; ip++)
226 {
227 auto& ip_data = _ip_data[ip];
228
230 std::nullopt, _element.getID(),
234 _element, ip_data.N_p))};
235
237 if (_process_data.initial_stress.value)
238 {
239 ip_data.sigma_eff =
241 DisplacementDim>((*_process_data.initial_stress.value)(
243 double>::quiet_NaN() /* time independent */,
244 x_position));
245 }
246
247 double const t = 0; // TODO (naumov) pass t from top
248 ip_data.solid_material.initializeInternalStateVariables(
249 t, x_position, *ip_data.material_state_variables);
250
251 ip_data.pushBackState();
252 }
253 }

References _element, _integration_method, _ip_data, _process_data, NumLib::interpolateCoordinates(), and MathLib::KelvinVector::symmetricTensorToKelvinVector().

◆ postNonLinearSolverConcrete()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::postNonLinearSolverConcrete ( Eigen::VectorXd const & local_x,
Eigen::VectorXd const & local_x_prev,
double const t,
double const dt,
int const process_id )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 836 of file HydroMechanicsFEM-impl.h.

841{
842 // Note: local_x and local_x_prev only contain the solutions of current
843 // process in the staggered scheme. This has to be changed according to the
844 // same two arguments in postTimestepConcrete.
845
846 int const n_integration_points = _integration_method.getNumberOfPoints();
847
848 auto const staggered_scheme_ptr =
849 std::get_if<Staggered>(&_process_data.coupling_scheme);
850
852 process_id == _process_data.hydraulic_process_id)
853 {
854 if (!staggered_scheme_ptr->fixed_stress_over_time_step)
855 {
856 auto const p =
858 auto const p_prev =
860
861 for (int ip = 0; ip < n_integration_points; ip++)
862 {
863 auto& ip_data = _ip_data[ip];
864
865 auto const& N_p = ip_data.N_p;
866
867 ip_data.strain_rate_variable = N_p.dot(p - p_prev) / dt;
868 }
869 }
870 }
871
873 process_id == _process_data.mechanics_related_process_id)
874 {
876 x_position.setElementID(_element.getID());
877
878 auto const& medium =
879 _process_data.media_map.getMedium(_element.getID());
880
881 auto const T_ref =
884 dt);
885
886 auto const u =
888
890 vars.temperature = T_ref;
891
892 for (int ip = 0; ip < n_integration_points; ip++)
893 {
894 auto const& N_u = _ip_data[ip].N_u;
895 auto const& dNdx_u = _ip_data[ip].dNdx_u;
896
897 x_position = {std::nullopt, _element.getID(),
901 _element, N_u))};
902
903 auto const x_coord = x_position.getCoordinates().value()[0];
904 auto const B = LinearBMatrix::computeBMatrix<
908
909 auto& eps = _ip_data[ip].eps;
910 eps.noalias() = B * u;
911 vars.mechanical_strain.emplace<
913
914 _ip_data[ip].updateConstitutiveRelation(vars, t, x_position, dt, u,
915 T_ref);
916 }
917 }
918}

References _element, _integration_method, _ip_data, _is_axially_symmetric, _process_data, ProcessLib::LinearBMatrix::computeBMatrix(), displacement_index, MaterialPropertyLib::EmptyVariableArray, ParameterLib::SpatialPosition::getCoordinates(), NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::mechanical_strain, pressure_index, MaterialPropertyLib::reference_temperature, ParameterLib::SpatialPosition::setElementID(), and MaterialPropertyLib::VariableArray::temperature.

◆ postTimestepConcrete()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::postTimestepConcrete ( Eigen::VectorXd const & local_x,
Eigen::VectorXd const & local_x_prev,
double const t,
double const dt,
int const process_id )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 924 of file HydroMechanicsFEM-impl.h.

928{
929 auto const staggered_scheme_ptr =
930 std::get_if<Staggered>(&_process_data.coupling_scheme);
931
933 process_id == _process_data.hydraulic_process_id)
934 {
935 if (staggered_scheme_ptr->fixed_stress_over_time_step)
936 {
938 staggered_scheme_ptr->fixed_stress_stabilization_parameter;
939
940 auto const p =
942 auto const p_prev =
944
946 x_position.setElementID(_element.getID());
947
948 auto const& solid_material =
950 _process_data.solid_materials, _process_data.material_ids,
951 _element.getID());
952
953 auto const& medium =
954 _process_data.media_map.getMedium(_element.getID());
956
957 auto const T_ref =
959 .template value<double>(vars, x_position, t, dt);
960 vars.temperature = T_ref;
961
962 int const n_integration_points =
963 _integration_method.getNumberOfPoints();
964 for (int ip = 0; ip < n_integration_points; ip++)
965 {
966 auto& ip_data = _ip_data[ip];
967
968 auto const& N_p = ip_data.N_p;
969
970 x_position = {
971 std::nullopt, _element.getID(),
975 _element, N_p))};
976
977 auto const& eps = ip_data.eps;
978 auto const& eps_prev = ip_data.eps_prev;
979 const double eps_v_dot =
981
982 auto const C_el = ip_data.computeElasticTangentStiffness(
983 t, x_position, dt, T_ref);
984 auto const K_S =
985 solid_material.getBulkModulus(t, x_position, &C_el);
986
987 auto const alpha_b =
989 .template value<double>(vars, x_position, t, dt);
990
991 ip_data.strain_rate_variable =
993 N_p.dot(p - p_prev) / dt / K_S;
994 }
995 }
996 }
997
998 unsigned const n_integration_points =
999 _integration_method.getNumberOfPoints();
1000
1001 for (unsigned ip = 0; ip < n_integration_points; ip++)
1002 {
1003 _ip_data[ip].pushBackState();
1004 }
1005}

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::biot_coefficient, NumLib::interpolateCoordinates(), postTimestepConcrete(), pressure_index, MaterialPropertyLib::reference_temperature, MaterialLib::Solids::selectSolidConstitutiveRelation(), ParameterLib::SpatialPosition::setElementID(), MaterialPropertyLib::VariableArray::temperature, and MathLib::KelvinVector::Invariants< KelvinVectorSize >::trace().

Referenced by postTimestepConcrete().

◆ setInitialConditionsConcrete()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
void ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::setInitialConditionsConcrete ( Eigen::VectorXd const local_x,
double const t,
int const process_id )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 774 of file HydroMechanicsFEM-impl.h.

778{
780 x_position.setElementID(_element.getID());
781
782 auto const& medium = _process_data.media_map.getMedium(_element.getID());
783
784 auto const p = local_x.template segment<pressure_size>(pressure_index);
785 auto const u =
787
788 auto const& identity2 = Invariants::identity2;
789 const double dt = 0.0;
790
792
793 int const n_integration_points = _integration_method.getNumberOfPoints();
794 for (int ip = 0; ip < n_integration_points; ip++)
795 {
796 auto const& N_u = _ip_data[ip].N_u;
797 auto const& dNdx_u = _ip_data[ip].dNdx_u;
798
799 x_position = {
800 std::nullopt, _element.getID(),
804 _element, N_u))};
805
806 auto const x_coord = x_position.getCoordinates().value()[0];
807 auto const B =
812
813 auto& eps = _ip_data[ip].eps;
814 eps.noalias() = B * u;
815 vars.mechanical_strain
817 eps);
818
819 if (_process_data.initial_stress.isTotalStress())
820 {
821 auto const& N_p = _ip_data[ip].N_p;
822 auto const alpha_b =
824 .template value<double>(vars, x_position, t, dt);
825
826 auto& sigma_eff = _ip_data[ip].sigma_eff;
827 sigma_eff.noalias() += alpha_b * N_p.dot(p) * identity2;
828 _ip_data[ip].sigma_eff_prev.noalias() = sigma_eff;
829 }
830 }
831}

References _element, _integration_method, _ip_data, _is_axially_symmetric, _process_data, MaterialPropertyLib::biot_coefficient, ProcessLib::LinearBMatrix::computeBMatrix(), displacement_index, ParameterLib::SpatialPosition::getCoordinates(), MathLib::KelvinVector::Invariants< KelvinVectorSize >::identity2, NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::mechanical_strain, pressure_index, and ParameterLib::SpatialPosition::setElementID().

◆ setIPDataInitialConditions()

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
std::size_t ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::setIPDataInitialConditions ( std::string_view const name,
double const * values,
int const integration_order )
overridevirtual

Returns number of read integration points.

Implements ProcessLib::HydroMechanics::LocalAssemblerInterface< DisplacementDim >.

Definition at line 1011 of file HydroMechanicsFEM-impl.h.

1014{
1015 if (integration_order !=
1016 static_cast<int>(_integration_method.getIntegrationOrder()))
1017 {
1018 OGS_FATAL(
1019 "Setting integration point initial conditions; The integration "
1020 "order of the local assembler for element {:d} is different from "
1021 "the integration order in the initial condition.",
1022 _element.getID());
1023 }
1024
1025 if (name == "sigma")
1026 {
1027 if (_process_data.initial_stress.value != nullptr)
1028 {
1029 OGS_FATAL(
1030 "Setting initial conditions for stress from integration "
1031 "point data and from a parameter '{:s}' is not possible "
1032 "simultaneously.",
1033 _process_data.initial_stress.value->name);
1034 }
1035
1038 }
1039
1040 if (name == "epsilon")
1041 {
1044 }
1045
1046 if (name == "strain_rate_variable")
1047 {
1050 }
1051
1052 return 0;
1053}
std::size_t setIntegrationPointKelvinVectorData(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType IpData::*const member)
std::size_t setIntegrationPointScalarData(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType IpData::*const member)

References _element, _integration_method, _ip_data, _process_data, ProcessLib::HydroMechanics::IntegrationPointData< BMatricesType, ShapeMatricesTypeDisplacement, ShapeMatricesTypePressure, DisplacementDim, ShapeFunctionDisplacement::NPOINTS >::eps, OGS_FATAL, ProcessLib::setIntegrationPointKelvinVectorData(), ProcessLib::setIntegrationPointScalarData(), ProcessLib::HydroMechanics::IntegrationPointData< BMatricesType, ShapeMatricesTypeDisplacement, ShapeMatricesTypePressure, DisplacementDim, ShapeFunctionDisplacement::NPOINTS >::sigma_eff, and ProcessLib::HydroMechanics::IntegrationPointData< BMatricesType, ShapeMatricesTypeDisplacement, ShapeMatricesTypePressure, DisplacementDim, ShapeFunctionDisplacement::NPOINTS >::strain_rate_variable.

Member Data Documentation

◆ _element

◆ _integration_method

◆ _ip_data

◆ _is_axially_symmetric

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
bool const ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::_is_axially_symmetric
private

◆ _process_data

◆ _secondary_data

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
SecondaryData< typename ShapeMatricesTypeDisplacement::ShapeMatrices::ShapeType> ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::_secondary_data
private

Definition at line 397 of file HydroMechanicsFEM.h.

Referenced by HydroMechanicsLocalAssembler(), and getShapeMatrix().

◆ displacement_index

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
const int ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::displacement_index = ShapeFunctionPressure::NPOINTS
staticprivate

◆ displacement_size

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
const int ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::displacement_size
staticprivate
Initial value:
=
ShapeFunctionDisplacement::NPOINTS * DisplacementDim

Definition at line 402 of file HydroMechanicsFEM.h.

Referenced by assembleWithJacobian(), assembleWithJacobianForDeformationEquations(), and getNumberOfVectorElementsForDeformation().

◆ KelvinVectorSize

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
int const ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::KelvinVectorSize
static
Initial value:

Definition at line 170 of file HydroMechanicsFEM.h.

Referenced by computeSecondaryVariableConcrete().

◆ N_u_op

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
auto& ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::N_u_op
staticconstexpr
Initial value:
DisplacementDim,
constexpr Eigen::CwiseNullaryOp< EigenBlockMatrixViewFunctor< D, M >, typename EigenBlockMatrixViewFunctor< D, M >::Matrix > eigenBlockMatrixView(const Eigen::MatrixBase< M > &matrix)
RowVectorType< ShapeFunction::NPOINTS > NodalRowVectorType

Definition at line 176 of file HydroMechanicsFEM.h.

Referenced by assembleWithJacobian(), and assembleWithJacobianForDeformationEquations().

◆ pressure_index

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
const int ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::pressure_index = 0
staticprivate

◆ pressure_size

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int DisplacementDim>
const int ProcessLib::HydroMechanics::HydroMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::pressure_size = ShapeFunctionPressure::NPOINTS
staticprivate

The documentation for this class was generated from the following files: