From f26703a250fe5f23d4762de96f9d5fed6fe86f0e Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 19 May 2020 17:40:36 +0200
Subject: [PATCH] Add boundary management in pugs' language.

Also split BoudaryConditionDescriptor and BoundaryDescriptor files
---
 src/language/modules/SchemeModule.cpp         |  12 +-
 src/main.cpp                                  |  24 ++-
 src/scheme/BoundaryConditionDescriptor.hpp    | 179 ------------------
 src/scheme/IBoundaryConditionDescriptor.hpp   |  33 ++++
 src/scheme/IBoundaryDescriptor.hpp            |  41 ++++
 src/scheme/NamedBoundaryDescriptor.hpp        |  43 +++++
 src/scheme/NumberedBoundaryDescriptor.hpp     |  42 ++++
 .../SymmetryBoundaryConditionDescriptor.hpp   |  46 +++++
 8 files changed, 227 insertions(+), 193 deletions(-)
 delete mode 100644 src/scheme/BoundaryConditionDescriptor.hpp
 create mode 100644 src/scheme/IBoundaryConditionDescriptor.hpp
 create mode 100644 src/scheme/IBoundaryDescriptor.hpp
 create mode 100644 src/scheme/NamedBoundaryDescriptor.hpp
 create mode 100644 src/scheme/NumberedBoundaryDescriptor.hpp
 create mode 100644 src/scheme/SymmetryBoundaryConditionDescriptor.hpp

diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp
index 7a41194c3..05f6de053 100644
--- a/src/language/modules/SchemeModule.cpp
+++ b/src/language/modules/SchemeModule.cpp
@@ -4,13 +4,17 @@
 #include <language/utils/TypeDescriptor.hpp>
 #include <mesh/Mesh.hpp>
 #include <scheme/AcousticSolver.hpp>
+#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/IBoundaryDescriptor.hpp>
+#include <scheme/NamedBoundaryDescriptor.hpp>
+#include <scheme/NumberedBoundaryDescriptor.hpp>
+#include <scheme/SymmetryBoundaryConditionDescriptor.hpp>
 
 #include <memory>
 
 /////////// TEMPORARY
 
 #include <output/VTKWriter.hpp>
-#include <scheme/BoundaryConditionDescriptor.hpp>
 
 template <size_t Dimension>
 struct MeshDimensionAdapter
@@ -35,14 +39,14 @@ struct MeshDimensionAdapter
     }();
 
     MeshDataType mesh_data(m_mesh);
-    std::vector<std::shared_ptr<BoundaryConditionDescriptor>> bc_descriptor_list;
+    std::vector<std::shared_ptr<IBoundaryConditionDescriptor>> bc_descriptor_list;
     for (const auto& sym_boundary_name : sym_boundary_name_list) {
       std::shared_ptr<IBoundaryDescriptor> boudary_descriptor =
         std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name));
       SymmetryBoundaryConditionDescriptor* sym_bc_descriptor =
         new SymmetryBoundaryConditionDescriptor(boudary_descriptor);
 
-      bc_descriptor_list.push_back(std::shared_ptr<BoundaryConditionDescriptor>(sym_bc_descriptor));
+      bc_descriptor_list.push_back(std::shared_ptr<IBoundaryConditionDescriptor>(sym_bc_descriptor));
     }
 
     std::vector<BoundaryConditionHandler> bc_list;
@@ -57,7 +61,7 @@ struct MeshDimensionAdapter
 
       for (const auto& bc_descriptor : bc_descriptor_list) {
         switch (bc_descriptor->type()) {
-        case BoundaryConditionDescriptor::Type::symmetry: {
+        case IBoundaryConditionDescriptor::Type::symmetry: {
           const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor =
             dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
           for (size_t i_ref_face_list = 0;
diff --git a/src/main.cpp b/src/main.cpp
index 76f822d21..1bde1fe58 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -15,7 +15,11 @@
 #include <algebra/TinyMatrix.hpp>
 #include <algebra/TinyVector.hpp>
 
-#include <scheme/BoundaryConditionDescriptor.hpp>
+#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/IBoundaryDescriptor.hpp>
+#include <scheme/NamedBoundaryDescriptor.hpp>
+#include <scheme/NumberedBoundaryDescriptor.hpp>
+#include <scheme/SymmetryBoundaryConditionDescriptor.hpp>
 
 #include <mesh/MeshNodeBoundary.hpp>
 
@@ -63,14 +67,14 @@ main(int argc, char* argv[])
       switch (p_mesh->dimension()) {
       case 1: {
         std::vector<std::string> sym_boundary_name_list = {"XMIN", "XMAX"};
-        std::vector<std::shared_ptr<BoundaryConditionDescriptor>> bc_descriptor_list;
+        std::vector<std::shared_ptr<IBoundaryConditionDescriptor>> bc_descriptor_list;
         for (const auto& sym_boundary_name : sym_boundary_name_list) {
           std::shared_ptr<IBoundaryDescriptor> boudary_descriptor =
             std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name));
           SymmetryBoundaryConditionDescriptor* sym_bc_descriptor =
             new SymmetryBoundaryConditionDescriptor(boudary_descriptor);
 
-          bc_descriptor_list.push_back(std::shared_ptr<BoundaryConditionDescriptor>(sym_bc_descriptor));
+          bc_descriptor_list.push_back(std::shared_ptr<IBoundaryConditionDescriptor>(sym_bc_descriptor));
         }
 
         using ConnectivityType = Connectivity1D;
@@ -88,7 +92,7 @@ main(int argc, char* argv[])
         {
           for (const auto& bc_descriptor : bc_descriptor_list) {
             switch (bc_descriptor->type()) {
-            case BoundaryConditionDescriptor::Type::symmetry: {
+            case IBoundaryConditionDescriptor::Type::symmetry: {
               const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor =
                 dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
               for (size_t i_ref_node_list = 0;
@@ -182,14 +186,14 @@ main(int argc, char* argv[])
       case 2: {
         // test case boundary condition description
         std::vector<std::string> sym_boundary_name_list = {"XMIN", "XMAX", "YMIN", "YMAX"};
-        std::vector<std::shared_ptr<BoundaryConditionDescriptor>> bc_descriptor_list;
+        std::vector<std::shared_ptr<IBoundaryConditionDescriptor>> bc_descriptor_list;
         for (const auto& sym_boundary_name : sym_boundary_name_list) {
           std::shared_ptr<IBoundaryDescriptor> boudary_descriptor =
             std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name));
           SymmetryBoundaryConditionDescriptor* sym_bc_descriptor =
             new SymmetryBoundaryConditionDescriptor(boudary_descriptor);
 
-          bc_descriptor_list.push_back(std::shared_ptr<BoundaryConditionDescriptor>(sym_bc_descriptor));
+          bc_descriptor_list.push_back(std::shared_ptr<IBoundaryConditionDescriptor>(sym_bc_descriptor));
         }
 
         using ConnectivityType = Connectivity2D;
@@ -207,7 +211,7 @@ main(int argc, char* argv[])
         {
           for (const auto& bc_descriptor : bc_descriptor_list) {
             switch (bc_descriptor->type()) {
-            case BoundaryConditionDescriptor::Type::symmetry: {
+            case IBoundaryConditionDescriptor::Type::symmetry: {
               const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor =
                 dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
               for (size_t i_ref_face_list = 0;
@@ -288,14 +292,14 @@ main(int argc, char* argv[])
       }
       case 3: {
         std::vector<std::string> sym_boundary_name_list = {"XMIN", "XMAX", "YMIN", "YMAX", "ZMIN", "ZMAX"};
-        std::vector<std::shared_ptr<BoundaryConditionDescriptor>> bc_descriptor_list;
+        std::vector<std::shared_ptr<IBoundaryConditionDescriptor>> bc_descriptor_list;
         for (const auto& sym_boundary_name : sym_boundary_name_list) {
           std::shared_ptr<IBoundaryDescriptor> boudary_descriptor =
             std::shared_ptr<IBoundaryDescriptor>(new NamedBoundaryDescriptor(sym_boundary_name));
           SymmetryBoundaryConditionDescriptor* sym_bc_descriptor =
             new SymmetryBoundaryConditionDescriptor(boudary_descriptor);
 
-          bc_descriptor_list.push_back(std::shared_ptr<BoundaryConditionDescriptor>(sym_bc_descriptor));
+          bc_descriptor_list.push_back(std::shared_ptr<IBoundaryConditionDescriptor>(sym_bc_descriptor));
         }
 
         using ConnectivityType = Connectivity3D;
@@ -313,7 +317,7 @@ main(int argc, char* argv[])
         {
           for (const auto& bc_descriptor : bc_descriptor_list) {
             switch (bc_descriptor->type()) {
-            case BoundaryConditionDescriptor::Type::symmetry: {
+            case IBoundaryConditionDescriptor::Type::symmetry: {
               const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor =
                 dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
               for (size_t i_ref_face_list = 0;
diff --git a/src/scheme/BoundaryConditionDescriptor.hpp b/src/scheme/BoundaryConditionDescriptor.hpp
deleted file mode 100644
index 4fd5ae1d7..000000000
--- a/src/scheme/BoundaryConditionDescriptor.hpp
+++ /dev/null
@@ -1,179 +0,0 @@
-#ifndef BOUNDARY_CONDITION_DESCRIPTOR_HPP
-#define BOUNDARY_CONDITION_DESCRIPTOR_HPP
-
-#include <mesh/RefId.hpp>
-
-#include <memory>
-
-class IBoundaryDescriptor
-{
- public:
-  enum class Type
-  {
-    named,
-    numbered
-  };
-
- protected:
-  virtual std::ostream& _write(std::ostream& os) const = 0;
-
- public:
-  friend std::ostream&
-  operator<<(std::ostream& os, const IBoundaryDescriptor& bd)
-  {
-    return bd._write(os);
-  }
-
-  virtual bool operator==(const RefId& ref_id) const = 0;
-  friend bool
-  operator==(const RefId& ref_id, const IBoundaryDescriptor& bcd)
-  {
-    return bcd == ref_id;
-  }
-  virtual Type type() const = 0;
-
-  IBoundaryDescriptor(const IBoundaryDescriptor&) = delete;
-  IBoundaryDescriptor(IBoundaryDescriptor&&)      = delete;
-  IBoundaryDescriptor()                           = default;
-
-  virtual ~IBoundaryDescriptor() = default;
-};
-
-class NamedBoundaryDescriptor : public IBoundaryDescriptor
-{
- private:
-  std::string m_name;
-
-  std::ostream&
-  _write(std::ostream& os) const final
-  {
-    os << '"' << m_name << '"';
-    return os;
-  }
-
- public:
-  bool
-  operator==(const RefId& ref_id) const final
-  {
-    return m_name == ref_id.tagName();
-  }
-
-  Type
-  type() const final
-  {
-    return Type::named;
-  }
-
-  NamedBoundaryDescriptor(const NamedBoundaryDescriptor&) = delete;
-  NamedBoundaryDescriptor(NamedBoundaryDescriptor&&)      = delete;
-  NamedBoundaryDescriptor(const std::string& name) : m_name(name)
-  {
-    ;
-  }
-  virtual ~NamedBoundaryDescriptor() = default;
-};
-
-class NumberedBoundaryDescriptor : public IBoundaryDescriptor
-{
- private:
-  unsigned int m_number;
-
-  std::ostream&
-  _write(std::ostream& os) const final
-  {
-    os << '"' << m_number << '"';
-    return os;
-  }
-
-  bool
-  operator==(const RefId& ref_id) const final
-  {
-    return m_number == ref_id.tagNumber();
-  }
-
- public:
-  Type
-  type() const final
-  {
-    return Type::numbered;
-  }
-
-  NumberedBoundaryDescriptor(const NumberedBoundaryDescriptor&) = delete;
-  NumberedBoundaryDescriptor(NumberedBoundaryDescriptor&&)      = delete;
-  NumberedBoundaryDescriptor(unsigned int number) : m_number(number)
-  {
-    ;
-  }
-  virtual ~NumberedBoundaryDescriptor() = default;
-};
-
-class BoundaryConditionDescriptor
-{
- public:
-  enum class Type
-  {
-    symmetry
-  };
-
- protected:
-  std::shared_ptr<IBoundaryDescriptor> m_boundary_descriptor;
-
-  virtual std::ostream& _write(std::ostream& os) const = 0;
-
- public:
-  friend std::ostream&
-  operator<<(std::ostream& os, const BoundaryConditionDescriptor& bcd)
-  {
-    return bcd._write(os);
-  }
-
-  virtual Type type() const = 0;
-
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const
-  {
-    return *m_boundary_descriptor;
-  }
-
-  BoundaryConditionDescriptor(std::shared_ptr<IBoundaryDescriptor> boundary_descriptor)
-    : m_boundary_descriptor(boundary_descriptor)
-  {
-    ;
-  }
-
-  BoundaryConditionDescriptor(const BoundaryConditionDescriptor&) = delete;
-  BoundaryConditionDescriptor(BoundaryConditionDescriptor&&)      = delete;
-
-  virtual ~BoundaryConditionDescriptor() = default;
-};
-
-class SymmetryBoundaryConditionDescriptor : public BoundaryConditionDescriptor
-{
- private:
-  std::ostream&
-  _write(std::ostream& os) const final
-  {
-    os << "symmetry(" << *m_boundary_descriptor << ")";
-    return os;
-  }
-
- public:
-  Type
-  type() const final
-  {
-    return Type::symmetry;
-  }
-
-  SymmetryBoundaryConditionDescriptor(std::shared_ptr<IBoundaryDescriptor> boundary_descriptor)
-    : BoundaryConditionDescriptor(boundary_descriptor)
-  {
-    ;
-  }
-
-  SymmetryBoundaryConditionDescriptor(const SymmetryBoundaryConditionDescriptor&) = delete;
-  SymmetryBoundaryConditionDescriptor(SymmetryBoundaryConditionDescriptor&&)      = delete;
-
-  ~SymmetryBoundaryConditionDescriptor() = default;
-};
-
-#endif   // BOUNDARY_CONDITION_DESCRIPTOR_HPP
diff --git a/src/scheme/IBoundaryConditionDescriptor.hpp b/src/scheme/IBoundaryConditionDescriptor.hpp
new file mode 100644
index 000000000..0814c9e85
--- /dev/null
+++ b/src/scheme/IBoundaryConditionDescriptor.hpp
@@ -0,0 +1,33 @@
+#ifndef I_BOUNDARY_CONDITION_DESCRIPTOR_HPP
+#define I_BOUNDARY_CONDITION_DESCRIPTOR_HPP
+
+#include <iostream>
+
+class IBoundaryConditionDescriptor
+{
+ public:
+  enum class Type
+  {
+    symmetry
+  };
+
+ protected:
+  virtual std::ostream& _write(std::ostream& os) const = 0;
+
+ public:
+  friend std::ostream&
+  operator<<(std::ostream& os, const IBoundaryConditionDescriptor& bcd)
+  {
+    return bcd._write(os);
+  }
+
+  virtual Type type() const = 0;
+
+  IBoundaryConditionDescriptor()                                    = default;
+  IBoundaryConditionDescriptor(const IBoundaryConditionDescriptor&) = delete;
+  IBoundaryConditionDescriptor(IBoundaryConditionDescriptor&&)      = delete;
+
+  virtual ~IBoundaryConditionDescriptor() = default;
+};
+
+#endif   // I_BOUNDARY_CONDITION_DESCRIPTOR_HPP
diff --git a/src/scheme/IBoundaryDescriptor.hpp b/src/scheme/IBoundaryDescriptor.hpp
new file mode 100644
index 000000000..4e016c35b
--- /dev/null
+++ b/src/scheme/IBoundaryDescriptor.hpp
@@ -0,0 +1,41 @@
+#ifndef I_BOUNDARY_DESCRIPTOR_HPP
+#define I_BOUNDARY_DESCRIPTOR_HPP
+
+#include <mesh/RefId.hpp>
+
+#include <iostream>
+
+class IBoundaryDescriptor
+{
+ public:
+  enum class Type
+  {
+    named,
+    numbered
+  };
+
+ protected:
+  virtual std::ostream& _write(std::ostream& os) const = 0;
+
+ public:
+  friend std::ostream&
+  operator<<(std::ostream& os, const IBoundaryDescriptor& bd)
+  {
+    return bd._write(os);
+  }
+
+  virtual bool operator==(const RefId& ref_id) const = 0;
+  friend bool
+  operator==(const RefId& ref_id, const IBoundaryDescriptor& bcd)
+  {
+    return bcd == ref_id;
+  }
+  virtual Type type() const = 0;
+
+  IBoundaryDescriptor(const IBoundaryDescriptor&) = delete;
+  IBoundaryDescriptor(IBoundaryDescriptor&&)      = delete;
+  IBoundaryDescriptor()                           = default;
+
+  virtual ~IBoundaryDescriptor() = default;
+};
+#endif   // I_BOUNDARY_DESCRIPTOR_HPP
diff --git a/src/scheme/NamedBoundaryDescriptor.hpp b/src/scheme/NamedBoundaryDescriptor.hpp
new file mode 100644
index 000000000..db88ee4a0
--- /dev/null
+++ b/src/scheme/NamedBoundaryDescriptor.hpp
@@ -0,0 +1,43 @@
+#ifndef NAMED_BOUNDARY_DESCRIPTOR_HPP
+#define NAMED_BOUNDARY_DESCRIPTOR_HPP
+
+#include <scheme/IBoundaryDescriptor.hpp>
+
+#include <iostream>
+#include <string>
+
+class NamedBoundaryDescriptor : public IBoundaryDescriptor
+{
+ private:
+  std::string m_name;
+
+  std::ostream&
+  _write(std::ostream& os) const final
+  {
+    os << '"' << m_name << '"';
+    return os;
+  }
+
+ public:
+  bool
+  operator==(const RefId& ref_id) const final
+  {
+    return m_name == ref_id.tagName();
+  }
+
+  Type
+  type() const final
+  {
+    return Type::named;
+  }
+
+  NamedBoundaryDescriptor(const NamedBoundaryDescriptor&) = delete;
+  NamedBoundaryDescriptor(NamedBoundaryDescriptor&&)      = delete;
+  NamedBoundaryDescriptor(const std::string& name) : m_name(name)
+  {
+    ;
+  }
+  virtual ~NamedBoundaryDescriptor() = default;
+};
+
+#endif   // NAMED_BOUNDARY_DESCRIPTOR_HPP
diff --git a/src/scheme/NumberedBoundaryDescriptor.hpp b/src/scheme/NumberedBoundaryDescriptor.hpp
new file mode 100644
index 000000000..4ed9a2628
--- /dev/null
+++ b/src/scheme/NumberedBoundaryDescriptor.hpp
@@ -0,0 +1,42 @@
+#ifndef NUMBERED_BOUNDARY_DESCRIPTOR_HPP
+#define NUMBERED_BOUNDARY_DESCRIPTOR_HPP
+
+#include <scheme/IBoundaryDescriptor.hpp>
+
+#include <iostream>
+
+class NumberedBoundaryDescriptor : public IBoundaryDescriptor
+{
+ private:
+  unsigned int m_number;
+
+  std::ostream&
+  _write(std::ostream& os) const final
+  {
+    os << '"' << m_number << '"';
+    return os;
+  }
+
+  bool
+  operator==(const RefId& ref_id) const final
+  {
+    return m_number == ref_id.tagNumber();
+  }
+
+ public:
+  Type
+  type() const final
+  {
+    return Type::numbered;
+  }
+
+  NumberedBoundaryDescriptor(const NumberedBoundaryDescriptor&) = delete;
+  NumberedBoundaryDescriptor(NumberedBoundaryDescriptor&&)      = delete;
+  NumberedBoundaryDescriptor(unsigned int number) : m_number(number)
+  {
+    ;
+  }
+  virtual ~NumberedBoundaryDescriptor() = default;
+};
+
+#endif   // NUMBERED_BOUNDARY_DESCRIPTOR_HPP
diff --git a/src/scheme/SymmetryBoundaryConditionDescriptor.hpp b/src/scheme/SymmetryBoundaryConditionDescriptor.hpp
new file mode 100644
index 000000000..cdb35a4f4
--- /dev/null
+++ b/src/scheme/SymmetryBoundaryConditionDescriptor.hpp
@@ -0,0 +1,46 @@
+#ifndef SYMMETRY_BOUNDARY_CONDITION_DESCRIPTOR_HPP
+#define SYMMETRY_BOUNDARY_CONDITION_DESCRIPTOR_HPP
+
+#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/IBoundaryDescriptor.hpp>
+
+#include <memory>
+
+class SymmetryBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+{
+ private:
+  std::ostream&
+  _write(std::ostream& os) const final
+  {
+    os << "symmetry(" << *m_boundary_descriptor << ")";
+    return os;
+  }
+
+  std::shared_ptr<IBoundaryDescriptor> m_boundary_descriptor;
+
+ public:
+  const IBoundaryDescriptor&
+  boundaryDescriptor() const
+  {
+    return *m_boundary_descriptor;
+  }
+
+  Type
+  type() const final
+  {
+    return Type::symmetry;
+  }
+
+  SymmetryBoundaryConditionDescriptor(std::shared_ptr<IBoundaryDescriptor> boundary_descriptor)
+    : m_boundary_descriptor(boundary_descriptor)
+  {
+    ;
+  }
+
+  SymmetryBoundaryConditionDescriptor(const SymmetryBoundaryConditionDescriptor&) = delete;
+  SymmetryBoundaryConditionDescriptor(SymmetryBoundaryConditionDescriptor&&)      = delete;
+
+  ~SymmetryBoundaryConditionDescriptor() = default;
+};
+
+#endif   // SYMMETRY_BOUNDARY_CONDITION_DESCRIPTOR_HPP
-- 
GitLab