diff --git a/experimental/AcousticSolverWithMesh.hpp b/experimental/AcousticSolverWithMesh.hpp index d17a54e402bae2c4ecbc359182e7875ccd8400f9..4755e8f0c3002035372d312a7861f98cdf7f1244 100644 --- a/experimental/AcousticSolverWithMesh.hpp +++ b/experimental/AcousticSolverWithMesh.hpp @@ -72,11 +72,14 @@ private: } KOKKOS_INLINE_FUNCTION - const Kokkos::View<const Rdd*[2]> + const Kokkos::View<const Rdd**> computeAjr(const Kokkos::View<const double*>& rhocj, - const Kokkos::View<const Rd*[2]>& Cjr) { + const Kokkos::View<const Rd**>& Cjr) { + const Kokkos::View<const unsigned short*> cell_nb_nodes + = m_connectivity.cellNbNodes(); + Kokkos::parallel_for(m_nj, KOKKOS_LAMBDA(const int& j) { - for (int r=0; r<2; ++r) { + for (int r=0; r<cell_nb_nodes[j]; ++r) { m_Ajr(j,r) = tensorProduct(rhocj(j)*Cjr(j,r), Cjr(j,r)); } }); @@ -86,9 +89,9 @@ private: KOKKOS_INLINE_FUNCTION const Kokkos::View<const Rdd*> - computeAr(const Kokkos::View<const Rdd*[2]>& Ajr) { - const Kokkos::View<const unsigned int*[2]> node_cells = m_connectivity.nodeCells(); - const Kokkos::View<const unsigned short*[2]> node_cell_local_node = m_connectivity.nodeCellLocalNode(); + computeAr(const Kokkos::View<const Rdd**>& Ajr) { + const Kokkos::View<const unsigned int**> node_cells = m_connectivity.nodeCells(); + const Kokkos::View<const unsigned short**> node_cell_local_node = m_connectivity.nodeCellLocalNode(); const Kokkos::View<const unsigned short*> node_nb_cells = m_connectivity.nodeNbCells(); Kokkos::parallel_for(m_nr, KOKKOS_LAMBDA(const int& r) { @@ -106,12 +109,12 @@ private: KOKKOS_INLINE_FUNCTION const Kokkos::View<const Rd*> - computeBr(const Kokkos::View<const Rdd*[2]>& Ajr, - const Kokkos::View<const Rd*[2]>& Cjr, + computeBr(const Kokkos::View<const Rdd**>& Ajr, + const Kokkos::View<const Rd**>& Cjr, const Kokkos::View<const Rd*>& uj, const Kokkos::View<const double*>& pj) { - const Kokkos::View<const unsigned int*[2]>& node_cells = m_connectivity.nodeCells(); - const Kokkos::View<const unsigned short*[2]>& node_cell_local_node = m_connectivity.nodeCellLocalNode(); + const Kokkos::View<const unsigned int**>& node_cells = m_connectivity.nodeCells(); + const Kokkos::View<const unsigned short**>& node_cell_local_node = m_connectivity.nodeCellLocalNode(); const Kokkos::View<const unsigned short*>& node_nb_cells = m_connectivity.nodeNbCells(); Kokkos::parallel_for(m_nr, KOKKOS_LAMBDA(const int& r) { @@ -141,15 +144,18 @@ private: return m_ur; } - Kokkos::View<Rd*[2]> - computeFjr(const Kokkos::View<const Rdd*[2]>& Ajr, + Kokkos::View<Rd**> + computeFjr(const Kokkos::View<const Rdd**>& Ajr, const Kokkos::View<const Rd*>& ur, - const Kokkos::View<const Rd*[2]>& Cjr, + const Kokkos::View<const Rd**>& Cjr, const Kokkos::View<const Rd*>& uj, const Kokkos::View<const double*>& pj) { - const Kokkos::View<const unsigned int*[2]>& cell_nodes = m_connectivity.cellNodes(); + const Kokkos::View<const unsigned int**>& cell_nodes = m_connectivity.cellNodes(); + const Kokkos::View<const unsigned short*> cell_nb_nodes + = m_connectivity.cellNbNodes(); + Kokkos::parallel_for(m_nj, KOKKOS_LAMBDA(const int& j) { - for (int r=0; r<2; ++r) { + for (int r=0; r<cell_nb_nodes[j]; ++r) { m_Fjr(j,r) = Ajr(j,r)*(uj(j)-ur(cell_nodes(j,r)))+pj(j)*Cjr(j,r); } }); @@ -192,15 +198,15 @@ private: const Kokkos::View<const double*>& pj, const Kokkos::View<const double*>& cj, const Kokkos::View<const double*>& Vj, - const Kokkos::View<const Rd*[2]>& Cjr, - Kokkos::View<Rd*>& ur, - Kokkos::View<Rd*[2]>& Fjr) { + const Kokkos::View<const Rd**>& Cjr) { const Kokkos::View<const double*> rhocj = computeRhoCj(rhoj, cj); - const Kokkos::View<const Rdd*[2]> Ajr = computeAjr(rhocj, Cjr); + const Kokkos::View<const Rdd**> Ajr = computeAjr(rhocj, Cjr); const Kokkos::View<const Rdd*> Ar = computeAr(Ajr); const Kokkos::View<const Rd*> br = computeBr(Ajr, Cjr, uj, pj); + Kokkos::View<Rd*> ur = m_ur; + Kokkos::View<Rd**> Fjr = m_Fjr; ur = computeUr(Ar, br); Fjr = computeFjr(Ajr, ur, Cjr, uj, pj); } @@ -209,10 +215,10 @@ private: const size_t m_nr; Kokkos::View<Rd*> m_br; - Kokkos::View<Rdd*[2]> m_Ajr; + Kokkos::View<Rdd**> m_Ajr; Kokkos::View<Rdd*> m_Ar; Kokkos::View<Rdd*> m_inv_Ar; - Kokkos::View<Rd*[2]> m_Fjr; + Kokkos::View<Rd**> m_Fjr; Kokkos::View<Rd*> m_ur; Kokkos::View<double*> m_rhocj; Kokkos::View<double*> m_Vj_over_cj; @@ -225,10 +231,10 @@ public: m_nj(mesh.numberOfCells()), m_nr(mesh.numberOfNodes()), m_br("br", m_nr), - m_Ajr("Ajr", m_nj), + m_Ajr("Ajr", m_nj, m_connectivity.maxNbNodePerCell()), m_Ar("Ar", m_nr), m_inv_Ar("inv_Ar", m_nr), - m_Fjr("Fjr", m_nj), + m_Fjr("Fjr", m_nj, m_connectivity.maxNbNodePerCell()), m_ur("ur", m_nr), m_rhocj("rho_c", m_nj), m_Vj_over_cj("Vj_over_cj", m_nj) @@ -248,7 +254,7 @@ public: Kokkos::View<Rd*> xr = mesh.xr(); - const Kokkos::View<const unsigned int*[2]>& cell_nodes = m_connectivity.cellNodes(); + const Kokkos::View<const unsigned int**>& cell_nodes = m_connectivity.cellNodes(); Kokkos::parallel_for(m_nj, KOKKOS_LAMBDA(const int& j){ xj[j] = 0.5*(xr[cell_nodes(j,0)]+xr[cell_nodes(j,1)]); }); @@ -318,16 +324,17 @@ public: t=tmax; } - computeExplicitFluxes(xr, xj, rhoj, uj, pj, cj, Vj, Cjr, - m_ur, m_Fjr); + computeExplicitFluxes(xr, xj, rhoj, uj, pj, cj, Vj, Cjr); - const Kokkos::View<const Rd*[2]> Fjr = m_Fjr; + const Kokkos::View<const Rd**> Fjr = m_Fjr; const Kokkos::View<const Rd*> ur = m_ur; + const Kokkos::View<const unsigned short*> cell_nb_nodes + = m_connectivity.cellNbNodes(); Kokkos::parallel_for(m_nj, KOKKOS_LAMBDA(const int& j) { Rd momentum_fluxes = zero; double energy_fluxes = 0; - for (int R=0; R<2; ++R) { + for (int R=0; R<cell_nb_nodes[j]; ++R) { const int r=cell_nodes(j,R); momentum_fluxes += Fjr(j,R); energy_fluxes += (Fjr(j,R), ur[r]); diff --git a/experimental/Connectivity1D.hpp b/experimental/Connectivity1D.hpp index 952b7d9a2f6b7e3540eb7fb8635e71fd6d51a10d..6431faae7e538366ef3063058b1c6da849ec9fbc 100644 --- a/experimental/Connectivity1D.hpp +++ b/experimental/Connectivity1D.hpp @@ -17,6 +17,9 @@ private: Kokkos::View<unsigned int*[2]> m_cell_nodes; const Kokkos::View<unsigned int*[2]>& m_cell_faces; + Kokkos::View<unsigned short*> m_cell_nb_nodes; + const Kokkos::View<unsigned short*> m_cell_nb_faces; + Kokkos::View<unsigned short*> m_node_nb_cells; const Kokkos::View<unsigned short*>& m_face_nb_cells; @@ -26,6 +29,8 @@ private: Kokkos::View<unsigned short*[2]> m_node_cell_local_node; const Kokkos::View<unsigned short*[2]>& m_face_cell_local_face; + const size_t m_max_nb_node_per_cell; + public: const size_t& numberOfNodes() const { @@ -42,12 +47,17 @@ public: return m_number_of_cells; } - const Kokkos::View<const unsigned int*[2]> cellNodes() const + const size_t& maxNbNodePerCell() const + { + return m_max_nb_node_per_cell; + } + + const Kokkos::View<const unsigned int**> cellNodes() const { return m_cell_nodes; } - const Kokkos::View<const unsigned int*[2]> cellFaces() const + const Kokkos::View<const unsigned int**> cellFaces() const { return m_cell_faces; } @@ -57,27 +67,37 @@ public: return m_node_nb_cells; } + const Kokkos::View<const unsigned short*> cellNbNodes() const + { + return m_cell_nb_nodes; + } + + const Kokkos::View<const unsigned short*> cellNbFaces() const + { + return m_cell_nb_faces; + } + const Kokkos::View<const unsigned short*> faceNbCells() const { return m_face_nb_cells; } - const Kokkos::View<const unsigned int*[2]> nodeCells() const + const Kokkos::View<const unsigned int**> nodeCells() const { return m_node_cells; } - const Kokkos::View<const unsigned int*[2]> faceCells() const + const Kokkos::View<const unsigned int**> faceCells() const { return m_face_cells; } - const Kokkos::View<const unsigned short*[2]> nodeCellLocalNode() const + const Kokkos::View<const unsigned short**> nodeCellLocalNode() const { return m_node_cell_local_node; } - const Kokkos::View<const unsigned short*[2]> faceCellLocalFace() const + const Kokkos::View<const unsigned short**> faceCellLocalFace() const { return m_face_cell_local_face; } @@ -90,18 +110,26 @@ public: m_number_of_nodes (number_of_cells+1), m_cell_nodes ("cell_nodes", m_number_of_cells), m_cell_faces (m_cell_nodes), + m_cell_nb_nodes ("cell_nb_nodes", m_number_of_cells), + m_cell_nb_faces (m_cell_nb_nodes), m_node_nb_cells ("node_nb_cells",m_number_of_nodes), m_face_nb_cells (m_node_nb_cells), m_node_cells ("node_cells", m_number_of_nodes), m_face_cells (m_node_cells), m_node_cell_local_node ("node_cell_local_node", m_number_of_nodes), - m_face_cell_local_face (m_node_cell_local_node) + m_face_cell_local_face (m_node_cell_local_node), + m_max_nb_node_per_cell (2) { assert(number_of_cells>0); Kokkos::parallel_for(m_number_of_cells, KOKKOS_LAMBDA(const size_t& j) { - m_cell_nodes(j,0)=j; - m_cell_nodes(j,1)=j+1; + m_cell_nb_nodes[j] = 2; + }); + + Kokkos::parallel_for(m_number_of_cells, KOKKOS_LAMBDA(const size_t& j) { + for (int R=0; R<2; ++R) { + m_cell_nodes(j,R)=j+R; + } }); Kokkos::parallel_for(m_number_of_nodes, KOKKOS_LAMBDA(const size_t& r) {