From fd010b49bfa94594146e6403f1f48b6a8f1a9708 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 23 Apr 2018 18:55:25 +0200
Subject: [PATCH] Begining of BC cleaning. "The path is straight, but the slope
 is strong!"

---
 src/main.cpp                          |  24 ++---
 src/scheme/AcousticSolver.hpp         |  34 ++++---
 src/scheme/BoundaryCondition.hpp      | 135 ++++++++++++++++++++++++++
 src/scheme/FacesBoundaryCondition.hpp |  60 ------------
 4 files changed, 167 insertions(+), 86 deletions(-)
 create mode 100644 src/scheme/BoundaryCondition.hpp
 delete mode 100644 src/scheme/FacesBoundaryCondition.hpp

diff --git a/src/main.cpp b/src/main.cpp
index a87619a5d..7f0a9af86 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -13,7 +13,7 @@
 
 #include <Connectivity1D.hpp>
 #include <Mesh.hpp>
-#include <FacesBoundaryCondition.hpp>
+#include <BoundaryCondition.hpp>
 #include <AcousticSolver.hpp>
 
 #include <TinyVector.hpp>
@@ -127,23 +127,25 @@ int main(int argc, char *argv[])
     MeshType mesh(connectivity);
     MeshDataType mesh_data(mesh);
 
-    std::vector<FacesBoundaryCondition> faces_bc_list;
+    std::vector<BoundaryConditionHandler> bc_list;
     { // quite dirty!
-      FacesBoundaryCondition bc0(FacesBoundaryCondition::symmetry, 0,
-			       std::vector<unsigned int>({0u}));
-      faces_bc_list.push_back(bc0);
-      // FacesBoundaryCondition bc1(FacesBoundaryCondition::symmetry, 0,
-      // 				 std::vector<unsigned int>({static_cast<unsigned int>(mesh.numberOfCells())}));
-      FacesBoundaryCondition bc1(FacesBoundaryCondition::pressure, 0.125,
-				 std::vector<unsigned int>({static_cast<unsigned int>(mesh.numberOfCells())}));
-      faces_bc_list.push_back(bc1);
+      SymmetryBoundaryCondition* sym_bc0
+	= new SymmetryBoundaryCondition(std::vector<unsigned int>({0u}));
+      std::shared_ptr<SymmetryBoundaryCondition> bc0(sym_bc0);
+      bc_list.push_back(BoundaryConditionHandler(bc0));
+
+      PressureBoundaryCondition* pres_bc1
+	= new PressureBoundaryCondition(0.1,
+					std::vector<unsigned int>({static_cast<unsigned int>(mesh.numberOfCells())}));
+      std::shared_ptr<PressureBoundaryCondition> bc1(pres_bc1);
+      bc_list.push_back(BoundaryConditionHandler(bc1));
     }
 
     UnknownsType unknowns(mesh_data);
 
     unknowns.initializeSod();
 
-    AcousticSolver<MeshDataType> acoustic_solver(mesh_data, unknowns, faces_bc_list);
+    AcousticSolver<MeshDataType> acoustic_solver(mesh_data, unknowns, bc_list);
 
     typedef TinyVector<MeshType::dimension> Rd;
 
diff --git a/src/scheme/AcousticSolver.hpp b/src/scheme/AcousticSolver.hpp
index 362352eb5..39ecc8b75 100644
--- a/src/scheme/AcousticSolver.hpp
+++ b/src/scheme/AcousticSolver.hpp
@@ -11,7 +11,7 @@
 #include <Mesh.hpp>
 #include <MeshData.hpp>
 #include <FiniteVolumesEulerUnknowns.hpp>
-#include <FacesBoundaryCondition.hpp>
+#include <BoundaryCondition.hpp>
 
 template<typename MeshData>
 class AcousticSolver
@@ -22,7 +22,7 @@ class AcousticSolver
   MeshData& m_mesh_data;
   const MeshType& m_mesh;
   const typename MeshType::Connectivity& m_connectivity;
-  const std::vector<FacesBoundaryCondition>& m_faces_boundary_condition_list;
+  const std::vector<BoundaryConditionHandler>& m_boundary_condition_list;
 
   constexpr static size_t dimension = MeshType::dimension;
 
@@ -140,19 +140,21 @@ private:
 
   void applyBoundaryConditions()
   {
-    for (const auto& face_bc : m_faces_boundary_condition_list) {
-      switch (face_bc.type()) {
-      case FacesBoundaryCondition::normal_velocity: {
+    for (const auto& handler : m_boundary_condition_list) {
+      switch (handler.boundaryCondition().type()) {
+      case BoundaryCondition::normal_velocity: {
 	std::cerr << "normal_velocity NIY\n";
 	std::exit(0);
 	break;
       }
-      case FacesBoundaryCondition::velocity: {
+      case BoundaryCondition::velocity: {
 	std::cerr << "velocity NIY\n";
 	std::exit(0);
 	break;
       }
-      case FacesBoundaryCondition::pressure: {
+      case BoundaryCondition::pressure: {
+	const PressureBoundaryCondition& pressure_bc
+	  = dynamic_cast<const PressureBoundaryCondition&>(handler.boundaryCondition());
 	const Kokkos::View<const unsigned int**> face_cells
 	  = m_connectivity.faceCells();
 	const Kokkos::View<const unsigned short**> face_cell_local_face
@@ -160,18 +162,20 @@ private:
 	const Kokkos::View<const Rd**> Cjr
 	  = m_mesh_data.Cjr();
 
-	Kokkos::parallel_for(face_bc.numberOfFaces(), KOKKOS_LAMBDA(const int& l_number) {
+	Kokkos::parallel_for(pressure_bc.numberOfFaces(), KOKKOS_LAMBDA(const int& l_number) {
 	    // quite ugly: node/faces are melt in a bad way... at least works in 1d...
-	    const int l = face_bc.faceList()[l_number];
+	    const int l = pressure_bc.faceList()[l_number];
 	    assert(m_connectivity.faceNbCells() == 1);
 	    const unsigned int j = face_cells(l,0);
 	    const unsigned int L = face_cell_local_face(l,0);
 
-	    m_br(l) -= face_bc.value()*Cjr(j,L);
+	    m_br(l) -= pressure_bc.value()*Cjr(j,L);
 	  });
 	break;
       }
-      case FacesBoundaryCondition::symmetry: {
+      case BoundaryCondition::symmetry: {
+	const SymmetryBoundaryCondition& symmetry_bc
+	  = dynamic_cast<const SymmetryBoundaryCondition&>(handler.boundaryCondition());
 	const Rdd I = identity;
 	const Kokkos::View<const unsigned int**> face_cells
 	  = m_connectivity.faceCells();
@@ -180,9 +184,9 @@ private:
 	const Kokkos::View<const Rd**> njr
 	  = m_mesh_data.njr();
 
-	Kokkos::parallel_for(face_bc.numberOfFaces(), KOKKOS_LAMBDA(const int& l_number) {
+	Kokkos::parallel_for(symmetry_bc.numberOfFaces(), KOKKOS_LAMBDA(const int& l_number) {
 	    // quite ugly: node/faces are melt in a bad way... at least works in 1d...
-	    const int l = face_bc.faceList()[l_number];
+	    const int l = symmetry_bc.faceList()[l_number];
 	    assert(m_connectivity.faceNbCells() == 1);
 	    const unsigned int j = face_cells(l,0);
 	    const unsigned int L = face_cell_local_face(l,0);
@@ -282,11 +286,11 @@ private:
 public:
   AcousticSolver(MeshData& mesh_data,
 		 UnknownsType& unknowns,
-		 const std::vector<FacesBoundaryCondition>& faces_bc_list)
+		 const std::vector<BoundaryConditionHandler>& bc_list)
     : m_mesh_data(mesh_data),
       m_mesh(mesh_data.mesh()),
       m_connectivity(m_mesh.connectivity()),
-      m_faces_boundary_condition_list(faces_bc_list),
+      m_boundary_condition_list(bc_list),
       m_br("br", m_mesh.numberOfNodes()),
       m_Ajr("Ajr", m_mesh.numberOfCells(), m_connectivity.maxNbNodePerCell()),
       m_Ar("Ar", m_mesh.numberOfNodes()),
diff --git a/src/scheme/BoundaryCondition.hpp b/src/scheme/BoundaryCondition.hpp
new file mode 100644
index 000000000..80a7ea0fc
--- /dev/null
+++ b/src/scheme/BoundaryCondition.hpp
@@ -0,0 +1,135 @@
+#ifndef BOUNDARY_CONDITION_HANDLER_HPP
+#define BOUNDARY_CONDITION_HANDLER_HPP
+
+#include <vector>
+#include <memory>
+
+class BoundaryCondition
+{
+public:
+  enum Type {
+    velocity,
+    normal_velocity,
+    pressure,
+    symmetry
+  };
+
+  const Type m_type;
+protected:
+
+  BoundaryCondition(const Type& type)
+    : m_type(type)
+  {
+    ;
+  }
+
+public:
+  const Type& type() const
+  {
+    return m_type;
+  }
+
+  virtual ~BoundaryCondition() = default;
+};
+
+class PressureBoundaryCondition
+  : public BoundaryCondition
+{
+private:
+  const double m_value;
+
+  const size_t m_number_of_faces;
+  Kokkos::View<unsigned int*> m_face_list;
+
+public:
+  double value() const
+  {
+    return m_value;
+  }
+
+  const size_t& numberOfFaces() const
+  {
+    return m_number_of_faces;
+  }
+
+  const Kokkos::View<const unsigned int*> faceList() const
+  {
+    return m_face_list;
+  }
+
+  PressureBoundaryCondition(const double& value,
+			    const std::vector<unsigned int>& faces)
+    : BoundaryCondition(BoundaryCondition::pressure),
+      m_value(value),
+      m_number_of_faces(faces.size()),
+      m_face_list("faces_list", m_number_of_faces)
+  {
+    Kokkos::parallel_for(m_number_of_faces, KOKKOS_LAMBDA(const int& f){
+	m_face_list[f]=faces[f];
+      });
+  }
+
+  ~PressureBoundaryCondition() = default;
+};
+
+class SymmetryBoundaryCondition
+  : public BoundaryCondition
+{
+private:
+  const size_t m_number_of_faces;
+  Kokkos::View<unsigned int*> m_face_list;
+
+public:
+  const size_t& numberOfFaces() const
+  {
+    return m_number_of_faces;
+  }
+
+  const Kokkos::View<const unsigned int*> faceList() const
+  {
+    return m_face_list;
+  }
+
+  SymmetryBoundaryCondition(const std::vector<unsigned int>& faces)
+    : BoundaryCondition(BoundaryCondition::symmetry),
+      m_number_of_faces(faces.size()),
+      m_face_list("faces_list", m_number_of_faces)
+  {
+    Kokkos::parallel_for(m_number_of_faces, KOKKOS_LAMBDA(const int& f){
+	m_face_list[f]=faces[f];
+      });
+  }
+
+  ~SymmetryBoundaryCondition() = default;
+};
+
+class BoundaryConditionHandler
+{
+private:
+  std::shared_ptr<BoundaryCondition> m_boundary_condition;
+
+public:
+  const BoundaryCondition& boundaryCondition() const
+  {
+    return *m_boundary_condition;
+  }
+  
+  KOKKOS_INLINE_FUNCTION
+  BoundaryConditionHandler& operator=(BoundaryConditionHandler&) = default;
+
+  KOKKOS_INLINE_FUNCTION
+  BoundaryConditionHandler(const BoundaryConditionHandler&) = default;
+
+  KOKKOS_INLINE_FUNCTION
+  BoundaryConditionHandler(BoundaryConditionHandler&&) = default;
+
+  KOKKOS_INLINE_FUNCTION
+  BoundaryConditionHandler(std::shared_ptr<BoundaryCondition> boundary_condition)
+    : m_boundary_condition(boundary_condition)
+  {
+  }
+
+  ~BoundaryConditionHandler() = default;
+};
+
+#endif // BOUNDARY_CONDITION_HANDLER_HPP
diff --git a/src/scheme/FacesBoundaryCondition.hpp b/src/scheme/FacesBoundaryCondition.hpp
deleted file mode 100644
index 17186a72b..000000000
--- a/src/scheme/FacesBoundaryCondition.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef FACES_BOUNDARY_CONDITION_HPP
-#define FACES_BOUNDARY_CONDITION_HPP
-
-#include <vector>
-
-class FacesBoundaryCondition
-{
-public:
-  enum Type
-  {
-    velocity,
-    normal_velocity,
-    pressure,
-    symmetry
-  };
-
-private:
-  const Type m_type;
-  const double m_value;
-  const size_t m_number_of_faces;
-  Kokkos::View<unsigned int*> m_face_list;
-
-public:
-  const size_t& numberOfFaces() const
-  {
-    return m_number_of_faces;
-  }
-
-  const Kokkos::View<const unsigned int*> faceList() const
-  {
-    return m_face_list;
-  }
-  
-  const Type& type() const
-  {
-    return m_type;
-  }
-
-  double value() const
-  {
-    return m_value;
-  }
-
-  KOKKOS_INLINE_FUNCTION
-  FacesBoundaryCondition(const Type& type,
-			 const double& value,
-			 const std::vector<unsigned int>& faces)
-    : m_type(type),
-      m_value(value),
-      m_number_of_faces(faces.size()),
-      m_face_list("face_list", m_number_of_faces)
-  {
-    Kokkos::parallel_for(m_number_of_faces, KOKKOS_LAMBDA(const int& f){
-	m_face_list[f]=faces[f];
-      });
-  }
-  ~FacesBoundaryCondition() = default;
-};
-
-#endif // FACES_BOUNDARY_CONDITION_HPP
-- 
GitLab