MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fem_triangle6.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_triangle6.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:53 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 #include "fem_triangle6.h"
26 #include "fem_noeud.h"
27 #include "mg_element_maillage.h"
28 #include "fem_maillage.h"
29 #include "math.h"
30 #include "ot_quadrature_gauss.h"
31 
32 FEM_TRIANGLE6::FEM_TRIANGLE6(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,mai),FEM_TEMPLATE_ELEMENT<6>(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);
42 }
43 
45 {
47  tab[0]->get_lien_element2()->ajouter(this);
48  tab[1]->get_lien_element2()->ajouter(this);
49  tab[2]->get_lien_element2()->ajouter(this);
50  tab[3]->get_lien_element2()->ajouter(this);
51  tab[4]->get_lien_element2()->ajouter(this);
52  tab[5]->get_lien_element2()->ajouter(this);
54 }
55 
56 FEM_TRIANGLE6::FEM_TRIANGLE6(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,topo),FEM_TEMPLATE_ELEMENT<6>(tabnoeud)
57 {
59  tab[0]->get_lien_element2()->ajouter(this);
60  tab[1]->get_lien_element2()->ajouter(this);
61  tab[2]->get_lien_element2()->ajouter(this);
62  tab[3]->get_lien_element2()->ajouter(this);
63  tab[4]->get_lien_element2()->ajouter(this);
64  tab[5]->get_lien_element2()->ajouter(this);
66 }
67 
69 {
71  tab[0]->get_lien_element2()->ajouter(this);
72  tab[1]->get_lien_element2()->ajouter(this);
73  tab[2]->get_lien_element2()->ajouter(this);
74  tab[3]->get_lien_element2()->ajouter(this);
75  tab[4]->get_lien_element2()->ajouter(this);
76  tab[5]->get_lien_element2()->ajouter(this);
78 }
79 FEM_TRIANGLE6::FEM_TRIANGLE6(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<6>(tabnoeud)
80 {
82  tab[0]->get_lien_element2()->ajouter(this);
83  tab[1]->get_lien_element2()->ajouter(this);
84  tab[2]->get_lien_element2()->ajouter(this);
85  tab[3]->get_lien_element2()->ajouter(this);
86  tab[4]->get_lien_element2()->ajouter(this);
87  tab[5]->get_lien_element2()->ajouter(this);
89 }
90 
92 {
94  tab[0]->get_lien_element2()->ajouter(this);
95  tab[1]->get_lien_element2()->ajouter(this);
96  tab[2]->get_lien_element2()->ajouter(this);
97  tab[3]->get_lien_element2()->ajouter(this);
98  tab[4]->get_lien_element2()->ajouter(this);
99  tab[5]->get_lien_element2()->ajouter(this);
101 }
102 
103 
104 
106 {
108 }
109 
110 
111 
112 
114 {
116  tab[0]->get_lien_element2()->ajouter(this);
117  tab[1]->get_lien_element2()->ajouter(this);
118  tab[2]->get_lien_element2()->ajouter(this);
119  tab[3]->get_lien_element2()->ajouter(this);
120  tab[4]->get_lien_element2()->ajouter(this);
121  tab[5]->get_lien_element2()->ajouter(this);
123 }
125 {
126  if (liaison_topologique!=NULL)
128  tab[0]->get_lien_element2()->supprimer(this);
129  tab[1]->get_lien_element2()->supprimer(this);
130  tab[2]->get_lien_element2()->supprimer(this);
131  tab[3]->get_lien_element2()->supprimer(this);
132  tab[4]->get_lien_element2()->supprimer(this);
133  tab[5]->get_lien_element2()->supprimer(this);
135 }
136 
138 {
139  FEM_NOEUD* tabnoeud[6];
140  tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
141  tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
142  tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
143  tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
144  tabnoeud[4]=femmai->get_fem_noeudid(tab[4]->get_id()+decalage);
145  tabnoeud[5]=femmai->get_fem_noeudid(tab[5]->get_id()+decalage);
146  FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(get_id()+decalage,maillage,tabnoeud);
147  femmai->ajouter_fem_element2(tri);
148  return tri;
149 }
150 
151 
153 {
154 voisin.vide();
155 if (no==tab[0])
156  {
157  voisin.ajouter(tab[1]);
158  voisin.ajouter(tab[5]);
159  }
160 if (no==tab[1])
161  {
162  voisin.ajouter(tab[0]);
163  voisin.ajouter(tab[2]);
164  }
165 if (no==tab[2])
166  {
167  voisin.ajouter(tab[1]);
168  voisin.ajouter(tab[3]);
169  }
170 if (no==tab[3])
171  {
172  voisin.ajouter(tab[2]);
173  voisin.ajouter(tab[4]);
174  }
175 if (no==tab[4])
176  {
177  voisin.ajouter(tab[3]);
178  voisin.ajouter(tab[5]);
179  }
180 if (no==tab[5])
181  {
182  voisin.ajouter(tab[4]);
183  voisin.ajouter(tab[0]);
184  }
185 }
187 {
188 if (uvw[0]>=-1e-10)
189  if (uvw[1]>=-1e-10)
190  if (uvw[0]+uvw[1]<=1.+1e-10)
191  return true;
192 return false;
193 }
194 
195 
197 {
199 }
200 
202 {
203  return 2;
204 }
205 
206 
208 {
210 }
211 
213 {
215 }
216 
218 {
220 }
221 
223 {
225 }
226 
227 
228 void FEM_TRIANGLE6::enregistrer(std::ostream& o,double version)
229 {
230  if (maillage!=NULL)
231  if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TRIANGLE6($"<< 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() << ");" << std::endl;
232  else o << "%" << get_id() << "=FEM_TRIANGLE6(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() << ");" << std::endl;
233  else
234  if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TRIANGLE6($"<< 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() << ");" << std::endl;
235  else o << "%" << get_id() << "=FEM_TRIANGLE6(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() << ");" << std::endl;
236 
237 }
238 
240 {
242 }
243 
244 void FEM_TRIANGLE6::get_pt_gauss(int degre,int num,double &w,double *uv)
245 {
246 return OT_POINTS_GAUSS::get_pt_gauss_tri(degre,num,w,uv);
247 }
248 
250 {
252 }
253 
255 {
256  return 6;
257 }
259 {
260  return 2;
261 }
263 {
264  double val;
265  switch (num)
266  {
267  case 1:
268  val=(-1+uv[0]+uv[1])*(-1+2*uv[0]+2*uv[1]);
269  break;
270  case 2:
271  val=4.*uv[0]*(1-uv[0]-uv[1]);
272  break;
273  case 3:
274  val=-uv[0]*(1.-2.*uv[0]);
275  break;
276  case 4:
277  val=4.*uv[0]*uv[1];
278  break;
279  case 5:
280  val=-uv[1]*(1-2*uv[1]);
281  break;
282  case 6:
283  val=4.*uv[1]*(1-uv[0]-uv[1]);
284  break;
285 
286  }
287  return val;
288 }
289 
290 double FEM_TRIANGLE6::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
291 {
292  double val;
293 
294  switch (num)
295  {
296  case 1:
297  switch (num_variable)
298  {
299  case 1:
300  val=-3.+4*uv[0]+4*uv[1];
301  break;
302  case 2:
303  val=-3.+4*uv[0]+4*uv[1];
304  break;
305  } break;
306  case 2:
307  switch (num_variable)
308  {
309  case 1:
310  val=4.-8*uv[0]-4*uv[1];
311  break;
312  case 2:
313  val=-4.*uv[0];
314  break;
315  }break;
316  case 3:
317  switch (num_variable)
318  {
319  case 1:
320  val=-1.+4*uv[0];
321  break;
322  case 2:
323  val=0.;
324  break;
325  }break;
326  case 4:
327  switch (num_variable)
328  {
329  case 1:
330  val=4*uv[1];
331  break;
332  case 2:
333  val=4*uv[0];
334  break;
335  }break;
336  case 5:
337  switch (num_variable)
338  {
339  case 1:
340  val=0.;
341  break;
342  case 2:
343  val=-1+4.*uv[1];
344  break;
345  }break;
346  case 6:
347  switch (num_variable)
348  {
349  case 1:
350  val=-4*uv[1];
351  break;
352  case 2:
353  val=4-4*uv[0]-8*uv[1];
354  break;
355  }break;
356 
357  }
358  return val;
359 }
360 
361 
virtual class MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
class MG_ELEMENT_MAILLAGE * maillage
class MG_ELEMENT_TOPOLOGIQUE * liaison_topologique
FEM_NOEUD * get_fem_noeudid(unsigned long num)
int ajouter_fem_element2(FEM_ELEMENT2 *femtriangle)
TPL_LISTE_ENTITE< class FEM_ELEMENT2 * > * get_lien_petit_element2(void)
Definition: fem_noeud.cpp:412
TPL_LISTE_ENTITE< class FEM_ELEMENT2 * > * get_lien_element2(void)
Definition: fem_noeud.cpp:406
virtual FEM_NOEUD * get_fem_noeud(int num)
virtual void reinit_boite_3D(void)
virtual FEM_NOEUD * get_fem_noeudpetitid(void)
virtual int get_nb_fem_noeud(void)
virtual void change_noeud(int num, FEM_NOEUD *noeud)
virtual BOITE_3D & get_boite_3D(void)
virtual void enregistrer(std::ostream &o, double version)
virtual int get_nb_fonction_interpolation(void)
virtual BOITE_3D & get_boite_3D(void)
virtual int get_nb_pt_gauss(int degre)
virtual void reinit_boite_3D(void)
virtual int get_degre_gauss(int num)
virtual ~FEM_TRIANGLE6()
virtual int get_nb_fem_noeud(void)
FEM_ELEMENT_MAILLAGE * dupliquer(FEM_MAILLAGE *femmai, long decalage)
virtual int get_type_entite(void)
virtual void get_voisin_noeud(class FEM_NOEUD *no, TPL_LISTE_ENTITE< FEM_NOEUD * > &voisin)
virtual double get_fonction_derive_interpolation(int num, int numvariable, double *uv)
virtual void get_pt_gauss(int degre, int num, double &w, double *uv)
virtual int get_degremax_fonction_interpolation(void)
virtual bool valide_parametre_EF(double *uvw)
FEM_TRIANGLE6(unsigned long num, class MG_ELEMENT_MAILLAGE *mai, class FEM_NOEUD **tabnoeud)
virtual FEM_NOEUD * get_fem_noeud(int num)
virtual void change_noeud(int num, FEM_NOEUD *noeud)
virtual double get_fonction_interpolation(int num, double *uv)
virtual int get_dimension(void)
virtual TPL_LISTE_ENTITE< FEM_ELEMENT_MAILLAGE * > * get_lien_fem_maillage(void)
virtual int get_dimension(void)=0
unsigned long get_id()
static int get_nb_point_tri(int degre)
static int get_degre_gauss_tri(int num)
static void get_pt_gauss_tri(int degre, int num, double &w, double *uv)
virtual void vide(void)
virtual void supprimer(X x)
virtual void ajouter(X x)