56 const IntTab& tab_Face_sommets,
57 const IntTab& tab_Face_voisins,
58 const IntTab& tab_elem_faces,
59 const Domaine& domaine_geom)
const
63 CIntTabView Face_sommets = tab_Face_sommets.
view_ro();
64 CIntTabView Face_voisins = tab_Face_voisins.
view_ro();
65 CIntTabView elem_faces = tab_elem_faces.
view_ro();
66 DoubleTabView Face_normales = tab_Face_normales.
view_rw();
67 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(0, nb_face_tot), KOKKOS_LAMBDA(
const int num_Face)
69 int n0 = Face_sommets(num_Face, 0);
70 int n1 = Face_sommets(num_Face, 1);
71 int n2 = Face_sommets(num_Face, 2);
73 double x1 = les_coords(n0, 0) - les_coords(n1, 0);
74 double y1 = les_coords(n0, 1) - les_coords(n1, 1);
75 double z1 = les_coords(n0, 2) - les_coords(n1, 2);
77 double x2 = les_coords(n2, 0) - les_coords(n1, 0);
78 double y2 = les_coords(n2, 1) - les_coords(n1, 1);
79 double z2 = les_coords(n2, 2) - les_coords(n1, 2);
81 double nx = (y1 * z2 - y2 * z1) / 2;
82 double ny = (-x1 * z2 + x2 * z1) / 2;
83 double nz = (x1 * y2 - x2 * y1) / 2;
87 int elem1 = Face_voisins(num_Face, 0);
88 int f0 = elem_faces(elem1, 0);
90 f0 = elem_faces(elem1, 1);
92 int no4 = Face_sommets(f0, 0);
93 if (no4 == n0 || no4 == n1 || no4 == n2)
95 no4 = Face_sommets(f0, 1);
96 if (no4 == n0 || no4 == n1 || no4 == n2)
97 no4 = Face_sommets(f0, 2);
100 x1 = les_coords(no4, 0) - les_coords(n0, 0);
101 y1 = les_coords(no4, 1) - les_coords(n0, 1);
102 z1 = les_coords(no4, 2) - les_coords(n0, 2);
104 double sign = ((nx * x1 + ny * y1 + nz * z1) > 0) ? -1. : 1.;
105 Face_normales(num_Face, 0) = sign * nx;
106 Face_normales(num_Face, 1) = sign * ny;
107 Face_normales(num_Face, 2) = sign * nz;
109 end_gpu_timer(__KERNEL_NAME__);
116 const IntVect& tab_rang_elem_non_std)
const
118 const Domaine& domaine_geom = dom_VEF.
domaine();
119 auto& facette_normales =
const_cast<Domaine_VEF&
>(dom_VEF).facette_normales();
122 if (facette_normales.dimension(0) != nb_elem_tot)
123 facette_normales.resize(nb_elem_tot,6,3);
127 CIntArrView rang_elem_non_std = tab_rang_elem_non_std.view_ro();
128 CIntTabView
KEL =
KEL_.view_ro();
129 DoubleTabView3 facette_normale = facette_normales.view_rw<3>();
130 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(0, nb_elem_tot), KOKKOS_LAMBDA(
const int i)
132 if (rang_elem_non_std(i) == -1)
136 num_som[0] = les_Polys(i, 0);
137 num_som[1] = les_Polys(i, 1);
138 num_som[2] = les_Polys(i, 2);
139 num_som[3] = les_Polys(i, 3);
140 for (
int s = 0; s < 4; s++)
141 for (
int d = 0; d < 3; d++)
142 x[s][d] = les_coords(num_som[s], d);
144 xg[0] = 0.25*(x[0][0]+x[1][0]+x[2][0]+x[3][0]);
145 xg[1] = 0.25*(x[0][1]+x[1][1]+x[2][1]+x[3][1]);
146 xg[2] = 0.25*(x[0][2]+x[1][2]+x[2][2]+x[3][2]);
147 for (
int fa7 = 0; fa7 < 6; fa7++)
150 double u[3], v[3], pv[3], xj0[3];
151 u[0] = x[
KEL(2,fa7)][0]-xg[0];
152 u[1] = x[
KEL(2,fa7)][1]-xg[1];
153 u[2] = x[
KEL(2,fa7)][2]-xg[2];
154 v[0] = x[
KEL(3,fa7)][0]-xg[0];
155 v[1] = x[
KEL(3,fa7)][1]-xg[1];
156 v[2] = x[
KEL(3,fa7)][2]-xg[2];
158 pv[0] = u[1]*v[2]-u[2]*v[1];
159 pv[1] = u[2]*v[0]-u[0]*v[2];
160 pv[2] = u[0]*v[1]-u[1]*v[0];
162 xj0[0] = x[
KEL(0,fa7)][0]-x[
KEL(1,fa7)][0];
163 xj0[1] = x[
KEL(0,fa7)][1]-x[
KEL(1,fa7)][1];
164 xj0[2] = x[
KEL(0,fa7)][2]-x[
KEL(1,fa7)][2];
165 double psc = xj0[0]*pv[0]+xj0[1]*pv[1]+xj0[2]*pv[2];
166 double sign = (psc < 0) ? -0.5 : 0.5;
167 facette_normale(i,fa7,0) = sign*pv[0];
168 facette_normale(i,fa7,1) = sign*pv[1];
169 facette_normale(i,fa7,2) = sign*pv[2];
173 end_gpu_timer(__KERNEL_NAME__);
230 DoubleVect& volumes_entrelaces_Cl,
235 const IntTab& elem_faces = le_dom_VEF.
elem_faces();
243 Cerr <<
"Tetra_VEF::modif_volumes_entrelaces() type 0 not possible!\n";
249 vol_mod = volumes_entrelaces[j]/3 ;
250 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
251 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
252 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
258 vol_mod = volumes_entrelaces[j]/3 ;
259 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
260 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
261 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
267 vol_mod = volumes_entrelaces[j]/3 ;
268 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
269 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
270 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
276 vol_mod = volumes_entrelaces[j]/3 ;
277 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
278 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
279 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
285 vol_mod = (volumes_entrelaces[elem_faces(elem,2)]
286 + volumes_entrelaces[elem_faces(elem,3)])/2;
287 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
288 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
294 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
295 + volumes_entrelaces[elem_faces(elem,3)])/2;
296 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
297 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
303 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
304 + volumes_entrelaces[elem_faces(elem,2)])/2;
305 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
306 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
312 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
313 + volumes_entrelaces[elem_faces(elem,3)])/2;
314 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
315 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
321 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
322 + volumes_entrelaces[elem_faces(elem,2)])/2;
323 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
324 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
330 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
331 + volumes_entrelaces[elem_faces(elem,1)])/2;
332 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
333 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
341 vol_mod = volumes_entrelaces[elem_faces(elem,1)]
342 + volumes_entrelaces[elem_faces(elem,2)]
343 + volumes_entrelaces[elem_faces(elem,3)];
344 volumes_entrelaces_Cl[elem_faces(elem,0)] += vol_mod;
350 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
351 + volumes_entrelaces[elem_faces(elem,2)]
352 + volumes_entrelaces[elem_faces(elem,3)];
353 volumes_entrelaces_Cl[elem_faces(elem,1)] += vol_mod;
360 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
361 + volumes_entrelaces[elem_faces(elem,1)]
362 + volumes_entrelaces[elem_faces(elem,3)];
363 volumes_entrelaces_Cl[elem_faces(elem,2)] += vol_mod;
369 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
370 + volumes_entrelaces[elem_faces(elem,1)]
371 + volumes_entrelaces[elem_faces(elem,2)];
372 volumes_entrelaces_Cl[elem_faces(elem,3)] += vol_mod;
377 Cerr <<
"\n unknown type in Tetra_VEF::modif_volumes_entrelaces: " << type_cl;
386 DoubleVect& volumes_entrelaces_Cl,
391 const IntTab& elem_faces = le_dom_VEF.
elem_faces();
394 int nb_faces_cl = volumes_entrelaces_Cl.
size();
401 Cerr <<
"Tetra_VEF::modif_volumes_entrelaces() type 0 not possible!\n";
407 vol_mod = volumes_entrelaces[j]/3 ;
408 face=elem_faces(elem,0);
410 volumes_entrelaces_Cl[face] += vol_mod;
411 face=elem_faces(elem,1);
413 volumes_entrelaces_Cl[face] += vol_mod;
414 face=elem_faces(elem,2);
416 volumes_entrelaces_Cl[face] += vol_mod;
422 vol_mod = volumes_entrelaces[j]/3 ;
423 face=elem_faces(elem,0);
425 volumes_entrelaces_Cl[face] += vol_mod;
426 face=elem_faces(elem,1);
428 volumes_entrelaces_Cl[face] += vol_mod;
429 face=elem_faces(elem,3);
431 volumes_entrelaces_Cl[face] += vol_mod;
437 vol_mod = volumes_entrelaces[j]/3 ;
438 face=elem_faces(elem,0);
440 volumes_entrelaces_Cl[face] += vol_mod;
441 face=elem_faces(elem,2);
443 volumes_entrelaces_Cl[face] += vol_mod;
444 face=elem_faces(elem,3);
446 volumes_entrelaces_Cl[face] += vol_mod;
452 vol_mod = volumes_entrelaces[j]/3 ;
453 face=elem_faces(elem,1);
455 volumes_entrelaces_Cl[face] += vol_mod;
456 face=elem_faces(elem,2);
458 volumes_entrelaces_Cl[face] += vol_mod;
459 face=elem_faces(elem,3);
461 volumes_entrelaces_Cl[face] += vol_mod;
467 vol_mod = (volumes_entrelaces[elem_faces(elem,2)]
468 + volumes_entrelaces[elem_faces(elem,3)])/2;
469 face=elem_faces(elem,0);
471 volumes_entrelaces_Cl[face] += vol_mod;
472 face=elem_faces(elem,1);
474 volumes_entrelaces_Cl[face] += vol_mod;
480 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
481 + volumes_entrelaces[elem_faces(elem,3)])/2;
482 face=elem_faces(elem,0);
484 volumes_entrelaces_Cl[face] += vol_mod;
485 face=elem_faces(elem,2);
487 volumes_entrelaces_Cl[face] += vol_mod;
493 vol_mod = (volumes_entrelaces[elem_faces(elem,1)]
494 + volumes_entrelaces[elem_faces(elem,2)])/2;
495 face=elem_faces(elem,0);
497 volumes_entrelaces_Cl[face] += vol_mod;
498 face=elem_faces(elem,3);
500 volumes_entrelaces_Cl[face] += vol_mod;
506 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
507 + volumes_entrelaces[elem_faces(elem,3)])/2;
508 face=elem_faces(elem,1);
510 volumes_entrelaces_Cl[face] += vol_mod;
511 face=elem_faces(elem,2);
513 volumes_entrelaces_Cl[face] += vol_mod;
519 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
520 + volumes_entrelaces[elem_faces(elem,2)])/2;
521 face=elem_faces(elem,1);
523 volumes_entrelaces_Cl[face] += vol_mod;
524 face=elem_faces(elem,3);
526 volumes_entrelaces_Cl[face] += vol_mod;
532 vol_mod = (volumes_entrelaces[elem_faces(elem,0)]
533 + volumes_entrelaces[elem_faces(elem,1)])/2;
534 face=elem_faces(elem,2);
536 volumes_entrelaces_Cl[face] += vol_mod;
537 face=elem_faces(elem,3);
539 volumes_entrelaces_Cl[face] += vol_mod;
547 vol_mod = volumes_entrelaces[elem_faces(elem,1)]
548 + volumes_entrelaces[elem_faces(elem,2)]
549 + volumes_entrelaces[elem_faces(elem,3)];
550 face=elem_faces(elem,0);
552 volumes_entrelaces_Cl[face] += vol_mod;
558 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
559 + volumes_entrelaces[elem_faces(elem,2)]
560 + volumes_entrelaces[elem_faces(elem,3)];
561 face=elem_faces(elem,1);
563 volumes_entrelaces_Cl[face] += vol_mod;
570 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
571 + volumes_entrelaces[elem_faces(elem,1)]
572 + volumes_entrelaces[elem_faces(elem,3)];
573 face=elem_faces(elem,2);
575 volumes_entrelaces_Cl[face] += vol_mod;
581 vol_mod = volumes_entrelaces[elem_faces(elem,0)]
582 + volumes_entrelaces[elem_faces(elem,1)]
583 + volumes_entrelaces[elem_faces(elem,2)];
584 face=elem_faces(elem,3);
586 volumes_entrelaces_Cl[face] += vol_mod;
591 Cerr <<
"\n unknown type in Tetra_VEF::modif_volumes_entrelaces: " << type_cl;
630 int fa7,
int num_elem,
int idirichlet,
631 int n1,
int n2,
int n3)
const
645 normales_facettes_Cl(num_elem,fa7,0) = 0;
646 normales_facettes_Cl(num_elem,fa7,1) = 0;
647 normales_facettes_Cl(num_elem,fa7,2) = 0;
654 normales_facettes_Cl(num_elem,fa7,0) = 0;
655 normales_facettes_Cl(num_elem,fa7,1) = 0;
656 normales_facettes_Cl(num_elem,fa7,2) = 0;
658 normales_facettes_Cl(num_elem,fa7,0) = 0;
659 normales_facettes_Cl(num_elem,fa7,1) = 0;
660 normales_facettes_Cl(num_elem,fa7,2) = 0;
662 normales_facettes_Cl(num_elem,fa7,0) = 0;
663 normales_facettes_Cl(num_elem,fa7,1) = 0;
664 normales_facettes_Cl(num_elem,fa7,2) = 0;
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.