diff --git a/src/main.cpp b/src/main.cpp index 7f0a9af86cc0402068a3ed8b9d5ee9e54a8168e6..dbf5164af581d42dbf88200a09b55900fca5fc3d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -129,9 +129,10 @@ int main(int argc, char *argv[]) std::vector<BoundaryConditionHandler> bc_list; { // quite dirty! - SymmetryBoundaryCondition* sym_bc0 - = new SymmetryBoundaryCondition(std::vector<unsigned int>({0u})); - std::shared_ptr<SymmetryBoundaryCondition> bc0(sym_bc0); + SymmetryBoundaryCondition<MeshType::dimension>* sym_bc0 + = new SymmetryBoundaryCondition<MeshType::dimension>(std::vector<unsigned int>({0u}), + TinyVector<1>(-1)); + std::shared_ptr<SymmetryBoundaryCondition<1>> bc0(sym_bc0); bc_list.push_back(BoundaryConditionHandler(bc0)); PressureBoundaryCondition* pres_bc1 diff --git a/src/scheme/AcousticSolver.hpp b/src/scheme/AcousticSolver.hpp index 39ecc8b7503642fb053a7fe4773ede78b69ff3f8..0268118e4f033bf263545a6bb1c5b48d225cf2ff 100644 --- a/src/scheme/AcousticSolver.hpp +++ b/src/scheme/AcousticSolver.hpp @@ -174,29 +174,20 @@ private: break; } 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(); - const Kokkos::View<const unsigned short**> face_cell_local_face - = m_connectivity.faceCellLocalFace(); - const Kokkos::View<const Rd**> njr - = m_mesh_data.njr(); + const SymmetryBoundaryCondition<dimension>& symmetry_bc + = dynamic_cast<const SymmetryBoundaryCondition<dimension>&>(handler.boundaryCondition()); - 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 = 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); + const Rd& n = symmetry_bc.outgoingNormal(); + const Rdd I = identity; + const Rdd nxn = tensorProduct(n,n); + const Rdd P = I-nxn; - const Rd& n = njr(j,L); - const Rdd nxn = tensorProduct(n,n); - const Rdd P = I-nxn; + Kokkos::parallel_for(symmetry_bc.numberOfNodes(), KOKKOS_LAMBDA(const int& r_number) { + const int r = symmetry_bc.nodeList()[r_number]; + assert(m_connectivity.nodeNbCells() == 1); - m_Ar(l) = P*m_Ar(l)*P + nxn; - m_br(l) = P*m_br(l); + m_Ar(r) = P*m_Ar(r)*P + nxn; + m_br(r) = P*m_br(r); }); break; } diff --git a/src/scheme/BoundaryCondition.hpp b/src/scheme/BoundaryCondition.hpp index 80a7ea0fc95a43fcdb61736a201c53f591cb7d50..83f5fb3443571d293cf34fc77e55dc857eb8efb5 100644 --- a/src/scheme/BoundaryCondition.hpp +++ b/src/scheme/BoundaryCondition.hpp @@ -72,31 +72,39 @@ public: ~PressureBoundaryCondition() = default; }; +template <size_t dimension> class SymmetryBoundaryCondition : public BoundaryCondition { -private: - const size_t m_number_of_faces; - Kokkos::View<unsigned int*> m_face_list; +public: + typedef TinyVector<dimension, double> Rd; +private: + Kokkos::View<unsigned int*> m_node_list; + const Rd m_outgoing_normal; public: - const size_t& numberOfFaces() const + const Rd& outgoingNormal() const { - return m_number_of_faces; + return m_outgoing_normal; + } + size_t numberOfNodes() const + { + return m_node_list.size(); } - const Kokkos::View<const unsigned int*> faceList() const + const Kokkos::View<const unsigned int*> nodeList() const { - return m_face_list; + return m_node_list; } - SymmetryBoundaryCondition(const std::vector<unsigned int>& faces) + SymmetryBoundaryCondition(const std::vector<unsigned int>& nodes, + const Rd& outgoing_normal) : BoundaryCondition(BoundaryCondition::symmetry), - m_number_of_faces(faces.size()), - m_face_list("faces_list", m_number_of_faces) + m_node_list("node_list", nodes.size()), + m_outgoing_normal(outgoing_normal) { - Kokkos::parallel_for(m_number_of_faces, KOKKOS_LAMBDA(const int& f){ - m_face_list[f]=faces[f]; + Kokkos::parallel_for(m_node_list.size(), KOKKOS_LAMBDA(const int& f){ + m_node_list[f]=nodes[f]; }); }