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
9
10namespace ProcessLib
11{
12namespace LIE
13{
14namespace HydroMechanics
15{
16template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
17 int DisplacementDim>
19 ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
20 HydroMechanicsLocalAssemblerMatrixNearFracture(
21 MeshLib::Element const& e,
22 std::size_t const n_variables,
23 std::size_t const local_matrix_size,
24 std::vector<unsigned> const& dofIndex_to_localIndex,
25 NumLib::GenericIntegrationMethod const& integration_method,
26 bool const is_axially_symmetric,
29 ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>(
30 e, n_variables, local_matrix_size, dofIndex_to_localIndex,
31 integration_method, is_axially_symmetric, process_data),
32 _e_center_coords(getCenterOfGravity(e).data())
33{
34 for (auto fid : process_data.vec_ele_connected_fractureIDs[e.getID()])
35 {
36 _fracID_to_local.insert({fid, _fracture_props.size()});
37 _fracture_props.push_back(&_process_data.fracture_properties[fid]);
38 }
39
40 // TODO(naumov) Junctions not yet implemented.
41}
42
43template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
44 int DisplacementDim>
45void HydroMechanicsLocalAssemblerMatrixNearFracture<
46 ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
47 assembleWithJacobianConcrete(double const t, double const dt,
48 Eigen::VectorXd const& local_x,
49 Eigen::VectorXd const& local_x_prev,
50 Eigen::VectorXd& local_b,
51 Eigen::MatrixXd& local_J)
52{
53 auto p = const_cast<Eigen::VectorXd&>(local_x).segment(pressure_index,
55 auto p_prev = const_cast<Eigen::VectorXd&>(local_x_prev)
57 if (_process_data.deactivate_matrix_in_flow)
58 {
60 }
61 auto const u = local_x.segment(displacement_index, displacement_size);
62 auto const u_prev =
63 local_x_prev.segment(displacement_index, displacement_size);
64
65 auto rhs_p = local_b.segment(pressure_index, pressure_size);
66 auto rhs_u = local_b.segment(displacement_index, displacement_size);
67
68 auto J_pp = local_J.block(pressure_index, pressure_index, pressure_size,
70 auto J_pu = local_J.block(pressure_index, displacement_index, pressure_size,
72 auto J_up = local_J.block(displacement_index, pressure_index,
74 auto J_uu = local_J.block(displacement_index, displacement_index,
76
77 // levelset value of the element
78 // remark: this assumes the levelset function is uniform within an element
79 std::vector<double> levelsets = uGlobalEnrichments(
81 double const ele_levelset = levelsets[0]; // single fracture
82
83 if (ele_levelset == 0)
84 {
85 // no DoF exists for displacement jumps. do the normal assembly
87 t, dt, p, p_prev, u, u_prev, rhs_p, rhs_u, J_pp, J_pu, J_uu, J_up);
88 return;
89 }
90
91 // Displacement jumps should be taken into account
92
93 // compute true displacements
94 auto const g = local_x.segment(displacement_jump_index, displacement_size);
95 auto const g_prev =
96 local_x_prev.segment(displacement_jump_index, displacement_size);
97 Eigen::VectorXd const total_u = u + ele_levelset * g;
98 Eigen::VectorXd const total_u_prev = u_prev + ele_levelset * g_prev;
99
100 // evaluate residuals and Jacobians for pressure and displacements
101 Base::assembleBlockMatricesWithJacobian(t, dt, p, p_prev, total_u,
102 total_u_prev, rhs_p, rhs_u, J_pp,
103 J_pu, J_uu, J_up);
104
105 // compute residuals and Jacobians for displacement jumps
106 auto rhs_g = local_b.segment(displacement_jump_index, displacement_size);
107 auto J_pg = local_J.block(pressure_index, displacement_jump_index,
109 auto J_ug = local_J.block(displacement_index, displacement_jump_index,
111 auto J_gp = local_J.block(displacement_jump_index, pressure_index,
113 auto J_gu = local_J.block(displacement_jump_index, displacement_index,
115 auto J_gg = local_J.block(displacement_jump_index, displacement_jump_index,
117
118 rhs_g = ele_levelset * rhs_u;
119 J_pg = ele_levelset * J_pu;
120 J_ug = ele_levelset * J_uu;
121 J_gp = ele_levelset * J_up;
122 J_gu = ele_levelset * J_uu;
123 J_gg = ele_levelset * ele_levelset * J_uu;
124}
125
126template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
127 int DisplacementDim>
129 ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
130 postTimestepConcreteWithVector(double const t, double const dt,
131 Eigen::VectorXd const& local_x)
132{
133 auto p = const_cast<Eigen::VectorXd&>(local_x).segment(pressure_index,
135 if (_process_data.deactivate_matrix_in_flow)
136 {
138 }
139 auto u = local_x.segment(displacement_index, displacement_size);
140
141 // levelset value of the element
142 // remark: this assumes the levelset function is uniform within an element
143 std::vector<double> levelsets = uGlobalEnrichments(
145 double const ele_levelset = levelsets[0]; // single fracture
146
147 if (ele_levelset == 0)
148 {
149 // no DoF exists for displacement jumps. do the normal assembly
151 return;
152 }
153
154 // Displacement jumps should be taken into account
155
156 // compute true displacements
157 auto const g = local_x.segment(displacement_jump_index, displacement_size);
158 Eigen::VectorXd const total_u = u + ele_levelset * g;
159
160 // evaluate residuals and Jacobians for pressure and displacements
162}
163
164} // namespace HydroMechanics
165} // namespace LIE
166} // 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)