From 40d85cbef37debaa2443c94a985aa6bb859df69f Mon Sep 17 00:00:00 2001 From: "Dmitry Yu. Naumov" <github@naumov.de> Date: Fri, 9 Nov 2018 17:10:52 +0100 Subject: [PATCH] [PL] PF; MaterialIDs based solid models. --- .../PhaseField/CreatePhaseFieldProcess.cpp | 45 +++++-------------- ProcessLib/PhaseField/PhaseFieldFEM.h | 20 +++++++-- ProcessLib/PhaseField/PhaseFieldProcessData.h | 36 +++++++-------- 3 files changed, 43 insertions(+), 58 deletions(-) diff --git a/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp b/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp index 1d019588127..63dad638ad6 100644 --- a/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp +++ b/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp @@ -11,9 +11,10 @@ #include <cassert> -#include "MaterialLib/SolidModels/CreateLinearElasticIsotropic.h" -#include "MaterialLib/SolidModels/LinearElasticIsotropicPhaseField.h" +#include "MaterialLib/SolidModels/CreateConstitutiveRelation.h" +#include "MaterialLib/SolidModels/MechanicsBase.h" #include "ProcessLib/Output/CreateSecondaryVariables.h" +#include "ProcessLib/Utils/ProcessUtils.h" #include "PhaseFieldProcess.h" #include "PhaseFieldProcessData.h" @@ -99,40 +100,14 @@ std::unique_ptr<Process> createPhaseFieldProcess( variable_ph->getNumberOfComponents()); } - // Constitutive relation. - // read type; - auto const constitutive_relation_config = - //! \ogs_file_param{prj__processes__process__PHASE_FIELD__constitutive_relation} - config.getConfigSubtree("constitutive_relation"); + auto solid_constitutive_relations = + MaterialLib::Solids::createConstitutiveRelations<DisplacementDim>( + parameters, config); auto const phasefield_parameters_config = //! \ogs_file_param{prj__processes__process__PHASE_FIELD__phasefield_parameters} config.getConfigSubtree("phasefield_parameters"); - auto const type = - //! \ogs_file_param{prj__processes__process__PHASE_FIELD__constitutive_relation__type} - constitutive_relation_config.peekConfigParameter<std::string>("type"); - - std::unique_ptr<MaterialLib::Solids::PhaseFieldExtension<DisplacementDim>> - material = nullptr; - if (type == "LinearElasticIsotropic") - { - const bool skip_type_checking = false; - auto elastic_model = - MaterialLib::Solids::createLinearElasticIsotropic<DisplacementDim>( - parameters, constitutive_relation_config, skip_type_checking); - material = std::make_unique< - MaterialLib::Solids::LinearElasticIsotropicPhaseField< - DisplacementDim>>( - std::move(elastic_model->getMaterialProperties())); - } - else - { - OGS_FATAL( - "Cannot construct constitutive relation of given type \'%s\'.", - type.c_str()); - } - // Residual stiffness auto& residual_stiffness = findParameter<double>( phasefield_parameters_config, @@ -212,9 +187,11 @@ std::unique_ptr<Process> createPhaseFieldProcess( ((*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, propagating_crack, + materialIDs(mesh), std::move(solid_constitutive_relations), + residual_stiffness, crack_resistance, + crack_length_scale, kinetic_coefficient, + solid_density, history_field, + specific_body_force, propagating_crack, crack_pressure}; SecondaryVariableCollection secondary_variables; diff --git a/ProcessLib/PhaseField/PhaseFieldFEM.h b/ProcessLib/PhaseField/PhaseFieldFEM.h index d8baae92313..ec85389e166 100644 --- a/ProcessLib/PhaseField/PhaseFieldFEM.h +++ b/ProcessLib/PhaseField/PhaseFieldFEM.h @@ -12,7 +12,9 @@ #include <memory> #include <vector> -#include "MaterialLib/SolidModels/PhaseFieldExtension.h" +#include "MaterialLib/SolidModels/LinearElasticIsotropic.h" +#include "MaterialLib/SolidModels/LinearElasticIsotropicPhaseField.h" +#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h" #include "MathLib/LinAlg/Eigen/EigenMapTools.h" #include "NumLib/Fem/FiniteElement/TemplateIsoparametric.h" #include "NumLib/Fem/ShapeMatrixPolicy.h" @@ -126,6 +128,19 @@ public: _ip_data.reserve(n_integration_points); _secondary_data.N.resize(n_integration_points); + auto& solid_material = + MaterialLib::Solids::selectSolidConstitutiveRelation( + _process_data.solid_materials, + _process_data.material_ids, + e.getID()); + if (!dynamic_cast<MaterialLib::Solids::LinearElasticIsotropic< + DisplacementDim> const*>(&solid_material)) + { + OGS_FATAL( + "For phasefield process only linear elastic solid material " + "support is implemented."); + } + auto const shape_matrices = initShapeMatrices<ShapeFunction, ShapeMatricesType, IntegrationMethod, DisplacementDim>( @@ -136,8 +151,7 @@ public: for (unsigned ip = 0; ip < n_integration_points; ip++) { - // displacement (subscript u) - _ip_data.emplace_back(*_process_data.material); + _ip_data.emplace_back(solid_material); auto& ip_data = _ip_data[ip]; ip_data.integration_weight = _integration_method.getWeightedPoint(ip).getWeight() * diff --git a/ProcessLib/PhaseField/PhaseFieldProcessData.h b/ProcessLib/PhaseField/PhaseFieldProcessData.h index 75fdace0717..069c0dc3254 100644 --- a/ProcessLib/PhaseField/PhaseFieldProcessData.h +++ b/ProcessLib/PhaseField/PhaseFieldProcessData.h @@ -33,8 +33,11 @@ template <int DisplacementDim> struct PhaseFieldProcessData { PhaseFieldProcessData( - std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>>&& - material_, + MeshLib::PropertyVector<int> const* const material_ids_, + std::map<int, + std::unique_ptr< + MaterialLib::Solids::MechanicsBase<DisplacementDim>>>&& + solid_materials_, Parameter<double> const& residual_stiffness_, Parameter<double> const& crack_resistance_, Parameter<double> const& crack_length_scale_, @@ -42,8 +45,10 @@ struct PhaseFieldProcessData Parameter<double> const& solid_density_, Parameter<double>& history_field_, Eigen::Matrix<double, DisplacementDim, 1> const& specific_body_force_, - bool propagating_crack_, bool crack_pressure_) - : material{std::move(material_)}, + bool const propagating_crack_, + bool const crack_pressure_) + : material_ids(material_ids_), + solid_materials{std::move(solid_materials_)}, residual_stiffness(residual_stiffness_), crack_resistance(crack_resistance_), crack_length_scale(crack_length_scale_), @@ -56,21 +61,7 @@ struct PhaseFieldProcessData { } - PhaseFieldProcessData(PhaseFieldProcessData&& other) - : material{std::move(other.material)}, - residual_stiffness(other.residual_stiffness), - crack_resistance(other.crack_resistance), - crack_length_scale(other.crack_length_scale), - kinetic_coefficient(other.kinetic_coefficient), - solid_density(other.solid_density), - history_field(other.history_field), - specific_body_force(other.specific_body_force), - dt(other.dt), - t(other.t), - propagating_crack(other.propagating_crack), - crack_pressure(other.crack_pressure) - { - } + PhaseFieldProcessData(PhaseFieldProcessData&& other) = default; //! Copies are forbidden. PhaseFieldProcessData(PhaseFieldProcessData const&) = delete; @@ -81,8 +72,11 @@ struct PhaseFieldProcessData //! Assignments are not needed. void operator=(PhaseFieldProcessData&&) = delete; - std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>> - material; + MeshLib::PropertyVector<int> const* const material_ids; + + std::map<int, std::unique_ptr< + MaterialLib::Solids::MechanicsBase<DisplacementDim>>> + solid_materials; Parameter<double> const& residual_stiffness; Parameter<double> const& crack_resistance; Parameter<double> const& crack_length_scale; -- GitLab