TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Hexaedre.cpp
1/****************************************************************************
2* Copyright (c) 2025, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Hexaedre.h>
17#include <Domaine.h>
18
19// Convention de numerotation
20// sommets faces 5(face z=1)
21// 6------7 *------*
22// /| /| /| 4 /|
23// 2------3 | *------* |
24// | | | | |0| |3|
25// | 4----|-5 | *----|-*
26// |/ |/ |/ 1 |/
27// 0------1 *------*
28// 2(face z=0)
29static int faces_sommets_hexa[6][4] =
30{
31 { 0, 2, 4, 6 },
32 { 0, 1, 4, 5 },
33 { 0, 1, 2, 3 },
34 { 1, 3, 5, 7 },
35 { 2, 3, 6, 7 },
36 { 4, 5, 6, 7 }
37};
38
39Implemente_instanciable_32_64(Hexaedre_32_64,"Hexaedre",Elem_geom_base_32_64<_T_>);
40
41
42/*! @brief NE FAIT RIEN
43 *
44 * @param (Sortie& s) un flot de sortie
45 * @return (Sortie&) le flot de sortie
46 */
47template <typename _SIZE_>
49{
50 return s;
51}
52
53
54/*! @brief NE FAIT RIEN
55 *
56 * @param (Entree& s) un flot d'entree
57 * @return (Entree&) le flot d'entree
58 */
59template <typename _SIZE_>
61{
62 return s;
63}
64
65/*! @brief Reordonne les sommets de l'hexaedre
66 */
67template <typename _SIZE_>
69{
70 if (this->reordonner_elem()==-1)
71 {
72 Cerr << "This mesh is not composed of regular hexahedra\n";
73 Cerr << "This seems to be VEF hexahedra (Hexaedre_VEF)\n";
74 Cerr << "Check your mesh." << finl;
76 }
77}
78
79/*! @brief Reordonne les sommets de l'hexaedre
80 *
81 */
82template <typename _SIZE_>
84{
85 Domaine_t& domaine = this->mon_dom.valeur();
86 const DoubleTab_t& dom_coord = domaine.les_sommets();
87 IntTab_t& elem = domaine.les_elems();
88 SmallArrOfTID_t S(8);
89 SmallArrOfTID_t NS(8);
90 double coord[8][3];
91 double xmin[3];
92 const int_t nb_elem = domaine.nb_elem();
93 const int delta[3] = {1, 2, 4};
94 trustIdType changed_count = 0;
95
96 for (int_t num_poly = 0; num_poly < nb_elem; num_poly++)
97 {
98 xmin[0] = xmin[1] = xmin[2] = 1e40;
99 for(int i=0; i<8; i++)
100 {
101 int_t s = elem(num_poly,i);
102 S[i] = s;
103 NS[i] = -1;
104 for(int j=0; j<3; j++)
105 {
106 double x = dom_coord(s, j);
107 coord[i][j] = x;
108 if (x < xmin[j])
109 xmin[j] = x;
110 }
111 }
112
113 // Pour chaque sommet, chercher rang dans l'element
114 // en fonction de ses coordonnees
115 for (int i=0; i<8; i++)
116 {
117 int num_sommet = 0;
118 for (int j=0; j<3; j++)
119 {
120 double x = coord[i][j];
121 if (!est_egal(x, xmin[j]))
122 num_sommet += delta[j];
123 }
124 if (NS[num_sommet] == -1)
125 NS[num_sommet] = S[i];
126 else
127 return -1;
128 }
129 // Est ce bien un hexaedre regulier ?
130 if (min_array(NS)==-1)
131 return -1;
132 // Tous les sommets ont-ils ete trouves ?
133 int updated = 0;
134 for(int i=0; i<8; i++)
135 {
136 if (S[i] != NS[i])
137 updated = 1;
138 elem(num_poly, i) = NS[i];
139 }
140 if (updated)
141 changed_count++;
142 }
143 changed_count = Process::mp_sum(changed_count);
145 Cerr << "Hexaedre_32_64<_SIZE_>::reordonner : " << changed_count << " elements reversed" << finl;
146 return 0;
147}
148
149/*! @brief Renvoie le nom LML d'un triangle = "VOXEL8".
150 *
151 * @return (Nom&) toujours egal a "VOXEL8"
152 */
153template <typename _SIZE_>
155{
156 static Nom nom="VOXEL8";
157 return nom;
158}
159
160
161/*! @brief Renvoie 1 si l'element "elemen" du domaine associe a l'element geometrique contient le point
162 *
163 * de coordonnees specifiees par le parametre "pos".
164 * Renvoie 0 sinon.
165 *
166 * @param (DoubleVect& pos) coordonnees du point que l'on cherche a localiser
167 * @param (int element) le numero de l'element du domaine dans lequel on cherche le point.
168 * @return (int) 1 si le point de coordonnees specifiees appartient a l'element "element" 0 sinon
169 */
170template <typename _SIZE_>
171int Hexaedre_32_64<_SIZE_>::contient(const ArrOfDouble& pos, int_t element ) const
172{
173 assert(pos.size_array()==3);
174 const Domaine_t& dom=this->mon_dom.valeur();
175 int_t som0 = dom.sommet_elem(element,0),
176 som7 = dom.sommet_elem(element,7);
177 if ( inf_ou_egal(dom.coord(som0,0),pos[0]) && inf_ou_egal(pos[0],dom.coord(som7,0))
178 && inf_ou_egal(dom.coord(som0,1),pos[1]) && inf_ou_egal(pos[1],dom.coord(som7,1))
179 && inf_ou_egal(dom.coord(som0,2),pos[2]) && inf_ou_egal(pos[2],dom.coord(som7,2)) )
180 return 1;
181 else
182 return 0;
183}
184
185
186/*! @brief Renvoie 1 si les sommets specifies par le parametre "pos" sont les sommets de l'element "element" du domaine associe a
187 *
188 * l'element geometrique.
189 *
190 * @param (IntVect& pos) les numeros des sommets a comparer avec ceux de l'elements "element"
191 * @param (int element) le numero de l'element du domaine dont on veut comparer les sommets
192 * @return (int) 1 si les sommets passes en parametre sont ceux de l'element specifie, 0 sinon
193 */
194template <typename _SIZE_>
196{
197 const Domaine_t& domaine=this->mon_dom.valeur();
198 if((domaine.sommet_elem(element,0)==som[0])&&
199 (domaine.sommet_elem(element,1)==som[1])&&
200 (domaine.sommet_elem(element,2)==som[2])&&
201 (domaine.sommet_elem(element,3)==som[3])&&
202 (domaine.sommet_elem(element,4)==som[4])&&
203 (domaine.sommet_elem(element,5)==som[5])&&
204 (domaine.sommet_elem(element,6)==som[6])&&
205 (domaine.sommet_elem(element,7)==som[7]))
206 return 1;
207 else
208 return 0;
209}
210
211/*! @brief Calcule les volumes des elements du domaine associe.
212 *
213 * @param (DoubleVect& volumes) le vecteur contenant les valeurs des des volumes des elements du domaine
214 */
215template <typename _SIZE_>
217{
218 const Domaine_t& domaine=this->mon_dom.valeur();
219 double dx,dy,dz;
220 int_t S1,S2,S3,S4;
221
222 int_t size_tot = domaine.nb_elem_tot();
223 assert(volumes.size_totale()==size_tot);
224 for (int_t num_poly=0; num_poly<size_tot; num_poly++)
225 {
226 S1 = domaine.sommet_elem(num_poly,0);
227 S2 = domaine.sommet_elem(num_poly,1);
228 S3 = domaine.sommet_elem(num_poly,2);
229 S4 = domaine.sommet_elem(num_poly,4);
230 dx = domaine.coord(S2,0) - domaine.coord(S1,0);
231 dy = domaine.coord(S3,1) - domaine.coord(S1,1);
232 dz = domaine.coord(S4,2) - domaine.coord(S1,2);
233 volumes[num_poly]= dx*dy*dz;
234 }
235}
236
237/*! @brief Calcule les normales aux faces des elements du domaine associe.
238 *
239 * @param (IntTab& face_sommets) les numeros des sommets des faces dans la liste des sommets du domaine associe
240 * @param (DoubleTab& face_normales)
241 */
242template <typename _SIZE_>
243void Hexaedre_32_64<_SIZE_>::calculer_normales(const IntTab_t& Face_sommets, DoubleTab_t& face_normales) const
244{
245 const Domaine_t& domaine_geom = this->mon_dom.valeur();
246 const DoubleTab_t& les_coords = domaine_geom.coord_sommets();
247 int_t nbfaces = Face_sommets.dimension(0);
248 double x1,y1,z1,x2,y2,z2;
249 int_t n0,n1,n2;
250 for (int numface=0; numface<nbfaces; numface++)
251 {
252
253 n0 = Face_sommets(numface,0);
254 n1 = Face_sommets(numface,1);
255 n2 = Face_sommets(numface,2);
256
257 x1 = les_coords(n0,0) - les_coords(n1,0);
258 y1 = les_coords(n0,1) - les_coords(n1,1);
259 z1 = les_coords(n0,2) - les_coords(n1,2);
260
261 x2 = les_coords(n2,0) - les_coords(n1,0);
262 y2 = les_coords(n2,1) - les_coords(n1,1);
263 z2 = les_coords(n2,2) - les_coords(n1,2);
264
265 face_normales(numface,0) = (y1*z2 - y2*z1);
266 face_normales(numface,1) = (-x1*z2 + x2*z1);
267 face_normales(numface,2) = (x1*y2 - x2*y1);
268 }
269}
270
271
272/*! @brief voir ElemGeomBase::get_tab_faces_sommets_locaux
273 *
274 */
275template <typename _SIZE_>
277{
278 faces_som_local.resize(6,4);
279 for (int i=0; i<6; i++)
280 for (int j=0; j<4; j++)
281 faces_som_local(i,j) = faces_sommets_hexa[i][j];
282 return 1;
283}
284
285/*! @brief Renvoie le numero du j-ieme sommet de la i-ieme face de l'element.
286 *
287 * @param (int i) un numero de face
288 * @param (int j) un numero de sommet
289 * @return (int) le numero du j-ieme sommet de la i-ieme face
290 */
291template <typename _SIZE_>
293{
294 assert(i<6);
295 switch(i)
296 {
297 case 0:
298 return face_sommet0(j);
299 case 1:
300 return face_sommet1(j);
301 case 2:
302 return face_sommet2(j);
303 case 3:
304 return face_sommet3(j);
305 case 4:
306 return face_sommet4(j);
307 case 5:
308 return face_sommet5(j);
309 default :
310 return -1;
311 }
312}
313
314
315template class Hexaedre_32_64<int>;
316#if INT_is_64_ == 2
317template class Hexaedre_32_64<trustIdType>;
318#endif
319
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
double coord(int_t i, int j) const
Definition Domaine.h:110
int_t sommet_elem(int_t i, int j) const
Renvoie le numero (global) du j-ieme sommet du i-ieme element.
Definition Domaine.h:136
Classe Elem_geom_base Cette classe est la classe de base pour la definition d'elements.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Classe Hexaedre Cette represente un element geometrique a 6 faces, 8 sommets et.
Definition Hexaedre.h:29
int reordonner_elem()
Reordonne les sommets de l'hexaedre.
Definition Hexaedre.cpp:83
void calculer_normales(const IntTab_t &faces_sommets, DoubleTab_t &face_normales) const override
Calcule les normales aux faces des elements du domaine associe.
Definition Hexaedre.cpp:243
int contient(const ArrOfDouble &pos, int_t elem) const override
Renvoie 1 si l'element "elemen" du domaine associe a l'element geometrique contient le point.
Definition Hexaedre.cpp:171
DoubleVect_T< _SIZE_ > DoubleVect_t
Definition Hexaedre.h:37
int face_sommet1(int i) const
Renvoie le numero du i-ieme sommet de la face 1.
Definition Hexaedre.h:114
_SIZE_ int_t
Definition Hexaedre.h:34
int face_sommet(int i, int j) const override
Renvoie le numero du j-ieme sommet de la i-ieme face de l'element.
Definition Hexaedre.cpp:292
int face_sommet2(int i) const
Renvoie le numero du i-ieme sommet de la face 2.
Definition Hexaedre.h:132
int face_sommet0(int i) const
Renvoie le numero du i-ieme sommet de la face 0.
Definition Hexaedre.h:96
void calculer_volumes(DoubleVect_t &vols) const override
Calcule les volumes des elements du domaine associe.
Definition Hexaedre.cpp:216
int face_sommet4(int i) const
Renvoie le numero du i-ieme sommet de la face 4.
Definition Hexaedre.h:168
int get_tab_faces_sommets_locaux(IntTab &faces_som_local) const override
voir ElemGeomBase::get_tab_faces_sommets_locaux
Definition Hexaedre.cpp:276
Domaine_32_64< _SIZE_ > Domaine_t
Definition Hexaedre.h:39
const Nom & nom_lml() const override
Renvoie le nom LML d'un triangle = "VOXEL8".
Definition Hexaedre.cpp:154
int face_sommet5(int i) const
Renvoie le numero du i-ieme sommet de la face 5.
Definition Hexaedre.h:186
void reordonner() override
Reordonne les sommets de l'hexaedre.
Definition Hexaedre.cpp:68
SmallArrOfTID_T< _SIZE_ > SmallArrOfTID_t
Definition Hexaedre.h:36
DoubleTab_T< _SIZE_ > DoubleTab_t
Definition Hexaedre.h:38
int face_sommet3(int i) const
Renvoie le numero du i-ieme sommet de la face 3.
Definition Hexaedre.h:150
IntTab_T< _SIZE_ > IntTab_t
Definition Hexaedre.h:35
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
Definition Process.cpp:146
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size_array() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size_totale() const
Definition TRUSTVect.tpp:61