From a3358ad4faea9724c68f0effacaf1cd16a6cd470 Mon Sep 17 00:00:00 2001 From: "Dmitry Yu. Naumov" <github@naumov.de> Date: Mon, 17 Sep 2018 18:46:47 +0200 Subject: [PATCH] [PL] RM; Add MaterialID based solid materials. --- .../CreateRichardsMechanicsProcess.cpp | 17 ++++++++-------- .../RichardsMechanicsFEM-impl.h | 6 ++++-- .../RichardsMechanicsProcessData.h | 20 +++++++++++++------ 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp index d901fb3f40a..7234773c662 100644 --- a/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp +++ b/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp @@ -101,9 +101,8 @@ std::unique_ptr<Process> createRichardsMechanicsProcess( variable_p->getNumberOfComponents()); } - // Constitutive relation. - auto solid_material = - MaterialLib::Solids::createConstitutiveRelation<DisplacementDim>( + auto solid_constitutive_relations = + MaterialLib::Solids::createConstitutiveRelations<DisplacementDim>( parameters, config); // Intrinsic permeability @@ -174,14 +173,15 @@ std::unique_ptr<Process> createRichardsMechanicsProcess( //! \ogs_file_param{prj__processes__process__RICHARDS_MECHANICS__material_property} config.getConfigSubtree("material_property"); - boost::optional<MeshLib::PropertyVector<int> const&> material_ids; - if (mesh.getProperties().existsPropertyVector<int>("MaterialIDs")) + auto const material_ids = + mesh.getProperties().existsPropertyVector<int>("MaterialIDs") + ? mesh.getProperties().getPropertyVector<int>("MaterialIDs") + : nullptr; + if (material_ids != nullptr) { INFO( "MaterialIDs vector found; the Richards flow is in heterogeneous " "porous media."); - material_ids = - *mesh.getProperties().getPropertyVector<int>("MaterialIDs"); } else { @@ -194,8 +194,9 @@ std::unique_ptr<Process> createRichardsMechanicsProcess( flow_material_config, material_ids, parameters); RichardsMechanicsProcessData<DisplacementDim> process_data{ + material_ids, std::move(flow_material), - std::move(solid_material), + std::move(solid_constitutive_relations), intrinsic_permeability, fluid_bulk_modulus, biot_coefficient, diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h index 5d6f227360b..ae37ff019a5 100644 --- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h +++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h @@ -54,10 +54,12 @@ RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement, IntegrationMethod, DisplacementDim>( e, is_axially_symmetric, _integration_method); + auto const material_id = _process_data.material_ids == nullptr + ? 0 + : (*_process_data.material_ids)[e.getID()]; for (unsigned ip = 0; ip < n_integration_points; ip++) { - // displacement (subscript u) - _ip_data.emplace_back(*_process_data.solid_material); + _ip_data.emplace_back(*_process_data.solid_materials[material_id]); auto& ip_data = _ip_data[ip]; auto const& sm_u = shape_matrices_u[ip]; _ip_data[ip].integration_weight = diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h b/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h index df5a6edf8d0..f737f7ce28a 100644 --- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h +++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h @@ -34,11 +34,14 @@ template <int DisplacementDim> struct RichardsMechanicsProcessData { RichardsMechanicsProcessData( + MeshLib::PropertyVector<int> const* const material_ids_, std::unique_ptr< ProcessLib::RichardsFlow::RichardsFlowMaterialProperties>&& flow_material_, - std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>>&& - solid_material_, + std::map<int, + std::unique_ptr< + MaterialLib::Solids::MechanicsBase<DisplacementDim>>>&& + solid_materials_, Parameter<double> const& intrinsic_permeability_, Parameter<double> const& fluid_bulk_modulus_, Parameter<double> const& biot_coefficient_, @@ -47,8 +50,9 @@ struct RichardsMechanicsProcessData Parameter<double> const& temperature_, Eigen::Matrix<double, DisplacementDim, 1> specific_body_force_) - : flow_material{std::move(flow_material_)}, - solid_material{std::move(solid_material_)}, + : material_ids(material_ids_), + flow_material{std::move(flow_material_)}, + solid_materials{std::move(solid_materials_)}, intrinsic_permeability(intrinsic_permeability_), fluid_bulk_modulus(fluid_bulk_modulus_), biot_coefficient(biot_coefficient_), @@ -69,12 +73,16 @@ struct RichardsMechanicsProcessData void operator=(RichardsMechanicsProcessData const&) = delete; void operator=(RichardsMechanicsProcessData&&) = delete; + MeshLib::PropertyVector<int> const* const material_ids; + std::unique_ptr<ProcessLib::RichardsFlow::RichardsFlowMaterialProperties> flow_material; /// The constitutive relation for the mechanical part. - std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>> - solid_material; + std::map< + int, + std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>>> + solid_materials; /// Permeability of the solid. A scalar quantity, Parameter<double>. Parameter<double> const& intrinsic_permeability; /// Fluid's bulk modulus. A scalar quantity, Parameter<double>. -- GitLab