From 9760dd9b7b1f045f9eb182b7c100ebd1bfd8a624 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 17 Jul 2018 18:50:20 +0200
Subject: [PATCH] Define Fjr as a NodeByCellData

---
 src/scheme/AcousticSolver.hpp | 55 ++++++++++++-----------------------
 1 file changed, 19 insertions(+), 36 deletions(-)

diff --git a/src/scheme/AcousticSolver.hpp b/src/scheme/AcousticSolver.hpp
index aed106a9b..d9c596519 100644
--- a/src/scheme/AcousticSolver.hpp
+++ b/src/scheme/AcousticSolver.hpp
@@ -81,35 +81,23 @@ private:
   }
 
   KOKKOS_INLINE_FUNCTION
-  const Kokkos::View<const Rdd**>
-  computeAjr(const Kokkos::View<const double*>& rhocj,
-             const Kokkos::View<const double**>& ljr,
-             const Kokkos::View<const Rd**>& njr)
+  void computeAjr(const Kokkos::View<const double*>& rhocj,
+                  const Kokkos::View<const double**>& ljr,
+                  const Kokkos::View<const Rd**>& njr)
   {
     const Kokkos::View<const Rd**> Cjr = m_mesh_data.Cjr();
-
-    Kokkos::parallel_for("old Ajr", m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) {
-        const auto& cell_nodes = m_mesh.connectivity().m_cell_to_node_matrix.rowConst(j);
-        const double& rho_c = rhocj(j);
-        for (size_t r=0; r<cell_nodes.length; ++r) {
-          m_Ajr(j,r) = tensorProduct(rho_c*Cjr(j,r), njr(j,r));
-        }
-      });
-
     Kokkos::parallel_for("new nested Ajr", m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) {
-        const size_t& nb_nodes =m_Ajr_new.numberOfSubValues(j);
+        const size_t& nb_nodes =m_Ajr.numberOfSubValues(j);
         const double& rho_c = rhocj(j);
         for (size_t r=0; r<nb_nodes; ++r) {
-          m_Ajr_new(j,r) = tensorProduct(rho_c*Cjr(j,r), njr(j,r));
+          m_Ajr(j,r) = tensorProduct(rho_c*Cjr(j,r), njr(j,r));
         }
       });
-
-    return m_Ajr;
   }
 
   KOKKOS_INLINE_FUNCTION
   const Kokkos::View<const Rdd*>
-  computeAr(const Kokkos::View<const Rdd**>& Ajr) {
+  computeAr(const NodeByCellData<Rdd>& Ajr) {
     Kokkos::parallel_for(m_mesh.numberOfNodes(), KOKKOS_LAMBDA(const int& r) {
         Rdd sum = zero;
         const auto& node_to_cell = m_connectivity.m_node_to_cell_matrix.rowConst(r);
@@ -127,7 +115,7 @@ private:
 
   KOKKOS_INLINE_FUNCTION
   const Kokkos::View<const Rd*>
-  computeBr(const Kokkos::View<const Rdd**>& Ajr,
+  computeBr(const NodeByCellData<Rdd>& Ajr,
             const Kokkos::View<const Rd**>& Cjr,
             const Kokkos::View<const Rd*>& uj,
             const Kokkos::View<const double*>& pj) {
@@ -178,7 +166,6 @@ private:
 
         Kokkos::parallel_for(symmetry_bc.numberOfNodes(), KOKKOS_LAMBDA(const int& r_number) {
             const int r = symmetry_bc.nodeList()[r_number];
-            // assert(m_connectivity.nodeNbCells()[r] == 1);
 
             m_Ar(r) = P*m_Ar(r)*P + nxn;
             m_br(r) = P*m_br(r);
@@ -202,8 +189,8 @@ private:
     return m_ur;
   }
 
-  Kokkos::View<Rd**>
-  computeFjr(const Kokkos::View<const Rdd**>& Ajr,
+  void
+  computeFjr(const NodeByCellData<Rdd>& Ajr,
              const Kokkos::View<const Rd*>& ur,
              const Kokkos::View<const Rd**>& Cjr,
              const Kokkos::View<const Rd*>& uj,
@@ -216,8 +203,6 @@ private:
           m_Fjr(j,r) = Ajr(j,r)*(uj(j)-ur(cell_nodes(r)))+pj(j)*Cjr(j,r);
         }
       });
-
-    return m_Fjr;
   }
 
   void inverse(const Kokkos::View<const Rdd*>& A,
@@ -240,25 +225,24 @@ private:
                              const Kokkos::View<const double**>& ljr,
                              const Kokkos::View<const Rd**>& njr) {
     const Kokkos::View<const double*> rhocj  = computeRhoCj(rhoj, cj);
-    const Kokkos::View<const Rdd**> Ajr = computeAjr(rhocj, ljr, njr);
+    // const Kokkos::View<const Rdd**> Ajr =
+    computeAjr(rhocj, ljr, njr);
 
-    const Kokkos::View<const Rdd*> Ar = computeAr(Ajr);
-    const Kokkos::View<const Rd*> br = computeBr(Ajr, Cjr, uj, pj);
+    const Kokkos::View<const Rdd*> Ar = computeAr(m_Ajr);
+    const Kokkos::View<const Rd*> br = computeBr(m_Ajr, Cjr, uj, pj);
 
     this->applyBoundaryConditions();
 
     Kokkos::View<Rd*> ur = m_ur;
-    Kokkos::View<Rd**> Fjr = m_Fjr;
     ur  = computeUr(Ar, br);
-    Fjr = computeFjr(Ajr, ur, Cjr, uj, pj);
+    computeFjr(m_Ajr, ur, Cjr, uj, pj);
   }
 
   Kokkos::View<Rd*> m_br;
-  NodeByCellData<Rdd> m_Ajr_new;
-  Kokkos::View<Rdd**> m_Ajr;
+  NodeByCellData<Rdd> m_Ajr;
   Kokkos::View<Rdd*> m_Ar;
   Kokkos::View<Rdd*> m_inv_Ar;
-  Kokkos::View<Rd**> m_Fjr;
+  NodeByCellData<Rd> m_Fjr;
   Kokkos::View<Rd*> m_ur;
   Kokkos::View<double*> m_rhocj;
   Kokkos::View<double*> m_Vj_over_cj;
@@ -272,11 +256,10 @@ public:
       m_connectivity(m_mesh.connectivity()),
       m_boundary_condition_list(bc_list),
       m_br("br", m_mesh.numberOfNodes()),
-      m_Ajr_new(m_connectivity.m_node_id_per_cell_matrix),
-      m_Ajr("Ajr", m_mesh.numberOfCells(), m_connectivity.maxNbNodePerCell()),
+      m_Ajr(m_connectivity.m_node_id_per_cell_matrix),
       m_Ar("Ar", m_mesh.numberOfNodes()),
       m_inv_Ar("inv_Ar", m_mesh.numberOfNodes()),
-      m_Fjr("Fjr", m_mesh.numberOfCells(), m_connectivity.maxNbNodePerCell()),
+      m_Fjr(m_connectivity.m_node_id_per_cell_matrix),
       m_ur("ur", m_mesh.numberOfNodes()),
       m_rhocj("rho_c", m_mesh.numberOfCells()),
       m_Vj_over_cj("Vj_over_cj", m_mesh.numberOfCells())
@@ -328,7 +311,7 @@ public:
 
     computeExplicitFluxes(xr, xj, rhoj, uj, pj, cj, Vj, Cjr, ljr, njr);
 
-    const Kokkos::View<const Rd**> Fjr = m_Fjr;
+    const NodeByCellData<Rd>& Fjr = m_Fjr;
     const Kokkos::View<const Rd*> ur = m_ur;
 
     const Kokkos::View<const double*> inv_mj = unknowns.invMj();
-- 
GitLab