From f2d8e51a1069cc7988a5850ffef77a208ab451b3 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov <github@naumov.de> Date: Thu, 19 Sep 2024 16:14:22 +0200 Subject: [PATCH] [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 <spdlog/fmt/bundled/core.h> +#include <spdlog/fmt/bundled/ranges.h> + +#include <range/v3/view/map.hpp> + #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( -- GitLab