57 const IntTab& tab_Face_sommets,
58 const IntTab& tab_Face_voisins,
59 const IntTab& tab_elem_faces,
60 const Domaine& domaine_geom)
const
64 CIntTabView Face_sommets = tab_Face_sommets.
view_ro();
65 CIntTabView Face_voisins = tab_Face_voisins.
view_ro();
66 CIntTabView elem_faces = tab_elem_faces.
view_ro();
67 DoubleTabView Face_normales = tab_Face_normales.
view_rw();
68 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(0, nb_face_tot), KOKKOS_LAMBDA(
const int num_Face)
70 int n0 = Face_sommets(num_Face, 0);
71 int n1 = Face_sommets(num_Face, 1);
72 int n2 = Face_sommets(num_Face, 2);
74 double x1 = les_coords(n0, 0) - les_coords(n1, 0);
75 double y1 = les_coords(n0, 1) - les_coords(n1, 1);
76 double z1 = les_coords(n0, 2) - les_coords(n1, 2);
78 double x2 = les_coords(n2, 0) - les_coords(n1, 0);
79 double y2 = les_coords(n2, 1) - les_coords(n1, 1);
80 double z2 = les_coords(n2, 2) - les_coords(n1, 2);
82 double nx = (y1 * z2 - y2 * z1) / 2;
83 double ny = (-x1 * z2 + x2 * z1) / 2;
84 double nz = (x1 * y2 - x2 * y1) / 2;
88 int elem1 = Face_voisins(num_Face, 0);
89 int f0 = elem_faces(elem1, 0);
91 f0 = elem_faces(elem1, 1);
93 int no4 = Face_sommets(f0, 0);
94 if (no4 == n0 || no4 == n1 || no4 == n2)
96 no4 = Face_sommets(f0, 1);
97 if (no4 == n0 || no4 == n1 || no4 == n2)
98 no4 = Face_sommets(f0, 2);
101 x1 = les_coords(no4, 0) - les_coords(n0, 0);
102 y1 = les_coords(no4, 1) - les_coords(n0, 1);
103 z1 = les_coords(no4, 2) - les_coords(n0, 2);
105 double sign = ((nx * x1 + ny * y1 + nz * z1) > 0) ? -1. : 1.;
106 Face_normales(num_Face, 0) = sign * nx;
107 Face_normales(num_Face, 1) = sign * ny;
108 Face_normales(num_Face, 2) = sign * nz;
110 end_gpu_timer(__KERNEL_NAME__);
117 const IntVect& tab_rang_elem_non_std)
const
119 const Domaine& domaine_geom = dom_VEF.
domaine();
120 auto& facette_normales =
const_cast<Domaine_VEF&
>(dom_VEF).facette_normales();
123 if (facette_normales.dimension(0) != nb_elem_tot)
124 facette_normales.resize(nb_elem_tot,6,3);
128 CIntArrView rang_elem_non_std = tab_rang_elem_non_std.view_ro();
129 CIntTabView
KEL =
KEL_.view_ro();
130 DoubleTabView3 facette_normale = facette_normales.view_rw<3>();
131 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(0, nb_elem_tot), KOKKOS_LAMBDA(
const int i)
133 if (rang_elem_non_std(i) == -1)
137 num_som[0] = les_Polys(i, 0);
138 num_som[1] = les_Polys(i, 1);
139 num_som[2] = les_Polys(i, 2);
140 num_som[3] = les_Polys(i, 3);
141 for (
int s = 0; s < 4; s++)
142 for (
int d = 0; d < 3; d++)
143 x[s][d] = les_coords(num_som[s], d);
145 xg[0] = 0.25*(x[0][0]+x[1][0]+x[2][0]+x[3][0]);
146 xg[1] = 0.25*(x[0][1]+x[1][1]+x[2][1]+x[3][1]);
147 xg[2] = 0.25*(x[0][2]+x[1][2]+x[2][2]+x[3][2]);
148 for (
int fa7 = 0; fa7 < 6; fa7++)
151 double u[3], v[3], pv[3], xj0[3];
152 u[0] = x[
KEL(2,fa7)][0]-xg[0];
153 u[1] = x[
KEL(2,fa7)][1]-xg[1];
154 u[2] = x[
KEL(2,fa7)][2]-xg[2];
155 v[0] = x[
KEL(3,fa7)][0]-xg[0];
156 v[1] = x[
KEL(3,fa7)][1]-xg[1];
157 v[2] = x[
KEL(3,fa7)][2]-xg[2];
159 pv[0] = u[1]*v[2]-u[2]*v[1];
160 pv[1] = u[2]*v[0]-u[0]*v[2];
161 pv[2] = u[0]*v[1]-u[1]*v[0];
163 xj0[0] = x[
KEL(0,fa7)][0]-x[
KEL(1,fa7)][0];
164 xj0[1] = x[
KEL(0,fa7)][1]-x[
KEL(1,fa7)][1];
165 xj0[2] = x[
KEL(0,fa7)][2]-x[
KEL(1,fa7)][2];
166 double psc = xj0[0]*pv[0]+xj0[1]*pv[1]+xj0[2]*pv[2];
167 double sign = (psc < 0) ? -0.5 : 0.5;
168 facette_normale(i,fa7,0) = sign*pv[0];
169 facette_normale(i,fa7,1) = sign*pv[1];
170 facette_normale(i,fa7,2) = sign*pv[2];
174 end_gpu_timer(__KERNEL_NAME__);
231 DoubleVect& volumes_entrelaces_Cl,
236 const IntTab& elem_faces = le_dom_VEF.
elem_faces();
244 Cerr <<
"Tetra_VEF::modif_volumes_entrelaces() type 0 impossible!\n";
250 vol_mod = volumes_entrelaces[j]/3 ;
251 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
252 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
253 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
259 vol_mod = volumes_entrelaces[j]/3 ;
260 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
261 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
262 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
268 vol_mod = volumes_entrelaces[j]/3 ;
269 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
270 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
271 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
277 vol_mod = volumes_entrelaces[j]/3 ;
278 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
279 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
280 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
286 vol_mod = (volumes_entrelaces[elem_faces(elem,2)]
287 + volumes_entrelaces[elem_faces(elem,3)])/2;
288 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
289 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
295 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
296 + volumes_entrelaces[elem_faces(elem,3)])/2;
297 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
298 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
304 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
305 + volumes_entrelaces[elem_faces(elem,2)])/2;
306 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
307 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
313 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
314 + volumes_entrelaces[elem_faces(elem,3)])/2;
315 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
316 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
322 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
323 + volumes_entrelaces[elem_faces(elem,2)])/2;
324 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
325 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
331 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
332 + volumes_entrelaces[elem_faces(elem,1)])/2;
333 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
334 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
342 vol_mod = volumes_entrelaces[elem_faces(elem,1)]
343 + volumes_entrelaces[elem_faces(elem,2)]
344 + volumes_entrelaces[elem_faces(elem,3)];
345 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
351 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
352 + volumes_entrelaces[elem_faces(elem,2)]
353 + volumes_entrelaces[elem_faces(elem,3)];
354 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
361 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
362 + volumes_entrelaces[elem_faces(elem,1)]
363 + volumes_entrelaces[elem_faces(elem,3)];
364 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
370 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
371 + volumes_entrelaces[elem_faces(elem,1)]
372 + volumes_entrelaces[elem_faces(elem,2)];
373 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
378 Cerr <<
"\n type inconnu Tetra_VEF::modif_volumes_entrelaces: " << type_cl;
387 DoubleVect& volumes_entrelaces_Cl,
392 const IntTab& elem_faces = le_dom_VEF.
elem_faces();
395 int nb_faces_cl = volumes_entrelaces_Cl.
size();
402 Cerr <<
"Tetra_VEF::modif_volumes_entrelaces() type 0 impossible!\n";
408 vol_mod = volumes_entrelaces[j]/3 ;
409 face=elem_faces(elem,0);
411 volumes_entrelaces_Cl[face] += vol_mod;
412 face=elem_faces(elem,1);
414 volumes_entrelaces_Cl[face] += vol_mod;
415 face=elem_faces(elem,2);
417 volumes_entrelaces_Cl[face] += vol_mod;
423 vol_mod = volumes_entrelaces[j]/3 ;
424 face=elem_faces(elem,0);
426 volumes_entrelaces_Cl[face] += vol_mod;
427 face=elem_faces(elem,1);
429 volumes_entrelaces_Cl[face] += vol_mod;
430 face=elem_faces(elem,3);
432 volumes_entrelaces_Cl[face] += vol_mod;
438 vol_mod = volumes_entrelaces[j]/3 ;
439 face=elem_faces(elem,0);
441 volumes_entrelaces_Cl[face] += vol_mod;
442 face=elem_faces(elem,2);
444 volumes_entrelaces_Cl[face] += vol_mod;
445 face=elem_faces(elem,3);
447 volumes_entrelaces_Cl[face] += vol_mod;
453 vol_mod = volumes_entrelaces[j]/3 ;
454 face=elem_faces(elem,1);
456 volumes_entrelaces_Cl[face] += vol_mod;
457 face=elem_faces(elem,2);
459 volumes_entrelaces_Cl[face] += vol_mod;
460 face=elem_faces(elem,3);
462 volumes_entrelaces_Cl[face] += vol_mod;
468 vol_mod = (volumes_entrelaces[elem_faces(elem,2)]
469 + volumes_entrelaces[elem_faces(elem,3)])/2;
470 face=elem_faces(elem,0);
472 volumes_entrelaces_Cl[face] += vol_mod;
473 face=elem_faces(elem,1);
475 volumes_entrelaces_Cl[face] += vol_mod;
481 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
482 + volumes_entrelaces[elem_faces(elem,3)])/2;
483 face=elem_faces(elem,0);
485 volumes_entrelaces_Cl[face] += vol_mod;
486 face=elem_faces(elem,2);
488 volumes_entrelaces_Cl[face] += vol_mod;
494 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
495 + volumes_entrelaces[elem_faces(elem,2)])/2;
496 face=elem_faces(elem,0);
498 volumes_entrelaces_Cl[face] += vol_mod;
499 face=elem_faces(elem,3);
501 volumes_entrelaces_Cl[face] += vol_mod;
507 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
508 + volumes_entrelaces[elem_faces(elem,3)])/2;
509 face=elem_faces(elem,1);
511 volumes_entrelaces_Cl[face] += vol_mod;
512 face=elem_faces(elem,2);
514 volumes_entrelaces_Cl[face] += vol_mod;
520 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
521 + volumes_entrelaces[elem_faces(elem,2)])/2;
522 face=elem_faces(elem,1);
524 volumes_entrelaces_Cl[face] += vol_mod;
525 face=elem_faces(elem,3);
527 volumes_entrelaces_Cl[face] += vol_mod;
533 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
534 + volumes_entrelaces[elem_faces(elem,1)])/2;
535 face=elem_faces(elem,2);
537 volumes_entrelaces_Cl[face] += vol_mod;
538 face=elem_faces(elem,3);
540 volumes_entrelaces_Cl[face] += vol_mod;
548 vol_mod = volumes_entrelaces[elem_faces(elem,1)]
549 + volumes_entrelaces[elem_faces(elem,2)]
550 + volumes_entrelaces[elem_faces(elem,3)];
551 face=elem_faces(elem,0);
553 volumes_entrelaces_Cl[face] += vol_mod;
559 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
560 + volumes_entrelaces[elem_faces(elem,2)]
561 + volumes_entrelaces[elem_faces(elem,3)];
562 face=elem_faces(elem,1);
564 volumes_entrelaces_Cl[face] += vol_mod;
571 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
572 + volumes_entrelaces[elem_faces(elem,1)]
573 + volumes_entrelaces[elem_faces(elem,3)];
574 face=elem_faces(elem,2);
576 volumes_entrelaces_Cl[face] += vol_mod;
582 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
583 + volumes_entrelaces[elem_faces(elem,1)]
584 + volumes_entrelaces[elem_faces(elem,2)];
585 face=elem_faces(elem,3);
587 volumes_entrelaces_Cl[face] += vol_mod;
592 Cerr <<
"\n type inconnu Tetra_VEF::modif_volumes_entrelaces: " << type_cl;
629 int fa7,
int num_elem,
int idirichlet,
630 int n1,
int n2,
int n3)
const
644 normales_facettes_Cl(num_elem,fa7,0) = 0;
645 normales_facettes_Cl(num_elem,fa7,1) = 0;
646 normales_facettes_Cl(num_elem,fa7,2) = 0;
653 normales_facettes_Cl(num_elem,fa7,0) = 0;
654 normales_facettes_Cl(num_elem,fa7,1) = 0;
655 normales_facettes_Cl(num_elem,fa7,2) = 0;
657 normales_facettes_Cl(num_elem,fa7,0) = 0;
658 normales_facettes_Cl(num_elem,fa7,1) = 0;
659 normales_facettes_Cl(num_elem,fa7,2) = 0;
661 normales_facettes_Cl(num_elem,fa7,0) = 0;
662 normales_facettes_Cl(num_elem,fa7,1) = 0;
663 normales_facettes_Cl(num_elem,fa7,2) = 0;
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