57 assert(dim==2 || dim==3);
68 double Poids = 1./(dim+1);
88 double a = 0.5854101966249685;
89 double b = 0.1381966011250105;
114 int nb_comp = le_scalaire.
nb_comp();
117 IntTrav tab_les_polygones(nb_elem_tot * nbpts);
118 DoubleTrav tab_les_positions(nb_elem_tot * nbpts, dim);
123 IntArrView les_polygones =
static_cast<ArrOfInt&
>(tab_les_polygones).view_wo();
124 DoubleTabView les_positions = tab_les_positions.
view_wo();
126 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
127 Kokkos::RangePolicy<>(0, nb_elem_tot), KOKKOS_LAMBDA(
130 for (
int pt = 0; pt < nbpts; pt++)
131 les_polygones(elem * nbpts + pt) = elem;
134 double a0[3], a0a1[3], a0a2[3], a0a3[3];
135 const int som_glob = elem_sommets(elem,0);
136 for (
int d=0; d<dim; d++)
137 a0[d]=coord_sommets(som_glob,d);
139 const int som_glob1 = elem_sommets(elem,1);
140 for (
int d=0; d<dim; d++)
141 a0a1[d]=coord_sommets(som_glob1,d)-a0[d];
143 const int som_glob2 = elem_sommets(elem,2);
144 for (
int d=0; d<dim; d++)
145 a0a2[d]=coord_sommets(som_glob2,d)-a0[d];
149 const int som_glob3 = elem_sommets(elem,3);
150 for (
int d=0; d<dim; d++)
151 a0a3[d]=coord_sommets(som_glob3,d)-a0[d];
155 for (
int pt = 0; pt < nbpts; pt++)
157 int point = elem * nbpts + pt;
158 for (
int d=0; d<dim; d++)
160 les_positions(point, d) = a0[d]
161 + coord_bary(pt, 1) * a0a1[d]
162 + coord_bary(pt, 2) * a0a2[d];
164 les_positions(point, d) = a0[d]
165 + coord_bary(pt, 1) * a0a1[d]
166 + coord_bary(pt, 2) * a0a2[d]
167 + coord_bary(pt, 3) * a0a3[d];
170 end_gpu_timer(__KERNEL_NAME__);
173 DoubleTrav tab_valeurs_scalaire(nb_elem_tot * nbpts, nb_comp);
174 DoubleTrav tab_valeurs_beta(nb_elem_tot * nbpts, nb_comp);
177 le_scalaire.
valeur_aux_elems(tab_les_positions, tab_les_polygones, tab_valeurs_scalaire);
188 CDoubleArrView g =
static_cast<const DoubleVect&
>(
gravite().
valeurs()).view_ro();
190 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
191 CDoubleArrView volumes = domaine_VEF.
volumes().view_ro();
192 CDoubleTabView valeurs_scalaire = tab_valeurs_scalaire.
view_ro();
193 CDoubleTabView valeurs_beta = tab_valeurs_beta.
view_ro();
196 DoubleTabView resu = tab_resu.
view_rw();
198 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
199 Kokkos::RangePolicy<>(0, nb_elem_tot), KOKKOS_LAMBDA(
212 double volume=volumes(elem);
215 for(
int face=0; face<=dim; face++)
217 int num_face=elem_faces(elem, face);
218 double valeurs_Psi[4];
220 for (
int pt=0; pt<nbpts; pt++)
222 int point = elem * nbpts + pt;
224 valeurs_Psi[pt]=(1-dim*coord_bary(pt,face))*porosite_surf(num_face);
226 for (
int d=0; d<dim; d++)
229 for (
int comp=0; comp<nb_comp; comp++)
230 contrib+=Poids*volume*(
Scalaire0(comp)-valeurs_scalaire(point,comp))*valeurs_beta(point,comp)*g(d)*valeurs_Psi[pt];
231 Kokkos::atomic_add(&resu(num_face,d), contrib);
256 end_gpu_timer(__KERNEL_NAME__);
259 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
266 int nb_faces_bord=le_bord.
nb_faces();
267 CIntArrView le_bord_num_face = le_bord.
num_face().view_ro();
268 CIntArrView la_cl_perio_face_associee = la_cl_perio.
face_associee().view_ro();
269 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
270 Kokkos::RangePolicy<>(0, nb_faces_bord/2), KOKKOS_LAMBDA(
273 int face = le_bord_num_face(ind_face);
274 int face_associee = le_bord_num_face(la_cl_perio_face_associee(ind_face));
275 for (
int d=0; d<dim; d++)
277 resu(face_associee, d) += resu(face, d);
278 resu(face, d) = resu(face_associee, d);
281 end_gpu_timer(__KERNEL_NAME__);
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
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