16#include <Discretisation_tools.h>
17#include <Check_espace_virtuel.h>
18#include <Champ_base.h>
19#include <Domaine_VF.h>
26 ToDo_Kokkos(
"critical for EF but not used in TRUST...");
27 const DoubleTab& tabHn=Hn.
valeurs();
36 int nb_elem=domaine_dis_base.
nb_elem();
39 for (
int ele=0; ele<nb_elem; ele++)
41 for (
int s=0; s<nb_som_elem; s++)
43 int sglob=les_elems(ele,s);
44 tabHe(ele)+=tabHn(sglob);
47 double inv_nb_som_elem=1./(nb_som_elem);
48 tabHe*=inv_nb_som_elem;
53 ToDo_Kokkos(
"critical for EF");
55 const DoubleTab& tabHe=He.
valeurs();
57 assert_espace_virtuel_vect(tabHe);
64 const DoubleVect& volumes=ref_cast(
Domaine_VF,domaine_dis_base).volumes();
72 for (
int e = 0; e < nb_elem_tot; e++)
73 for (
int s = 0, sglob; s < nb_som_elem && (sglob = les_elems(e, s)) >= 0; s++)
75 for (
int n = 0; n < N; n++)
76 tabHn(sglob, n) += tabHe(e, n) * volumes(e);
77 vsom(sglob) += volumes(e);
80 for (
int s = 0; s < domaine_dis_base.
nb_som(); s++)
81 for (
int n = 0; n < N; n++)
82 tabHn(s, n) /= vsom(s);
89 ToDo_Kokkos(
"critical but seems not used by TRUST...");
90 const DoubleTab& tabHf=Hf.
valeurs();
97 const IntTab& elem_faces=domaine_vf.
elem_faces();
99 int nb_elem=domaine_dis_base.
nb_elem();
102 for (
int ele=0; ele<nb_elem; ele++)
104 for (
int s=0; s<nb_face_elem; s++)
107 tabHe(ele)+=tabHf(elem_faces(ele,s));
110 double inv_nb_face_elem=1./(nb_face_elem);
111 tabHe*=inv_nb_face_elem;
116template<
typename ExecSpace>
117void cells_to_faces_kernel(
const Domaine_VF& domaine_vf,
const DoubleTab& tabHe, DoubleTab& tab_vol_tot, DoubleTab& tabHf)
119 static constexpr bool kernelOnDevice = !std::is_same<ExecSpace, Kokkos::DefaultHostExecutionSpace>::value;
121 int nb_face_elem = domaine_vf.
elem_faces().dimension(1);
122 auto elem_faces = domaine_vf.
elem_faces().template view_ro<2, ExecSpace>();
123 auto volumes = domaine_vf.
volumes().template view_ro<1, ExecSpace>();
124 auto He_v =
static_cast<const ArrOfDouble&
>(tabHe).
template view_ro<1, ExecSpace>();
125 auto vol_tot =
static_cast<ArrOfDouble&
>(tab_vol_tot).
template view_rw<1, ExecSpace>();
126 auto Hf_v =
static_cast<ArrOfDouble&
>(tabHf).
template view_rw<1, ExecSpace>();
127 Kokkos::MDRangePolicy<ExecSpace, Kokkos::Rank<2>> policy({0, 0}, {nb_elem_tot, nb_face_elem});
128 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), policy, KOKKOS_LAMBDA(
const int ele,
const int s)
130 int face = elem_faces(ele, s);
131 double volume_elem = volumes(ele);
132 Kokkos::atomic_add(&Hf_v(face), He_v(ele) * volume_elem);
133 Kokkos::atomic_add(&vol_tot(face), volume_elem);
135 end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
141 const DoubleTab& tabHe=He.
valeurs();
143 assert_espace_virtuel_vect(tabHe);
157 DoubleTrav tab_vol_tot(tabHf);
161 cells_to_faces_kernel<Kokkos::DefaultExecutionSpace>(domaine_vf, tabHe, tab_vol_tot, tabHf);
163 cells_to_faces_kernel<Kokkos::DefaultHostExecutionSpace>(domaine_vf, tabHe, tab_vol_tot, tabHf);
166 tab_divide_any_shape(tabHf, tab_vol_tot, VECT_REAL_ITEMS);
170 int nb_face_elem=domaine_vf.
elem_faces().dimension(1);
172 const IntTab& elem_faces = domaine_vf.
elem_faces();
173 const DoubleVect& volumes = domaine_vf.
volumes();
174 ToDo_Kokkos(
"critical");
182 for (
int ele=0; ele<nb_elem_tot; ele++)
183 for (
int s=0; s<nb_face_elem; s++)
185 int face=elem_faces(ele,s);
186 for (
int r = 0; r < domaine_vf.
dimension; r++)
191 tabHf(face) += tabHe(ele, r) * normOnSurf * normOnSurf * volumes(ele);
195 tabHf(f)/=volumes_entrelaces(f)*coeffb;
197 tabHf(f)/=volumes_entrelaces(f)*coeffi;
201 double coeffb=nb_face_elem;
202 double coeffi=coeffb;
204 for (
int ele=0; ele<nb_elem_tot; ele++)
205 for (
int s=0; s<nb_face_elem; s++)
207 int face=elem_faces(ele,s);
208 for (
int comp=0; comp<nb_comp; comp++)
209 tabHf(face,comp)+=tabHe(ele,comp)*volumes(ele);
213 for (
int comp=0; comp<nb_comp; comp++)
214 tabHf(f,comp)/=volumes_entrelaces(f)*coeffb;
216 for (
int comp=0; comp<nb_comp; comp++)
217 tabHf(f,comp)/=volumes_entrelaces(f)*coeffi;
226 const int nb_face_elem = domaine_vf.
elem_faces().line_size(), nb_comp = tab_face.
line_size();
231 Process::exit(
"Discretisation_tools::cells_to_faces limited to VEF.");
235 auto elem_faces = domaine_vf.
elem_faces().view_ro();
236 auto volumes = domaine_vf.
volumes().view_ro();
237 auto tab_elem_v = tab_elem.
view_ro();
238 auto tab_face_v = tab_face.
view_rw();
239 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_2D({0, 0}, {nb_elem_tot, nb_face_elem}), KOKKOS_LAMBDA(
const int ele,
const int s)
241 int face = elem_faces(ele, s);
242 double volume_elem = volumes(ele);
243 for (
int comp = 0; comp < nb_comp; comp++)
244 Kokkos::atomic_add(&tab_face_v(face, comp), tab_elem_v(ele, comp) * volume_elem);
246 end_gpu_timer(__KERNEL_NAME__);
249 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_2D({0, 0}, {domaine_vf.
nb_faces(), nb_comp}), KOKKOS_LAMBDA(
const int f,
const int comp)
251 tab_face_v(f, comp) /= volumes_entrelaces(f) * nb_face_elem;
253 end_gpu_timer(__KERNEL_NAME__);
264 const int nb_face_elem = domaine_vf.
elem_faces().dimension(1), nb_elem = domaine_vf.
nb_elem(), nb_comp = tab_face.
line_size();
270 CIntTabView elem_faces = domaine_vf.
elem_faces().view_ro();
271 CDoubleTabView face = tab_face.
view_ro();
272 DoubleTabView elem = tab_elem.
view_rw();
273 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_2D({0, 0}, {nb_elem, nb_comp}), KOKKOS_LAMBDA(
const int ele,
const int comp)
276 for (
int s = 0; s < nb_face_elem; s++)
277 sum += face(elem_faces(ele, s), comp);
278 elem(ele, comp) = sum;
280 end_gpu_timer(__KERNEL_NAME__);
282 double inv_nb_face_elem = 1. / nb_face_elem;
283 tab_elem *= inv_nb_face_elem;
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual const Domaine_dis_base & domaine_dis_base() const
static void verifier(const char *const msg, double)
virtual const DoubleVect & face_surfaces() const
int nb_faces() const
renvoie le nombre global de faces.
DoubleVect & volumes_entrelaces()
int nb_faces_tot() const
renvoie le nombre total de faces.
virtual double face_normales(int face, int comp) const
double volumes(int i) const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
_SIZE_ dimension_tot(int) const override
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")