16#include <Champ_implementation_P0.h>
17#include <Champ_Uniforme_Morceaux.h>
18#include <Champ_Fonc_Morceaux.h>
19#include <Champ_Don_Fonc_txyz.h>
20#include <Champ_Uniforme.h>
21#include <Champ_base.h>
23#include <Domaine_VF.h>
28 int nb_components = ch_base.
nb_comp();
29 const DoubleTab& values = ch_base.
valeurs();
31 assert(result.
size() == nb_components);
34 assert(values.
nb_dim() == 2);
35 assert(values.
dimension(1) == nb_components);
37 for (
int i = 0; i < nb_components; i++) result(i) = values(poly, i);
45 const DoubleTab& values = ch_base.
valeurs();
48 assert(ncomp < ch_base.
nb_comp());
55 result = values(poly, ncomp);
70 Process::exit(
"Error, you must use valeur_aux_centres_de_gravite() on the whole discretized mesh.");
78 if (tab_result.
nb_dim() == 1) tab_result.
resize(nb_polys, 1);
80 int nb_dim = tab_values.
nb_dim();
82 assert(tab_values.
line_size() == nb_components);
83 assert(tab_values.
line_size() == nb_components || nb_components == 1);
84 DoubleTabView result = tab_result.
view_wo();
87 CDoubleArrView values =
static_cast<const ArrOfDouble&
>(tab_values).view_ro();
88 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_2D({0, 0}, {nb_polys, line_size}), KOKKOS_LAMBDA(
const int i,
const int j)
90 result(i, j) = values(i);
95 CDoubleTabView values = tab_values.
view_ro();
96 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_2D({0, 0}, {nb_polys, line_size}),
97 KOKKOS_LAMBDA(
const int i,
const int j)
99 result(i, j) = values(i, (line_size == nb_components) * j);
102 end_gpu_timer(__KERNEL_NAME__);
106template<
typename ExecSpace>
107void valeur_aux_elems_kernel(
const DoubleTab& tab_values,
const IntVect& tab_polys, DoubleTab& tab_result,
int nb_components)
109 int nb_polys = tab_polys.
size();
111 int nb_dim = tab_values.
nb_dim();
112 auto polys = tab_polys.template view_ro<1, ExecSpace>();
113 auto result = tab_result.template view_wo<2, ExecSpace>();
114 Kokkos::RangePolicy<ExecSpace> policy(0, nb_polys);
117 auto values = tab_values.template view_ro<1, ExecSpace>();
118 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), policy, KOKKOS_LAMBDA(
const int i)
122 for (
int j = 0; j < line_size; j++)
123 result(i, j) = values(cell);
128 auto values = tab_values.template view_ro<2, ExecSpace>();
129 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), policy, KOKKOS_LAMBDA(
const int i)
133 for (
int j = 0; j < line_size; j++)
134 result(i, j) = values(cell, (line_size == nb_components) * j);
137 static constexpr bool kernelOnDevice = !std::is_same<ExecSpace, Kokkos::DefaultHostExecutionSpace>::value;
138 end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
143 int nb_polys = tab_polys.
size();
150 if (tab_result.
nb_dim() == 1) tab_result.
resize(nb_polys, 1);
152 assert(tab_values.
line_size() == nb_components);
153 assert(tab_values.
line_size() == nb_components || nb_components == 1);
157 valeur_aux_elems_kernel<Kokkos::DefaultExecutionSpace>(tab_values, tab_polys, tab_result, nb_components);
159 valeur_aux_elems_kernel<Kokkos::DefaultHostExecutionSpace>(tab_values, tab_polys, tab_result, nb_components);
163template<
typename ExecSpace>
164void valeur_aux_elems_compo_kernel(
const DoubleTab& tab_values,
const IntVect& tab_polys, DoubleVect& tab_result,
int ncomp)
166 int nb_polys = tab_polys.
size();
167 auto polys = tab_polys.template view_ro<1, ExecSpace>();
168 auto values = tab_values.template view_ro<2, ExecSpace>();
169 auto result = tab_result.template view_wo<1, ExecSpace>();
170 Kokkos::RangePolicy<ExecSpace> policy(0, nb_polys);
171 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), policy, KOKKOS_LAMBDA(
const int i)
175 result(i) = values(cell, ncomp);
177 static constexpr bool kernelOnDevice = !std::is_same<ExecSpace, Kokkos::DefaultHostExecutionSpace>::value;
178 end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
186 assert(ncomp <
le_champ().nb_comp());
187 assert(tab_result.
size() == tab_polys.
size());
192 valeur_aux_elems_compo_kernel<Kokkos::DefaultExecutionSpace>(tab_values, tab_polys, tab_result, ncomp);
194 valeur_aux_elems_compo_kernel<Kokkos::DefaultHostExecutionSpace>(tab_values, tab_polys, tab_result, ncomp);
203 domaine.calculer_centres_gravite(positions);
210 int nb_elem = domaine.nb_elem();
213 ToDo_Kokkos(
"critical");
214 for (
int i = 0; i < nb_elem; i++) polys(i) = i;
221 int nb_components = ch_base.
nb_comp();
222 const DoubleTab& tab_values = ch_base.
valeurs();
224 int nb_cells = domaine.nb_elem_tot();
225 int nb_nodes = domaine.nb_som();
226 int nb_nodes_per_cell = domaine.nb_som_elem();
228 assert(tab_result.
line_size() == nb_components);
229 assert(tab_values.
line_size() == nb_components);
230 int nb_dim = tab_values.
nb_dim();
231 IntTrav tab_count(nb_nodes);
233 CIntTabView sommet_elem = domaine.les_elems().
view_ro();
234 CDoubleTabView values = tab_values.
view_ro();
235 IntArrView count =
static_cast<ArrOfInt&
>(tab_count).view_rw();
236 DoubleTabView result = tab_result.
view_rw();
237 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0,0}, {nb_cells,nb_nodes_per_cell}), KOKKOS_LAMBDA(
const int i,
const int j)
239 int node = sommet_elem(i, j);
240 if (node >= 0 && node < nb_nodes)
242 Kokkos::atomic_add(&count[node], 1);
243 for (
int k = 0; k < nb_components; k++)
244 Kokkos::atomic_add(&result(node, k), values(i, nb_dim == 1 ? 0 : k));
247 end_gpu_timer(__KERNEL_NAME__);
248 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_nodes, KOKKOS_LAMBDA(
const int i)
250 for (
int j = 0; j < nb_components; j++)
251 result(i, j) /= count[i];
253 end_gpu_timer(__KERNEL_NAME__);
260 const DoubleTab& values = ch_base.
valeurs();
263 int nb_cells = domaine.nb_elem_tot();
264 int nb_nodes = domaine.nb_som();
265 int nb_nodes_per_cell = domaine.nb_som_elem();
267 ArrOfInt count(nb_nodes);
271 assert(ncomp < ch_base.
nb_comp());
272 assert(result.
size() == nb_nodes);
274 ToDo_Kokkos(
"critical");
275 for (
int i = 0; i < nb_cells; i++)
276 for (
int j = 0; j < nb_nodes_per_cell; j++)
278 int node = domaine.sommet_elem(i, j);
282 result(node) += values(i, ncomp);
285 for (
int i = 0; i < nb_nodes; i++) result(i) /= count[i];
295 const DoubleTab& val = cha.
valeurs();
298 DoubleTab pos_centre;
300 os << nb_elem_tot << finl;
301 for (elem = 0; elem < nb_elem_tot; elem++)
304 os << pos_centre(elem, 0) <<
" " << pos_centre(elem, 1) <<
" " << pos_centre(elem, 2) <<
" ";
306 os << pos_centre(elem, 0) <<
" " << pos_centre(elem, 1) <<
" ";
307 os << val(elem, ncomp) << finl;
310 Cout <<
"Champ_P0_implementation::imprime_P0 END >>>>>>>>>> " << finl;
class Champ_Don_Fonc_txyz Cette classe represente un champ de donnees fonction
classe Champ_Fonc_Morceaux Cette classe represente un champ prenant par morceaux des valuers fonction...
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual int a_un_domaine_dis_base() const
virtual const Domaine_dis_base & domaine_dis_base() const
virtual DoubleTab & valeur_aux_centres_de_gravite(const Domaine &, DoubleTab &valeurs) const
Cette methode, generique mais lente (calcul des centres de gravite, remplissage les_poly,...
public_for_cuda DoubleTab & valeur_aux_sommets_impl(DoubleTab &result) const override
DoubleVect & valeur_a_elem(const DoubleVect &position, DoubleVect &result, int poly) const override
DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &polys, DoubleTab &result) const override
int imprime_P0(Sortie &, int) const
double valeur_a_elem_compo(const DoubleVect &position, int poly, int ncomp) const override
DoubleVect & valeur_aux_sommets_compo_impl(DoubleVect &result, int ncomp) const override
int remplir_coord_noeuds_et_polys(DoubleTab &positions, IntVect &polys) const override
DoubleTab & valeur_aux_centres_de_gravite(const Domaine &, DoubleTab &valeurs) const
Computes field values at centers of gravity.
int affecter_(const Champ_base &)
DoubleTab & remplir_coord_noeuds(DoubleTab &positions) const override
DoubleVect & valeur_aux_elems_compo(const DoubleTab &positions, const IntVect &polys, DoubleVect &result, int ncomp) const override
const Domaine & get_domaine_geom() const
virtual Champ_base & le_champ()=0
int_t nb_elem_tot() const
void calculer_centres_gravite(DoubleTab_t &xp) const
Calcule les centres de gravites des elements du domaine.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
const Domaine & domaine() const
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual int nb_comp() const
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_wo()
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_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
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)