diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp index 1f52451511b7eea16501cfff12e9490055c911d6..17f63414460d7c0ce0e0ec55e490d32300aac4ac 100644 --- a/Applications/ApplicationsLib/ProjectData.cpp +++ b/Applications/ApplicationsLib/ProjectData.cpp @@ -14,9 +14,9 @@ #include "ProjectData.h" #include <algorithm> -#include <set> - +#include <cctype> #include <logog/include/logog.hpp> +#include <set> #ifdef OGS_USE_PYTHON #include <pybind11/eval.h> @@ -447,20 +447,52 @@ void ProjectData::parseMedia( //! \ogs_file_param{prj__media__medium} media_config->getConfigSubtreeList("medium")) { - //! \ogs_file_attr{prj__media__medium__id} - auto const material_id = medium_config.getConfigAttribute<int>("id", 0); - - if (_media.find(material_id) != _media.end()) + auto material_id_string = + //! \ogs_file_attr{prj__media__medium__id} + medium_config.getConfigAttribute<std::string>("id", "0"); + material_id_string.erase( + remove_if(begin(material_id_string), end(material_id_string), + [](unsigned char const c) { return std::isspace(c); }), + end(material_id_string)); + auto const material_ids_strings = + BaseLib::splitString(material_id_string, ','); + + // Convert strings to ints; + std::vector<int> material_ids; + std::transform( + begin(material_ids_strings), end(material_ids_strings), + std::back_inserter(material_ids), [](std::string const& m_id) { + if (auto const it = std::find_if_not( + begin(m_id), end(m_id), + [](unsigned char const c) { return std::isdigit(c); }); + it != end(m_id)) + { + OGS_FATAL( + "Could not parse material ID's from '%s'. Please " + "separate multiple material ID's by comma only. " + "Invalid character: '%c'", + m_id.c_str(), *it); + } + return std::stoi(m_id); + }); + + for (auto const& id : material_ids) { - OGS_FATAL( - "Multiple media were specified for the same material id %d. " - "Keep in mind, that if no material id is specified, it is " - "assumed to be 0 by default.", - material_id); - } + if (_media.find(id) != end(_media)) + { + OGS_FATAL( + "Multiple media were specified for the same material id " + "'%d'. " + "Keep in mind, that if no material id is specified, it is " + "assumed to be 0 by default.", + id); + } - _media[material_id] = - MaterialPropertyLib::createMedium(medium_config, _parameters); + _media[id] = (id == material_ids[0]) + ? MaterialPropertyLib::createMedium(medium_config, + _parameters) + : _media[material_ids[0]]; + } } if (_media.empty()) diff --git a/Applications/ApplicationsLib/ProjectData.h b/Applications/ApplicationsLib/ProjectData.h index e80ddd36ca165b1de9968f59a128cd0355d8291a..e1593be124c61f57eb79fa84bff23ce5e9db8229 100644 --- a/Applications/ApplicationsLib/ProjectData.h +++ b/Applications/ApplicationsLib/ProjectData.h @@ -125,7 +125,7 @@ private: boost::optional<ParameterLib::CoordinateSystem> _local_coordinate_system; - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> _media; + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> _media; /// The time loop used to solve this project's processes. std::unique_ptr<ProcessLib::TimeLoop> _time_loop; diff --git a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp index 95afd5115c8563d5de220585c003f958b35d6a3c..f4e31dc2700a401330c00cc47ec8a0f76bedc792 100644 --- a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp +++ b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp @@ -16,7 +16,7 @@ namespace MaterialPropertyLib { std::unique_ptr<MaterialSpatialDistributionMap> createMaterialSpatialDistributionMap( - std::map<int, std::unique_ptr<Medium>> const& media, + std::map<int, std::shared_ptr<Medium>> const& media, MeshLib::Mesh const& mesh) { auto const material_ids = materialIDs(mesh); diff --git a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h index 8d60b9c5f6db8fd0f3681b41f5401295ee2e38dd..2062e86fe5821a38bf383675313002eb1d2fdaab 100644 --- a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h +++ b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h @@ -26,6 +26,6 @@ class Medium; std::unique_ptr<MaterialSpatialDistributionMap> createMaterialSpatialDistributionMap( - std::map<int, std::unique_ptr<Medium>> const& media, + std::map<int, std::shared_ptr<Medium>> const& media, MeshLib::Mesh const& mesh); } // namespace MaterialPropertyLib diff --git a/MaterialLib/MPL/MaterialSpatialDistributionMap.h b/MaterialLib/MPL/MaterialSpatialDistributionMap.h index 06c86509e764abec5daf135f82cf5edf0175898c..f51f94a0d3d4b5d0132b369edfd74f03ac2454f1 100644 --- a/MaterialLib/MPL/MaterialSpatialDistributionMap.h +++ b/MaterialLib/MPL/MaterialSpatialDistributionMap.h @@ -29,7 +29,7 @@ class MaterialSpatialDistributionMap { public: MaterialSpatialDistributionMap( - std::map<int, std::unique_ptr<Medium>> const& media, + std::map<int, std::shared_ptr<Medium>> const& media, MeshLib::PropertyVector<int> const* const material_ids) : _media(media), _material_ids(material_ids) { @@ -38,7 +38,7 @@ public: Medium* getMedium(std::size_t element_id); private: - std::map<int, std::unique_ptr<Medium>> const& _media; + std::map<int, std::shared_ptr<Medium>> const& _media; MeshLib::PropertyVector<int> const* const _material_ids; }; } // namespace MaterialPropertyLib diff --git a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp index 558022ef13b28e51a076bd851168df6b7eccd124..c38fda09ea42558ab8bdd7618d36d1ed97f3b393 100644 --- a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp +++ b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp @@ -32,7 +32,7 @@ std::unique_ptr<Process> createComponentTransportProcess( BaseLib::ConfigTree const& config, std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes, std::string const& output_directory, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media) + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "ComponentTransport"); diff --git a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.h b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.h index a5baa0892874e99f29ab2b84df798a0afa12c072..2fe8a2f395103fef857b6cd4ec0363df4290561b 100644 --- a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.h +++ b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.h @@ -32,7 +32,7 @@ std::unique_ptr<Process> createComponentTransportProcess( BaseLib::ConfigTree const& config, std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes, std::string const& output_directory, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace ComponentTransport } // namespace ProcessLib diff --git a/ProcessLib/HT/CreateHTProcess.cpp b/ProcessLib/HT/CreateHTProcess.cpp index 2c3ea66626afba5d91da9c23b76b130796e31216..10ec33b1e1980b9a8ed6036fa767ddf374cca3e1 100644 --- a/ProcessLib/HT/CreateHTProcess.cpp +++ b/ProcessLib/HT/CreateHTProcess.cpp @@ -36,7 +36,7 @@ std::unique_ptr<Process> createHTProcess( BaseLib::ConfigTree const& config, std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes, std::string const& output_directory, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media) + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "HT"); diff --git a/ProcessLib/HT/CreateHTProcess.h b/ProcessLib/HT/CreateHTProcess.h index d5a0e053cb6ba9e98a5bf305c6b0f29d04986567..38a1305c704e9a191cad3a5d6c2dc03c57e34a65 100644 --- a/ProcessLib/HT/CreateHTProcess.h +++ b/ProcessLib/HT/CreateHTProcess.h @@ -33,7 +33,7 @@ std::unique_ptr<Process> createHTProcess( BaseLib::ConfigTree const& config, std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes, std::string const& output_directory, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace HT } // namespace ProcessLib diff --git a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp index b7e7ec8dbd3d602e44e1041b165ad7a6d96e0746..9deeded9983794783538a85b9341624bf3efdbeb 100644 --- a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp +++ b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp @@ -39,7 +39,7 @@ std::unique_ptr<Process> createHeatTransportBHEProcess( std::map<std::string, std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const& curves, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media) + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "HEAT_TRANSPORT_BHE"); diff --git a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.h b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.h index bfc3debc09bfa9f6efc0dce0cfc394bb93b7fda1..b53296d0314ec9e8c8efc85dbfb72a0397d97344 100644 --- a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.h +++ b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.h @@ -30,6 +30,6 @@ std::unique_ptr<Process> createHeatTransportBHEProcess( std::map<std::string, std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const& curves, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace HeatTransportBHE } // namespace ProcessLib diff --git a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp index 410299d5da0769e3e259e220c1e7df5f3ac79a4c..c688a1211563ed077621eae0afc579d3dc4d08d5 100644 --- a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp +++ b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp @@ -38,7 +38,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess( boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media) + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "HYDRO_MECHANICS"); @@ -232,7 +232,7 @@ template std::unique_ptr<Process> createHydroMechanicsProcess<2>( local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); template std::unique_ptr<Process> createHydroMechanicsProcess<3>( std::string name, @@ -244,7 +244,7 @@ template std::unique_ptr<Process> createHydroMechanicsProcess<3>( local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace HydroMechanics } // namespace ProcessLib diff --git a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h index 7fb0b496022043f36fa050c224e1be5d37601ea9..d77e971b6ce202f7b4e44f4be704a353900e4ecf 100644 --- a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h +++ b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h @@ -54,7 +54,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess( local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); extern template std::unique_ptr<Process> createHydroMechanicsProcess<2>( std::string name, @@ -66,7 +66,7 @@ extern template std::unique_ptr<Process> createHydroMechanicsProcess<2>( local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); extern template std::unique_ptr<Process> createHydroMechanicsProcess<3>( std::string name, @@ -78,6 +78,6 @@ extern template std::unique_ptr<Process> createHydroMechanicsProcess<3>( local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace HydroMechanics } // namespace ProcessLib diff --git a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp index 6269dc0971def0498f1d60a2d155c4c32c2315d7..a0d7118f78d1829574eb170650a125c1e22bca10 100644 --- a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp +++ b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp @@ -37,7 +37,7 @@ std::unique_ptr<Process> createThermoHydroMechanicsProcess( boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media) + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "THERMO_HYDRO_MECHANICS"); @@ -186,7 +186,7 @@ template std::unique_ptr<Process> createThermoHydroMechanicsProcess<2>( local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); template std::unique_ptr<Process> createThermoHydroMechanicsProcess<3>( std::string name, @@ -198,6 +198,6 @@ template std::unique_ptr<Process> createThermoHydroMechanicsProcess<3>( local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace ThermoHydroMechanics } // namespace ProcessLib diff --git a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.h b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.h index 80546f1b842082cae4859f3c33387a2f1ff9a8ee..3b9637abdf357b0eff92ae5b7b690c39faa077e2 100644 --- a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.h +++ b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.h @@ -57,7 +57,7 @@ std::unique_ptr<Process> createThermoHydroMechanicsProcess( local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); extern template std::unique_ptr<Process> createThermoHydroMechanicsProcess<2>( std::string name, MeshLib::Mesh& mesh, @@ -67,7 +67,7 @@ extern template std::unique_ptr<Process> createThermoHydroMechanicsProcess<2>( boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); extern template std::unique_ptr<Process> createThermoHydroMechanicsProcess<3>( std::string name, @@ -79,6 +79,6 @@ extern template std::unique_ptr<Process> createThermoHydroMechanicsProcess<3>( local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace ThermoHydroMechanics } // namespace ProcessLib diff --git a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.cpp b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.cpp index d8ab2b2192e23d2b109ca5c808d0ef8d39d5fe7c..bce744c33b946a5a8045d7842de5ccf097952f69 100644 --- a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.cpp +++ b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.cpp @@ -34,7 +34,7 @@ std::unique_ptr<Process> createTwoPhaseFlowWithPPProcess( std::map<std::string, std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const& curves, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media) + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "TWOPHASE_FLOW_PP"); diff --git a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.h b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.h index 56a79530b198eb2148a057bebb15c4e9651243eb..2739147c30511356a48ed598c746c785c694fe93 100644 --- a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.h +++ b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.h @@ -63,6 +63,6 @@ std::unique_ptr<Process> createTwoPhaseFlowWithPPProcess( std::map<std::string, std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const& curves, - std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media); + std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media); } // namespace TwoPhaseFlowWithPP } // namespace ProcessLib