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 29 of file HydroMechanicsFEM-impl.h.

38 _element(e),
40{
41 unsigned const n_integration_points =
42 _integration_method.getNumberOfPoints();
43
46
47 auto const shape_matrices_u =
52
53 auto const shape_matrices_p =
57
58 auto const& solid_material =
60 _process_data.solid_materials, _process_data.material_ids,
61 e.getID());
62
63 for (unsigned ip = 0; ip < n_integration_points; ip++)
64 {
65 _ip_data.emplace_back(solid_material);
66 auto& ip_data = _ip_data[ip];
67 auto const& sm_u = shape_matrices_u[ip];
68 ip_data.integration_weight =
69 _integration_method.getWeightedPoint(ip).getWeight() *
70 sm_u.integralMeasure * sm_u.detJ;
71
72 // Initialize current time step values
73 static const int kelvin_vector_size =
75 ip_data.sigma_eff.setZero(kelvin_vector_size);
76 ip_data.eps.setZero(kelvin_vector_size);
77
78 // Previous time step values are not initialized and are set later.
79 ip_data.eps_prev.resize(kelvin_vector_size);
80 ip_data.sigma_eff_prev.resize(kelvin_vector_size);
81
82 ip_data.N_u = sm_u.N;
83 ip_data.dNdx_u = sm_u.dNdx;
84
86 ip_data.dNdx_p = shape_matrices_p[ip].dNdx;
87
89 }
90}
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 95 of file HydroMechanicsFEM-impl.h.

101{
103
106
107 auto u =
111
112 auto p_prev =
116 auto u_prev =
120
127
132
136
140
144
150
156
162
163 auto const& solid_material =
165 _process_data.solid_materials, _process_data.material_ids,
166 _element.getID());
167
169 x_position.setElementID(_element.getID());
170
171 unsigned const n_integration_points =
172 _integration_method.getNumberOfPoints();
173
174 auto const& b = _process_data.specific_body_force;
175 auto const& medium = _process_data.media_map.getMedium(_element.getID());
176 auto const& solid = medium->phase("Solid");
177 auto const& fluid = fluidPhase(*medium);
179 auto& phase_pressure = medium->hasPhase("Gas") ? vars.gas_phase_pressure
180 : vars.liquid_phase_pressure;
181
182 auto const T_ref =
184 .template value<double>(vars, x_position, t, dt);
185 vars.temperature = T_ref;
186
187 auto const& identity2 = Invariants::identity2;
188
189 for (unsigned ip = 0; ip < n_integration_points; ip++)
190 {
191 auto const& w = _ip_data[ip].integration_weight;
192
193 auto const& N_u = _ip_data[ip].N_u;
194 auto const& dNdx_u = _ip_data[ip].dNdx_u;
195
196 auto const& N_p = _ip_data[ip].N_p;
197 auto const& dNdx_p = _ip_data[ip].dNdx_p;
198
199 x_position = {
200 std::nullopt, _element.getID(),
204 _element, N_u))};
205
206 auto const x_coord = x_position.getCoordinates().value()[0];
207
208 auto const B =
213
214 auto& eps = _ip_data[ip].eps;
215 eps.noalias() = B * u;
216 auto const& sigma_eff = _ip_data[ip].sigma_eff;
217
218 double const p_int_pt = N_p.dot(p);
219
221
222 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
223 t, x_position, dt, T_ref);
224 auto const K_S = solid_material.getBulkModulus(t, x_position, &C_el);
225
226 auto const alpha = medium->property(MPL::PropertyType::biot_coefficient)
227 .template value<double>(vars, x_position, t, dt);
228
229 auto const rho_sr =
231 .template value<double>(vars, x_position, t, dt);
232 auto const porosity =
234 .template value<double>(vars, x_position, t, dt);
235
236 auto const [rho_fr, mu] =
238 fluid, vars);
239
240 auto const beta_p =
242 .template dValue<double>(vars, _process_data.phase_variable,
243 x_position, t, dt) /
244 rho_fr;
245
246 // Set mechanical variables for the intrinsic permeability model
247 // For stress dependent permeability.
248 {
249 auto const sigma_total =
250 (_ip_data[ip].sigma_eff - alpha * p_int_pt * identity2).eval();
251
252 vars.total_stress.emplace<SymmetricTensor>(
254 sigma_total));
255 }
256 // For strain dependent permeability
257 vars.volumetric_strain = Invariants::trace(eps);
258 vars.equivalent_plastic_strain =
259 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
260 vars.mechanical_strain
262 eps);
263
266 .value(vars, x_position, t, dt));
267 auto const dkde = MPL::formEigenTensor<
269 (*medium)[MPL::PropertyType::permeability].dValue(
271
272 auto const K_over_mu = K / mu;
273
274 auto C = _ip_data[ip].updateConstitutiveRelation(vars, t, x_position,
275 dt, u, T_ref);
276
277 //
278 // displacement equation, displacement part
279 //
283 .noalias() += B.transpose() * C * B * w;
284
285 double const rho = rho_sr * (1 - porosity) + porosity * rho_fr;
287 .noalias() -=
288 (B.transpose() * sigma_eff - N_u_op(N_u).transpose() * rho * b) * w;
289
290 //
291 // displacement equation, pressure part
292 //
293 Kup.noalias() += B.transpose() * alpha * identity2 * N_p * w;
294
295 //
296 // pressure equation, pressure part.
297 //
298 laplace_p.noalias() +=
299 rho_fr * dNdx_p.transpose() * K_over_mu * dNdx_p * w;
300
301 storage_p.noalias() +=
302 rho_fr * N_p.transpose() * N_p * w *
303 ((alpha - porosity) * (1.0 - alpha) / K_S + porosity * beta_p);
304
305 // density dependence on pressure evaluated for Darcy-term,
306 // for laplace and storage terms this dependence is neglected
307 add_p_derivative.noalias() += rho_fr * beta_p * dNdx_p.transpose() *
308 K_over_mu *
309 (dNdx_p * p - 2.0 * rho_fr * b) * N_p * w;
310
311 local_rhs.template segment<pressure_size>(pressure_index).noalias() +=
312 dNdx_p.transpose() * rho_fr * rho_fr * K_over_mu * b * w;
313
314 //
315 // pressure equation, displacement part.
316 //
317 Kpu.noalias() +=
318 rho_fr * alpha * N_p.transpose() * identity2.transpose() * B * w;
319
320 Kpu_k.noalias() +=
321 dNdx_p.transpose() *
323 dNdx_p * p - rho_fr * b) *
324 dkde * B * rho_fr / mu * w;
325 }
326 // displacement equation, pressure part
330 .noalias() = -Kup;
331
332 if (_process_data.mass_lumping)
333 {
334 storage_p = storage_p.colwise().sum().eval().asDiagonal();
335
336 if constexpr (pressure_size == displacement_size)
337 {
338 Kpu = Kpu.colwise().sum().eval().asDiagonal();
339 Kpu_k = Kpu_k.colwise().sum().eval().asDiagonal();
340 }
341 }
342
343 // pressure equation, pressure part.
347 .noalias() += laplace_p + storage_p / dt + add_p_derivative;
348
349 // pressure equation, displacement part.
353 .noalias() += Kpu / dt + Kpu_k;
354
355 // pressure equation
356 local_rhs.template segment<pressure_size>(pressure_index).noalias() -=
357 laplace_p * p + storage_p * (p - p_prev) / dt + Kpu * (u - u_prev) / dt;
358
359 // displacement equation
361 .noalias() += Kup * p;
362}
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::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::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 641 of file HydroMechanicsFEM-impl.h.

645{
646 auto const p = local_x.template segment<pressure_size>(pressure_index);
647 auto const u =
649
654
655 auto local_rhs =
659
661 x_position.setElementID(_element.getID());
662
663 auto const& medium = _process_data.media_map.getMedium(_element.getID());
664 auto const& solid = medium->phase("Solid");
665 auto const& fluid = fluidPhase(*medium);
667 auto& phase_pressure = medium->hasPhase("Gas") ? vars.gas_phase_pressure
668 : vars.liquid_phase_pressure;
669
670 auto const T_ref =
672 .template value<double>(vars, x_position, t, dt);
673 vars.temperature = T_ref;
674
675 int const n_integration_points = _integration_method.getNumberOfPoints();
676 for (int ip = 0; ip < n_integration_points; ip++)
677 {
678 auto const& w = _ip_data[ip].integration_weight;
679
680 auto const& N_u = _ip_data[ip].N_u;
681 auto const& dNdx_u = _ip_data[ip].dNdx_u;
682
683 auto const& N_p = _ip_data[ip].N_p;
684
685 x_position = {
686 std::nullopt, _element.getID(),
690 _element, N_u))};
691
692 auto const x_coord = x_position.getCoordinates().value()[0];
693 auto const B =
698
699 auto& eps = _ip_data[ip].eps;
700 auto const& sigma_eff = _ip_data[ip].sigma_eff;
701
702 phase_pressure = N_p.dot(p);
703
704 auto const alpha = medium->property(MPL::PropertyType::biot_coefficient)
705 .template value<double>(vars, x_position, t, dt);
706 auto const rho_sr =
708 .template value<double>(vars, x_position, t, dt);
709 auto const porosity =
711 .template value<double>(vars, x_position, t, dt);
712
714 t, dt, x_position, fluid, vars);
715
716 auto const& b = _process_data.specific_body_force;
720
721 eps.noalias() = B * u;
722 vars.mechanical_strain
724 eps);
725
726 auto C = _ip_data[ip].updateConstitutiveRelation(vars, t, x_position,
727 dt, u, T_ref);
728
729 local_Jac.noalias() += B.transpose() * C * B * w;
730
731 double p_at_xi = 0.;
733
734 double const rho = rho_sr * (1 - porosity) + porosity * rho_fr;
735 local_rhs.noalias() -=
736 (B.transpose() * (sigma_eff - alpha * identity2 * p_at_xi) -
737 N_u_op(N_u).transpose() * rho * b) *
738 w;
739 }
740}
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::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(), 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 463 of file HydroMechanicsFEM-impl.h.

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

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::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 745 of file HydroMechanicsFEM-impl.h.

752{
753 // For the equations with pressure
754 if (process_id == _process_data.hydraulic_process_id)
755 {
758 return;
759 }
760
761 // For the equations with deformation
764}
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 1108 of file HydroMechanicsFEM-impl.h.

1112{
1113 auto const p = local_x.template segment<pressure_size>(pressure_index);
1114
1118 *_process_data.pressure_interpolated);
1119
1120 int const elem_id = _element.getID();
1121
1122 unsigned const n_integration_points =
1123 _integration_method.getNumberOfPoints();
1124
1125 auto const& medium = _process_data.media_map.getMedium(elem_id);
1127 auto& phase_pressure = medium->hasPhase("Gas") ? vars.gas_phase_pressure
1128 : vars.liquid_phase_pressure;
1129
1133
1134 auto const& identity2 = Invariants::identity2;
1135
1136 for (unsigned ip = 0; ip < n_integration_points; ip++)
1137 {
1138 auto const& eps = _ip_data[ip].eps;
1139 sigma_eff_sum += _ip_data[ip].sigma_eff;
1140
1142 std::nullopt, _element.getID(),
1146 _element, _ip_data[ip].N_u))};
1147
1148 auto const alpha = medium->property(MPL::PropertyType::biot_coefficient)
1149 .template value<double>(vars, x_position, t, dt);
1150 double const p_int_pt = _ip_data[ip].N_p.dot(p);
1151
1153
1154 // Set mechanical variables for the intrinsic permeability model
1155 // For stress dependent permeability.
1156 {
1157 auto const sigma_total =
1158 (_ip_data[ip].sigma_eff - alpha * p_int_pt * identity2).eval();
1159 vars.total_stress.emplace<SymmetricTensor>(
1161 sigma_total));
1162 }
1163 // For strain dependent permeability
1164 vars.volumetric_strain = Invariants::trace(eps);
1165 vars.equivalent_plastic_strain =
1166 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
1167 vars.mechanical_strain
1169 eps);
1170
1173 .value(vars, x_position, t, dt));
1174 }
1175
1177 &(*_process_data.permeability)[elem_id * KelvinVectorSize],
1179
1183
1185
1187 &(*_process_data.principal_stress_values)[elem_id * 3], 3) =
1188 e_s.eigenvalues();
1189
1190 auto eigen_vectors = e_s.eigenvectors();
1191
1192 for (auto i = 0; i < 3; i++)
1193 {
1195 &(*_process_data.principal_stress_vector[i])[elem_id * 3], 3) =
1196 eigen_vectors.col(i);
1197 }
1198}
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::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 367 of file HydroMechanicsFEM-impl.h.

373{
374 int const hydraulic_process_id = _process_data.hydraulic_process_id;
375 auto const indices =
377 assert(!indices.empty());
378 auto const local_x = x[hydraulic_process_id]->get(indices);
379
380 unsigned const n_integration_points =
381 _integration_method.getNumberOfPoints();
382 cache.clear();
386
389
391 x_position.setElementID(_element.getID());
392
393 auto const& medium = _process_data.media_map.getMedium(_element.getID());
394 auto const& fluid = fluidPhase(*medium);
396 auto& phase_pressure = medium->hasPhase("Gas") ? vars.gas_phase_pressure
397 : vars.liquid_phase_pressure;
398
399 // TODO (naumov) Temporary value not used by current material models. Need
400 // extension of secondary variables interface.
402 vars.temperature =
404 .template value<double>(vars, x_position, t, dt);
405
406 auto const& identity2 = Invariants::identity2;
407
408 for (unsigned ip = 0; ip < n_integration_points; ip++)
409 {
410 x_position = {
411 std::nullopt, _element.getID(),
415 _element, _ip_data[ip].N_u))};
416
417 double const p_int_pt = _ip_data[ip].N_p.dot(p);
418
420
421 auto const alpha = medium->property(MPL::PropertyType::biot_coefficient)
422 .template value<double>(vars, x_position, t, dt);
423
424 // Set mechanical variables for the intrinsic permeability model
425 // For stress dependent permeability.
426 auto const sigma_total =
427 (_ip_data[ip].sigma_eff - alpha * p_int_pt * identity2).eval();
428 vars.total_stress.emplace<SymmetricTensor>(
430
431 // For strain dependent permeability
432 vars.volumetric_strain = Invariants::trace(_ip_data[ip].eps);
433 vars.equivalent_plastic_strain =
434 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
435 vars.mechanical_strain
437 _ip_data[ip].eps);
438
441 .value(vars, x_position, t, dt));
442
443 auto const [rho_fr, mu] =
445 fluid, vars);
446
447 auto const K_over_mu = K / mu;
448
449 auto const& b = _process_data.specific_body_force;
450
451 // Compute the velocity
452 auto const& dNdx_p = _ip_data[ip].dNdx_p;
453 cache_matrix.col(ip).noalias() =
454 -K_over_mu * dNdx_p * p + K_over_mu * rho_fr * b;
455 }
456
457 return cache;
458}
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::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 1213 of file HydroMechanicsFEM-impl.h.

1214{
1215 return _process_data.material_ids == nullptr
1216 ? 0
1217 : (*_process_data.material_ids)[_element.getID()];
1218}

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 1225 of file HydroMechanicsFEM-impl.h.

1227{
1228 return *_ip_data[integration_point].material_state_variables;
1229}

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 1090 of file HydroMechanicsFEM-impl.h.

1091{
1092 unsigned const n_integration_points =
1093 _integration_method.getNumberOfPoints();
1094
1096
1097 for (unsigned ip = 0; ip < n_integration_points; ++ip)
1098 {
1099 ip_strain_rate_variables[ip] = _ip_data[ip].strain_rate_variable;
1100 }
1101
1103}

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 831 of file HydroMechanicsFEM-impl.h.

836{
837 // Note: local_x and local_x_prev only contain the solutions of current
838 // process in the staggered scheme. This has to be changed according to the
839 // same two arguments in postTimestepConcrete.
840
841 int const n_integration_points = _integration_method.getNumberOfPoints();
842
843 auto const staggered_scheme_ptr =
844 std::get_if<Staggered>(&_process_data.coupling_scheme);
845
847 process_id == _process_data.hydraulic_process_id)
848 {
849 if (!staggered_scheme_ptr->fixed_stress_over_time_step)
850 {
851 auto const p =
853 auto const p_prev =
855
856 for (int ip = 0; ip < n_integration_points; ip++)
857 {
858 auto& ip_data = _ip_data[ip];
859
860 auto const& N_p = ip_data.N_p;
861
862 ip_data.strain_rate_variable = N_p.dot(p - p_prev) / dt;
863 }
864 }
865 }
866
868 process_id == _process_data.mechanics_related_process_id)
869 {
871 x_position.setElementID(_element.getID());
872
873 auto const& medium =
874 _process_data.media_map.getMedium(_element.getID());
875
876 auto const T_ref =
879 dt);
880
881 auto const u =
883
885 vars.temperature = T_ref;
886
887 for (int ip = 0; ip < n_integration_points; ip++)
888 {
889 auto const& N_u = _ip_data[ip].N_u;
890 auto const& dNdx_u = _ip_data[ip].dNdx_u;
891
892 x_position = {std::nullopt, _element.getID(),
896 _element, N_u))};
897
898 auto const x_coord = x_position.getCoordinates().value()[0];
899 auto const B = LinearBMatrix::computeBMatrix<
903
904 auto& eps = _ip_data[ip].eps;
905 eps.noalias() = B * u;
906 vars.mechanical_strain.emplace<
908
909 _ip_data[ip].updateConstitutiveRelation(vars, t, x_position, dt, u,
910 T_ref);
911 }
912 }
913}

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 919 of file HydroMechanicsFEM-impl.h.

923{
924 auto const staggered_scheme_ptr =
925 std::get_if<Staggered>(&_process_data.coupling_scheme);
926
928 process_id == _process_data.hydraulic_process_id)
929 {
930 if (staggered_scheme_ptr->fixed_stress_over_time_step)
931 {
933 staggered_scheme_ptr->fixed_stress_stabilization_parameter;
934
935 auto const p =
937 auto const p_prev =
939
941 x_position.setElementID(_element.getID());
942
943 auto const& solid_material =
945 _process_data.solid_materials, _process_data.material_ids,
946 _element.getID());
947
948 auto const& medium =
949 _process_data.media_map.getMedium(_element.getID());
951
952 auto const T_ref =
954 .template value<double>(vars, x_position, t, dt);
955 vars.temperature = T_ref;
956
957 int const n_integration_points =
958 _integration_method.getNumberOfPoints();
959 for (int ip = 0; ip < n_integration_points; ip++)
960 {
961 auto& ip_data = _ip_data[ip];
962
963 auto const& N_p = ip_data.N_p;
964
965 x_position = {
966 std::nullopt, _element.getID(),
970 _element, N_p))};
971
972 auto const& eps = ip_data.eps;
973 auto const& eps_prev = ip_data.eps_prev;
974 const double eps_v_dot =
976
977 auto const C_el = ip_data.computeElasticTangentStiffness(
978 t, x_position, dt, T_ref);
979 auto const K_S =
980 solid_material.getBulkModulus(t, x_position, &C_el);
981
982 auto const alpha_b =
984 .template value<double>(vars, x_position, t, dt);
985
986 ip_data.strain_rate_variable =
988 N_p.dot(p - p_prev) / dt / K_S;
989 }
990 }
991 }
992
993 unsigned const n_integration_points =
994 _integration_method.getNumberOfPoints();
995
996 for (unsigned ip = 0; ip < n_integration_points; ip++)
997 {
998 _ip_data[ip].pushBackState();
999 }
1000}

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 769 of file HydroMechanicsFEM-impl.h.

773{
775 x_position.setElementID(_element.getID());
776
777 auto const& medium = _process_data.media_map.getMedium(_element.getID());
778
779 auto const p = local_x.template segment<pressure_size>(pressure_index);
780 auto const u =
782
783 auto const& identity2 = Invariants::identity2;
784 const double dt = 0.0;
785
787
788 int const n_integration_points = _integration_method.getNumberOfPoints();
789 for (int ip = 0; ip < n_integration_points; ip++)
790 {
791 auto const& N_u = _ip_data[ip].N_u;
792 auto const& dNdx_u = _ip_data[ip].dNdx_u;
793
794 x_position = {
795 std::nullopt, _element.getID(),
799 _element, N_u))};
800
801 auto const x_coord = x_position.getCoordinates().value()[0];
802 auto const B =
807
808 auto& eps = _ip_data[ip].eps;
809 eps.noalias() = B * u;
810 vars.mechanical_strain
812 eps);
813
814 if (_process_data.initial_stress.isTotalStress())
815 {
816 auto const& N_p = _ip_data[ip].N_p;
817 auto const alpha_b =
819 .template value<double>(vars, x_position, t, dt);
820
821 auto& sigma_eff = _ip_data[ip].sigma_eff;
822 sigma_eff.noalias() += alpha_b * N_p.dot(p) * identity2;
823 _ip_data[ip].sigma_eff_prev.noalias() = sigma_eff;
824 }
825 }
826}

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 1006 of file HydroMechanicsFEM-impl.h.

1009{
1010 if (integration_order !=
1011 static_cast<int>(_integration_method.getIntegrationOrder()))
1012 {
1013 OGS_FATAL(
1014 "Setting integration point initial conditions; The integration "
1015 "order of the local assembler for element {:d} is different from "
1016 "the integration order in the initial condition.",
1017 _element.getID());
1018 }
1019
1020 if (name == "sigma")
1021 {
1022 if (_process_data.initial_stress.value != nullptr)
1023 {
1024 OGS_FATAL(
1025 "Setting initial conditions for stress from integration "
1026 "point data and from a parameter '{:s}' is not possible "
1027 "simultaneously.",
1028 _process_data.initial_stress.value->name);
1029 }
1030
1033 }
1034
1035 if (name == "epsilon")
1036 {
1039 }
1040
1041 if (name == "strain_rate_variable")
1042 {
1045 }
1046
1047 return 0;
1048}
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: