diff --git a/src/main.cpp b/src/main.cpp index 5e6325e1b1024a8bc74c4daca0b4538edbd1da1b..8a5237884398a28b365d41d1d6b17720a1a5770a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -173,7 +173,8 @@ int main(int argc, char *argv[]) std::cout << "* " << rang::style::underline << "Final time" << rang::style::reset << ": " << rang::fgB::green << t << rang::fg::reset << " (" << iteration << " iterations)\n"; - method_cost_map["AcousticSolverWithMesh"] = timer.seconds(); + //method_cost_map["AcousticSolverWithMesh"] = timer.seconds(); + method_cost_map["FiniteVolumesDiffusionWithMesh"] = timer.seconds(); { // gnuplot output for density const Kokkos::View<const Rd*> xj = mesh_data.xj(); diff --git a/src/scheme/FiniteVolumesDiffusion.hpp b/src/scheme/FiniteVolumesDiffusion.hpp index 1afd942e198fce7e5be89fab581c68c2f5814903..694b7f43fc7afe7788b45b67c1025e41eb56d770 100644 --- a/src/scheme/FiniteVolumesDiffusion.hpp +++ b/src/scheme/FiniteVolumesDiffusion.hpp @@ -18,20 +18,20 @@ // Creation classe FiniteVolumesDiffusion -template<typename MeshData> // MeshData est le type generique des donnees (geometriques) attachees a un maillage +template<typename MeshData> class FiniteVolumesDiffusion { - typedef typename MeshData::MeshType MeshType; // type du maillage - typedef FiniteVolumesEulerUnknowns<MeshData> UnknownsType; // type des inconnues + typedef typename MeshData::MeshType MeshType; + typedef FiniteVolumesEulerUnknowns<MeshData> UnknownsType; - MeshData& m_mesh_data; // reference vers les donnees attachees du maillage - const MeshType& m_mesh; // reference vers le maillage - const typename MeshType::Connectivity& m_connectivity; // references vers la connectivite + MeshData& m_mesh_data; + const MeshType& m_mesh; + const typename MeshType::Connectivity& m_connectivity; - constexpr static size_t dimension = MeshType::dimension; // dimension du maillage (connue a la compilation) + constexpr static size_t dimension = MeshType::dimension; - typedef TinyVector<dimension> Rd; // type de petits vecteurs (de dimension MeshType::dimension) - typedef TinyMatrix<dimension> Rdd; // type de petites matrices + typedef TinyVector<dimension> Rd; + typedef TinyMatrix<dimension> Rdd; private: @@ -73,7 +73,8 @@ private: } }; - Kokkos::View<Rd**> // Fonction qui calcule F_jr + // Calcule un Fjr + Kokkos::View<Rd**> computeFjr(const Kokkos::View<const Rd**>& Cjr, const Kokkos::View<const Rd*>& uj, const Kokkos::View<const double*>& kj) { @@ -84,14 +85,16 @@ private: Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) { for (int r=0; r<cell_nb_nodes[j]; ++r) { - m_Fjr(j,r) = ((kj(cell_nodes(j,r)) + kj(cell_nodes(j,r)-1))/(2*Dj(j))) * (uj(j,r),Cjr(j,r)); //tensorProduct(uj(j,r),Cjr(j,r)) ? + m_Fjr(j,r) = ((kj(cell_nodes(j,r)) + kj(cell_nodes(j-1,r)))/(2*Dj(j))) + * ((uj(j,r),Cjr(j,r))+ (uj(j-1,r),Cjr(j-1,r))) ; //tensorProduct(uj(j,r),Cjr(j,r)) ? } }); return m_Fjr; } - Kokkos::View<double**> // Fonction qui calcule G_jr + // Calcule un Gjr + Kokkos::View<double**> computeGjr(const Kokkos::View<const Rd*>& uj, const Kokkos::View<const Rd**>& Fjr) { const Kokkos::View<const unsigned int**>& cell_nodes = m_connectivity.cellNodes(); @@ -100,15 +103,15 @@ private: Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) { for (int r=0; r<cell_nb_nodes[j]; ++r) { - m_Gjr(j,r) = 0.5*((uj(cell_nodes(j,r)) + uj(cell_nodes(j,r)-1)),Fjr(j,r)); + m_Gjr(j,r) = 0.5*((uj(cell_nodes(j,r)) + uj(cell_nodes(j-1,r))),Fjr(j,r)); } }); return m_Gjr; } - // Calcul la liste des inverses d'une liste de matrices (pour - // l'instant seulement $R^{1\times 1}$) + // Calcule la liste des inverse d'une liste de matrices + // (pour l'instant, juste 1x1) void inverse(const Kokkos::View<const Rdd*>& A, Kokkos::View<Rdd*>& inv_A) const { Kokkos::parallel_for(A.size(), KOKKOS_LAMBDA(const int& r) { @@ -116,7 +119,7 @@ private: }); } - // Calcul la liste des inverses d'une liste de reels + // Calcule la liste des inverses d'une liste de reels void inverse(const Kokkos::View<const double*>& x, Kokkos::View<double*>& inv_x) const { Kokkos::parallel_for(x.size(), KOKKOS_LAMBDA(const int& r) { @@ -153,7 +156,7 @@ public: } // Calcule une evaluation du pas de temps verifiant le CFL parabolique - // Utilise la reduction definie dans la structure ReduceMin. Ici, dx_j=V_j + // Utilise la reduction definie dans la structure ReduceMin. KOKKOS_INLINE_FUNCTION double diffusion_dt(const Kokkos::View<const double*>& rhoj, const Kokkos::View<const double*>& kj) const { @@ -163,12 +166,12 @@ public: const Kokkos::View<const double*>& Vj = m_mesh_data.Vj(); Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){ - dt_j[j] - = rhoj(j)*Vj(j)*(2./(kj(j+1) + 2*kj(j) + kj(j-1))) - * std::min(Dj(j+1),Dj(j)); + //dt_j[j]= rhoj(j)*Vj(j)*(2./(kj(j+1) + 2*kj(j) + kj(j-1))) + // * std::min(Dj(j),Dj(j-1)); // * std::min(xj(j+1)-xj(j), xj(j)-xj(j-1)); // * std::min((Dxj(j+1),Cjr(j,1)) + (xj(j),Cjr(j,0)), //(xj(j),Cjr(j,1)) + (xj(j-1),Cjr(j,0)) ); + dt_j[j] = 0.0001; // le signal vient d ici ! }); double dt = std::numeric_limits<double>::max();