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