From ed3ab4569187b8f5fbe4ca1cfbb18948271d9978 Mon Sep 17 00:00:00 2001 From: KeitaYoshioka <keita.yoshioka@ufz.de> Date: Tue, 6 Feb 2018 10:35:38 +0100 Subject: [PATCH] [PL] PF: Add hydro_cracking option. The option has been added to input (none, static, or propagating). --- .../PHASE_FIELD/t_hydro_crack_scheme.md | 1 + .../PhaseField/CreatePhaseFieldProcess.cpp | 21 ++++++++++++++++++- ProcessLib/PhaseField/PhaseFieldFEM-impl.h | 10 ++++++--- ProcessLib/PhaseField/PhaseFieldProcessData.h | 14 +++++++++---- 4 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 Documentation/ProjectFile/prj/processes/process/PHASE_FIELD/t_hydro_crack_scheme.md diff --git a/Documentation/ProjectFile/prj/processes/process/PHASE_FIELD/t_hydro_crack_scheme.md b/Documentation/ProjectFile/prj/processes/process/PHASE_FIELD/t_hydro_crack_scheme.md new file mode 100644 index 00000000000..e938d33adab --- /dev/null +++ b/Documentation/ProjectFile/prj/processes/process/PHASE_FIELD/t_hydro_crack_scheme.md @@ -0,0 +1 @@ +In case of static, pressure is set to 1.0. For propagating crack, evolution of pressure is found through enforcing the crack volume balance. diff --git a/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp b/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp index 515427e6874..674bb831fa5 100644 --- a/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp +++ b/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp @@ -192,10 +192,29 @@ std::unique_ptr<Process> createPhaseFieldProcess( std::copy_n(b.data(), b.size(), specific_body_force.data()); } + auto const crack_scheme = + //! \ogs_file_param{prj__processes__process__PHASE_FIELD__hydro_crack_scheme} + config.getConfigParameterOptional<std::string>("hydro_crack_scheme"); + if (crack_scheme && + ((*crack_scheme != "propagating") && (*crack_scheme != "static"))) + { + OGS_FATAL( + "hydro_crack_scheme must be \"propagating\" or \"static\" but " + "\"%s\" was given", + crack_scheme->c_str()); + } + + const bool propagating_crack = + (crack_scheme && (*crack_scheme == "propagating")); + const bool crack_pressure = + (crack_scheme && + ((*crack_scheme == "propagating") || (*crack_scheme == "static"))); + PhaseFieldProcessData<DisplacementDim> process_data{ std::move(material), residual_stiffness, crack_resistance, crack_length_scale, kinetic_coefficient, solid_density, - history_field, specific_body_force}; + history_field, specific_body_force, propagating_crack, + crack_pressure}; SecondaryVariableCollection secondary_variables; diff --git a/ProcessLib/PhaseField/PhaseFieldFEM-impl.h b/ProcessLib/PhaseField/PhaseFieldFEM-impl.h index c0bc4dd3c18..b41a17021bc 100644 --- a/ProcessLib/PhaseField/PhaseFieldFEM-impl.h +++ b/ProcessLib/PhaseField/PhaseFieldFEM-impl.h @@ -273,7 +273,9 @@ void PhaseFieldLocalAssembler<ShapeFunction, IntegrationMethod, x_position.setElementID(_element.getID()); double const& dt = _process_data.dt; - auto local_pressure = _process_data.unity_pressure; + auto local_pressure = 0.0; + if (_process_data.crack_pressure) + local_pressure = _process_data.unity_pressure; int const n_integration_points = _integration_method.getNumberOfPoints(); for (int ip = 0; ip < n_integration_points; ip++) @@ -369,8 +371,10 @@ void PhaseFieldLocalAssembler<ShapeFunction, IntegrationMethod, x_position.setElementID(_element.getID()); double const& dt = _process_data.dt; - auto local_pressure = _process_data.unity_pressure; - if (_process_data.propagating_crack) + auto local_pressure = 0.0; + if (_process_data.crack_pressure) + local_pressure = _process_data.unity_pressure; + else if (_process_data.propagating_crack) local_pressure = _process_data.pressure; int const n_integration_points = _integration_method.getNumberOfPoints(); diff --git a/ProcessLib/PhaseField/PhaseFieldProcessData.h b/ProcessLib/PhaseField/PhaseFieldProcessData.h index e5cff177ece..26fcde7b5b8 100644 --- a/ProcessLib/PhaseField/PhaseFieldProcessData.h +++ b/ProcessLib/PhaseField/PhaseFieldProcessData.h @@ -41,7 +41,8 @@ struct PhaseFieldProcessData Parameter<double> const& kinetic_coefficient_, Parameter<double> const& solid_density_, Parameter<double>& history_field_, - Eigen::Matrix<double, DisplacementDim, 1> const& specific_body_force_) + Eigen::Matrix<double, DisplacementDim, 1> const& specific_body_force_, + bool propagating_crack_, bool crack_pressure_) : material{std::move(material_)}, residual_stiffness(residual_stiffness_), crack_resistance(crack_resistance_), @@ -49,7 +50,9 @@ struct PhaseFieldProcessData kinetic_coefficient(kinetic_coefficient_), solid_density(solid_density_), history_field(history_field_), - specific_body_force(specific_body_force_) + specific_body_force(specific_body_force_), + propagating_crack(propagating_crack_), + crack_pressure(crack_pressure_) { } @@ -63,7 +66,9 @@ struct PhaseFieldProcessData history_field(other.history_field), specific_body_force(other.specific_body_force), dt(other.dt), - t(other.t) + t(other.t), + propagating_crack(other.propagating_crack), + crack_pressure(other.crack_pressure) { } @@ -93,7 +98,8 @@ struct PhaseFieldProcessData double pressure_error = 0.0; double injected_volume = 0.0; double crack_volume = 0.0; - bool propagating_crack = true; + bool propagating_crack = false; + bool crack_pressure = false; }; } // namespace PhaseField -- GitLab