Loading [MathJax]/extensions/tex2jax.js
OGS
ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim > Class Template Reference

Detailed Description

template<typename ShapeFunctionDisplacement, typename ShapeFunctionPressure, int GlobalDim>
class ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >

Definition at line 30 of file HydroMechanicsLocalAssemblerFracture.h.

#include <HydroMechanicsLocalAssemblerFracture.h>

Inheritance diagram for ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >:
[legend]
Collaboration diagram for ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >:
[legend]

Public Member Functions

 HydroMechanicsLocalAssemblerFracture (HydroMechanicsLocalAssemblerFracture const &)=delete
 
 HydroMechanicsLocalAssemblerFracture (HydroMechanicsLocalAssemblerFracture &&)=delete
 
 HydroMechanicsLocalAssemblerFracture (MeshLib::Element const &e, std::size_t const local_matrix_size, std::vector< unsigned > const &dofIndex_to_localIndex, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, HydroMechanicsProcessData< GlobalDim > &process_data)
 
void preTimestepConcrete (std::vector< double > const &, double const, double const) override
 
void postTimestepConcreteWithVector (const double t, double const dt, Eigen::VectorXd const &local_x) 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
 
std::vector< double > const & getIntPtDarcyVelocity (const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
 
std::vector< double > const & getIntPtFractureVelocity (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 & getIntPtFractureStress (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 & getIntPtFractureAperture (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 & getIntPtFracturePermeability (const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
 
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix (const unsigned integration_point) const override
 Provides the shape matrix at the given integration point.
 
- Public Member Functions inherited from ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface
 HydroMechanicsLocalAssemblerInterface (MeshLib::Element const &element, bool const is_axially_symmetric, NumLib::GenericIntegrationMethod const &integration_method, std::size_t n_local_size, std::vector< unsigned > dofIndex_to_localIndex)
 
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_b_data, std::vector< double > &local_Jac_data) override
 
void postTimestepConcrete (Eigen::VectorXd const &local_x_, Eigen::VectorXd const &, const double t, double const dt, int 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 assembleWithJacobianForStaggeredScheme (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_b_data, std::vector< double > &local_Jac_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.
 
virtual std::optional< VectorSegmentgetVectorDeformationSegment () const
 
- Public Member Functions inherited from NumLib::ExtrapolatableElement
virtual ~ExtrapolatableElement ()=default
 

Private Types

using ShapeMatricesTypeDisplacement
 
using HMatricesType
 
using HMatrixType = typename HMatricesType::HMatrixType
 
using ShapeMatricesTypePressure
 
using IntegrationPointDataType
 
using GlobalDimVectorType = Eigen::Matrix<double, GlobalDim, 1>
 

Private Member Functions

void assembleWithJacobianConcrete (double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, Eigen::VectorXd &local_b, Eigen::MatrixXd &local_J) override
 
void assembleBlockMatricesWithJacobian (double const t, double const dt, Eigen::Ref< const Eigen::VectorXd > const &p, Eigen::Ref< const Eigen::VectorXd > const &p_prev, Eigen::Ref< const Eigen::VectorXd > const &g, Eigen::Ref< const Eigen::VectorXd > const &g_prev, Eigen::Ref< Eigen::VectorXd > rhs_p, Eigen::Ref< Eigen::VectorXd > rhs_g, Eigen::Ref< Eigen::MatrixXd > J_pp, Eigen::Ref< Eigen::MatrixXd > J_pg, Eigen::Ref< Eigen::MatrixXd > J_gg, Eigen::Ref< Eigen::MatrixXd > J_gp)
 

Private Attributes

HydroMechanicsProcessData< GlobalDim > & _process_data
 
std::vector< IntegrationPointDataType, Eigen::aligned_allocator< IntegrationPointDataType > > _ip_data
 
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
 

Additional Inherited Members

- Protected Member Functions inherited from ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface
- Protected Attributes inherited from ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface
MeshLib::Element const & _element
 
bool const _is_axially_symmetric
 
NumLib::GenericIntegrationMethod const & _integration_method
 

Member Typedef Documentation

◆ GlobalDimVectorType

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
using ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::GlobalDimVectorType = Eigen::Matrix<double, GlobalDim, 1>
private

Definition at line 158 of file HydroMechanicsLocalAssemblerFracture.h.

◆ HMatricesType

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
using ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::HMatricesType
private
Initial value:
HMatrixPolicyType<ShapeFunctionDisplacement, GlobalDim>

Definition at line 144 of file HydroMechanicsLocalAssemblerFracture.h.

◆ HMatrixType

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
using ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::HMatrixType = typename HMatricesType::HMatrixType
private

Definition at line 146 of file HydroMechanicsLocalAssemblerFracture.h.

◆ IntegrationPointDataType

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
using ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::IntegrationPointDataType
private
Initial value:
IntegrationPointDataFracture<HMatricesType,
ShapeMatrixPolicyType< ShapeFunctionDisplacement, GlobalDim > ShapeMatricesTypeDisplacement
ShapeMatrixPolicyType< ShapeFunctionPressure, GlobalDim > ShapeMatricesTypePressure

Definition at line 153 of file HydroMechanicsLocalAssemblerFracture.h.

◆ ShapeMatricesTypeDisplacement

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
using ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::ShapeMatricesTypeDisplacement
private

◆ ShapeMatricesTypePressure

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
using ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::ShapeMatricesTypePressure
private

Constructor & Destructor Documentation

◆ HydroMechanicsLocalAssemblerFracture() [1/3]

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::HydroMechanicsLocalAssemblerFracture ( HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim > const & )
delete

◆ HydroMechanicsLocalAssemblerFracture() [2/3]

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::HydroMechanicsLocalAssemblerFracture ( HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim > && )
delete

◆ HydroMechanicsLocalAssemblerFracture() [3/3]

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::HydroMechanicsLocalAssemblerFracture ( MeshLib::Element const & e,
std::size_t const local_matrix_size,
std::vector< unsigned > const & dofIndex_to_localIndex,
NumLib::GenericIntegrationMethod const & integration_method,
bool const is_axially_symmetric,
HydroMechanicsProcessData< GlobalDim > & process_data )

Definition at line 44 of file HydroMechanicsLocalAssemblerFracture-impl.h.

53 e, is_axially_symmetric, integration_method,
54 ShapeFunctionDisplacement::NPOINTS * GlobalDim +
55 ShapeFunctionPressure::NPOINTS,
56 dofIndex_to_localIndex),
57 _process_data(process_data)
58{
59 assert(e.getDimension() == GlobalDim - 1);
60
61 unsigned const n_integration_points =
62 integration_method.getNumberOfPoints();
63
64 _ip_data.reserve(n_integration_points);
65 _secondary_data.N.resize(n_integration_points);
66
67 auto const shape_matrices_u =
68 NumLib::initShapeMatrices<ShapeFunctionDisplacement,
70 e, is_axially_symmetric, integration_method);
71
72 auto const shape_matrices_p =
73 NumLib::initShapeMatrices<ShapeFunctionPressure,
74 ShapeMatricesTypePressure, GlobalDim>(
75 e, is_axially_symmetric, integration_method);
76
77 auto const& frac_prop = *_process_data.fracture_property;
78
79 // Get element nodes for aperture0 interpolation from nodes to integration
80 // point. The aperture0 parameter is time-independent.
82 aperture0_node_values = frac_prop.aperture0.getNodalValuesOnElement(
83 e, /*time independent*/ 0);
84
85 for (unsigned ip = 0; ip < n_integration_points; ip++)
86 {
87 _ip_data.emplace_back(*_process_data.fracture_model);
88 auto const& sm_u = shape_matrices_u[ip];
89 auto const& sm_p = shape_matrices_p[ip];
91 std::nullopt, _element.getID(),
93 NumLib::interpolateCoordinates<ShapeFunctionDisplacement,
95 _element, sm_u.N))};
96
97 auto& ip_data = _ip_data[ip];
98 ip_data.integration_weight =
99 sm_u.detJ * sm_u.integralMeasure *
100 integration_method.getWeightedPoint(ip).getWeight();
101
102 ip_data.H_u.setZero(GlobalDim,
103 ShapeFunctionDisplacement::NPOINTS * GlobalDim);
105 GlobalDim, ShapeFunctionDisplacement::NPOINTS,
107 HMatrixType>(sm_u.N, ip_data.H_u);
108 ip_data.N_p = sm_p.N;
109 ip_data.dNdx_p = sm_p.dNdx;
110
111 _secondary_data.N[ip] = sm_u.N;
112
113 // Initialize current time step values
114 ip_data.w.setZero(GlobalDim);
115 ip_data.sigma_eff.setZero(GlobalDim);
116
117 // Previous time step values are not initialized and are set later.
118 ip_data.w_prev.resize(GlobalDim);
119 ip_data.sigma_eff_prev.resize(GlobalDim);
120
121 ip_data.C.resize(GlobalDim, GlobalDim);
122
123 ip_data.aperture0 = aperture0_node_values.dot(sm_u.N);
124 ip_data.aperture = ip_data.aperture0;
125
126 auto const initial_effective_stress =
127 _process_data.initial_fracture_effective_stress(0, x_position);
128 for (int i = 0; i < GlobalDim; i++)
129 {
130 ip_data.sigma_eff[i] = initial_effective_stress[i];
131 ip_data.sigma_eff_prev[i] = initial_effective_stress[i];
132 }
133 }
134}
std::size_t getID() const
Returns the ID of the element.
Definition Element.h:89
SecondaryData< typename ShapeMatricesTypeDisplacement::ShapeMatrices::ShapeType > _secondary_data
std::vector< IntegrationPointDataType, Eigen::aligned_allocator< IntegrationPointDataType > > _ip_data
HydroMechanicsLocalAssemblerInterface(MeshLib::Element const &element, bool const is_axially_symmetric, NumLib::GenericIntegrationMethod const &integration_method, std::size_t n_local_size, std::vector< unsigned > dofIndex_to_localIndex)
std::vector< typename ShapeMatricesType::ShapeMatrices, Eigen::aligned_allocator< typename ShapeMatricesType::ShapeMatrices > > initShapeMatrices(MeshLib::Element const &e, bool const is_axially_symmetric, IntegrationMethod const &integration_method)
std::array< double, 3 > interpolateCoordinates(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
void computeHMatrix(N_Type const &N, HMatrixType &H)
Fills a H-matrix based on given shape function.
VectorType< ShapeFunction::NPOINTS > NodalVectorType
RowVectorType< ShapeFunction::NPOINTS > NodalRowVectorType
std::vector< ShapeMatrixType, Eigen::aligned_allocator< ShapeMatrixType > > N

References ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface::_element, ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::_ip_data, ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::_process_data, ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::_secondary_data, ProcessLib::computeHMatrix(), MeshLib::Element::getDimension(), MeshLib::Element::getID(), NumLib::GenericIntegrationMethod::getNumberOfPoints(), MathLib::WeightedPoint::getWeight(), NumLib::GenericIntegrationMethod::getWeightedPoint(), NumLib::initShapeMatrices(), NumLib::interpolateCoordinates(), and ProcessLib::LIE::HydroMechanics::SecondaryData< ShapeMatrixType >::N.

Member Function Documentation

◆ assembleBlockMatricesWithJacobian()

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
void ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::assembleBlockMatricesWithJacobian ( double const t,
double const dt,
Eigen::Ref< const Eigen::VectorXd > const & p,
Eigen::Ref< const Eigen::VectorXd > const & p_prev,
Eigen::Ref< const Eigen::VectorXd > const & g,
Eigen::Ref< const Eigen::VectorXd > const & g_prev,
Eigen::Ref< Eigen::VectorXd > rhs_p,
Eigen::Ref< Eigen::VectorXd > rhs_g,
Eigen::Ref< Eigen::MatrixXd > J_pp,
Eigen::Ref< Eigen::MatrixXd > J_pg,
Eigen::Ref< Eigen::MatrixXd > J_gg,
Eigen::Ref< Eigen::MatrixXd > J_gp )
private

Definition at line 170 of file HydroMechanicsLocalAssemblerFracture-impl.h.

180{
181 auto const& frac_prop = *_process_data.fracture_property;
182 auto const& R = frac_prop.R;
183
184 // the index of a normal (normal to a fracture plane) component
185 // in a displacement vector
186 auto constexpr index_normal = GlobalDim - 1;
187
189 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
191
193 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
195
196 typename ShapeMatricesTypeDisplacement::template MatrixType<
198 Kgp = ShapeMatricesTypeDisplacement::template MatrixType<
201
202 // Projection of the body force vector at the element.
203 Eigen::MatrixXd const global2local_rotation =
204 R.template topLeftCorner<ShapeFunctionPressure::DIM, GlobalDim>();
205
206 GlobalDimVectorType const gravity_vec = global2local_rotation.transpose() *
207 global2local_rotation *
208 _process_data.specific_body_force;
209
211 x_position.setElementID(_element.getID());
212
213 MPL::VariableArray variables;
214 auto const& medium = _process_data.media_map.getMedium(_element.getID());
215 auto const& liquid_phase = medium->phase("AqueousLiquid");
216 auto const T_ref =
217 medium->property(MPL::PropertyType::reference_temperature)
218 .template value<double>(variables, x_position, t, dt);
219 variables.temperature = T_ref;
220
221 unsigned const n_integration_points = _ip_data.size();
222 for (unsigned ip = 0; ip < n_integration_points; ip++)
223 {
224 auto& ip_data = _ip_data[ip];
225 auto const& ip_w = ip_data.integration_weight;
226 auto const& N_p = ip_data.N_p;
227 auto const& dNdx_p = ip_data.dNdx_p;
228 auto const& H_g = ip_data.H_u;
229 auto const& identity2 =
231
232 x_position = {
233 std::nullopt, _element.getID(),
235 NumLib::interpolateCoordinates<ShapeFunctionPressure,
237 _element, N_p))};
238
239 auto& mat = ip_data.fracture_material;
240 auto& effective_stress = ip_data.sigma_eff;
241 auto const& effective_stress_prev = ip_data.sigma_eff_prev;
242 auto& w = ip_data.w;
243 auto const& w_prev = ip_data.w_prev;
244 auto& C = ip_data.C;
245 auto& state = *ip_data.material_state_variables;
246 auto& b_m = ip_data.aperture;
247
248 auto const rho_fr =
249 liquid_phase.property(MPL::PropertyType::density)
250 .template value<double>(variables, x_position, t, dt);
251 variables.density = rho_fr;
252
253 auto const alpha =
254 medium->property(MPL::PropertyType::biot_coefficient)
255 .template value<double>(variables, x_position, t, dt);
256
257 double const S =
258 medium->property(MPL::PropertyType::storage)
259 .template value<double>(variables, x_position, t, dt);
260
261 auto const mu =
262 liquid_phase.property(MPL::PropertyType::viscosity)
263 .template value<double>(variables, x_position, t, dt);
264
265 // displacement jumps in local coordinates
266 w.noalias() = R * H_g * g;
267
268 // aperture
269 b_m = ip_data.aperture0 + w[index_normal];
270 if (b_m < 0.0)
271 {
272 DBUG(
273 "Element {:d}, gp {:d}: Fracture aperture is {:g}, but it must "
274 "be "
275 "non-negative. Setting it to zero.",
276 _element.getID(), ip, b_m);
277 b_m = 0;
278 }
279
280 auto const initial_effective_stress =
281 _process_data.initial_fracture_effective_stress(0, x_position);
282
283 Eigen::Map<typename HMatricesType::ForceVectorType const> const stress0(
284 initial_effective_stress.data(), initial_effective_stress.size());
285
286 // local C, local stress
287 mat.computeConstitutiveRelation(
288 t, x_position, ip_data.aperture0, stress0, w_prev, w,
289 effective_stress_prev, effective_stress, C, state);
290
291 //
292 // displacement equation, displacement jump part
293 //
294 rhs_g.noalias() -=
295 H_g.transpose() * R.transpose() * effective_stress * ip_w;
296 J_gg.noalias() += H_g.transpose() * R.transpose() * C * R * H_g * ip_w;
297
298 //
299 // displacement equation, pressure part
300 //
301 Kgp.noalias() +=
302 H_g.transpose() * R.transpose() * alpha * identity2 * N_p * ip_w;
303
304 //
305 // pressure equation, pressure part.
306 //
307
308 variables.fracture_aperture = b_m;
309 // Assume that the fracture permeability is isotropic
310 auto const permeability =
311 medium->property(MPL::PropertyType::permeability)
312 .value(variables, x_position, t, dt);
313
314 auto& k = ip_data.permeability;
315 k = std::get<double>(permeability);
316 double const k_over_mu = k / mu;
317 storage_p.noalias() += N_p.transpose() * b_m * S * N_p * ip_w;
318 laplace_p.noalias() +=
319 dNdx_p.transpose() * b_m * k_over_mu * dNdx_p * ip_w;
320 rhs_p.noalias() +=
321 dNdx_p.transpose() * b_m * k_over_mu * rho_fr * gravity_vec * ip_w;
322
323 //
324 // pressure equation, displacement jump part.
325 //
326 GlobalDimVectorType const grad_head = dNdx_p * p + rho_fr * gravity_vec;
327 Eigen::Matrix<double, 1, displacement_size> const mT_R_Hg =
328 identity2.transpose() * R * H_g;
329 // velocity in global coordinates
330 ip_data.darcy_velocity = -k_over_mu * grad_head;
331 J_pg.noalias() +=
332 N_p.transpose() * S * N_p * (p - p_prev) / dt * mT_R_Hg * ip_w;
333
334 // derivative of permeability with respect to aperture
335 double const dk_db_over_mu =
336 medium->property(MPL::PropertyType::permeability)
337 .template dValue<double>(variables,
338 MPL::Variable::fracture_aperture,
339 x_position, t, dt) /
340 mu;
341 J_pg.noalias() +=
342 dNdx_p.transpose() * k_over_mu * grad_head * mT_R_Hg * ip_w;
343 J_pg.noalias() += dNdx_p.transpose() * b_m * dk_db_over_mu * grad_head *
344 mT_R_Hg * ip_w;
345 }
346
347 // displacement equation, pressure part
348 J_gp.noalias() -= Kgp;
349
350 // pressure equation, pressure part.
351 J_pp.noalias() += laplace_p + storage_p / dt;
352
353 // pressure equation, displacement jump part.
354 J_pg.noalias() += Kgp.transpose() / dt;
355
356 // pressure equation
357 rhs_p.noalias() -= laplace_p * p + storage_p * (p - p_prev) / dt +
358 Kgp.transpose() * (g - g_prev) / dt;
359
360 // displacement equation
361 rhs_g.noalias() -= -Kgp * p;
362}
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:30
void setElementID(std::size_t element_id)
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType

References DBUG(), MaterialPropertyLib::VariableArray::density, MaterialPropertyLib::VariableArray::fracture_aperture, NumLib::interpolateCoordinates(), ParameterLib::SpatialPosition::setElementID(), and MaterialPropertyLib::VariableArray::temperature.

◆ assembleWithJacobianConcrete()

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
void ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::assembleWithJacobianConcrete ( double const t,
double const dt,
Eigen::VectorXd const & local_x,
Eigen::VectorXd const & local_x_prev,
Eigen::VectorXd & local_b,
Eigen::MatrixXd & local_J )
overrideprivatevirtual

Implements ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface.

Definition at line 139 of file HydroMechanicsLocalAssemblerFracture-impl.h.

145{
146 auto const p = local_x.segment(pressure_index, pressure_size);
147 auto const p_prev = local_x_prev.segment(pressure_index, pressure_size);
148 auto const g = local_x.segment(displacement_index, displacement_size);
149 auto const g_prev =
150 local_x_prev.segment(displacement_index, displacement_size);
151
152 auto rhs_p = local_b.segment(pressure_index, pressure_size);
153 auto rhs_g = local_b.segment(displacement_index, displacement_size);
154 auto J_pp = local_J.block(pressure_index, pressure_index, pressure_size,
156 auto J_pg = local_J.block(pressure_index, displacement_index, pressure_size,
158 auto J_gp = local_J.block(displacement_index, pressure_index,
160 auto J_gg = local_J.block(displacement_index, displacement_index,
162
163 assembleBlockMatricesWithJacobian(t, dt, p, p_prev, g, g_prev, rhs_p, rhs_g,
164 J_pp, J_pg, J_gg, J_gp);
165}
void assembleBlockMatricesWithJacobian(double const t, double const dt, Eigen::Ref< const Eigen::VectorXd > const &p, Eigen::Ref< const Eigen::VectorXd > const &p_prev, Eigen::Ref< const Eigen::VectorXd > const &g, Eigen::Ref< const Eigen::VectorXd > const &g_prev, Eigen::Ref< Eigen::VectorXd > rhs_p, Eigen::Ref< Eigen::VectorXd > rhs_g, Eigen::Ref< Eigen::MatrixXd > J_pp, Eigen::Ref< Eigen::MatrixXd > J_pg, Eigen::Ref< Eigen::MatrixXd > J_gg, Eigen::Ref< Eigen::MatrixXd > J_gp)

◆ getIntPtDarcyVelocity()

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
std::vector< double > const & ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::getIntPtDarcyVelocity ( const double ,
std::vector< GlobalVector * > const & ,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & ,
std::vector< double > & cache ) const
inlineoverridevirtual

Implements ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface.

Definition at line 81 of file HydroMechanicsLocalAssemblerFracture.h.

86 {
87 cache.resize(0);
88 return cache;
89 }

◆ getIntPtEpsilon()

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

Implements ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface.

Definition at line 71 of file HydroMechanicsLocalAssemblerFracture.h.

76 {
77 cache.resize(0);
78 return cache;
79 }

◆ getIntPtFractureAperture()

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
std::vector< double > const & ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::getIntPtFractureAperture ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
overridevirtual

Implements ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface.

Definition at line 524 of file HydroMechanicsLocalAssemblerFracture-impl.h.

530{
533}
std::vector< double > const & getIntegrationPointScalarData(IntegrationPointDataVector const &ip_data_vector, MemberType IpData::*const member, std::vector< double > &cache)

References ProcessLib::getIntegrationPointScalarData().

◆ getIntPtFracturePermeability()

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
std::vector< double > const & ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::getIntPtFracturePermeability ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
overridevirtual

◆ getIntPtFractureStress()

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
std::vector< double > const & ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::getIntPtFractureStress ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
overridevirtual

Implements ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface.

Definition at line 500 of file HydroMechanicsLocalAssemblerFracture-impl.h.

506{
507 unsigned const n_integration_points = _ip_data.size();
508 cache.clear();
509 auto cache_matrix = MathLib::createZeroedMatrix<
510 Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>(
511 cache, GlobalDim, n_integration_points);
512
513 for (unsigned ip = 0; ip < n_integration_points; ip++)
514 {
515 cache_matrix.col(ip).noalias() = _ip_data[ip].sigma_eff;
516 }
517
518 return cache;
519}
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)

References MathLib::createZeroedMatrix().

◆ getIntPtFractureVelocity()

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
std::vector< double > const & ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::getIntPtFractureVelocity ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
overridevirtual

Implements ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface.

Definition at line 476 of file HydroMechanicsLocalAssemblerFracture-impl.h.

482{
483 unsigned const n_integration_points = _ip_data.size();
484 cache.clear();
485 auto cache_matrix = MathLib::createZeroedMatrix<
486 Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>(
487 cache, GlobalDim, n_integration_points);
488
489 for (unsigned ip = 0; ip < n_integration_points; ip++)
490 {
491 cache_matrix.col(ip).noalias() = _ip_data[ip].darcy_velocity;
492 }
493
494 return cache;
495}

References MathLib::createZeroedMatrix().

◆ getIntPtSigma()

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

Implements ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface.

Definition at line 61 of file HydroMechanicsLocalAssemblerFracture.h.

66 {
67 cache.resize(0);
68 return cache;
69 }

◆ getShapeMatrix()

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

Provides the shape matrix at the given integration point.

Implements NumLib::ExtrapolatableElement.

Definition at line 115 of file HydroMechanicsLocalAssemblerFracture.h.

117 {
118 auto const& N = _secondary_data.N[integration_point];
119
120 // assumes N is stored contiguously in memory
121 return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size());
122 }

References ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::_secondary_data, and ProcessLib::LIE::HydroMechanics::SecondaryData< ShapeMatrixType >::N.

◆ postTimestepConcreteWithVector()

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
void ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::postTimestepConcreteWithVector ( const double t,
double const dt,
Eigen::VectorXd const & local_x )
overridevirtual

Implements ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerInterface.

Definition at line 368 of file HydroMechanicsLocalAssemblerFracture-impl.h.

371{
372 auto const nodal_g = local_x.segment(displacement_index, displacement_size);
373
374 auto const& frac_prop = *_process_data.fracture_property;
375 auto const& R = frac_prop.R;
376 // the index of a normal (normal to a fracture plane) component
377 // in a displacement vector
378 auto constexpr index_normal = GlobalDim - 1;
379
381 auto const e_id = _element.getID();
382 x_position.setElementID(e_id);
383
384 unsigned const n_integration_points = _ip_data.size();
385 for (unsigned ip = 0; ip < n_integration_points; ip++)
386 {
387 auto& ip_data = _ip_data[ip];
388 auto const& H_g = ip_data.H_u;
389 auto& mat = ip_data.fracture_material;
390 auto& effective_stress = ip_data.sigma_eff;
391 auto const& effective_stress_prev = ip_data.sigma_eff_prev;
392 auto& w = ip_data.w;
393 auto const& w_prev = ip_data.w_prev;
394 auto& C = ip_data.C;
395 auto& state = *ip_data.material_state_variables;
396 auto& b_m = ip_data.aperture;
397
398 x_position = {
399 std::nullopt, e_id,
401 NumLib::interpolateCoordinates<ShapeFunctionPressure,
403 _element, ip_data.N_p))};
404
405 // displacement jumps in local coordinates
406 w.noalias() = R * H_g * nodal_g;
407
408 // aperture
409 b_m = ip_data.aperture0 + w[index_normal];
410 if (b_m < 0.0)
411 {
412 DBUG(
413 "Element {:d}, gp {:d}: Fracture aperture is {:g}, but it is "
414 "expected to be non-negative. Setting it to zero now.",
415 _element.getID(), ip, b_m);
416 b_m = 0;
417 }
418
419 auto const initial_effective_stress =
420 _process_data.initial_fracture_effective_stress(0, x_position);
421
422 Eigen::Map<typename HMatricesType::ForceVectorType const> const stress0(
423 initial_effective_stress.data(), initial_effective_stress.size());
424
425 // local C, local stress
426 mat.computeConstitutiveRelation(
427 t, x_position, ip_data.aperture0, stress0, w_prev, w,
428 effective_stress_prev, effective_stress, C, state);
429 }
430
431 double ele_b = 0;
432 double ele_k = 0;
433 typename HMatricesType::ForceVectorType ele_sigma_eff =
434 HMatricesType::ForceVectorType::Zero(GlobalDim);
435 typename HMatricesType::ForceVectorType ele_w =
436 HMatricesType::ForceVectorType::Zero(GlobalDim);
437 GlobalDimVectorType ele_velocity = GlobalDimVectorType::Zero();
438
439 double ele_Fs = -std::numeric_limits<double>::max();
440 for (auto const& ip : _ip_data)
441 {
442 ele_b += ip.aperture;
443 ele_k += ip.permeability;
444 ele_w += ip.w;
445 ele_sigma_eff += ip.sigma_eff;
446 ele_velocity += ip.darcy_velocity;
447 ele_Fs = std::max(
448 ele_Fs, ip.material_state_variables->getShearYieldFunctionValue());
449 }
450 ele_b /= static_cast<double>(n_integration_points);
451 ele_k /= static_cast<double>(n_integration_points);
452 ele_w /= static_cast<double>(n_integration_points);
453 ele_sigma_eff /= static_cast<double>(n_integration_points);
454 ele_velocity /= static_cast<double>(n_integration_points);
455 auto const element_id = _element.getID();
456 (*_process_data.mesh_prop_b)[element_id] = ele_b;
457 (*_process_data.mesh_prop_k_f)[element_id] = ele_k;
458
459 Eigen::Map<GlobalDimVectorType>(
460 &(*_process_data.element_fracture_stresses)[e_id * GlobalDim]) =
461 ele_sigma_eff;
462
463 Eigen::Map<GlobalDimVectorType>(
464 &(*_process_data.element_fracture_velocities)[e_id * GlobalDim]) =
465 ele_velocity;
466
467 Eigen::Map<GlobalDimVectorType>(
468 &(*_process_data.element_local_jumps)[e_id * GlobalDim]) = ele_w;
469
470 (*_process_data.mesh_prop_fracture_shear_failure)[element_id] = ele_Fs;
471}
VectorType< DisplacementDim > ForceVectorType

References DBUG(), NumLib::interpolateCoordinates(), and ParameterLib::SpatialPosition::setElementID().

◆ preTimestepConcrete()

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
void ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::preTimestepConcrete ( std::vector< double > const & ,
double const ,
double const  )
inlineoverridevirtual

Member Data Documentation

◆ _ip_data

◆ _process_data

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
HydroMechanicsProcessData<GlobalDim>& ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::_process_data
private

◆ _secondary_data

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
SecondaryData< typename ShapeMatricesTypeDisplacement::ShapeMatrices::ShapeType> ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::_secondary_data
private

◆ displacement_index

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
const int ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::displacement_index = ShapeFunctionPressure::NPOINTS
staticprivate

Definition at line 168 of file HydroMechanicsLocalAssemblerFracture.h.

◆ displacement_size

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
const int ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::displacement_size
staticprivate
Initial value:
=
ShapeFunctionDisplacement::NPOINTS * GlobalDim

Definition at line 169 of file HydroMechanicsLocalAssemblerFracture.h.

◆ pressure_index

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
const int ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::pressure_index = 0
staticprivate

Definition at line 166 of file HydroMechanicsLocalAssemblerFracture.h.

◆ pressure_size

template<typename ShapeFunctionDisplacement , typename ShapeFunctionPressure , int GlobalDim>
const int ProcessLib::LIE::HydroMechanics::HydroMechanicsLocalAssemblerFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, GlobalDim >::pressure_size = ShapeFunctionPressure::NPOINTS
staticprivate

Definition at line 167 of file HydroMechanicsLocalAssemblerFracture.h.


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