16#ifndef Iterateur_Source_VEF_Face_included
17#define Iterateur_Source_VEF_Face_included
19#include <Evaluateur_Source_VEF_Face.h>
20#include <Iterateur_Source_base.h>
21#include <Champ_Uniforme.h>
22#include <TRUSTSingle.h>
23#include <Milieu_base.h>
24#include <Domaine_Cl_VEF.h>
26#include <Domaine_VEF.h>
28template<
typename _TYPE_>
43 nb_faces_(iter.nb_faces_), nb_faces_elem_(iter.nb_faces_elem_), premiere_face_std_(iter.premiere_face_std_) { }
45 DoubleTab&
ajouter(DoubleTab&)
const override;
49 nb_faces_ = ref_cast(
Domaine_VEF,le_dom.valeur()).nb_faces();
50 nb_faces_elem_ = le_dom->domaine().nb_faces_elem();
51 premiere_face_std_ = ref_cast(
Domaine_VEF,le_dom.valeur()).premiere_face_std();
61 inline const int&
faces_doubles(
int num_face)
const {
return ref_cast(
Domaine_VEF,le_dom.valeur()).faces_doubles()[num_face]; }
64 inline int face_voisins(
int num_face,
int dir)
const {
return ref_cast(
Domaine_VEF,le_dom.valeur()).face_voisins(num_face, dir); }
65 inline int elem_faces(
int num_elem,
int i)
const {
return ref_cast(
Domaine_VEF,le_dom.valeur()).elem_faces(num_elem, i); }
68 _TYPE_ evaluateur_source_face_;
69 int nb_faces_, nb_faces_elem_, premiere_face_std_;
70 mutable DoubleTab tab_coef_;
71 DoubleVect volumes_cl_dirichlet_;
74 template <
typename Type_Double> DoubleTab& ajouter_faces_standard(
const int, DoubleTab& )
const;
75 template <
typename Type_Double> DoubleTab& ajouter_faces_non_standard(
const int, DoubleTab& )
const;
78template<
typename _TYPE_>
82 evaluateur().changer_volumes_entrelaces_Cl(volumes_cl_dirichlet_);
86template<
typename _TYPE_>
89 ((_TYPE_&) (evaluateur_source_face_)).mettre_a_jour();
93 int nb_faces_tot = ref_cast(
Domaine_VEF,le_dom.valeur()).nb_faces_tot();
94 DoubleVect& bilan = so_base->bilan();
97 if (tab_coef_.size_array()!=nb_faces_tot) tab_coef_.
resize(nb_faces_tot, RESIZE_OPTIONS::NOCOPY_NOINIT);
104 tab_coef_ = rho.
valeurs()(0, 0);
107 const DoubleTab& val_rho = rho.
valeurs();
108 const IntTab& face_vois = le_dom->face_voisins();
109 const DoubleVect& volumes = ref_cast(
Domaine_VEF,le_dom.valeur()).volumes();
111 ToDo_Kokkos(
"critical");
112 for (
int fac = 0; fac < nb_faces_tot; fac++)
114 int elem1 = face_vois(fac, 0);
115 int elem2 = face_vois(fac, 1);
119 tab_coef_(fac) += val_rho(elem1) * volumes(elem1);
120 vol += volumes(elem1);
124 tab_coef_(fac) += val_rho(elem2) * volumes(elem2);
125 vol += volumes(elem2);
127 tab_coef_(fac) /= vol;
133 ajouter_faces_non_standard<SingleDouble>(ncomp,resu);
134 ajouter_faces_standard<SingleDouble>(ncomp,resu);
138 ajouter_faces_non_standard<ArrOfDouble>(ncomp,resu);
139 ajouter_faces_standard<ArrOfDouble>(ncomp,resu);
144template<
typename _TYPE_>
150 DoubleVect& marq = volumes_cl_dirichlet_;
155 for (
int num_cl = 0; num_cl < zvef.
nb_front_Cl() * 0; num_cl++)
161 for (
int ind_face = 0; ind_face < nf; ind_face++)
163 int num_face = le_bord.
num_face(ind_face);
171template<
typename _TYPE_>
template<
typename Type_Double>
172DoubleTab& Iterateur_Source_VEF_Face<_TYPE_>::ajouter_faces_non_standard(
const int ncomp, DoubleTab& tab_resu)
const
174 DoubleVect& tab_bilan = so_base->bilan();
175 for (
int num_cl = 0; num_cl < le_dom->nb_front_Cl(); num_cl++)
177 const Cond_lim& la_cl = la_zcl->les_conditions_limites(num_cl);
181 if (evaluateur().has_view())
183 const int nb_faces = nb_faces_, nb_faces_elem = nb_faces_elem_;
184 _TYPE_ evaluateur_source_face;
185 evaluateur_source_face.set(evaluateur_source_face_);
186 CIntArrView faces_doubles = ref_cast(
Domaine_VEF,le_dom.valeur()).faces_doubles().view_ro();
187 CIntTabView elem_faces = ref_cast(
Domaine_VEF,le_dom.valeur()).elem_faces().view_ro();
188 CIntTabView face_voisins = ref_cast(
Domaine_VEF,le_dom.valeur()).face_voisins().view_ro();
189 CDoubleArrView volumes_entrelaces_Cl = volumes_cl_dirichlet_.view_ro();
190 CIntArrView le_bord_num_face = le_bord.
num_face().view_ro();
191 CDoubleArrView coef =
static_cast<const ArrOfDouble&
>(tab_coef_).view_ro();
192 DoubleArrView bilan = tab_bilan.view_rw();
193 DoubleTabView resu = tab_resu.
view_rw();
194 Kokkos::View<double**, DoubleTabView::array_layout> source_view(
"source", nf, ncomp);
195 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(0, nf), KOKKOS_LAMBDA(
const int ind_face)
197 int num_face = le_bord_num_face(ind_face);
198 auto source = Kokkos::subview(source_view, ind_face, Kokkos::ALL());
199 evaluateur_source_face.calculer_terme_source_non_standard_view(num_face, source);
200 if (volumes_entrelaces_Cl(num_face) == 0)
202 int faces_dirichlet = 0;
203 for (
int i = 0; i < nb_faces_elem; i++)
205 int face_voisine = elem_faces(face_voisins(num_face, 0), i);
206 if (volumes_entrelaces_Cl(face_voisine) == 0)
207 faces_dirichlet += 1;
209 for (
int i = 0; i < nb_faces_elem; i++)
211 int face_voisine = elem_faces(face_voisins(num_face, 0), i);
212 if (volumes_entrelaces_Cl(face_voisine) != 0)
213 for (
int k = 0; k < ncomp; k++)
215 Kokkos::atomic_add(&resu(face_voisine, k), + source(k) / (nb_faces_elem - faces_dirichlet));
216 if (face_voisine < nb_faces)
218 double contribution = (faces_doubles(face_voisine) == 1) ? 0.5 : 1;
219 Kokkos::atomic_add(&bilan(k), + contribution * coef(face_voisine) * source(k) /
220 (nb_faces_elem - faces_dirichlet));
227 for (
int k = 0; k < ncomp; k++)
229 resu(num_face, k) += source(k);
232 double contribution = (faces_doubles(num_face) == 1) ? 0.5 : 1;
233 Kokkos::atomic_add(&bilan(k), + contribution * coef(num_face) * source(k));
238 end_gpu_timer(__KERNEL_NAME__);
242 Type_Double source(ncomp);
243 ToDo_Kokkos(
"critical");
244 for (
int ind_face = 0; ind_face < nf; ind_face++)
246 int num_face = le_bord.
num_face(ind_face);
247 evaluateur_source_face_.calculer_terme_source_non_standard(num_face, source);
248 if (volumes_entrelaces_Cl(num_face) == 0)
250 int faces_dirichlet = 0;
251 for (
int i = 0; i < nb_faces_elem_; i++)
253 int face_voisine = elem_faces(face_voisins(num_face, 0), i);
254 if (volumes_entrelaces_Cl(face_voisine) == 0)
255 faces_dirichlet += 1;
257 for (
int i = 0; i < nb_faces_elem_; i++)
259 int face_voisine = elem_faces(face_voisins(num_face, 0), i);
260 if (volumes_entrelaces_Cl(face_voisine) != 0)
261 for (
int k = 0; k < ncomp; k++)
263 tab_resu(face_voisine, k) += source(k) / (nb_faces_elem_ - faces_dirichlet);
264 if (face_voisine < nb_faces_)
266 double contribution = (faces_doubles(face_voisine) == 1) ? 0.5 : 1;
267 tab_bilan(k) += contribution * tab_coef_(face_voisine) * source(k) /
268 (nb_faces_elem_ - faces_dirichlet);
275 for (
int k = 0; k < ncomp; k++)
277 tab_resu(num_face, k) += source(k);
280 double contribution = (faces_doubles(num_face) == 1) ? 0.5 : 1;
281 tab_bilan(k) += contribution * tab_coef_(num_face) * source(k);
288 if (evaluateur().has_view())
290 const int premiere_face_std = premiere_face_std_;
291 const int premiere_face_int = ref_cast(
Domaine_VEF, le_dom.valeur()).premiere_face_int();
292 _TYPE_ evaluateur_source_face;
293 evaluateur_source_face.set(evaluateur_source_face_);
294 CIntArrView faces_doubles = ref_cast(
Domaine_VEF,le_dom.valeur()).faces_doubles().view_ro();
295 CDoubleArrView coef =
static_cast<const ArrOfDouble&
>(tab_coef_).view_ro();
296 DoubleArrView bilan = tab_bilan.view_rw();
297 DoubleTabView resu = tab_resu.
view_rw();
298 Kokkos::View<double**, DoubleTabView::array_layout> source_view(
"source", premiere_face_std-premiere_face_int, ncomp);
299 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(premiere_face_int, premiere_face_std), KOKKOS_LAMBDA(
const int num_face)
301 auto source = Kokkos::subview(source_view, num_face-premiere_face_int, Kokkos::ALL());
302 evaluateur_source_face.calculer_terme_source_non_standard_view(num_face, source);
303 for (
int k = 0; k < ncomp; k++)
305 resu(num_face, k) += source(k);
306 double contribution = (faces_doubles(num_face) == 1) ? 0.5 : 1;
307 Kokkos::atomic_add(&bilan(k), contribution * coef(num_face) * source(k));
310 end_gpu_timer(__KERNEL_NAME__);
314 ToDo_Kokkos(
"critical");
315 Type_Double source(ncomp);
316 const int premiere_face_int = ref_cast(
Domaine_VEF, le_dom.valeur()).premiere_face_int();
317 for (
int num_face = premiere_face_int; num_face < premiere_face_std_; num_face++)
319 evaluateur_source_face_.calculer_terme_source_non_standard(num_face, source);
320 for (
int k = 0; k < ncomp; k++)
322 tab_resu(num_face, k) += source(k);
323 double contribution = (faces_doubles(num_face) == 1) ? 0.5 : 1;
324 tab_bilan(k) += contribution * tab_coef_(num_face) * source(k);
331template<
typename _TYPE_>
template<
typename Type_Double>
332DoubleTab& Iterateur_Source_VEF_Face<_TYPE_>::ajouter_faces_standard(
const int ncomp, DoubleTab& tab_resu)
const
334 DoubleVect& tab_bilan = so_base->bilan();
337 const int nb_faces = nb_faces_, premiere_face_std = premiere_face_std_;
338 _TYPE_ evaluateur_source_face;
339 evaluateur_source_face.set(evaluateur_source_face_);
341 CDoubleArrView coef =
static_cast<const ArrOfDouble&
>(tab_coef_).view_ro();
342 DoubleArrView bilan = tab_bilan.view_rw();
343 DoubleTabView resu = tab_resu.
view_rw();
344 Kokkos::View<double**, DoubleTabView::array_layout> source_view(
"source", nb_faces-premiere_face_std, ncomp);
345 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(premiere_face_std, nb_faces), KOKKOS_LAMBDA(
const int num_face)
347 auto source = Kokkos::subview(source_view, num_face-premiere_face_std, Kokkos::ALL());
348 evaluateur_source_face.calculer_terme_source_standard_view(num_face, source);
349 for (
int k = 0; k < ncomp; k++)
351 resu(num_face, k) += source(k);
352 double contribution = (
faces_doubles(num_face) == 1) ? 0.5 : 1;
353 Kokkos::atomic_add(&bilan(k), contribution * coef(num_face) * source(k));
356 end_gpu_timer(__KERNEL_NAME__);
360 ToDo_Kokkos(
"critical");
361 Type_Double source(ncomp);
362 for (
int num_face = premiere_face_std_; num_face < nb_faces_; num_face++)
364 evaluateur_source_face_.calculer_terme_source_standard(num_face, source);
365 for (
int k = 0; k < ncomp; k++)
367 tab_resu(num_face, k) += source(k);
368 double contribution = (
faces_doubles(num_face) == 1) ? 0.5 : 1;
369 tab_bilan(k) += contribution * tab_coef_(num_face) * source(k);
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
DoubleVect & volumes_entrelaces_Cl()
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
int premiere_face_std() const
int nb_faces() const
renvoie le nombre global de faces.
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
virtual const Milieu_base & milieu() const =0
int num_face(const int) const
const Evaluateur_Source_VEF_Face & evaluateur() const
void completer_() override
double volumes_entrelaces(int &num_face) const
Evaluateur_Source_VEF_Face & evaluateur() override
void remplir_volumes_cl_dirichlet()
Iterateur_Source_VEF_Face()
int face_voisins(int num_face, int dir) const
int elem_faces(int num_elem, int i) const
const int & faces_doubles(int num_face) const
DoubleTab & ajouter(DoubleTab &) const override
Iterateur_Source_VEF_Face(const Iterateur_Source_VEF_Face< _TYPE_ > &iter)
double volumes_entrelaces_Cl(int &num_face) const
int initialiser(double tps) override
int equation_divisee_par_rho() const
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
virtual const Equation_base & equation(const std::string &nom_inc) const
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
virtual int duplique() const =0
virtual unsigned taille_memoire() const =0
int numero() const
Renvoie l'indice de l'objet dans Memoire::data.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
_SIZE_ size_array() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")