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 0000000000000000000000000000000000000000..e938d33adaba54df328d623ca8c11f732bf1902b --- /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 515427e6874eb6b69c7814fb2e1f1e96b248dc65..674bb831fa55c0baada25f33375e133cdd087fbc 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 c0bc4dd3c183adbcae4f720b510b519591eb224b..b41a17021bcd4c2203f634126284a0378ebfcfed 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 e5cff177ecee95c89448d7fd3083bfb16fa71a32..26fcde7b5b843e729a34838d1ac11b902df43ee3 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