MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fem_tetra4.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_tetra4.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_tetra4.h"
26 #include "fem_noeud.h"
27 #include "mg_element_maillage.h"
28 #include "fem_maillage.h"
29 #include "ot_mathematique.h"
30 #include "xfem_tetra4.h"
31 #include "ot_quadrature_gauss.h"
32 #include <math.h>
33 
34 FEM_TETRA4::FEM_TETRA4(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,mai),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
35 {
36  if (liaison_topologique!=NULL)
38  tab[0]->get_lien_element3()->ajouter(this);
39  tab[1]->get_lien_element3()->ajouter(this);
40  tab[2]->get_lien_element3()->ajouter(this);
41  tab[3]->get_lien_element3()->ajouter(this);
43 }
44 
46 {
47  if (liaison_topologique!=NULL)
49  tab[0]->get_lien_element3()->ajouter(this);
50  tab[1]->get_lien_element3()->ajouter(this);
51  tab[2]->get_lien_element3()->ajouter(this);
52  tab[3]->get_lien_element3()->ajouter(this);
54 }
55 FEM_TETRA4::FEM_TETRA4(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,topo),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
56 {
57  if (liaison_topologique!=NULL)
59  tab[0]->get_lien_element3()->ajouter(this);
60  tab[1]->get_lien_element3()->ajouter(this);
61  tab[2]->get_lien_element3()->ajouter(this);
62  tab[3]->get_lien_element3()->ajouter(this);
64 }
65 
67 {
68  if (liaison_topologique!=NULL)
70  tab[0]->get_lien_element3()->ajouter(this);
71  tab[1]->get_lien_element3()->ajouter(this);
72  tab[2]->get_lien_element3()->ajouter(this);
73  tab[3]->get_lien_element3()->ajouter(this);
75 }
76 FEM_TETRA4::FEM_TETRA4(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<4>(tabnoeud)
77 {
78  if (liaison_topologique!=NULL)
80  tab[0]->get_lien_element3()->ajouter(this);
81  tab[1]->get_lien_element3()->ajouter(this);
82  tab[2]->get_lien_element3()->ajouter(this);
83  tab[3]->get_lien_element3()->ajouter(this);
85 }
86 
88 {
89  if (liaison_topologique!=NULL)
91  tab[0]->get_lien_element3()->ajouter(this);
92  tab[1]->get_lien_element3()->ajouter(this);
93  tab[2]->get_lien_element3()->ajouter(this);
94  tab[3]->get_lien_element3()->ajouter(this);
96 }
97 
98 
99 
101 {
103 }
104 
105 
106 
108 {
110  tab[0]->get_lien_element3()->ajouter(this);
111  tab[1]->get_lien_element3()->ajouter(this);
112  tab[2]->get_lien_element3()->ajouter(this);
113  tab[3]->get_lien_element3()->ajouter(this);
115 }
116 
118 {
119  if (liaison_topologique!=NULL)
121  tab[0]->get_lien_element3()->supprimer(this);
122  tab[1]->get_lien_element3()->supprimer(this);
123  tab[2]->get_lien_element3()->supprimer(this);
124  tab[3]->get_lien_element3()->supprimer(this);
126 }
127 
128 
130 {
131 voisin.vide();
132 if (no==tab[0])
133  {
134  voisin.ajouter(tab[1]);
135  voisin.ajouter(tab[2]);
136  voisin.ajouter(tab[3]);
137  }
138 if (no==tab[1])
139  {
140  voisin.ajouter(tab[0]);
141  voisin.ajouter(tab[2]);
142  voisin.ajouter(tab[3]);
143  }
144 if (no==tab[2])
145  {
146  voisin.ajouter(tab[0]);
147  voisin.ajouter(tab[1]);
148  voisin.ajouter(tab[3]);
149  }
150 if (no==tab[3])
151  {
152  voisin.ajouter(tab[0]);
153  voisin.ajouter(tab[1]);
154  voisin.ajouter(tab[2]);
155  }
156 }
157 
158 
160 {
161  FEM_NOEUD* tabnoeud[4];
162  tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
163  tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
164  tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
165  tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
166  FEM_TETRA4* tet=new FEM_TETRA4(get_id()+decalage,maillage,tabnoeud);
167  femmai->ajouter_fem_element3(tet);
168  return tet;
169 }
170 
171 
173 {
175 }
176 
178 {
179  return 3;
180 }
181 
182 
184 {
186 }
187 
189 {
191 }
192 
194 {
196 }
197 
198 
200 {
202 }
203 
204 
206 {
208 }
209 
210 void FEM_TETRA4::get_pt_gauss(int degre,int num,double &w,double *uvw)
211 {
212 return OT_POINTS_GAUSS::get_pt_gauss_tet(degre,num,w,uvw);
213 }
214 
216 {
218 }
219 
220 
222 {
223  return 4;
224 }
226 {
227  return 1;
228 }
229 
230 double FEM_TETRA4::get_fonction_interpolation(int num,double *uv)
231 {
232  double val;
233  switch (num)
234  {
235  case 1:
236  val=1-uv[0]-uv[1]-uv[2];
237  break;
238  case 2:
239  val=uv[0];
240  break;
241  case 3:
242  val=uv[1];
243  break;
244  case 4:
245  val=uv[2];
246  break;
247  }
248  return val;
249 }
250 
251 double FEM_TETRA4::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
252 {
253  double val;
254 
255  switch (num)
256  {
257  case 1:
258  switch (num_variable)
259  {
260  case 1:
261  val=-1;
262  break;
263  case 2:
264  val=-1;
265  break;
266  case 3:
267  val=-1;
268  break;
269  } break;
270  case 2:
271  switch (num_variable)
272  {
273  case 1:
274  val=1;
275  break;
276  case 2:
277  val=0;
278  break;
279  case 3:
280  val=0;
281  break;
282  }break;
283  case 3:
284  switch (num_variable)
285  {
286  case 1:
287  val=0;
288  break;
289  case 2:
290  val=1;
291  break;
292  case 3:
293  val=0;
294  break;
295  }break;
296  case 4:
297  switch (num_variable)
298  {
299  case 1:
300  val=0;
301  break;
302  case 2:
303  val=0;
304  break;
305  case 3:
306  val=1;
307  break;
308  }break;
309 
310  }
311  return val;
312 }
313 
314 
315 
317 {
318 if (uvw[0]>=-1e-10)
319  if (uvw[1]>=-1e-10)
320  if (uvw[2]>=-1e-10)
321  if (uvw[0]+uvw[1]+uvw[2]<=1.+1e-10)
322  return true;
323 return false;
324 }
325 void FEM_TETRA4::enregistrer(std::ostream& o,double version)
326 {
327  if (maillage!=NULL)
328  if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TETRA4($"<< get_lien_topologie()->get_id() << ",$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << ","<< get_etat(0) << ");" << std::endl;
329  else o << "%" << get_id() << "=FEM_TETRA4(NULL,$"<< maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << ","<< get_etat(0) << ");" << std::endl;
330  else
331  if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TETRA4($"<< get_lien_topologie()->get_id() << ",NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << ","<< get_etat(0) << ");" << std::endl;
332  else o << "%" << get_id() << "=FEM_TETRA4(NULL,NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << ","<< get_etat(0) << ");" << std::endl;
333 
334 }
335 
336 
338 {
339 if (get_nb_xfem(3)==0) return 1;
340 FEM_NOEUD* no1=get_fem_noeud(0);
341 FEM_NOEUD* no2=get_fem_noeud(1);
342 FEM_NOEUD* no3=get_fem_noeud(2);
343 FEM_NOEUD* no4=get_fem_noeud(3);
344 OT_VECTEUR_3D vec1(no1->get_coord(),no2->get_coord());
345 OT_VECTEUR_3D vec2(no1->get_coord(),no3->get_coord());
346 OT_VECTEUR_3D vec3(no1->get_coord(),no4->get_coord());
347 double volume=(vec1&vec2)*vec3;
348 int volumenul=0;
349 for (int i=0;i<get_nb_xfem(3);i++)
350  {
351  XFEM_TETRA4* xtet=(XFEM_TETRA4*)get_xfem(3,i);
352  FEM_NOEUD* xno1=xtet->get_fem_noeud(0);
353  FEM_NOEUD* xno2=xtet->get_fem_noeud(1);
354  FEM_NOEUD* xno3=xtet->get_fem_noeud(2);
355  FEM_NOEUD* xno4=xtet->get_fem_noeud(3);
356  OT_VECTEUR_3D xvec1(xno1->get_coord(),xno2->get_coord());
357  OT_VECTEUR_3D xvec2(xno1->get_coord(),xno3->get_coord());
358  OT_VECTEUR_3D xvec3(xno1->get_coord(),xno4->get_coord());
359  double xvolume=(xvec1&xvec2)*xvec3;
360  volume=volume-xvolume;
361  if (xvolume<1e-10*volume) volumenul=1;
362  }
363 if (vol!=NULL) *vol=volume;
364 if (fabs(volume)>1e-12) return 2*volumenul;
365 return 1+2*volumenul;
366 }
FEM_TETRA4::reinit_boite_3D
virtual void reinit_boite_3D(void)
Definition: fem_tetra4.cpp:100
FEM_TETRA4::FEM_TETRA4
FEM_TETRA4(unsigned long num, class MG_ELEMENT_MAILLAGE *mai, class FEM_NOEUD **tabnoeud)
Definition: fem_tetra4.cpp:34
FEM_TETRA4::get_dimension
virtual int get_dimension(void)
Definition: fem_tetra4.cpp:177
gestionversion.h
XFEM_TETRA4::get_fem_noeud
virtual FEM_NOEUD * get_fem_noeud(int num)
Definition: xfem_tetra4.cpp:69
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_tetra
static int get_nb_point_tetra(int degre)
Definition: ot_quadrature_gauss.cpp:145
FEM_TEMPLATE_ELEMENT::get_boite_3D
virtual BOITE_3D & get_boite_3D(void)
Definition: fem_template_element.cpp:127
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
fem_maillage.h
fem_noeud.h
FEM_TETRA4::change_noeud
virtual void change_noeud(int num, FEM_NOEUD *noeud)
Definition: fem_tetra4.cpp:193
MG_ELEMENT_MAILLAGE
Definition: mg_element_maillage.h:38
FEM_TETRA4::valide_parametre_EF
virtual bool valide_parametre_EF(double *uvw)
Definition: fem_tetra4.cpp:316
FEM_TETRA4::get_degremax_fonction_interpolation
virtual int get_degremax_fonction_interpolation(void)
Definition: fem_tetra4.cpp:225
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
FEM_TETRA4::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)
Definition: fem_tetra4.cpp:183
MG_ELEMENT_TOPOLOGIQUE::get_dimension
virtual int get_dimension(void)=0
mg_element_maillage.h
FEM_ELEMENT_MAILLAGE::liaison_topologique
class MG_ELEMENT_TOPOLOGIQUE * liaison_topologique
Definition: fem_element_maillage.h:73
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
xfem_tetra4.h
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
MAGIC::TYPE_ENTITE::IDFEM_TETRA4
@ IDFEM_TETRA4
Definition: mg_definition.h:70
FEM_TETRA4
Definition: fem_tetra4.h:34
FEM_NOEUD::get_coord
virtual double * get_coord(void)
Definition: fem_noeud.cpp:254
FEM_TETRA4::get_fonction_derive_interpolation
virtual double get_fonction_derive_interpolation(int num, int numvariable, double *uv)
Definition: fem_tetra4.cpp:251
FEM_TETRA4::get_voisin_noeud
virtual void get_voisin_noeud(class FEM_NOEUD *no, TPL_LISTE_ENTITE< FEM_NOEUD * > &voisin)
Definition: fem_tetra4.cpp:129
FEM_TETRA4::get_nb_fonction_interpolation
virtual int get_nb_fonction_interpolation(void)
Definition: fem_tetra4.cpp:221
OT_POINTS_GAUSS::get_pt_gauss_tet
static void get_pt_gauss_tet(int degre, int num, double &w, double *uvw)
Definition: ot_quadrature_gauss.cpp:323
OT_POINTS_GAUSS::get_degre_gauss_tetra
static int get_degre_gauss_tetra(int num)
Definition: ot_quadrature_gauss.cpp:154
FEM_TETRA4::dupliquer
virtual FEM_ELEMENT_MAILLAGE * dupliquer(FEM_MAILLAGE *femmai, long decalage)
Definition: fem_tetra4.cpp:159
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_NOEUD::get_lien_element3
TPL_LISTE_ENTITE< class FEM_ELEMENT3 * > * get_lien_element3(void)
Definition: fem_noeud.cpp:417
FEM_TETRA4::get_type_entite
virtual int get_type_entite(void)
Definition: fem_tetra4.cpp:172
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
FEM_TEMPLATE_ELEMENT< 4 >::get_fem_noeudpetitid
virtual FEM_NOEUD * get_fem_noeudpetitid(void)
Definition: fem_template_element.cpp:111
FEM_TETRA4::get_boite_3D
virtual BOITE_3D & get_boite_3D(void)
Definition: fem_tetra4.cpp:199
XFEM_TETRA4
Definition: xfem_tetra4.h:34
FEM_TETRA4::~FEM_TETRA4
virtual ~FEM_TETRA4()
Definition: fem_tetra4.cpp:117
ot_mathematique.h
FEM_TETRA4::get_degre_gauss
virtual int get_degre_gauss(int num)
Definition: fem_tetra4.cpp:215
FEM_NOEUD
Definition: fem_noeud.h:35
TPL_LISTE_ENTITE::vide
virtual void vide(void)
Definition: tpl_liste_entite.h:77
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
BOITE_3D
Definition: ot_boite_3d.h:27
FEM_TETRA4::get_fem_noeud
virtual FEM_NOEUD * get_fem_noeud(int num)
Definition: fem_tetra4.cpp:188
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_TETRA4::verifie_validite_decoupage_xfem
virtual int verifie_validite_decoupage_xfem(double *vol=NULL)
Definition: fem_tetra4.cpp:337
fem_tetra4.h
FEM_TEMPLATE_ELEMENT< 4 >::tab
FEM_NOEUD * tab[N]
Definition: fem_template_element.h:57
FEM_ELEMENT_MAILLAGE::get_xfem
virtual XFEM_ELEMENT_MAILLAGE * get_xfem(int dim, int num)
Definition: fem_element_maillage.cpp:145
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_TETRA4::get_nb_pt_gauss
virtual int get_nb_pt_gauss(int degre)
Definition: fem_tetra4.cpp:205
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_ELEMENT_MAILLAGE::get_etat
virtual int get_etat(int num)
Definition: fem_element_maillage.cpp:119
TPL_LISTE_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_liste_entite.h:42
FEM_TETRA4::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: fem_tetra4.cpp:325
FEM_MAILLAGE::ajouter_fem_element3
int ajouter_fem_element3(FEM_ELEMENT3 *femelement3)
Definition: fem_maillage.cpp:580
FEM_TETRA4::get_fonction_interpolation
virtual double get_fonction_interpolation(int num, double *uv)
Definition: fem_tetra4.cpp:230
FEM_ELEMENT_MAILLAGE::get_nb_xfem
virtual int get_nb_xfem(int dim)
Definition: fem_element_maillage.cpp:140
FEM_TETRA4::get_pt_gauss
virtual void get_pt_gauss(int degre, int num, double &w, double *uvw)
Definition: fem_tetra4.cpp:210
FEM_TEMPLATE_ELEMENT
Definition: fem_template_element.h:35