From 6e648c2d0194537877ab7c8e0b49dd6423e796eb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Thu, 30 Mar 2023 22:37:14 +0200
Subject: [PATCH] Store volume when detecting bad mesh

---
 src/mesh/CMakeLists.txt |  1 +
 src/mesh/MeshData.cpp   | 25 +++++++++++++++++++++++++
 src/mesh/MeshData.hpp   | 14 +++-----------
 3 files changed, 29 insertions(+), 11 deletions(-)
 create mode 100644 src/mesh/MeshData.cpp

diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt
index dd88e5fa8..39f312822 100644
--- a/src/mesh/CMakeLists.txt
+++ b/src/mesh/CMakeLists.txt
@@ -22,6 +22,7 @@ add_library(
   MedianDualMeshBuilder.cpp
   MeshBuilderBase.cpp
   MeshCellZone.cpp
+  MeshData.cpp
   MeshDataManager.cpp
   MeshEdgeBoundary.cpp
   MeshFaceBoundary.cpp
diff --git a/src/mesh/MeshData.cpp b/src/mesh/MeshData.cpp
new file mode 100644
index 000000000..2fdddb387
--- /dev/null
+++ b/src/mesh/MeshData.cpp
@@ -0,0 +1,25 @@
+#include <mesh/MeshData.hpp>
+
+#include <mesh/Connectivity.hpp>
+#include <mesh/ItemValueVariant.hpp>
+#include <mesh/Mesh.hpp>
+#include <output/NamedItemValueVariant.hpp>
+#include <output/VTKWriter.hpp>
+#include <utils/Exceptions.hpp>
+
+template <size_t Dimension>
+void
+MeshData<Dimension>::_storeBadMesh()
+{
+  VTKWriter writer("bad_mesh");
+  writer.writeOnMesh(std::make_shared<MeshType>(m_mesh.shared_connectivity(), m_mesh.xr()),
+                     {std::make_shared<NamedItemValueVariant>(std::make_shared<ItemValueVariant>(m_Vj), "volume")});
+  std::ostringstream error_msg;
+  error_msg << "mesh contains cells of non-positive volume (see " << rang::fgB::yellow << "bad_mesh.pvd"
+            << rang::fg::reset << " file).";
+  throw NormalError(error_msg.str());
+}
+
+template void MeshData<1>::_storeBadMesh();
+template void MeshData<2>::_storeBadMesh();
+template void MeshData<3>::_storeBadMesh();
diff --git a/src/mesh/MeshData.hpp b/src/mesh/MeshData.hpp
index a448862a0..78b9b81e6 100644
--- a/src/mesh/MeshData.hpp
+++ b/src/mesh/MeshData.hpp
@@ -5,14 +5,9 @@
 #include <mesh/IMeshData.hpp>
 #include <mesh/ItemValue.hpp>
 #include <mesh/SubItemValuePerItem.hpp>
-#include <utils/Exceptions.hpp>
 #include <utils/Messenger.hpp>
 #include <utils/PugsUtils.hpp>
 
-#include <output/VTKWriter.hpp>
-
-#include <map>
-
 template <size_t Dimension>
 class Connectivity;
 
@@ -49,6 +44,8 @@ class MeshData : public IMeshData
   FaceValue<const double> m_ll;
   EdgeValue<const Rd> m_xe;
 
+  void _storeBadMesh();
+
   PUGS_INLINE
   void
   _computeNl()
@@ -537,12 +534,7 @@ class MeshData : public IMeshData
     }();
 
     if (not parallel::allReduceAnd(is_valid)) {
-      VTKWriter writer("bad_mesh");
-      writer.writeMesh(m_mesh);
-      std::ostringstream error_msg;
-      error_msg << "mesh contains cells of non-positive volume (see " << rang::fgB::yellow << "bad_mesh.pvd"
-                << rang::fg::reset << " file).";
-      throw NormalError(error_msg.str());
+      this->_storeBadMesh();
     }
   }
 
-- 
GitLab