From 5ca7b2348ab497f45f9049fce2acc28f9bbff80d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Mon, 15 Nov 2021 16:04:38 +0100
Subject: [PATCH] Add an unordered 1d mesh to the mesh database

The aim of this mesh is to avoid the particular situation of the
generated 1d mesh.
---
 tests/MeshDataBaseForTests.cpp | 110 ++++++++++++++++++++++++++++++++-
 tests/MeshDataBaseForTests.hpp |  32 +++++++++-
 2 files changed, 138 insertions(+), 4 deletions(-)

diff --git a/tests/MeshDataBaseForTests.cpp b/tests/MeshDataBaseForTests.cpp
index 350dce0ff..b58cc22e8 100644
--- a/tests/MeshDataBaseForTests.cpp
+++ b/tests/MeshDataBaseForTests.cpp
@@ -21,8 +21,9 @@ MeshDataBaseForTests::MeshDataBaseForTests()
   m_cartesian_3d_mesh = std::dynamic_pointer_cast<const Mesh<Connectivity<3>>>(
     CartesianMeshBuilder{TinyVector<3>{0, 1, 0}, TinyVector<3>{2, -1, 3}, TinyVector<3, size_t>{6, 7, 4}}.mesh());
 
-  m_hybrid_2d_mesh = _buildHybrid2dMesh();
-  m_hybrid_3d_mesh = _buildHybrid3dMesh();
+  m_unordered_1d_mesh = _buildUnordered1dMesh();
+  m_hybrid_2d_mesh    = _buildHybrid2dMesh();
+  m_hybrid_3d_mesh    = _buildHybrid3dMesh();
 }
 
 const MeshDataBaseForTests&
@@ -64,6 +65,12 @@ MeshDataBaseForTests::cartesian3DMesh() const
   return m_cartesian_3d_mesh;
 }
 
+std::shared_ptr<const Mesh<Connectivity<1>>>
+MeshDataBaseForTests::unordered1DMesh() const
+{
+  return m_unordered_1d_mesh;
+}
+
 std::shared_ptr<const Mesh<Connectivity<2>>>
 MeshDataBaseForTests::hybrid2DMesh() const
 {
@@ -76,6 +83,105 @@ MeshDataBaseForTests::hybrid3DMesh() const
   return m_hybrid_3d_mesh;
 }
 
+std::shared_ptr<const Mesh<Connectivity<1>>>
+MeshDataBaseForTests::_buildUnordered1dMesh()
+{
+  const std::string filename = std::filesystem::path{PUGS_BINARY_DIR}.append("tests").append("unordered-1d.msh");
+  if (parallel::rank() == 0) {
+    std::ofstream fout(filename);
+    fout << R"($MeshFormat
+2.2 0 8
+$EndMeshFormat
+$PhysicalNames
+4
+0 1 "XMIN"
+0 2 "XMAX"
+1 3 "LEFT"
+1 4 "RIGHT"
+$EndPhysicalNames
+$Nodes
+35
+1 0 0 0
+2 -1 0 0
+3 1 0 0
+4 0.03246387076421061 0 0
+5 0.07692961499792127 0 0
+6 0.1378343163027127 0 0
+7 0.2212554508344625 0 0
+8 0.3355173320316702 0 0
+9 0.4920217492706127 0 0
+10 0.7063857794730655 0 0
+11 -0.9513615311521172 0 0
+12 -0.9036693300347614 0 0
+13 -0.8569049934960202 0 0
+14 -0.8110504814343311 0 0
+15 -0.7660880891035384 0 0
+16 -0.7220004662902741 0 0
+17 -0.6787705699229041 0 0
+18 -0.6363817403249178 0 0
+19 -0.5948175927947426 0 0
+20 -0.5540620983944274 0 0
+21 -0.5140995098187926 0 0
+22 -0.4749144219806904 0 0
+23 -0.4364916774353312 0 0
+24 -0.3988164798351664 0 0
+25 -0.3618742567441507 0 0
+26 -0.3256507606537927 0 0
+27 -0.2901320091863738 0 0
+28 -0.2553042883413312 0 0
+29 -0.2211541538737678 0 0
+30 -0.1876684263237806 0 0
+31 -0.1548341743437643 0 0
+32 -0.1226387276497952 0 0
+33 -0.09106965120674937 0 0
+34 -0.0601147701140996 0 0
+35 -0.02976212372405818 0 0
+$EndNodes
+$Elements
+36
+1 15 2 1 2 2
+2 15 2 2 3 3
+3 1 2 4 1 1 4
+4 1 2 4 1 4 5
+5 1 2 4 1 5 6
+6 1 2 4 1 6 7
+7 1 2 4 1 7 8
+8 1 2 4 1 8 9
+9 1 2 4 1 9 10
+10 1 2 4 1 10 3
+11 1 2 3 2 2 11
+12 1 2 3 2 11 12
+13 1 2 3 2 12 13
+14 1 2 3 2 13 14
+15 1 2 3 2 14 15
+16 1 2 3 2 15 16
+17 1 2 3 2 16 17
+18 1 2 3 2 17 18
+19 1 2 3 2 18 19
+20 1 2 3 2 19 20
+21 1 2 3 2 20 21
+22 1 2 3 2 21 22
+23 1 2 3 2 22 23
+24 1 2 3 2 23 24
+25 1 2 3 2 24 25
+26 1 2 3 2 25 26
+27 1 2 3 2 26 27
+28 1 2 3 2 27 28
+29 1 2 3 2 28 29
+30 1 2 3 2 29 30
+31 1 2 3 2 30 31
+32 1 2 3 2 31 32
+33 1 2 3 2 32 33
+34 1 2 3 2 33 34
+35 1 2 3 2 34 35
+36 1 2 3 2 35 1
+$EndElements
+)";
+  }
+
+  return std::dynamic_pointer_cast<const Mesh<Connectivity<1>>>(GmshReader{filename}.mesh());
+}
+
 std::shared_ptr<const Mesh<Connectivity<2>>>
 MeshDataBaseForTests::_buildHybrid2dMesh()
 {
diff --git a/tests/MeshDataBaseForTests.hpp b/tests/MeshDataBaseForTests.hpp
index 119348f0e..86e0019d4 100644
--- a/tests/MeshDataBaseForTests.hpp
+++ b/tests/MeshDataBaseForTests.hpp
@@ -9,7 +9,9 @@ class Connectivity;
 template <typename ConnectivityT>
 class Mesh;
 
+#include <array>
 #include <memory>
+#include <string>
 
 class MeshDataBaseForTests
 {
@@ -22,21 +24,47 @@ class MeshDataBaseForTests
   std::shared_ptr<const Mesh<Connectivity<2>>> m_cartesian_2d_mesh;
   std::shared_ptr<const Mesh<Connectivity<3>>> m_cartesian_3d_mesh;
 
+  std::shared_ptr<const Mesh<Connectivity<1>>> m_unordered_1d_mesh;
   std::shared_ptr<const Mesh<Connectivity<2>>> m_hybrid_2d_mesh;
   std::shared_ptr<const Mesh<Connectivity<3>>> m_hybrid_3d_mesh;
 
+  std::shared_ptr<const Mesh<Connectivity<1>>> _buildUnordered1dMesh();
   std::shared_ptr<const Mesh<Connectivity<2>>> _buildHybrid2dMesh();
   std::shared_ptr<const Mesh<Connectivity<3>>> _buildHybrid3dMesh();
 
  public:
   std::shared_ptr<const Mesh<Connectivity<1>>> cartesian1DMesh() const;
-  std::shared_ptr<const Mesh<Connectivity<2>>> cartesian2DMesh() const;
-  std::shared_ptr<const Mesh<Connectivity<3>>> cartesian3DMesh() const;
+  std::shared_ptr<const Mesh<Connectivity<1>>> unordered1DMesh() const;
 
+  std::shared_ptr<const Mesh<Connectivity<2>>> cartesian2DMesh() const;
   std::shared_ptr<const Mesh<Connectivity<2>>> hybrid2DMesh() const;
+
+  std::shared_ptr<const Mesh<Connectivity<3>>> cartesian3DMesh() const;
   std::shared_ptr<const Mesh<Connectivity<3>>> hybrid3DMesh() const;
 
   static const MeshDataBaseForTests& get();
+
+  auto
+  all1DMeshes() const
+  {
+    return std::array{std::make_pair(std::string("cartesian 1d mesh"), cartesian1DMesh()),
+                      std::make_pair(std::string("unordered 1d mesh"), unordered1DMesh())};
+  }
+
+  auto
+  all2DMeshes() const
+  {
+    return std::array{std::make_pair(std::string("cartesian 2d mesh"), cartesian2DMesh()),
+                      std::make_pair(std::string("hybrid 2d mesh"), hybrid2DMesh())};
+  }
+
+  auto
+  all3DMeshes() const
+  {
+    return std::array{std::make_pair(std::string("cartesian 3d mesh"), cartesian3DMesh()),
+                      std::make_pair(std::string("hybrid 3d mesh"), hybrid3DMesh())};
+  }
+
   static void create();
   static void destroy();
 
-- 
GitLab