99 ToDo_Kokkos(
"critical");
100 assert_espace_virtuel_vect(DivVelocityElements);
102 const DoubleVect& volumes = le_dom->volumes();
103 const DoubleVect& volumes_entrelaces = le_dom->volumes_entrelaces();
104 const DoubleVect& volumes_entrelaces_Cl = ref_cast(
Domaine_Cl_VEF,le_dom_Cl.valeur()).volumes_entrelaces_Cl();
106 IntTab& face_voisins = le_dom->face_voisins();
107 int premiere_fac_std=le_dom->premiere_face_std();
110 for (
int face=0; face<premiere_fac_std; face++)
113 DivVelocityFaces(face)=0;
114 for (
int i=0 ; i<2 ; i++)
116 int elem= face_voisins(face,i);
120 DivVelocityFaces(face) += DivVelocityElements(elem)*(volumes_entrelaces_Cl(face)/volumes(elem));
123 DivVelocityFaces(face) /= nb_comp;
126 int size = le_dom->nb_faces();
127 for (
int face=premiere_fac_std; face<size; face++)
130 DivVelocityFaces(face)=0;
131 for (
int i=0 ; i<2 ; i++)
133 int elem= face_voisins(face,i);
137 DivVelocityFaces(face) += DivVelocityElements(elem)*(volumes_entrelaces(face)/volumes(elem));
140 DivVelocityFaces(face) /= nb_comp;
153 const IntTab& face_sommets = le_dom->face_sommets();
154 int nb_elem_tot = le_dom->nb_elem_tot();
155 int nb_som_tot = le_dom->domaine().nb_som_tot();
156 int nb_faces_tot = le_dom->nb_faces_tot();
161 DoubleTrav tab_rhonP1_, tab_rhonp1P1_;
163 const DoubleTab& tab_rhonP1 = modif_par_porosite_si_flag(tab_rhon, tab_rhonP1_, 1, porosite_face);
164 const DoubleTab& tab_rhonp1P1 = modif_par_porosite_si_flag(tab_rhonp1, tab_rhonp1P1_, 1, porosite_face);
165 const DoubleVect& volumes_entrelaces = le_dom->volumes_entrelaces();
168 int nfe = le_dom->domaine().nb_faces_elem();
169 int nsf = le_dom->nb_som_face();
170 const Domaine& dom = le_dom->domaine();
173 DoubleTrav volume_int_som(nb_som_tot);
174 CIntTabView face_sommets_v = face_sommets.
view_ro();
175 CDoubleArrView volumes_entrelaces_v =
static_cast<const DoubleVect&
>(volumes_entrelaces).view_ro();
177 DoubleArrView volume_int_som_v =
static_cast<DoubleVect&
>(volume_int_som).view_rw();
178 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_faces_tot, KOKKOS_LAMBDA(
181 for (
int som = 0; som < nsf; som++)
183 int som_glob = renum_som_perio_v(face_sommets_v(face, som));
184 Kokkos::atomic_add(&volume_int_som_v(som_glob), volumes_entrelaces_v(face));
187 end_gpu_timer(__KERNEL_NAME__);
190 DoubleTrav tab_rhon_som(nb_som_tot);
191 DoubleTrav tab_rhonp1_som(nb_som_tot);
193 CDoubleTabView tab_rhonP1_v = tab_rhonP1.
view_ro();
194 CDoubleTabView tab_rhonp1P1_v = tab_rhonp1P1.
view_ro();
195 DoubleArrView tab_rhon_som_v =
static_cast<DoubleVect&
>(tab_rhon_som).view_rw();
196 DoubleArrView tab_rhonp1_som_v =
static_cast<DoubleVect&
>(tab_rhonp1_som).view_rw();
197 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_faces_tot, KOKKOS_LAMBDA(
200 for (
int som = 0; som < nsf; som++)
202 int som_glob = renum_som_perio_v(face_sommets_v(face, som));
204 double pond = volumes_entrelaces_v(face) / volume_int_som_v(som_glob);
205 Kokkos::atomic_add(&tab_rhon_som_v(som_glob), tab_rhonP1_v(face, 0) * pond);
206 Kokkos::atomic_add(&tab_rhonp1_som_v(som_glob), tab_rhonp1P1_v(face, 0) * pond);
209 end_gpu_timer(__KERNEL_NAME__);
216 Debog::verifier(
"EOS_Tools_VEF::secmembre_divU_Z tab_rhonP1=",tab_rhonP1);
217 Debog::verifier(
"EOS_Tools_VEF::secmembre_divU_Z tab_rhonp1P1=",tab_rhonp1P1);
223 int nb_ar_tot = le_dom->domaine().nb_aretes_tot();
227 DoubleTrav tab_dZ = pression;
228 DoubleArrView tab_dZ_v =
static_cast<DoubleVect&
>(tab_dZ).view_rw();
231 CIntTabView elem_faces_v = le_dom->elem_faces().view_ro();
232 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem_tot, KOKKOS_LAMBDA(
237 for (
int face = 0; face < nfe; face++)
239 rn += tab_rhonP1_v(elem_faces_v(elem, face), 0);
240 rnp1 += tab_rhonp1P1_v(elem_faces_v(elem, face), 0);
242 tab_dZ_v(elem) = (rnp1 - rn) / (nfe * dt);
244 end_gpu_timer(__KERNEL_NAME__);
245 decal += nb_elem_tot;
250 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_som_tot, KOKKOS_LAMBDA(
253 tab_dZ_v(decal + som) = ((tab_rhonp1_som_v(som)) - (tab_rhon_som_v(som))) / dt;
255 end_gpu_timer(__KERNEL_NAME__);
261 for (
int ar = 0; ar < nb_ar_tot; ar++)
262 tab_dZ(decal + ar) = 0;
277 CDoubleArrView dZ =
static_cast<DoubleVect&
>(tab_dZ).view_ro();
278 DoubleTabView W = tab_W.
view_rw();
282 double coefdivelem=1;
283 CDoubleArrView volumes_v = le_dom->volumes().view_ro();
284 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem_tot, KOKKOS_LAMBDA(
287 W(elem, 0) = -coefdivelem * dZ(elem) * volumes_v(elem);
289 end_gpu_timer(__KERNEL_NAME__);
296 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_som_tot, KOKKOS_LAMBDA(
299 W(decal + som, 0) = -coefdivsom * dZ(decal + som) * volumes_controle_v(som);
301 end_gpu_timer(__KERNEL_NAME__);
306 for (
int ar = 0; ar < nb_ar_tot; ar++)
309 assert(tab_dZ(decal + ar) == 0);
310 tab_W(decal + ar) = 0.;
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.