diff --git a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp index 45ac97c4f86566aed8564ea31b7b6d61dfef172c..4e524bd1380baa2ec6e70ad99d258f010f80c70b 100644 --- a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp +++ b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp @@ -76,19 +76,11 @@ PorousMediaProperties createPorousMediaProperties( BaseLib::reorderVector(porosity_models, mat_ids); BaseLib::reorderVector(storage_models, mat_ids); - std::vector<int> material_ids(mesh.getNumberOfElements()); - if (mesh.getProperties().existsPropertyVector<int>( - "MaterialIDs", MeshLib::MeshItemType::Cell, 1)) - { - auto const& mesh_material_ids = - mesh.getProperties().getPropertyVector<int>( - "MaterialIDs", MeshLib::MeshItemType::Cell, 1); - material_ids.reserve(mesh_material_ids->size()); - std::copy(mesh_material_ids->cbegin(), mesh_material_ids->cend(), - material_ids.begin()); - } + auto const material_ids = materialIDs(mesh); int const max_material_id = - *std::max_element(material_ids.cbegin(), material_ids.cend()); + !material_ids + ? 0 + : *std::max_element(begin(*material_ids), end(*material_ids)); if (max_material_id > static_cast<int>(mat_ids.size() - 1)) OGS_FATAL( @@ -112,8 +104,7 @@ PorousMediaProperties createPorousMediaProperties( return PorousMediaProperties{std::move(porosity_models), std::move(intrinsic_permeability_models), - std::move(storage_models), - std::move(material_ids)}; + std::move(storage_models), material_ids}; } } // namespace ComponentTransport diff --git a/MaterialLib/PorousMedium/PorousMediaProperties.cpp b/MaterialLib/PorousMedium/PorousMediaProperties.cpp index cdc37f81d5844fef7a9523b500f73d0ee68d5112..4213be83705deeddfec8774e3ffdb612ee511747 100644 --- a/MaterialLib/PorousMedium/PorousMediaProperties.cpp +++ b/MaterialLib/PorousMedium/PorousMediaProperties.cpp @@ -18,8 +18,7 @@ namespace PorousMedium int PorousMediaProperties::getMaterialID( ProcessLib::SpatialPosition const& pos) const { - int const element_id = pos.getElementID().get(); - return _material_ids[element_id]; + return _material_ids ? (*_material_ids)[pos.getElementID().get()] : 0; } MaterialLib::PorousMedium::Porosity const& PorousMediaProperties::getPorosity( diff --git a/MaterialLib/PorousMedium/PorousMediaProperties.h b/MaterialLib/PorousMedium/PorousMediaProperties.h index b37766dfdccffde83346e2aa34741d195e9de3ff..4424ccf0c9b0c445edf333204d89d64c55c9184c 100644 --- a/MaterialLib/PorousMedium/PorousMediaProperties.h +++ b/MaterialLib/PorousMedium/PorousMediaProperties.h @@ -36,23 +36,16 @@ public: intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&& specific_storage_models, - std::vector<int>&& material_ids) + MeshLib::PropertyVector<int> const* const material_ids) : _porosity_models(std::move(porosity_models)), _intrinsic_permeability_models( std::move(intrinsic_permeability_models)), _specific_storage_models(std::move(specific_storage_models)), - _material_ids(std::move(material_ids)) + _material_ids(material_ids) { } - PorousMediaProperties(PorousMediaProperties&& other) - : _porosity_models(std::move(other._porosity_models)), - _intrinsic_permeability_models( - std::move(other._intrinsic_permeability_models)), - _specific_storage_models(std::move(other._specific_storage_models)), - _material_ids(other._material_ids) - { - } + PorousMediaProperties(PorousMediaProperties&& other) = default; MaterialLib::PorousMedium::Porosity const& getPorosity( double t, ProcessLib::SpatialPosition const& pos) const; @@ -72,7 +65,7 @@ private: _intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> _specific_storage_models; - std::vector<int> _material_ids; + MeshLib::PropertyVector<int> const* const _material_ids; }; } diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp index f699249430ea53658a984834ba1847ba3ab41cdd..1e94afb1f573f6de41d693a583c06b1b61a16f80 100644 --- a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp +++ b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp @@ -40,8 +40,7 @@ std::unique_ptr<LiquidFlowMaterialProperties> createLiquidFlowMaterialProperties( BaseLib::ConfigTree const& config, std::vector<std::unique_ptr<ParameterBase>> const& parameters, - bool const has_material_ids, - MeshLib::PropertyVector<int> const& material_ids) + MeshLib::PropertyVector<int> const* const material_ids) { DBUG("Reading material properties of liquid flow process."); @@ -99,8 +98,7 @@ createLiquidFlowMaterialProperties( return std::make_unique<LiquidFlowMaterialProperties>( std::move(fluid_properties), std::move(intrinsic_permeability_models), - std::move(porosity_models), std::move(storage_models), has_material_ids, - material_ids); + std::move(porosity_models), std::move(storage_models), material_ids); } } // end of namespace diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.h b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.h index eb908fbe7bf1dee5b31882a3180aadc1f7a6bbe6..b8ae712e80d956172fbfc42455a25daf09a3107d 100644 --- a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.h +++ b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.h @@ -45,8 +45,7 @@ std::unique_ptr<LiquidFlowMaterialProperties> createLiquidFlowMaterialProperties( BaseLib::ConfigTree const& config, std::vector<std::unique_ptr<ParameterBase>> const& parameters, - bool const has_material_ids, - MeshLib::PropertyVector<int> const& material_ids); + MeshLib::PropertyVector<int> const* const material_ids); } // end of namespace } // end of namespace diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp index f8fc4511dc3923cc35a2f3b2e4b2e6f42516462c..3264dd7e1ce2801e1c4f3f6c976986e3ad2d65c2 100644 --- a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp +++ b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp @@ -91,39 +91,21 @@ std::unique_ptr<Process> createLiquidFlowProcess( //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property} auto const& mat_config = config.getConfigSubtree("material_property"); - if (mesh.getProperties().existsPropertyVector<int>( - "MaterialIDs", MeshLib::MeshItemType::Cell, 1)) + auto const material_ids = materialIDs(mesh); + if (material_ids) { INFO("The liquid flow is in heterogeneous porous media."); - const bool has_material_ids = true; - auto const& mat_ids = mesh.getProperties().getPropertyVector<int>( - "MaterialIDs", MeshLib::MeshItemType::Cell, 1); - return std::unique_ptr<Process>{new LiquidFlowProcess{ - mesh, std::move(jacobian_assembler), parameters, integration_order, - std::move(process_variables), std::move(secondary_variables), - std::move(named_function_caller), *mat_ids, has_material_ids, - gravity_axis_id, g, reference_temperature, mat_config}}; } - - INFO("The liquid flow is in homogeneous porous media."); - - MeshLib::Properties dummy_property; - // For a reference argument of LiquidFlowProcess(...). - auto const& dummy_property_vector = - dummy_property.createNewPropertyVector<int>( - "MaterialIDs", MeshLib::MeshItemType::Cell, 1); - - // Since dummy_property_vector is only visible in this function, - // the following constant, has_material_ids, is employed to indicate - // that material_ids does not exist. - const bool has_material_ids = false; + else + { + INFO("The liquid flow is in homogeneous porous media."); + } return std::unique_ptr<Process>{new LiquidFlowProcess{ mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(secondary_variables), - std::move(named_function_caller), *dummy_property_vector, - has_material_ids, gravity_axis_id, g, reference_temperature, - mat_config}}; + std::move(named_function_caller), material_ids, gravity_axis_id, g, + reference_temperature, mat_config}}; } } // end of namespace diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp index bc7aa51c7ccea8e9d12fe01c44a8bfa6b491b6c6..da7a9e0c464e3252a1b31f8d9346089421cf5d8f 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp +++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp @@ -33,13 +33,13 @@ namespace LiquidFlow int LiquidFlowMaterialProperties::getMaterialID( const SpatialPosition& pos) const { - if (!_has_material_ids) + if (!_material_ids) { return 0; } - assert(pos.getElementID().get() < _material_ids.size()); - return _material_ids[pos.getElementID().get()]; + assert(pos.getElementID().get() < _material_ids->size()); + return (*_material_ids)[pos.getElementID().get()]; } double LiquidFlowMaterialProperties::getLiquidDensity(const double p, diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h index bafb35327de3896175649b9e922939c41b9a4b50..d95374c6b2fbb3684c5a33a4f399cfe0b37349b5 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h +++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h @@ -56,10 +56,8 @@ public: porosity_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&& storage_models, - bool const has_material_ids, - MeshLib::PropertyVector<int> const& material_ids) - : _has_material_ids(has_material_ids), - _material_ids(material_ids), + MeshLib::PropertyVector<int> const* const material_ids) + : _material_ids(material_ids), _fluid_properties(std::move(fluid_properties)), _intrinsic_permeability_models( std::move(intrinsic_permeability_models)), @@ -106,13 +104,10 @@ public: const double porosity_variable, const double T) const; private: - /// A flag to indicate whether the reference member, _material_ids, - /// is not assigned. - const bool _has_material_ids; /** Use porous medium models for different material zones. * Material IDs must be given as mesh element properties. */ - MeshLib::PropertyVector<int> const& _material_ids; + MeshLib::PropertyVector<int> const* const _material_ids; const std::unique_ptr<MaterialLib::Fluid::FluidProperties> _fluid_properties; diff --git a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp index 8c04ad6d3c694ddf6aed3ec7fffc903b057f01c4..3e113c5d9679f546997c2887dbcad06c48503218 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp +++ b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp @@ -39,8 +39,7 @@ LiquidFlowProcess::LiquidFlowProcess( process_variables, SecondaryVariableCollection&& secondary_variables, NumLib::NamedFunctionCaller&& named_function_caller, - MeshLib::PropertyVector<int> const& material_ids, - bool const has_material_ids, + MeshLib::PropertyVector<int> const* const material_ids, int const gravitational_axis_id, double const gravitational_acceleration, double const reference_temperature, @@ -51,8 +50,8 @@ LiquidFlowProcess::LiquidFlowProcess( _gravitational_axis_id(gravitational_axis_id), _gravitational_acceleration(gravitational_acceleration), _reference_temperature(reference_temperature), - _material_properties(createLiquidFlowMaterialProperties( - config, parameters, has_material_ids, material_ids)) + _material_properties( + createLiquidFlowMaterialProperties(config, parameters, material_ids)) { DBUG("Create Liquid flow process."); } diff --git a/ProcessLib/LiquidFlow/LiquidFlowProcess.h b/ProcessLib/LiquidFlow/LiquidFlowProcess.h index 0383591dfcaeee4f0da792765d8d8b01cbe834e9..c12501bceec21f2bee81dd9dbe386c303687657c 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowProcess.h +++ b/ProcessLib/LiquidFlow/LiquidFlowProcess.h @@ -66,8 +66,7 @@ public: process_variables, SecondaryVariableCollection&& secondary_variables, NumLib::NamedFunctionCaller&& named_function_caller, - MeshLib::PropertyVector<int> const& material_ids, - bool const has_material_ids, + MeshLib::PropertyVector<int> const* const material_ids, int const gravitational_axis_id, double const gravitational_acceleration, double const reference_temperature,