33 std::string
const& name,
35 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
36 std::vector<ProcessVariable>
const& variables,
37 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
38 std::optional<ParameterLib::CoordinateSystem>
const&
39 local_coordinate_system,
40 unsigned const integration_order,
45 DBUG(
"Create HydroMechanicsProcess with LIE.");
46 auto const coupling_scheme =
49 const bool use_monolithic_scheme =
50 !(coupling_scheme && (*coupling_scheme ==
"staggered"));
59 std::vector<std::reference_wrapper<ProcessVariable>> p_u_process_variables;
60 std::vector<std::reference_wrapper<ProcessVariable>> p_process_variables;
61 std::vector<std::reference_wrapper<ProcessVariable>> u_process_variables;
62 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
64 for (std::string
const& pv_name : range)
66 if (pv_name !=
"pressure" && pv_name !=
"displacement" &&
67 !pv_name.starts_with(
"displacement_jump"))
70 "Found a process variable name '{}'. It should be "
71 "'displacement' or 'displacement_jumpN' or 'pressure'",
74 auto variable = std::find_if(variables.cbegin(), variables.cend(),
76 { return v.getName() == pv_name; });
78 if (variable == variables.end())
81 "Could not find process variable '{:s}' in the provided "
82 "variables list for config tag <{:s}>.",
83 pv_name,
"process_variable");
85 DBUG(
"Found process variable '{:s}' for config tag <{:s}>.",
86 variable->getName(),
"process_variable");
88 if (pv_name.find(
"displacement") != std::string::npos &&
89 variable->getNumberOfGlobalComponents() != GlobalDim)
92 "Number of components of the process variable '{:s}' is "
93 "different from the displacement dimension: got {:d}, expected "
96 variable->getNumberOfGlobalComponents(),
100 if (!use_monolithic_scheme)
102 if (pv_name ==
"pressure")
104 p_process_variables.emplace_back(
109 u_process_variables.emplace_back(
115 p_u_process_variables.emplace_back(
120 if (p_u_process_variables.size() > 3 || u_process_variables.size() > 2)
122 OGS_FATAL(
"Currently only one displacement jump is supported");
125 if (!use_monolithic_scheme)
127 process_variables.push_back(std::move(p_process_variables));
128 process_variables.push_back(std::move(u_process_variables));
132 process_variables.push_back(std::move(p_u_process_variables));
136 auto solid_constitutive_relations =
137 MaterialLib::Solids::createConstitutiveRelations<GlobalDim>(
138 parameters, local_coordinate_system, config);
141 auto& intrinsic_permeability = ParameterLib::findParameter<double>(
144 "intrinsic_permeability", parameters, 1, &mesh);
146 DBUG(
"Use '{:s}' as intrinsic permeability parameter.",
147 intrinsic_permeability.name);
150 auto& specific_storage = ParameterLib::findParameter<double>(
153 "specific_storage", parameters, 1, &mesh);
155 DBUG(
"Use '{:s}' as specific storage parameter.", specific_storage.name);
158 auto& fluid_viscosity = ParameterLib::findParameter<double>(
161 "fluid_viscosity", parameters, 1, &mesh);
162 DBUG(
"Use '{:s}' as fluid viscosity parameter.", fluid_viscosity.name);
165 auto& fluid_density = ParameterLib::findParameter<double>(
168 "fluid_density", parameters, 1, &mesh);
169 DBUG(
"Use '{:s}' as fluid density parameter.", fluid_density.name);
172 auto& biot_coefficient = ParameterLib::findParameter<double>(
175 "biot_coefficient", parameters, 1, &mesh);
176 DBUG(
"Use '{:s}' as Biot coefficient parameter.", biot_coefficient.name);
179 auto& porosity = ParameterLib::findParameter<double>(
182 "porosity", parameters, 1, &mesh);
183 DBUG(
"Use '{:s}' as porosity parameter.", porosity.name);
186 auto& solid_density = ParameterLib::findParameter<double>(
189 "solid_density", parameters, 1, &mesh);
190 DBUG(
"Use '{:s}' as solid density parameter.", solid_density.name);
193 Eigen::Matrix<double, GlobalDim, 1> specific_body_force;
195 std::vector<double>
const b =
198 "specific_body_force");
199 if (b.size() != GlobalDim)
202 "The size of the specific body force vector does not match the "
203 "displacement dimension. Vector size is {:d}, displacement "
205 b.size(), GlobalDim);
208 std::copy_n(b.data(), b.size(), specific_body_force.data());
212 std::unique_ptr<MaterialLib::Fracture::FractureModelBase<GlobalDim>>
213 fracture_model =
nullptr;
214 auto const opt_fracture_model_config =
217 if (opt_fracture_model_config)
219 auto& fracture_model_config = *opt_fracture_model_config;
221 auto const frac_type =
223 fracture_model_config.peekConfigParameter<std::string>(
"type");
225 if (frac_type ==
"LinearElasticIsotropic")
228 MaterialLib::Fracture::createLinearElasticIsotropic<GlobalDim>(
229 parameters, fracture_model_config);
231 else if (frac_type ==
"Coulomb")
233 fracture_model = MaterialLib::Fracture::createCoulomb<GlobalDim>(
234 parameters, fracture_model_config);
236 else if (frac_type ==
"CohesiveZoneModeI")
238 fracture_model = MaterialLib::Fracture::CohesiveZoneModeI::
239 createCohesiveZoneModeI<GlobalDim>(parameters,
240 fracture_model_config);
245 "Cannot construct fracture constitutive relation of given type "
252 std::unique_ptr<FracturePropertyHM> frac_prop =
nullptr;
253 auto opt_fracture_properties_config =
256 if (opt_fracture_properties_config)
258 auto& fracture_properties_config = *opt_fracture_properties_config;
260 frac_prop = std::make_unique<ProcessLib::LIE::FracturePropertyHM>(
263 fracture_properties_config.getConfigParameter<
int>(
"material_id"),
264 ParameterLib::findParameter<double>(
266 fracture_properties_config,
"initial_aperture", parameters, 1,
268 ParameterLib::findParameter<double>(
270 fracture_properties_config,
"specific_storage", parameters, 1,
272 ParameterLib::findParameter<double>(
274 fracture_properties_config,
"biot_coefficient", parameters, 1,
276 if (frac_prop->aperture0.isTimeDependent())
279 "The initial aperture parameter '{:s}' must not be "
281 frac_prop->aperture0.name);
284 auto permeability_model_config =
286 fracture_properties_config.getConfigSubtree(
"permeability_model");
287 frac_prop->permeability_model =
289 permeability_model_config);
293 auto& initial_effective_stress = ParameterLib::findParameter<double>(
296 "initial_effective_stress", parameters,
298 DBUG(
"Use '{:s}' as initial effective stress parameter.",
299 initial_effective_stress.name);
306 "initial_fracture_effective_stress", parameters, GlobalDim, &mesh);
307 DBUG(
"Use '{:s}' as initial fracture effective stress parameter.",
308 initial_fracture_effective_stress.name);
311 auto opt_deactivate_matrix_in_flow =
314 bool const deactivate_matrix_in_flow =
315 opt_deactivate_matrix_in_flow && *opt_deactivate_matrix_in_flow;
317 if (deactivate_matrix_in_flow)
318 INFO(
"Deactivate matrix elements in flow calculation.");
321 const auto& reference_temperature =
324 "reference_temperature", std::numeric_limits<double>::quiet_NaN());
328 std::move(solid_constitutive_relations),
329 intrinsic_permeability,
337 std::move(fracture_model),
338 std::move(frac_prop),
339 initial_effective_stress,
340 initial_fracture_effective_stress,
341 deactivate_matrix_in_flow,
342 reference_temperature};
348 return std::make_unique<HydroMechanicsProcess<GlobalDim>>(
349 std::move(name), mesh, std::move(jacobian_assembler), parameters,
350 integration_order, std::move(process_variables),
351 std::move(process_data), std::move(secondary_variables),
352 use_monolithic_scheme);