From ed9e500cffbe5db67dc1b8dc6189fa7d3a6ee6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Coppens?= Date: Tue, 21 Jul 2026 17:27:44 +0200 Subject: [PATCH 1/9] [Kokkos] Porting Op_Dift_VDF_Elem_base::calculer_dt_stab_elem --- .../Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp index c15b7e1dca..1626fb0d92 100644 --- a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp +++ b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp @@ -38,6 +38,15 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const ArrOfInt numfa(2*dimension); ToDo_Kokkos("critical"); + +Kokkos::View alpha_view("alpha_view", domaine_VDF.nb_elem()); +auto h_alpha_view = Kokkos::create_mirror_view(alpha_view); +for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) +{ + h_alpha_view(elem) = alpha_(elem); +} +Kokkos::deep_copy(alpha_view, h_alpha_view); + for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) { // choix du facteur @@ -61,7 +70,7 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const const double hd = domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d); moy += 1. / (hd * hd); } - const double alpha_local = (alpha_(elem) + alpha_t(elem)) / rcp * moy; + const double alpha_local = (h_alpha_view(elem) + alpha_t(elem)) / rcp * moy; coef = std::max(coef, alpha_local); } From 67a22857c1b42d23995ade662594625307302c97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Coppens?= Date: Wed, 22 Jul 2026 08:34:27 +0200 Subject: [PATCH 2/9] So far so good Changed loop structure. Pulled out the branch for !is_concentration and put the loops inside it. Regression tests still pass. --- .../Op_Dift_VDF_Elem_base.cpp | 66 ++++++++++++------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp index 1626fb0d92..a6d5af0b09 100644 --- a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp +++ b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp @@ -39,40 +39,58 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const ArrOfInt numfa(2*dimension); ToDo_Kokkos("critical"); -Kokkos::View alpha_view("alpha_view", domaine_VDF.nb_elem()); -auto h_alpha_view = Kokkos::create_mirror_view(alpha_view); -for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) -{ - h_alpha_view(elem) = alpha_(elem); -} -Kokkos::deep_copy(alpha_view, h_alpha_view); - + Kokkos::View alpha_view("alpha_view", domaine_VDF.nb_elem()); + auto h_alpha_view = Kokkos::create_mirror_view(alpha_view); for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) + { + h_alpha_view(elem) = alpha_(elem); + } + Kokkos::deep_copy(alpha_view, h_alpha_view); + + // choix du facteur + if (!is_concentration) { - // choix du facteur - double rcp = 1.; - if (!is_concentration) + for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) { const int Ccp = sub_type(Champ_Uniforme, mon_equation->milieu().capacite_calorifique()); const int Cr = sub_type(Champ_Uniforme, mon_equation->milieu().masse_volumique()); const DoubleTab& tab_Cp = mon_equation->milieu().capacite_calorifique().valeurs(); const DoubleTab& tab_r = mon_equation->milieu().masse_volumique().valeurs(); - rcp = tab_r(Cr ? 0 : elem, 0) * tab_Cp(Ccp ? 0 : elem, 0); + double rcp = tab_r(Cr ? 0 : elem, 0) * tab_Cp(Ccp ? 0 : elem, 0); + + double moy = 0.; + for (int i = 0; i < 2 * dimension; i++) numfa[i] = elem_faces(elem, i); + + // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! + // c'etait comme ca : for (int d = 0; d < dimension; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d)); + for (int d = 0; d < dimension; d++) + { + const double hd = domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d); + moy += 1. / (hd * hd); + } + const double alpha_local = (h_alpha_view(elem) + alpha_t(elem)) / rcp * moy; + coef = std::max(coef, alpha_local); } - - double moy = 0.; - for (int i = 0; i < 2 * dimension; i++) numfa[i] = elem_faces(elem, i); - - // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! - // c'etait comme ca : for (int d = 0; d < dimension; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d)); - for (int d = 0; d < dimension; d++) + } + else + { + for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) { - const double hd = domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d); - moy += 1. / (hd * hd); + double rcp = 1.; + double moy = 0.; + for (int i = 0; i < 2 * dimension; i++) numfa[i] = elem_faces(elem, i); + + // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! + // c'etait comme ca : for (int d = 0; d < dimension; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d)); + for (int d = 0; d < dimension; d++) + { + const double hd = domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d); + moy += 1. / (hd * hd); + } + const double alpha_local = (h_alpha_view(elem) + alpha_t(elem)) / rcp * moy; + coef = std::max(coef, alpha_local); } - const double alpha_local = (h_alpha_view(elem) + alpha_t(elem)) / rcp * moy; - coef = std::max(coef, alpha_local); - } + } coef = Process::mp_max(coef); dt_stab = 1. / (2. * (coef + DMINFLOAT)); From d123e348c6e7fc9f0167bb4127880fed58deee65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Coppens?= Date: Wed, 22 Jul 2026 08:38:10 +0200 Subject: [PATCH 3/9] Still passes --- .../Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp index a6d5af0b09..1ac94d3fec 100644 --- a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp +++ b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp @@ -50,12 +50,12 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const // choix du facteur if (!is_concentration) { + const int Ccp = sub_type(Champ_Uniforme, mon_equation->milieu().capacite_calorifique()); + const int Cr = sub_type(Champ_Uniforme, mon_equation->milieu().masse_volumique()); + const DoubleTab& tab_Cp = mon_equation->milieu().capacite_calorifique().valeurs(); + const DoubleTab& tab_r = mon_equation->milieu().masse_volumique().valeurs(); for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) { - const int Ccp = sub_type(Champ_Uniforme, mon_equation->milieu().capacite_calorifique()); - const int Cr = sub_type(Champ_Uniforme, mon_equation->milieu().masse_volumique()); - const DoubleTab& tab_Cp = mon_equation->milieu().capacite_calorifique().valeurs(); - const DoubleTab& tab_r = mon_equation->milieu().masse_volumique().valeurs(); double rcp = tab_r(Cr ? 0 : elem, 0) * tab_Cp(Ccp ? 0 : elem, 0); double moy = 0.; From 9895db8f9e3781a1e3488ea0155529045dfea1f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Coppens?= Date: Wed, 22 Jul 2026 08:44:22 +0200 Subject: [PATCH 4/9] Still good --- .../Op_Dift_VDF_Elem_base.cpp | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp index 1ac94d3fec..1ad68afc3b 100644 --- a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp +++ b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp @@ -47,6 +47,8 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const } Kokkos::deep_copy(alpha_view, h_alpha_view); + const int l_dim = Objet_U::dimension; + // choix du facteur if (!is_concentration) { @@ -57,15 +59,14 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) { double rcp = tab_r(Cr ? 0 : elem, 0) * tab_Cp(Ccp ? 0 : elem, 0); - double moy = 0.; - for (int i = 0; i < 2 * dimension; i++) numfa[i] = elem_faces(elem, i); + for (int i = 0; i < 2 * l_dim; i++) numfa[i] = elem_faces(elem, i); // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! - // c'etait comme ca : for (int d = 0; d < dimension; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d)); - for (int d = 0; d < dimension; d++) + // c'etait comme ca : for (int d = 0; d < l_dim; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d)); + for (int d = 0; d < l_dim; d++) { - const double hd = domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d); + const double hd = domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d); moy += 1. / (hd * hd); } const double alpha_local = (h_alpha_view(elem) + alpha_t(elem)) / rcp * moy; @@ -78,19 +79,19 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const { double rcp = 1.; double moy = 0.; - for (int i = 0; i < 2 * dimension; i++) numfa[i] = elem_faces(elem, i); + for (int i = 0; i < 2 * l_dim; i++) numfa[i] = elem_faces(elem, i); // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! - // c'etait comme ca : for (int d = 0; d < dimension; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d)); - for (int d = 0; d < dimension; d++) + // c'etait comme ca : for (int d = 0; d < l_dim; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d)); + for (int d = 0; d < l_dim; d++) { - const double hd = domaine_VDF.dist_face(numfa[d], numfa[dimension + d], d); + const double hd = domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d); moy += 1. / (hd * hd); } const double alpha_local = (h_alpha_view(elem) + alpha_t(elem)) / rcp * moy; coef = std::max(coef, alpha_local); } - } + } coef = Process::mp_max(coef); dt_stab = 1. / (2. * (coef + DMINFLOAT)); From 019a59aae896b40868551d012ac4776004b643b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Coppens?= Date: Wed, 22 Jul 2026 08:55:05 +0200 Subject: [PATCH 5/9] Still OK --- .../Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp index 1ad68afc3b..689c971519 100644 --- a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp +++ b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp @@ -39,15 +39,17 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const ArrOfInt numfa(2*dimension); ToDo_Kokkos("critical"); - Kokkos::View alpha_view("alpha_view", domaine_VDF.nb_elem()); + int nb_elem = domaine_VDF.nb_elem(); + const int l_dim = Objet_U::dimension; + + Kokkos::View alpha_view("alpha_view", nb_elem); auto h_alpha_view = Kokkos::create_mirror_view(alpha_view); - for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) + for (int elem = 0; elem < nb_elem; elem++) { h_alpha_view(elem) = alpha_(elem); } Kokkos::deep_copy(alpha_view, h_alpha_view); - const int l_dim = Objet_U::dimension; // choix du facteur if (!is_concentration) @@ -56,7 +58,7 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const const int Cr = sub_type(Champ_Uniforme, mon_equation->milieu().masse_volumique()); const DoubleTab& tab_Cp = mon_equation->milieu().capacite_calorifique().valeurs(); const DoubleTab& tab_r = mon_equation->milieu().masse_volumique().valeurs(); - for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) + for (int elem = 0; elem < nb_elem; elem++) { double rcp = tab_r(Cr ? 0 : elem, 0) * tab_Cp(Ccp ? 0 : elem, 0); double moy = 0.; @@ -75,7 +77,7 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const } else { - for (int elem = 0; elem < domaine_VDF.nb_elem(); elem++) + for (int elem = 0; elem < nb_elem; elem++) { double rcp = 1.; double moy = 0.; From 859825a73a255b9fe082649356713f725efaf683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Coppens?= Date: Wed, 22 Jul 2026 09:24:15 +0200 Subject: [PATCH 6/9] Still OK --- .../Op_Dift_VDF_Elem_base.cpp | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp index 689c971519..ac16c92a02 100644 --- a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp +++ b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp @@ -32,24 +32,30 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const { double dt_stab, coef = -1.e10; const Domaine_VDF& domaine_VDF = iter_->domaine(); - const IntTab& elem_faces = domaine_VDF.elem_faces(); - const DoubleVect& alpha_t = diffusivite_turbulente().valeurs(); + const IntTab& tab_elem_faces = domaine_VDF.elem_faces(); + CIntTabView elem_faces = tab_elem_faces.view_ro(); + (void)elem_faces; + const DoubleVect& tab_alpha_t = diffusivite_turbulente().valeurs(); + CDoubleArrView alpha_t = tab_alpha_t.view_ro(); + (void)alpha_t; bool is_concentration = (equation().que_suis_je().debute_par("Convection_Diffusion_Concentration") || equation().que_suis_je().debute_par("Convection_Diffusion_Espece")); - ArrOfInt numfa(2*dimension); + ArrOfInt tab_numfa(2*dimension); + IntArrView numfa = tab_numfa.view_rw(); + (void)numfa; + ToDo_Kokkos("critical"); int nb_elem = domaine_VDF.nb_elem(); const int l_dim = Objet_U::dimension; Kokkos::View alpha_view("alpha_view", nb_elem); - auto h_alpha_view = Kokkos::create_mirror_view(alpha_view); + auto tab_alpha_view = Kokkos::create_mirror_view(alpha_view); for (int elem = 0; elem < nb_elem; elem++) { - h_alpha_view(elem) = alpha_(elem); + tab_alpha_view(elem) = alpha_(elem); } - Kokkos::deep_copy(alpha_view, h_alpha_view); - + Kokkos::deep_copy(alpha_view, tab_alpha_view); // choix du facteur if (!is_concentration) @@ -62,16 +68,16 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const { double rcp = tab_r(Cr ? 0 : elem, 0) * tab_Cp(Ccp ? 0 : elem, 0); double moy = 0.; - for (int i = 0; i < 2 * l_dim; i++) numfa[i] = elem_faces(elem, i); + for (int i = 0; i < 2 * l_dim; i++) tab_numfa[i] = tab_elem_faces(elem, i); // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! // c'etait comme ca : for (int d = 0; d < l_dim; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d)); for (int d = 0; d < l_dim; d++) { - const double hd = domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d); + const double hd = domaine_VDF.dist_face(tab_numfa[d], tab_numfa[l_dim + d], d); moy += 1. / (hd * hd); } - const double alpha_local = (h_alpha_view(elem) + alpha_t(elem)) / rcp * moy; + const double alpha_local = (tab_alpha_view(elem) + tab_alpha_t(elem)) / rcp * moy; coef = std::max(coef, alpha_local); } } @@ -81,16 +87,16 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const { double rcp = 1.; double moy = 0.; - for (int i = 0; i < 2 * l_dim; i++) numfa[i] = elem_faces(elem, i); + for (int i = 0; i < 2 * l_dim; i++) tab_numfa[i] = tab_elem_faces(elem, i); // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! // c'etait comme ca : for (int d = 0; d < l_dim; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d)); for (int d = 0; d < l_dim; d++) { - const double hd = domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d); + const double hd = domaine_VDF.dist_face(tab_numfa[d], tab_numfa[l_dim + d], d); moy += 1. / (hd * hd); } - const double alpha_local = (h_alpha_view(elem) + alpha_t(elem)) / rcp * moy; + const double alpha_local = (tab_alpha_view(elem) + tab_alpha_t(elem)) / rcp * moy; coef = std::max(coef, alpha_local); } } From 739c997f87fe5b6012c9f7cf6678e271c31c61ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20COPPENS?= Date: Wed, 22 Jul 2026 16:23:20 +0000 Subject: [PATCH 7/9] Still OK --- .../Op_Dift_VDF_Elem_base.cpp | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp index ac16c92a02..0db2dd2de7 100644 --- a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp +++ b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp @@ -33,19 +33,11 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const double dt_stab, coef = -1.e10; const Domaine_VDF& domaine_VDF = iter_->domaine(); const IntTab& tab_elem_faces = domaine_VDF.elem_faces(); - CIntTabView elem_faces = tab_elem_faces.view_ro(); - (void)elem_faces; + [[maybe_unused]] CIntTabView elem_faces = tab_elem_faces.view_ro(); const DoubleVect& tab_alpha_t = diffusivite_turbulente().valeurs(); - CDoubleArrView alpha_t = tab_alpha_t.view_ro(); - (void)alpha_t; + [[maybe_unused]] CDoubleArrView alpha_t = tab_alpha_t.view_ro(); bool is_concentration = (equation().que_suis_je().debute_par("Convection_Diffusion_Concentration") || equation().que_suis_je().debute_par("Convection_Diffusion_Espece")); - ArrOfInt tab_numfa(2*dimension); - IntArrView numfa = tab_numfa.view_rw(); - (void)numfa; - - ToDo_Kokkos("critical"); - int nb_elem = domaine_VDF.nb_elem(); const int l_dim = Objet_U::dimension; @@ -57,6 +49,8 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const } Kokkos::deep_copy(alpha_view, tab_alpha_view); + const DoubleTab& xv = domaine_VDF.xv(); + // choix du facteur if (!is_concentration) { @@ -68,13 +62,12 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const { double rcp = tab_r(Cr ? 0 : elem, 0) * tab_Cp(Ccp ? 0 : elem, 0); double moy = 0.; - for (int i = 0; i < 2 * l_dim; i++) tab_numfa[i] = tab_elem_faces(elem, i); // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! // c'etait comme ca : for (int d = 0; d < l_dim; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d)); for (int d = 0; d < l_dim; d++) { - const double hd = domaine_VDF.dist_face(tab_numfa[d], tab_numfa[l_dim + d], d); + const double hd = xv(tab_elem_faces(elem, l_dim + d), d) - xv(tab_elem_faces(elem, d), d); moy += 1. / (hd * hd); } const double alpha_local = (tab_alpha_view(elem) + tab_alpha_t(elem)) / rcp * moy; @@ -87,13 +80,12 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const { double rcp = 1.; double moy = 0.; - for (int i = 0; i < 2 * l_dim; i++) tab_numfa[i] = tab_elem_faces(elem, i); // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! // c'etait comme ca : for (int d = 0; d < l_dim; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d)); for (int d = 0; d < l_dim; d++) { - const double hd = domaine_VDF.dist_face(tab_numfa[d], tab_numfa[l_dim + d], d); + const double hd = xv(tab_elem_faces(elem, l_dim + d), d) - xv(tab_elem_faces(elem, d), d); moy += 1. / (hd * hd); } const double alpha_local = (tab_alpha_view(elem) + tab_alpha_t(elem)) / rcp * moy; From 69cb20fd96468b58b5484b962ee6cc1e0968ba48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20COPPENS?= Date: Thu, 23 Jul 2026 07:53:49 +0000 Subject: [PATCH 8/9] Still builds, but fails test minor --- .../Op_Dift_VDF_Elem_base.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp index 0db2dd2de7..1bc979c758 100644 --- a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp +++ b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp @@ -49,7 +49,8 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const } Kokkos::deep_copy(alpha_view, tab_alpha_view); - const DoubleTab& xv = domaine_VDF.xv(); + const DoubleTab& tab_xv = domaine_VDF.xv(); + CDoubleTabView xv = tab_xv.view_ro(); // choix du facteur if (!is_concentration) @@ -57,22 +58,23 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const const int Ccp = sub_type(Champ_Uniforme, mon_equation->milieu().capacite_calorifique()); const int Cr = sub_type(Champ_Uniforme, mon_equation->milieu().masse_volumique()); const DoubleTab& tab_Cp = mon_equation->milieu().capacite_calorifique().valeurs(); + CDoubleTabView Cp = tab_Cp.view_ro(); const DoubleTab& tab_r = mon_equation->milieu().masse_volumique().valeurs(); - for (int elem = 0; elem < nb_elem; elem++) + CDoubleTabView r = tab_r.view_ro(); + Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__), range_1D(0, nb_elem), KOKKOS_LAMBDA (const int& elem, double& l_coef) { - double rcp = tab_r(Cr ? 0 : elem, 0) * tab_Cp(Ccp ? 0 : elem, 0); + double rcp = r(Cr ? 0 : elem, 0) * Cp(Ccp ? 0 : elem, 0); double moy = 0.; - // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! - // c'etait comme ca : for (int d = 0; d < l_dim; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d)); for (int d = 0; d < l_dim; d++) { const double hd = xv(tab_elem_faces(elem, l_dim + d), d) - xv(tab_elem_faces(elem, d), d); moy += 1. / (hd * hd); } - const double alpha_local = (tab_alpha_view(elem) + tab_alpha_t(elem)) / rcp * moy; - coef = std::max(coef, alpha_local); - } + const double alpha_local = (alpha_view(elem) + alpha_t(elem)) / rcp * moy; + l_coef = std::max(l_coef, alpha_local); + }, Kokkos::Max(coef)); + end_gpu_timer(__KERNEL_NAME__); } else { @@ -81,8 +83,6 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const double rcp = 1.; double moy = 0.; - // XXX : E Saikali j'ai corrige pour multi inco parce que c'etait 1/dx et pas 1/dx^2 ... donc attention si ecart ! - // c'etait comme ca : for (int d = 0; d < l_dim; d++) moy += 1. / (domaine_VDF.dist_face(numfa[d], numfa[l_dim + d], d)); for (int d = 0; d < l_dim; d++) { const double hd = xv(tab_elem_faces(elem, l_dim + d), d) - xv(tab_elem_faces(elem, d), d); From 66faecab6dc6c76d7987827d4ed6286cccaa1bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20COPPENS?= Date: Fri, 24 Jul 2026 12:58:54 +0000 Subject: [PATCH 9/9] Added debug info Final value of `coef` is infinite, after the parallel reduction is finished. --- .../Op_Dift_VDF_Elem_base.cpp | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp index 1bc979c758..af945f2b39 100644 --- a/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp +++ b/src/VDF/Operateurs/Op_Diff_Dift/Op_Diff_Dift_base/Op_Dift_VDF_Elem_base.cpp @@ -35,7 +35,7 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const const IntTab& tab_elem_faces = domaine_VDF.elem_faces(); [[maybe_unused]] CIntTabView elem_faces = tab_elem_faces.view_ro(); const DoubleVect& tab_alpha_t = diffusivite_turbulente().valeurs(); - [[maybe_unused]] CDoubleArrView alpha_t = tab_alpha_t.view_ro(); + [[maybe_unused]] CDoubleArrView alpha_t = tab_alpha_t.view_ro(); bool is_concentration = (equation().que_suis_je().debute_par("Convection_Diffusion_Concentration") || equation().que_suis_je().debute_par("Convection_Diffusion_Espece")); int nb_elem = domaine_VDF.nb_elem(); @@ -53,6 +53,8 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const CDoubleTabView xv = tab_xv.view_ro(); // choix du facteur + static size_t run = 0; + printf("DEBUG: run = %lu\n", run); if (!is_concentration) { const int Ccp = sub_type(Champ_Uniforme, mon_equation->milieu().capacite_calorifique()); @@ -64,15 +66,22 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__), range_1D(0, nb_elem), KOKKOS_LAMBDA (const int& elem, double& l_coef) { double rcp = r(Cr ? 0 : elem, 0) * Cp(Ccp ? 0 : elem, 0); - double moy = 0.; + if (elem == nb_elem-1) Kokkos::printf("DEBUG: thread = %d, rcp = %f\n", elem, rcp); + double moy = 0.; for (int d = 0; d < l_dim; d++) { const double hd = xv(tab_elem_faces(elem, l_dim + d), d) - xv(tab_elem_faces(elem, d), d); moy += 1. / (hd * hd); } + if (elem == nb_elem-1) Kokkos::printf("DEBUG: thread = %d, moy = %f\n", elem, moy); + const double alpha_local = (alpha_view(elem) + alpha_t(elem)) / rcp * moy; - l_coef = std::max(l_coef, alpha_local); + if (elem == nb_elem-1) Kokkos::printf("DEBUG: thread = %d, alpha_local = %f\n",elem, alpha_local); + + if (elem == nb_elem-1) Kokkos::printf("DEBUG: thread = %d, l_coef = %f\n", elem, l_coef); + l_coef = Kokkos::fmax(l_coef, alpha_local); + if (elem == nb_elem-1) Kokkos::printf("DEBUG: thread = %d, l_coef = %f\n", elem, l_coef); }, Kokkos::Max(coef)); end_gpu_timer(__KERNEL_NAME__); } @@ -81,20 +90,30 @@ double Op_Dift_VDF_Elem_base::calculer_dt_stab_elem() const for (int elem = 0; elem < nb_elem; elem++) { double rcp = 1.; - double moy = 0.; + if (elem == nb_elem-1) printf("DEBUG: thread = %d, rcp = %f\n", elem, rcp); + double moy = 0.; for (int d = 0; d < l_dim; d++) { const double hd = xv(tab_elem_faces(elem, l_dim + d), d) - xv(tab_elem_faces(elem, d), d); moy += 1. / (hd * hd); } + if (elem == nb_elem-1) printf("DEBUG: thread = %d, moy = %f\n", elem, moy); + const double alpha_local = (tab_alpha_view(elem) + tab_alpha_t(elem)) / rcp * moy; + if (elem == nb_elem-1) printf("DEBUG: thread = %d, alpha_local = %f\n",elem, alpha_local); + if (elem == nb_elem-1) printf("DEBUG: thread = %d, coef = %f\n", elem, coef); coef = std::max(coef, alpha_local); + if (elem == nb_elem-1) printf("DEBUG: thread = %d, coef = %f\n", elem, coef); } } + run++; + printf("DEBUG: coef = %f\n", coef); coef = Process::mp_max(coef); + printf("DEBUG: coef = %f\n", coef); dt_stab = 1. / (2. * (coef + DMINFLOAT)); + printf("DEBUG: dt_stab = %f\n", dt_stab); return dt_stab; }