MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fem_quadrangle8.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_quadrangle8.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_quadrangle8.h"
26 #include "fem_maillage.h"
27 #include "fem_noeud.h"
28 #include "mg_element_maillage.h"
29 #include "ot_quadrature_gauss.h"
30 
31 
32 FEM_QUADRANGLE8::FEM_QUADRANGLE8(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,mai),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
33 {
35  tab[0]->get_lien_element2()->ajouter(this);
36  tab[1]->get_lien_element2()->ajouter(this);
37  tab[2]->get_lien_element2()->ajouter(this);
38  tab[3]->get_lien_element2()->ajouter(this);
39  tab[4]->get_lien_element2()->ajouter(this);
40  tab[5]->get_lien_element2()->ajouter(this);
41  tab[6]->get_lien_element2()->ajouter(this);
42  tab[7]->get_lien_element2()->ajouter(this);
44 }
45 
47 {
49  tab[0]->get_lien_element2()->ajouter(this);
50  tab[1]->get_lien_element2()->ajouter(this);
51  tab[2]->get_lien_element2()->ajouter(this);
52  tab[3]->get_lien_element2()->ajouter(this);
53  tab[4]->get_lien_element2()->ajouter(this);
54  tab[5]->get_lien_element2()->ajouter(this);
55  tab[6]->get_lien_element2()->ajouter(this);
56  tab[7]->get_lien_element2()->ajouter(this);
58 }
59 FEM_QUADRANGLE8::FEM_QUADRANGLE8(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,topo),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
60 {
62  tab[0]->get_lien_element2()->ajouter(this);
63  tab[1]->get_lien_element2()->ajouter(this);
64  tab[2]->get_lien_element2()->ajouter(this);
65  tab[3]->get_lien_element2()->ajouter(this);
66  tab[4]->get_lien_element2()->ajouter(this);
67  tab[5]->get_lien_element2()->ajouter(this);
68  tab[6]->get_lien_element2()->ajouter(this);
69  tab[7]->get_lien_element2()->ajouter(this);
71 }
72 
74 {
76  tab[0]->get_lien_element2()->ajouter(this);
77  tab[1]->get_lien_element2()->ajouter(this);
78  tab[2]->get_lien_element2()->ajouter(this);
79  tab[3]->get_lien_element2()->ajouter(this);
80  tab[4]->get_lien_element2()->ajouter(this);
81  tab[5]->get_lien_element2()->ajouter(this);
82  tab[6]->get_lien_element2()->ajouter(this);
83  tab[7]->get_lien_element2()->ajouter(this);
85 }
86 FEM_QUADRANGLE8::FEM_QUADRANGLE8(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,topo,mai),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
87 {
89  tab[0]->get_lien_element2()->ajouter(this);
90  tab[1]->get_lien_element2()->ajouter(this);
91  tab[2]->get_lien_element2()->ajouter(this);
92  tab[3]->get_lien_element2()->ajouter(this);
93  tab[4]->get_lien_element2()->ajouter(this);
94  tab[5]->get_lien_element2()->ajouter(this);
95  tab[6]->get_lien_element2()->ajouter(this);
96  tab[7]->get_lien_element2()->ajouter(this);
98 }
99 
101 {
103  tab[0]->get_lien_element2()->ajouter(this);
104  tab[1]->get_lien_element2()->ajouter(this);
105  tab[2]->get_lien_element2()->ajouter(this);
106  tab[3]->get_lien_element2()->ajouter(this);
107  tab[4]->get_lien_element2()->ajouter(this);
108  tab[5]->get_lien_element2()->ajouter(this);
109  tab[6]->get_lien_element2()->ajouter(this);
110  tab[7]->get_lien_element2()->ajouter(this);
112 }
113 
114 
115 
116 
117 
118 
119 
120 
121 
123 {
125  tab[0]->get_lien_element2()->ajouter(this);
126  tab[1]->get_lien_element2()->ajouter(this);
127  tab[2]->get_lien_element2()->ajouter(this);
128  tab[3]->get_lien_element2()->ajouter(this);
129  tab[4]->get_lien_element2()->ajouter(this);
130  tab[5]->get_lien_element2()->ajouter(this);
131  tab[6]->get_lien_element2()->ajouter(this);
132  tab[7]->get_lien_element2()->ajouter(this);
134 }
136 {
137  if (liaison_topologique!=NULL)
139  tab[0]->get_lien_element2()->supprimer(this);
140  tab[1]->get_lien_element2()->supprimer(this);
141  tab[2]->get_lien_element2()->supprimer(this);
142  tab[3]->get_lien_element2()->supprimer(this);
143  tab[4]->get_lien_element2()->supprimer(this);
144  tab[5]->get_lien_element2()->supprimer(this);
145  tab[6]->get_lien_element2()->supprimer(this);
146  tab[7]->get_lien_element2()->supprimer(this);
148 }
149 
150 
152 {
153  FEM_NOEUD* tabnoeud[8];
154  tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
155  tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
156  tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
157  tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
158  tabnoeud[4]=femmai->get_fem_noeudid(tab[4]->get_id()+decalage);
159  tabnoeud[5]=femmai->get_fem_noeudid(tab[5]->get_id()+decalage);
160  tabnoeud[6]=femmai->get_fem_noeudid(tab[6]->get_id()+decalage);
161  tabnoeud[7]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
162  FEM_QUADRANGLE8* quad=new FEM_QUADRANGLE8(get_id()+decalage,maillage,tabnoeud);
163  femmai->ajouter_fem_element2(quad);
164  return quad;
165 }
166 
168 {
169 if (uvw[0]>=-1.-1e-10)
170  if (uvw[1]>=-1.-1e-10)
171  if (uvw[0]<=1.+1e-10)
172  if (uvw[1]<=1.+1e-10)
173  return true;
174 return false;
175 }
176 
178 {
179 voisin.vide();
180 if (no==tab[0])
181  {
182  voisin.ajouter(tab[1]);
183  voisin.ajouter(tab[7]);
184  }
185 if (no==tab[1])
186  {
187  voisin.ajouter(tab[0]);
188  voisin.ajouter(tab[2]);
189  }
190 if (no==tab[2])
191  {
192  voisin.ajouter(tab[1]);
193  voisin.ajouter(tab[3]);
194  }
195 if (no==tab[3])
196  {
197  voisin.ajouter(tab[2]);
198  voisin.ajouter(tab[4]);
199  }
200 if (no==tab[4])
201  {
202  voisin.ajouter(tab[3]);
203  voisin.ajouter(tab[5]);
204  }
205 if (no==tab[5])
206  {
207  voisin.ajouter(tab[4]);
208  voisin.ajouter(tab[6]);
209  }
210 if (no==tab[6])
211  {
212  voisin.ajouter(tab[5]);
213  voisin.ajouter(tab[7]);
214  }
215 if (no==tab[7])
216  {
217  voisin.ajouter(tab[6]);
218  voisin.ajouter(tab[0]);
219  }
220 }
221 
222 
224 {
226 }
227 
229 {
230  return 2;
231 }
232 
234 {
236 }
237 
239 {
241 }
242 
244 {
246 }
247 
249 {
251 }
252 
254 {
256 }
257 
258 
259 void FEM_QUADRANGLE8::enregistrer(std::ostream& o,double version)
260 {
261  if (maillage!=NULL)
262  if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_QUADRANGLE8($"<< 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;
263  else o << "%" << get_id() << "=FEM_QUADRANGLE8(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;
264  else
265  if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_QUADRANGLE8($"<< 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;
266  else o << "%" << get_id() << "=FEM_QUADRANGLE8(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;
267 
268 }
269 
271 {
273 }
274 
275 void FEM_QUADRANGLE8::get_pt_gauss(int degre,int num,double &w,double *uv)
276 {
277 return OT_POINTS_GAUSS::get_pt_gauss_qua_prod(degre,num,w,uv);
278 }
279 
281 {
283 }
284 
285 
287 {
288  return 8;
289 }
290 
292 {
293  return 3;
294 }
296 {
297  double val;
298  switch (num)
299  {
300  case 1:
301  val=-0.25*(1-uv[0])*(1-uv[1])*(1.+uv[0]+uv[1]);
302  break;
303  case 2:
304  val=0.5*(1-uv[0]*uv[0])*(1-uv[1]);
305  break;
306  case 3:
307  val=-0.25*(1+uv[0])*(1-uv[1])*(1.-uv[0]+uv[1]);
308  break;
309  case 4:
310  val=0.5*(1+uv[0])*(1-uv[1]*uv[1]);
311  break;
312  case 5:
313  val=-0.25*(1+uv[0])*(1+uv[1])*(1.-uv[0]-uv[1]);
314  break;
315  case 6:
316  val=0.5*(1-uv[0]*uv[0])*(1+uv[1]);
317  break;
318  case 7:
319  val=-0.25*(1-uv[0])*(1+uv[1])*(1.+uv[0]-uv[1]);
320  break;
321  case 8:
322  val=0.5*(1-uv[0])*(1-uv[1]*uv[1]);
323  break;
324  }
325  return val;
326 }
327 
328 double FEM_QUADRANGLE8::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
329 {
330  double val;
331 
332  switch (num)
333  {
334  case 1:
335  switch (num_variable)
336  {
337  case 1:
338  val=0.25*(1.-uv[1])*(2.*uv[0]+uv[1]);
339  break;
340  case 2:
341  val=0.25*(1.-uv[0])*(uv[0]+2.*uv[1]);
342  break;
343  } break;
344  case 2:
345  switch (num_variable)
346  {
347  case 1:
348  val=-uv[0]*(1.-uv[1]);
349  break;
350  case 2:
351  val=-0.5*(1.-uv[0]*uv[0]);
352  break;
353  }break;
354  case 3:
355  switch (num_variable)
356  {
357  case 1:
358  val=0.25*(1.-uv[1])*(2.*uv[0]-uv[1]);
359  break;
360  case 2:
361  val=-0.25*(1.+uv[0])*(uv[0]-2.*uv[1]);
362  break;
363  }break;
364  case 4:
365  switch (num_variable)
366  {
367  case 1:
368  val=0.5*(1.-uv[1]*uv[1]);
369  break;
370  case 2:
371  val=-uv[1]*(1.+uv[0]);
372  break;
373  }break;
374  case 5:
375  switch (num_variable)
376  {
377  case 1:
378  val=0.25*(1.+uv[1])*(2.*uv[0]+uv[1]);
379  break;
380  case 2:
381  val=0.25*(1.+uv[0])*(uv[0]+2.*uv[1]);
382  break;
383  } break;
384  case 6:
385  switch (num_variable)
386  {
387  case 1:
388  val=-uv[0]*(1.+uv[1]);
389  break;
390  case 2:
391  val=0.5*(1.-uv[0]*uv[0]);
392  break;
393  }break;
394  case 7:
395  switch (num_variable)
396  {
397  case 1:
398  val=0.25*(1.+uv[1])*(2.*uv[0]-uv[1]);
399  break;
400  case 2:
401  val=-0.25*(1.-uv[0])*(uv[0]-2.*uv[1]);
402  break;
403  }break;
404  case 8:
405  switch (num_variable)
406  {
407  case 1:
408  val=-0.5*(1.-uv[1]*uv[1]);
409  break;
410  case 2:
411  val=-uv[1]*(1.-uv[0]);
412  break;
413  }break;
414 
415  }
416  return val;
417 }
418 
419 
FEM_QUADRANGLE8::get_nb_fonction_interpolation
virtual int get_nb_fonction_interpolation(void)
Definition: fem_quadrangle8.cpp:286
FEM_QUADRANGLE8
Definition: fem_quadrangle8.h:35
FEM_MAILLAGE::ajouter_fem_element2
int ajouter_fem_element2(FEM_ELEMENT2 *femtriangle)
Definition: fem_maillage.cpp:469
gestionversion.h
FEM_QUADRANGLE8::get_boite_3D
virtual BOITE_3D & get_boite_3D(void)
Definition: fem_quadrangle8.cpp:253
FEM_TEMPLATE_ELEMENT::get_boite_3D
virtual BOITE_3D & get_boite_3D(void)
Definition: fem_template_element.cpp:127
FEM_QUADRANGLE8::get_dimension
virtual int get_dimension(void)
Definition: fem_quadrangle8.cpp:228
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
fem_maillage.h
OT_POINTS_GAUSS::get_pt_gauss_qua_prod
static void get_pt_gauss_qua_prod(int degre, int num, double &w, double *uv)
Definition: ot_quadrature_gauss.cpp:409
FEM_QUADRANGLE8::get_fonction_derive_interpolation
virtual double get_fonction_derive_interpolation(int num, int numvariable, double *uv)
Definition: fem_quadrangle8.cpp:328
fem_noeud.h
FEM_QUADRANGLE8::change_noeud
virtual void change_noeud(int num, FEM_NOEUD *noeud)
Definition: fem_quadrangle8.cpp:248
MG_ELEMENT_MAILLAGE
Definition: mg_element_maillage.h:38
FEM_ELEMENT_MAILLAGE::get_lien_topologie
virtual class MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: fem_element_maillage.cpp:89
FEM_QUADRANGLE8::get_nb_pt_gauss
virtual int get_nb_pt_gauss(int degre)
Definition: fem_quadrangle8.cpp:270
MG_ELEMENT_TOPOLOGIQUE::get_dimension
virtual int get_dimension(void)=0
fem_quadrangle8.h
mg_element_maillage.h
FEM_ELEMENT_MAILLAGE::liaison_topologique
class MG_ELEMENT_TOPOLOGIQUE * liaison_topologique
Definition: fem_element_maillage.h:73
FEM_NOEUD::get_lien_petit_element2
TPL_LISTE_ENTITE< class FEM_ELEMENT2 * > * get_lien_petit_element2(void)
Definition: fem_noeud.cpp:412
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_ELEMENT2
Definition: fem_element2.h:34
OT_POINTS_GAUSS::get_degre_gauss_quad_prod
static int get_degre_gauss_quad_prod(int num)
Definition: ot_quadrature_gauss.cpp:137
FEM_QUADRANGLE8::~FEM_QUADRANGLE8
virtual ~FEM_QUADRANGLE8()
Definition: fem_quadrangle8.cpp:135
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
FEM_NOEUD::get_lien_element2
TPL_LISTE_ENTITE< class FEM_ELEMENT2 * > * get_lien_element2(void)
Definition: fem_noeud.cpp:406
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_QUADRANGLE8::get_pt_gauss
virtual void get_pt_gauss(int degre, int num, double &w, double *uv)
Definition: fem_quadrangle8.cpp:275
FEM_QUADRANGLE8::get_type_entite
virtual int get_type_entite(void)
Definition: fem_quadrangle8.cpp:223
FEM_QUADRANGLE8::valide_parametre_EF
virtual bool valide_parametre_EF(double *uvw)
Definition: fem_quadrangle8.cpp:167
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
MAGIC::TYPE_ENTITE::IDFEM_QUADRANGLE8
@ IDFEM_QUADRANGLE8
Definition: mg_definition.h:70
FEM_TEMPLATE_ELEMENT< 8 >::get_fem_noeudpetitid
virtual FEM_NOEUD * get_fem_noeudpetitid(void)
Definition: fem_template_element.cpp:111
FEM_QUADRANGLE8::get_voisin_noeud
virtual void get_voisin_noeud(class FEM_NOEUD *no, TPL_LISTE_ENTITE< FEM_NOEUD * > &voisin)
Definition: fem_quadrangle8.cpp:177
FEM_QUADRANGLE8::get_degremax_fonction_interpolation
virtual int get_degremax_fonction_interpolation(void)
Definition: fem_quadrangle8.cpp:291
FEM_QUADRANGLE8::get_degre_gauss
virtual int get_degre_gauss(int num)
Definition: fem_quadrangle8.cpp:280
FEM_NOEUD
Definition: fem_noeud.h:35
TPL_LISTE_ENTITE::vide
virtual void vide(void)
Definition: tpl_liste_entite.h:77
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_QUADRANGLE8::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)
Definition: fem_quadrangle8.cpp:238
FEM_QUADRANGLE8::FEM_QUADRANGLE8
FEM_QUADRANGLE8(unsigned long num, class MG_ELEMENT_MAILLAGE *mai, class FEM_NOEUD **tabnoeud)
Definition: fem_quadrangle8.cpp:32
FEM_QUADRANGLE8::dupliquer
virtual FEM_ELEMENT_MAILLAGE * dupliquer(class FEM_MAILLAGE *femmai, long decalage)
Definition: fem_quadrangle8.cpp:151
FEM_TEMPLATE_ELEMENT< 8 >::tab
FEM_NOEUD * tab[N]
Definition: fem_template_element.h:57
FEM_QUADRANGLE8::reinit_boite_3D
virtual void reinit_boite_3D(void)
Definition: fem_quadrangle8.cpp:233
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
TPL_LISTE_ENTITE
Definition: tpl_liste_entite.h:32
FEM_TEMPLATE_ELEMENT::reinit_boite_3D
virtual void reinit_boite_3D(void)
Definition: fem_template_element.cpp:57
ot_quadrature_gauss.h
FEM_QUADRANGLE8::get_fonction_interpolation
virtual double get_fonction_interpolation(int num, double *uv)
Definition: fem_quadrangle8.cpp:295
TPL_LISTE_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_liste_entite.h:42
FEM_QUADRANGLE8::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: fem_quadrangle8.cpp:259
OT_POINTS_GAUSS::get_nb_point_quad_prod
static int get_nb_point_quad_prod(int degre)
Definition: ot_quadrature_gauss.cpp:129
FEM_QUADRANGLE8::get_fem_noeud
virtual FEM_NOEUD * get_fem_noeud(int num)
Definition: fem_quadrangle8.cpp:243
FEM_TEMPLATE_ELEMENT
Definition: fem_template_element.h:35