diff --git a/src/main.cpp b/src/main.cpp index b6afd5ddbe18c22a0f65d2ab7d5ff822db454d1d..e2781da1d09b26ebb2d7b51194036b5841b65ab5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -148,6 +148,7 @@ int main(int argc, char *argv[]) double t=0.; int itermax=std::numeric_limits<int>::max(); + //int itermax = 500; int iteration=0; Kokkos::View<double*> rhoj = unknowns.rhoj(); @@ -339,7 +340,8 @@ int main(int argc, char *argv[]) // NAVIER-STOKES SANS SPLITTING double dt = 0.1*acoustic_solver.acoustic_dt(Vj, cj); // pour le cas xi = 0 - double dt_diff = 0.9*finite_volumes_diffusion.diffusion_dt(rhoj, kj,nuj, cj, nuL, nuR, kL,kR); + //double dt_diff = 0.9*finite_volumes_diffusion.diffusion_dt(rhoj, kj,nuj, cj, nuL, nuR, kL,kR); + double dt_diff = 0.1*no_splitting.nosplitting_dt(Vj,cj,rhoj,kj); if (dt_diff < dt) { dt = dt_diff; } diff --git a/src/scheme/NoSplitting.hpp b/src/scheme/NoSplitting.hpp index cacf6f5f6e76630716f16654899ba4ed3ae14b8b..25345194e8909ed656c1a0f3ef311b72dc570ef8 100644 --- a/src/scheme/NoSplitting.hpp +++ b/src/scheme/NoSplitting.hpp @@ -73,12 +73,14 @@ private: KOKKOS_INLINE_FUNCTION const Kokkos::View<const double*> - computeRhoCj(const Kokkos::View<const double*>& rhoj, + computeRhoCj(const Kokkos::View<const double*>& kj, + const Kokkos::View<const double*>& Vj, + const Kokkos::View<const double*>& rhoj, const Kokkos::View<const double*>& cj) { Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) { - m_rhocj[j] = rhoj[j]*cj[j]; - //m_rhocj[j] = 1.; + //m_rhocj[j] = rhoj[j]*cj[j]; + m_rhocj[j] = rhoj[j]*cj[j] + kj[j]/Vj[j]; }); return m_rhocj; } @@ -221,13 +223,14 @@ private: void computeExplicitFluxes(const Kokkos::View<const Rd*>& xr, const Kokkos::View<const Rd*>& xj, const Kokkos::View<const double*>& rhoj, + const Kokkos::View<const double*>& kj, const Kokkos::View<const Rd*>& uj, const Kokkos::View<const double*>& pj, const Kokkos::View<const double*>& cj, const Kokkos::View<const double*>& Vj, const Kokkos::View<const Rd**>& Cjr, const double& t) { - const Kokkos::View<const double*> rhocj = computeRhoCj(rhoj, cj); + const Kokkos::View<const double*> rhocj = computeRhoCj(kj, Vj, rhoj, cj); const Kokkos::View<const Rdd**> Ajr = computeAjr(rhocj, Cjr); const Kokkos::View<const Rdd*> Ar = computeAr(Ajr); @@ -265,6 +268,24 @@ public: { ; } + + // Calcule une evaluation du pas de temps verifiant une CFL du type + // c*dt/dx<1 (c modifie) + KOKKOS_INLINE_FUNCTION + double nosplitting_dt(const Kokkos::View<const double*>& Vj, + const Kokkos::View<const double*>& cj, + const Kokkos::View<const double*>& rhoj, + const Kokkos::View<const double*>& kj) const { + Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){ + m_Vj_over_cj[j] = Vj[j]/(cj[j]+kj[j]/(rhoj[j]*Vj[j])); + }); + + double dt = std::numeric_limits<double>::max(); + Kokkos::parallel_reduce(m_mesh.numberOfCells(), ReduceMin(m_Vj_over_cj), dt); + + return dt; + } + // Avance la valeur des inconnues pendant un pas de temps dt void computeNextStep(const double& t, const double& dt, @@ -370,7 +391,7 @@ public: } // Calcul de PT (3eme essai, avec uR du solveur de Riemann) - computeExplicitFluxes(xr, xj, rhoj, uj, pj, cj, Vj, Cjr, t); + computeExplicitFluxes(xr, xj, rhoj, kj, uj, pj, cj, Vj, Cjr, t); Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) { @@ -397,7 +418,7 @@ public: // Calcule les flux - computeExplicitFluxes(xr, xj, rhoj, uj, PTj, cj, Vj, Cjr, t); + computeExplicitFluxes(xr, xj, rhoj, kj, uj, PTj, cj, Vj, Cjr, t); // Mise a jour de la vitesse et de l'energie totale specifique const Kokkos::View<const double*> inv_mj = unknowns.invMj(); @@ -460,15 +481,6 @@ public: }); */ - /* - // gnuplot output for vitesse riemann - std::ofstream fout("ur_no_split"); - fout.precision(15); - for (size_t j=0; j<m_mesh.numberOfNodes(); ++j) { - fout << xr[j][0] << ' ' << ur[j][0] << '\n'; - } - */ - } };