OGS
HydroMechanicsLocalAssemblerMatrixNearFracture-impl.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
8
9namespace ProcessLib
10{
11namespace LIE
12{
13namespace HydroMechanics
14{
15template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
16 int DisplacementDim>
18 ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
19 HydroMechanicsLocalAssemblerMatrixNearFracture(
20 MeshLib::Element const& e,
21 std::size_t const n_variables,
22 std::size_t const local_matrix_size,
23 std::vector<unsigned> const& dofIndex_to_localIndex,
24 NumLib::GenericIntegrationMethod const& integration_method,
25 bool const is_axially_symmetric,
28 ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>(
29 e, n_variables, local_matrix_size, dofIndex_to_localIndex,
30 integration_method, is_axially_symmetric, process_data),
31 _e_center_coords(getCenterOfGravity(e).data())
32{
33 for (auto fid : process_data.vec_ele_connected_fractureIDs[e.getID()])
34 {
35 _fracID_to_local.insert({fid, _fracture_props.size()});
36 _fracture_props.push_back(&_process_data.fracture_properties[fid]);
37 }
38
39 // TODO(naumov) Junctions not yet implemented.
40}
41
42template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
43 int DisplacementDim>
44void HydroMechanicsLocalAssemblerMatrixNearFracture<
45 ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
46 assembleWithJacobianConcrete(double const t, double const dt,
47 Eigen::VectorXd const& local_x,
48 Eigen::VectorXd const& local_x_prev,
49 Eigen::VectorXd& local_b,
50 Eigen::MatrixXd& local_J)
51{
52 auto p = const_cast<Eigen::VectorXd&>(local_x).segment(pressure_index,
54 auto p_prev = const_cast<Eigen::VectorXd&>(local_x_prev)
56 if (_process_data.deactivate_matrix_in_flow)
57 {
59 }
60 auto const u = local_x.segment(displacement_index, displacement_size);
61 auto const u_prev =
62 local_x_prev.segment(displacement_index, displacement_size);
63
64 auto rhs_p = local_b.segment(pressure_index, pressure_size);
65 auto rhs_u = local_b.segment(displacement_index, displacement_size);
66
67 auto J_pp = local_J.block(pressure_index, pressure_index, pressure_size,
69 auto J_pu = local_J.block(pressure_index, displacement_index, pressure_size,
71 auto J_up = local_J.block(displacement_index, pressure_index,
73 auto J_uu = local_J.block(displacement_index, displacement_index,
75
76 // levelset value of the element
77 // remark: this assumes the levelset function is uniform within an element
78 std::vector<double> levelsets = uGlobalEnrichments(
80 double const ele_levelset = levelsets[0]; // single fracture
81
82 if (ele_levelset == 0)
83 {
84 // no DoF exists for displacement jumps. do the normal assembly
86 t, dt, p, p_prev, u, u_prev, rhs_p, rhs_u, J_pp, J_pu, J_uu, J_up);
87 return;
88 }
89
90 // Displacement jumps should be taken into account
91
92 // compute true displacements
93 auto const g = local_x.segment(displacement_jump_index, displacement_size);
94 auto const g_prev =
95 local_x_prev.segment(displacement_jump_index, displacement_size);
96 Eigen::VectorXd const total_u = u + ele_levelset * g;
97 Eigen::VectorXd const total_u_prev = u_prev + ele_levelset * g_prev;
98
99 // evaluate residuals and Jacobians for pressure and displacements
100 Base::assembleBlockMatricesWithJacobian(t, dt, p, p_prev, total_u,
101 total_u_prev, rhs_p, rhs_u, J_pp,
102 J_pu, J_uu, J_up);
103
104 // compute residuals and Jacobians for displacement jumps
105 auto rhs_g = local_b.segment(displacement_jump_index, displacement_size);
106 auto J_pg = local_J.block(pressure_index, displacement_jump_index,
108 auto J_ug = local_J.block(displacement_index, displacement_jump_index,
110 auto J_gp = local_J.block(displacement_jump_index, pressure_index,
112 auto J_gu = local_J.block(displacement_jump_index, displacement_index,
114 auto J_gg = local_J.block(displacement_jump_index, displacement_jump_index,
116
117 rhs_g = ele_levelset * rhs_u;
118 J_pg = ele_levelset * J_pu;
119 J_ug = ele_levelset * J_uu;
120 J_gp = ele_levelset * J_up;
121 J_gu = ele_levelset * J_uu;
122 J_gg = ele_levelset * ele_levelset * J_uu;
123}
124
125template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
126 int DisplacementDim>
128 ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
129 postTimestepConcreteWithVector(double const t, double const dt,
130 Eigen::VectorXd const& local_x)
131{
132 auto p = const_cast<Eigen::VectorXd&>(local_x).segment(pressure_index,
134 if (_process_data.deactivate_matrix_in_flow)
135 {
137 }
138 auto u = local_x.segment(displacement_index, displacement_size);
139
140 // levelset value of the element
141 // remark: this assumes the levelset function is uniform within an element
142 std::vector<double> levelsets = uGlobalEnrichments(
144 double const ele_levelset = levelsets[0]; // single fracture
145
146 if (ele_levelset == 0)
147 {
148 // no DoF exists for displacement jumps. do the normal assembly
150 return;
151 }
152
153 // Displacement jumps should be taken into account
154
155 // compute true displacements
156 auto const g = local_x.segment(displacement_jump_index, displacement_size);
157 Eigen::VectorXd const total_u = u + ele_levelset * g;
158
159 // evaluate residuals and Jacobians for pressure and displacements
161}
162
163} // namespace HydroMechanics
164} // namespace LIE
165} // namespace ProcessLib
std::size_t getID() const
Returns the ID of the element.
Definition Element.h:80
void postTimestepConcreteWithBlockVectors(double const t, double const dt, Eigen::Ref< const Eigen::VectorXd > const &p, Eigen::Ref< const Eigen::VectorXd > const &u)
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 &u, Eigen::Ref< const Eigen::VectorXd > const &u_prev, Eigen::Ref< Eigen::VectorXd > rhs_p, Eigen::Ref< Eigen::VectorXd > rhs_u, Eigen::Ref< Eigen::MatrixXd > J_pp, Eigen::Ref< Eigen::MatrixXd > J_pu, Eigen::Ref< Eigen::MatrixXd > J_uu, Eigen::Ref< Eigen::MatrixXd > J_up)
HydroMechanicsLocalAssemblerMatrix(HydroMechanicsLocalAssemblerMatrix const &)=delete
std::vector< double > uGlobalEnrichments(std::vector< FractureProperty * > const &frac_props, std::vector< JunctionProperty * > const &junction_props, std::unordered_map< int, int > const &fracID_to_local, Eigen::Vector3d const &x)