MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fem_hexa8.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// fem_hexa8.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:54 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 #include "fem_hexa8.h"
26 #include "fem_maillage.h"
27 #include "fem_noeud.h"
28 #include "mg_element_maillage.h"
29 #include "ot_tenseur.h"
30 #include "ot_quadrature_gauss.h"
31 
32 
33 FEM_HEXA8::FEM_HEXA8(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,mai),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
34 {
36  tab[0]->get_lien_element3()->ajouter(this);
37  tab[1]->get_lien_element3()->ajouter(this);
38  tab[2]->get_lien_element3()->ajouter(this);
39  tab[3]->get_lien_element3()->ajouter(this);
40  tab[4]->get_lien_element3()->ajouter(this);
41  tab[5]->get_lien_element3()->ajouter(this);
42  tab[6]->get_lien_element3()->ajouter(this);
43  tab[7]->get_lien_element3()->ajouter(this);
45 }
46 
48 {
50  tab[0]->get_lien_element3()->ajouter(this);
51  tab[1]->get_lien_element3()->ajouter(this);
52  tab[2]->get_lien_element3()->ajouter(this);
53  tab[3]->get_lien_element3()->ajouter(this);
54  tab[4]->get_lien_element3()->ajouter(this);
55  tab[5]->get_lien_element3()->ajouter(this);
56  tab[6]->get_lien_element3()->ajouter(this);
57  tab[7]->get_lien_element3()->ajouter(this);
59 }
60 
61 FEM_HEXA8::FEM_HEXA8(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,topo),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
62 {
64  tab[0]->get_lien_element3()->ajouter(this);
65  tab[1]->get_lien_element3()->ajouter(this);
66  tab[2]->get_lien_element3()->ajouter(this);
67  tab[3]->get_lien_element3()->ajouter(this);
68  tab[4]->get_lien_element3()->ajouter(this);
69  tab[5]->get_lien_element3()->ajouter(this);
70  tab[6]->get_lien_element3()->ajouter(this);
71  tab[7]->get_lien_element3()->ajouter(this);
73 }
74 
76 {
78  tab[0]->get_lien_element3()->ajouter(this);
79  tab[1]->get_lien_element3()->ajouter(this);
80  tab[2]->get_lien_element3()->ajouter(this);
81  tab[3]->get_lien_element3()->ajouter(this);
82  tab[4]->get_lien_element3()->ajouter(this);
83  tab[5]->get_lien_element3()->ajouter(this);
84  tab[6]->get_lien_element3()->ajouter(this);
85  tab[7]->get_lien_element3()->ajouter(this);
87 }
88 
89 FEM_HEXA8::FEM_HEXA8(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,topo,mai),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
90 {
92  tab[0]->get_lien_element3()->ajouter(this);
93  tab[1]->get_lien_element3()->ajouter(this);
94  tab[2]->get_lien_element3()->ajouter(this);
95  tab[3]->get_lien_element3()->ajouter(this);
96  tab[4]->get_lien_element3()->ajouter(this);
97  tab[5]->get_lien_element3()->ajouter(this);
98  tab[6]->get_lien_element3()->ajouter(this);
99  tab[7]->get_lien_element3()->ajouter(this);
101 }
102 
104 {
106  tab[0]->get_lien_element3()->ajouter(this);
107  tab[1]->get_lien_element3()->ajouter(this);
108  tab[2]->get_lien_element3()->ajouter(this);
109  tab[3]->get_lien_element3()->ajouter(this);
110  tab[4]->get_lien_element3()->ajouter(this);
111  tab[5]->get_lien_element3()->ajouter(this);
112  tab[6]->get_lien_element3()->ajouter(this);
113  tab[7]->get_lien_element3()->ajouter(this);
115 }
116 
117 
118 
119 
121 {
123  tab[0]->get_lien_element3()->ajouter(this);
124  tab[1]->get_lien_element3()->ajouter(this);
125  tab[2]->get_lien_element3()->ajouter(this);
126  tab[3]->get_lien_element3()->ajouter(this);
127  tab[4]->get_lien_element3()->ajouter(this);
128  tab[5]->get_lien_element3()->ajouter(this);
129  tab[6]->get_lien_element3()->ajouter(this);
130  tab[7]->get_lien_element3()->ajouter(this);
132 }
134 {
135  if (liaison_topologique!=NULL)
137  tab[0]->get_lien_element3()->supprimer(this);
138  tab[1]->get_lien_element3()->supprimer(this);
139  tab[2]->get_lien_element3()->supprimer(this);
140  tab[3]->get_lien_element3()->supprimer(this);
141  tab[4]->get_lien_element3()->supprimer(this);
142  tab[5]->get_lien_element3()->supprimer(this);
143  tab[6]->get_lien_element3()->supprimer(this);
144  tab[7]->get_lien_element3()->supprimer(this);
146 }
147 
148 
150 {
151  FEM_NOEUD* tabnoeud[8];
152  tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
153  tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
154  tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
155  tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
156  tabnoeud[4]=femmai->get_fem_noeudid(tab[4]->get_id()+decalage);
157  tabnoeud[5]=femmai->get_fem_noeudid(tab[5]->get_id()+decalage);
158  tabnoeud[6]=femmai->get_fem_noeudid(tab[6]->get_id()+decalage);
159  tabnoeud[7]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
160  FEM_HEXA8* quad=new FEM_HEXA8(get_id()+decalage,maillage,tabnoeud);
161  femmai->ajouter_fem_element3(quad);
162  return quad;
163 }
165 {
166 voisin.vide();
167 if (no==tab[0])
168  {
169  voisin.ajouter(tab[1]);
170  voisin.ajouter(tab[3]);
171  voisin.ajouter(tab[4]);
172  }
173 if (no==tab[1])
174  {
175  voisin.ajouter(tab[0]);
176  voisin.ajouter(tab[2]);
177  voisin.ajouter(tab[5]);
178  }
179 if (no==tab[2])
180  {
181  voisin.ajouter(tab[1]);
182  voisin.ajouter(tab[3]);
183  voisin.ajouter(tab[6]);
184  }
185 if (no==tab[3])
186  {
187  voisin.ajouter(tab[0]);
188  voisin.ajouter(tab[2]);
189  voisin.ajouter(tab[7]);
190  }
191 if (no==tab[4])
192  {
193  voisin.ajouter(tab[0]);
194  voisin.ajouter(tab[5]);
195  voisin.ajouter(tab[7]);
196  }
197 if (no==tab[5])
198  {
199  voisin.ajouter(tab[1]);
200  voisin.ajouter(tab[4]);
201  voisin.ajouter(tab[6]);
202  }
203 if (no==tab[6])
204  {
205  voisin.ajouter(tab[2]);
206  voisin.ajouter(tab[5]);
207  voisin.ajouter(tab[7]);
208  }
209 if (no==tab[7])
210  {
211  voisin.ajouter(tab[3]);
212  voisin.ajouter(tab[4]);
213  voisin.ajouter(tab[6]);
214  }
215 }
216 
218 {
219 if (uvw[0]>=-1.-1e-10)
220  if (uvw[1]>=-1.-1e-10)
221  if (uvw[2]>=-1.-1e-10)
222  if (uvw[0]<=1.+1e-10)
223  if (uvw[1]<=1.+1e-10)
224  if (uvw[2]<=1.+1e-10)
225  return true;
226 return false;
227 }
228 
230 {
232 }
233 
235 {
237 }
238 
240 {
241  return 3;
242 }
243 
244 
245 
247 {
249 }
250 
252 {
254 }
255 
256 void FEM_HEXA8::change_noeud(int num,FEM_NOEUD* noeud)
257 {
259 }
260 
262 {
264 }
265 
266 
267 void FEM_HEXA8::enregistrer(std::ostream& o,double version)
268 {
269  if (maillage!=NULL)
270  if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_HEXA8($"<< get_lien_topologie()->get_id() << ",$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<< ");" << std::endl;
271  else o << "%" << get_id() << "=FEM_HEXA8(NULL,$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<<");" << std::endl;
272  else
273  if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_HEXA8($"<< get_lien_topologie()->get_id() << ",NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<< ");" << std::endl;
274  else o << "%" << get_id() << "=FEM_HEXA8(NULL,NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<<");" << std::endl;
275 
276 }
277 
278 
280 {
282 }
283 
284 void FEM_HEXA8::get_pt_gauss(int degre,int num,double &w,double *uvw)
285 {
286 return OT_POINTS_GAUSS::get_pt_gauss_hex_prod(degre,num,w,uvw);
287 }
288 
290 {
292 }
293 
295 {
296  return 8;
297 }
298 
300 {
301  return 3;
302 }
303 double FEM_HEXA8::get_fonction_interpolation(int num,double *uv)
304 {
305  double val;
306  double a1=1.+uv[0],a2=1.-uv[0];
307  double b1=1.+uv[1],b2=1.-uv[1];
308  double c1=1.+uv[2],c2=1.-uv[2];
309  switch (num)
310  {
311  case 1:
312  val=0.125*a2*b2*c2;
313  break;
314  case 2:
315  val=0.125*a1*b2*c2;
316  break;
317  case 3:
318  val=0.125*a1*b1*c2;
319  break;
320  case 4:
321  val=0.125*a2*b1*c2;
322  break;
323  case 5:
324  val=0.125*a2*b2*c1;
325  break;
326  case 6:
327  val=0.125*a1*b2*c1;
328  break;
329  case 7:
330  val=0.125*a1*b1*c1;
331  break;
332  case 8:
333  val=0.125*a2*b1*c1;
334  break;
335  }
336  return val;
337 }
338 
339 double FEM_HEXA8::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
340 {
341  double val;
342  double a1=1.+uv[0],a2=1.-uv[0];
343  double b1=1.+uv[1],b2=1.-uv[1];
344  double c1=1.+uv[2],c2=1.-uv[2];
345  switch (num)
346  {
347  case 1:
348  switch (num_variable)
349  {
350  case 1:
351  val=-0.125*b2*c2;
352  break;
353  case 2:
354  val=-0.125*a2*c2;
355  break;
356  case 3:
357  val=-0.125*a2*b2;
358  break;
359  } break;
360  case 2:
361  switch (num_variable)
362  {
363  case 1:
364  val=0.125*b2*c2;
365  break;
366  case 2:
367  val=-0.125*a1*c2;
368  break;
369  case 3:
370  val=-0.125*a1*b2;
371  break;
372  } break;
373  case 3:
374  switch (num_variable)
375  {
376  case 1:
377  val=0.125*b1*c2;
378  break;
379  case 2:
380  val=0.125*a1*c2;
381  break;
382  case 3:
383  val=-0.125*a1*b1;
384  break;
385  } break;
386  case 4:
387  switch (num_variable)
388  {
389  case 1:
390  val=-0.125*b1*c2;
391  break;
392  case 2:
393  val=0.125*a2*c2;
394  break;
395  case 3:
396  val=-0.125*a2*b1;
397  break;
398  } break;
399  case 5:
400  switch (num_variable)
401  {
402  case 1:
403  val=-0.125*b2*c1;
404  break;
405  case 2:
406  val=-0.125*a2*c1;
407  break;
408  case 3:
409  val=0.125*a2*b2;
410  break;
411  } break;
412  case 6:
413  switch (num_variable)
414  {
415  case 1:
416  val=0.125*b2*c1;
417  break;
418  case 2:
419  val=-0.125*a1*c1;
420  break;
421  case 3:
422  val=0.125*a1*b2;
423  break;
424  } break;
425  case 7:
426  switch (num_variable)
427  {
428  case 1:
429  val=0.125*b1*c1;
430  break;
431  case 2:
432  val=0.125*a1*c1;
433  break;
434  case 3:
435  val=0.125*a1*b1;
436  break;
437  } break;
438  case 8:
439  switch (num_variable)
440  {
441  case 1:
442  val=-0.125*b1*c1;
443  break;
444  case 2:
445  val=0.125*a2*c1;
446  break;
447  case 3:
448  val=0.125*a2*b1;
449  break;
450  } break;
451  }
452  return val;
453 }
454 
455 
456 
457 
459 {
460 return 0;
461 }
FEM_HEXA8::dupliquer
virtual FEM_ELEMENT_MAILLAGE * dupliquer(class FEM_MAILLAGE *femmai, long decalage)
Definition: fem_hexa8.cpp:149
fem_hexa8.h
MAGIC::TYPE_ENTITE::IDFEM_HEXA8
@ IDFEM_HEXA8
Definition: mg_definition.h:70
gestionversion.h
FEM_HEXA8::get_fonction_derive_interpolation
virtual double get_fonction_derive_interpolation(int num, int numvariable, double *uv)
Definition: fem_hexa8.cpp:339
FEM_NOEUD::get_lien_petit_element3
TPL_LISTE_ENTITE< class FEM_ELEMENT3 * > * get_lien_petit_element3(void)
Definition: fem_noeud.cpp:423
OT_POINTS_GAUSS::get_nb_point_hexa_prod
static int get_nb_point_hexa_prod(int degre)
Definition: ot_quadrature_gauss.cpp:179
FEM_HEXA8::get_fonction_interpolation
virtual double get_fonction_interpolation(int num, double *uv)
Definition: fem_hexa8.cpp:303
FEM_HEXA8::get_nb_fonction_interpolation
virtual int get_nb_fonction_interpolation(void)
Definition: fem_hexa8.cpp:294
FEM_HEXA8::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)
Definition: fem_hexa8.cpp:246
FEM_TEMPLATE_ELEMENT::get_boite_3D
virtual BOITE_3D & get_boite_3D(void)
Definition: fem_template_element.cpp:127
FEM_HEXA8::get_type_entite
virtual int get_type_entite(void)
Definition: fem_hexa8.cpp:234
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
fem_maillage.h
FEM_HEXA8::FEM_HEXA8
FEM_HEXA8(unsigned long num, class MG_ELEMENT_MAILLAGE *mai, class FEM_NOEUD **tabnoeud)
Definition: fem_hexa8.cpp:33
fem_noeud.h
MG_ELEMENT_MAILLAGE
Definition: mg_element_maillage.h:38
FEM_HEXA8::get_fem_noeud
virtual FEM_NOEUD * get_fem_noeud(int num)
Definition: fem_hexa8.cpp:251
FEM_HEXA8::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: fem_hexa8.cpp:267
FEM_ELEMENT_MAILLAGE::get_lien_topologie
virtual class MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: fem_element_maillage.cpp:89
FEM_ELEMENT3
Definition: fem_element3.h:34
MG_ELEMENT_TOPOLOGIQUE::get_dimension
virtual int get_dimension(void)=0
mg_element_maillage.h
FEM_HEXA8::verifie_validite_decoupage_xfem
virtual int verifie_validite_decoupage_xfem(double *vol=NULL)
Definition: fem_hexa8.cpp:458
FEM_ELEMENT_MAILLAGE::liaison_topologique
class MG_ELEMENT_TOPOLOGIQUE * liaison_topologique
Definition: fem_element_maillage.h:73
FEM_HEXA8::get_pt_gauss
virtual void get_pt_gauss(int degre, int num, double &w, double *uvw)
Definition: fem_hexa8.cpp:284
OT_POINTS_GAUSS::get_pt_gauss_hex_prod
static void get_pt_gauss_hex_prod(int degre, int num, double &w, double *uvw)
Definition: ot_quadrature_gauss.cpp:441
FEM_MAILLAGE::get_fem_noeudid
FEM_NOEUD * get_fem_noeudid(unsigned long num)
Definition: fem_maillage.cpp:150
FEM_TEMPLATE_ELEMENT::get_fem_noeud
virtual FEM_NOEUD * get_fem_noeud(int num)
Definition: fem_template_element.cpp:100
FEM_HEXA8::valide_parametre_EF
virtual bool valide_parametre_EF(double *uvw)
Definition: fem_hexa8.cpp:217
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
FEM_HEXA8::change_noeud
virtual void change_noeud(int num, FEM_NOEUD *noeud)
Definition: fem_hexa8.cpp:256
FEM_HEXA8::get_dimension
virtual int get_dimension(void)
Definition: fem_hexa8.cpp:239
FEM_HEXA8::~FEM_HEXA8
virtual ~FEM_HEXA8()
Definition: fem_hexa8.cpp:133
FEM_ELEMENT_MAILLAGE
Definition: fem_element_maillage.h:35
FEM_TEMPLATE_ELEMENT::change_noeud
virtual void change_noeud(int num, FEM_NOEUD *noeud)
Definition: fem_template_element.cpp:106
FEM_MAILLAGE
Definition: fem_maillage.h:66
FEM_HEXA8
Definition: fem_hexa8.h:35
FEM_NOEUD::get_lien_element3
TPL_LISTE_ENTITE< class FEM_ELEMENT3 * > * get_lien_element3(void)
Definition: fem_noeud.cpp:417
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
FEM_HEXA8::reinit_boite_3D
virtual void reinit_boite_3D(void)
Definition: fem_hexa8.cpp:229
FEM_TEMPLATE_ELEMENT< 8 >::get_fem_noeudpetitid
virtual FEM_NOEUD * get_fem_noeudpetitid(void)
Definition: fem_template_element.cpp:111
FEM_HEXA8::get_degre_gauss
virtual int get_degre_gauss(int num)
Definition: fem_hexa8.cpp:289
FEM_HEXA8::get_nb_pt_gauss
virtual int get_nb_pt_gauss(int degre)
Definition: fem_hexa8.cpp:279
FEM_NOEUD
Definition: fem_noeud.h:35
TPL_LISTE_ENTITE::vide
virtual void vide(void)
Definition: tpl_liste_entite.h:77
ot_tenseur.h
BOITE_3D
Definition: ot_boite_3d.h:27
FEM_TEMPLATE_ELEMENT::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)
Definition: fem_template_element.cpp:94
FEM_ELEMENT_MAILLAGE::maillage
class MG_ELEMENT_MAILLAGE * maillage
Definition: fem_element_maillage.h:72
FEM_TEMPLATE_ELEMENT< 8 >::tab
FEM_NOEUD * tab[N]
Definition: fem_template_element.h:57
MG_ELEMENT_TOPOLOGIQUE::get_lien_fem_maillage
virtual TPL_LISTE_ENTITE< FEM_ELEMENT_MAILLAGE * > * get_lien_fem_maillage(void)
Definition: mg_element_topologique.cpp:67
FEM_HEXA8::get_voisin_noeud
virtual void get_voisin_noeud(class FEM_NOEUD *no, TPL_LISTE_ENTITE< FEM_NOEUD * > &voisin)
Definition: fem_hexa8.cpp:164
TPL_LISTE_ENTITE
Definition: tpl_liste_entite.h:32
FEM_HEXA8::get_degremax_fonction_interpolation
virtual int get_degremax_fonction_interpolation(void)
Definition: fem_hexa8.cpp:299
FEM_TEMPLATE_ELEMENT::reinit_boite_3D
virtual void reinit_boite_3D(void)
Definition: fem_template_element.cpp:57
ot_quadrature_gauss.h
TPL_LISTE_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_liste_entite.h:42
FEM_MAILLAGE::ajouter_fem_element3
int ajouter_fem_element3(FEM_ELEMENT3 *femelement3)
Definition: fem_maillage.cpp:580
FEM_HEXA8::get_boite_3D
virtual BOITE_3D & get_boite_3D(void)
Definition: fem_hexa8.cpp:261
OT_POINTS_GAUSS::get_degre_gauss_hexa_prod
static int get_degre_gauss_hexa_prod(int num)
Definition: ot_quadrature_gauss.cpp:187
FEM_TEMPLATE_ELEMENT
Definition: fem_template_element.h:35