From f2d8e51a1069cc7988a5850ffef77a208ab451b3 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov Date: Thu, 19 Sep 2024 16:14:22 +0200 Subject: [PATCH 1/5] [MPL] Report media/material ids mismatch instead of crash triggered by map::at std::out_of_range exception. --- .../MPL/MaterialSpatialDistributionMap.cpp | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/MaterialLib/MPL/MaterialSpatialDistributionMap.cpp b/MaterialLib/MPL/MaterialSpatialDistributionMap.cpp index 3709e1ad453..dcde7ccfa7d 100644 --- a/MaterialLib/MPL/MaterialSpatialDistributionMap.cpp +++ b/MaterialLib/MPL/MaterialSpatialDistributionMap.cpp @@ -11,6 +11,11 @@ */ #include "MaterialSpatialDistributionMap.h" +#include +#include + +#include + #include "MeshLib/Mesh.h" namespace MaterialPropertyLib @@ -28,7 +33,36 @@ Medium const* MaterialSpatialDistributionMap::getMedium( auto const material_id = material_ids_ == nullptr ? 0 : (*material_ids_)[element_id]; - return media_.at(material_id).get(); + assert(!media_.empty()); + + if (auto const it = media_.find(material_id); it != media_.end()) + { + return it->second.get(); + } + + // + // Error handling until end of the function. + // + + if (material_ids_ == nullptr) + { + assert(material_id == 0); + ERR("No MaterialIDs given in the mesh therefore default material id = " + "0 is used."); + } + auto keys = media_ | ranges::views::keys; + + if (media_.size() == 1) + { + ERR("Single medium for material id {} is defined.", + fmt::join(keys, ", ")); + } + else + { + ERR("Media for material ids {} are defined.", fmt::join(keys, ", ")); + } + OGS_FATAL("No medium for material id {} found for element {}.", material_id, + element_id); } void MaterialSpatialDistributionMap::checkElementHasMedium( From a4ca32f2734aa524005185f937596a54b5f776e2 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov Date: Thu, 19 Sep 2024 16:16:03 +0200 Subject: [PATCH 2/5] [App] Add id="*" for media as a catch all mat ids --- Applications/ApplicationsLib/ProjectData.cpp | 23 ++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp index 86266fbd74a..a541166c245 100644 --- a/Applications/ApplicationsLib/ProjectData.cpp +++ b/Applications/ApplicationsLib/ProjectData.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "BaseLib/Algorithm.h" @@ -564,8 +565,26 @@ void ProjectData::parseMedia( //! \ogs_file_attr{prj__media__medium__id} medium_config.getConfigAttribute("id", "0"); - auto const material_ids_of_this_medium = - BaseLib::splitMaterialIdString(material_id_string); + std::vector material_ids_of_this_medium; + if (material_id_string == "*") + { + auto const* const material_ids = materialIDs(*_mesh_vec[0]); + if (material_ids != nullptr) + { + material_ids_of_this_medium = + *material_ids | + ranges::views::adjacent_remove_if(std::equal_to<>()) | + ranges::to_vector; + BaseLib::makeVectorUnique(material_ids_of_this_medium); + DBUG("Catch all medium definition for material ids {}.", + fmt::join(material_ids_of_this_medium, ", ")); + } + } + else + { + material_ids_of_this_medium = + BaseLib::splitMaterialIdString(material_id_string); + } for (auto const& id : material_ids_of_this_medium) { From b5408eaaeca846507a62f5cef0ae377a542b66cf Mon Sep 17 00:00:00 2001 From: Dmitri Naumov Date: Fri, 20 Sep 2024 08:14:24 +0200 Subject: [PATCH 3/5] [T] Use in some tests --- .../cube_1x1x1_SteadyStateDiffusion/cube_1e4_anisotropic.prj | 2 +- .../Data/HydroMechanics/ExcavationNiches/excavation_niches.prj | 2 +- .../LiquidFlow/RasterParameter/GroundwaterModelWithRasterBC.prj | 2 +- .../ThermoHydroMechanics/HeatingHomogeneousDomain/hex_THM.prj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/Data/Elliptic/cube_1x1x1_SteadyStateDiffusion/cube_1e4_anisotropic.prj b/Tests/Data/Elliptic/cube_1x1x1_SteadyStateDiffusion/cube_1e4_anisotropic.prj index 6ee8e360caa..0b668684a10 100644 --- a/Tests/Data/Elliptic/cube_1x1x1_SteadyStateDiffusion/cube_1e4_anisotropic.prj +++ b/Tests/Data/Elliptic/cube_1x1x1_SteadyStateDiffusion/cube_1e4_anisotropic.prj @@ -16,7 +16,7 @@ - + diffusion diff --git a/Tests/Data/HydroMechanics/ExcavationNiches/excavation_niches.prj b/Tests/Data/HydroMechanics/ExcavationNiches/excavation_niches.prj index 2aa4c890ada..db8844f15f1 100644 --- a/Tests/Data/HydroMechanics/ExcavationNiches/excavation_niches.prj +++ b/Tests/Data/HydroMechanics/ExcavationNiches/excavation_niches.prj @@ -30,7 +30,7 @@ - + AqueousLiquid diff --git a/Tests/Data/Parabolic/LiquidFlow/RasterParameter/GroundwaterModelWithRasterBC.prj b/Tests/Data/Parabolic/LiquidFlow/RasterParameter/GroundwaterModelWithRasterBC.prj index c9f6f597ac4..bc7ff297048 100644 --- a/Tests/Data/Parabolic/LiquidFlow/RasterParameter/GroundwaterModelWithRasterBC.prj +++ b/Tests/Data/Parabolic/LiquidFlow/RasterParameter/GroundwaterModelWithRasterBC.prj @@ -26,7 +26,7 @@ - + AqueousLiquid diff --git a/Tests/Data/ThermoHydroMechanics/HeatingHomogeneousDomain/hex_THM.prj b/Tests/Data/ThermoHydroMechanics/HeatingHomogeneousDomain/hex_THM.prj index 0036222525f..a178272dc13 100644 --- a/Tests/Data/ThermoHydroMechanics/HeatingHomogeneousDomain/hex_THM.prj +++ b/Tests/Data/ThermoHydroMechanics/HeatingHomogeneousDomain/hex_THM.prj @@ -33,7 +33,7 @@ - + AqueousLiquid From e7ee1bcbc5ecb2091c06a1161fccd74f99167722 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov Date: Tue, 1 Oct 2024 16:27:47 +0200 Subject: [PATCH 4/5] [AL] Extract parseMaterialIdString() --- Applications/ApplicationsLib/ProjectData.cpp | 50 ++++++++++++-------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp index a541166c245..ee6def405ca 100644 --- a/Applications/ApplicationsLib/ProjectData.cpp +++ b/Applications/ApplicationsLib/ProjectData.cpp @@ -356,6 +356,33 @@ std::vector readRasters( // } //} +std::vector parseMaterialIdString( + std::string const& material_id_string, + MeshLib::PropertyVector const* const material_ids) +{ + if (material_id_string == "*") + { + if (material_ids == nullptr) + { + OGS_FATAL( + "MaterialIDs property is not defined in the mesh but it is " + "required to parse '*' definition."); + } + + std::vector material_ids_of_this_medium = + *material_ids | + ranges::views::adjacent_remove_if(std::equal_to<>()) | + ranges::to_vector; + BaseLib::makeVectorUnique(material_ids_of_this_medium); + DBUG("Catch all medium definition for material ids {}.", + fmt::join(material_ids_of_this_medium, ", ")); + return material_ids_of_this_medium; + } + + // Usual case of ids separated by comma. + return BaseLib::splitMaterialIdString(material_id_string); +} + } // namespace ProjectData::ProjectData() = default; @@ -565,26 +592,9 @@ void ProjectData::parseMedia( //! \ogs_file_attr{prj__media__medium__id} medium_config.getConfigAttribute("id", "0"); - std::vector material_ids_of_this_medium; - if (material_id_string == "*") - { - auto const* const material_ids = materialIDs(*_mesh_vec[0]); - if (material_ids != nullptr) - { - material_ids_of_this_medium = - *material_ids | - ranges::views::adjacent_remove_if(std::equal_to<>()) | - ranges::to_vector; - BaseLib::makeVectorUnique(material_ids_of_this_medium); - DBUG("Catch all medium definition for material ids {}.", - fmt::join(material_ids_of_this_medium, ", ")); - } - } - else - { - material_ids_of_this_medium = - BaseLib::splitMaterialIdString(material_id_string); - } + std::vector const material_ids_of_this_medium = + parseMaterialIdString(material_id_string, + materialIDs(*_mesh_vec[0])); for (auto const& id : material_ids_of_this_medium) { From 121f60c05c7385ffd398d85a3f3529f90d2797b8 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov Date: Tue, 1 Oct 2024 16:37:16 +0200 Subject: [PATCH 5/5] [AL] Extract createMediumForId operating on map ... with shared pointers. There is a generalization for arbitrary types of map values and should be usable also in the constitutive relations map for solids and BHEs. --- Applications/ApplicationsLib/ProjectData.cpp | 66 ++++++++++++-------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp index ee6def405ca..4c32723f64a 100644 --- a/Applications/ApplicationsLib/ProjectData.cpp +++ b/Applications/ApplicationsLib/ProjectData.cpp @@ -383,6 +383,34 @@ std::vector parseMaterialIdString( return BaseLib::splitMaterialIdString(material_id_string); } +template +requires std::convertible_to()( + std::declval())), + std::shared_ptr> +void createMediumForId(int const id, + std::map>& _media, + std::vector const& material_ids_of_this_medium, + CreateMedium&& create_medium) +{ + 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); + } + + if (id == material_ids_of_this_medium[0]) + { + _media[id] = create_medium(id); + } + else + { + _media[id] = _media[material_ids_of_this_medium[0]]; + } +} + } // namespace ProjectData::ProjectData() = default; @@ -588,7 +616,16 @@ void ProjectData::parseMedia( //! \ogs_file_param{prj__media__medium} media_config->getConfigSubtreeList("medium")) { - auto material_id_string = + auto create_medium = [dim = _mesh_vec[0]->getDimension(), + &medium_config, this](int const id) + { + return MaterialPropertyLib::createMedium( + id, _mesh_vec[0]->getDimension(), medium_config, _parameters, + _local_coordinate_system ? &*_local_coordinate_system : nullptr, + _curves); + }; + + auto const material_id_string = //! \ogs_file_attr{prj__media__medium__id} medium_config.getConfigAttribute("id", "0"); @@ -598,31 +635,8 @@ void ProjectData::parseMedia( for (auto const& id : material_ids_of_this_medium) { - 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); - } - - if (id == material_ids_of_this_medium[0]) - { - _media[id] = MaterialPropertyLib::createMedium( - id, _mesh_vec[0]->getDimension(), medium_config, - _parameters, - _local_coordinate_system ? &*_local_coordinate_system - : nullptr, - _curves); - } - else - { - // This medium has multiple material IDs assigned and this is - // not the first material ID. Therefore we can reuse the medium - // we created before. - _media[id] = _media[material_ids_of_this_medium[0]]; - } + createMediumForId(id, _media, material_ids_of_this_medium, + create_medium); } }