MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
xfem_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 //####// xfem_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 "xfem_tetra4.h"
26 #include "fem_tetra4.h"
27 #include "fem_noeud.h"
28 #include "mg_element_maillage.h"
29 #include "fem_maillage.h"
30 
31 
32 XFEM_TETRA4::XFEM_TETRA4(unsigned long num,class FEM_ELEMENT_MAILLAGE *mai,class MG_ELEMENT_TOPOLOGIQUE *mgtopo,class FEM_NOEUD** tabnoeud):XFEM_ELEMENT3(num,mai,mgtopo),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
33 {
34 femmai->ajouter_xfem(this);
35 }
36 
38 {
39 femmai->ajouter_xfem(this);
40 }
41 
43 {
44 }
45 
47 {
48 femmai->supprimer_xfem(this);
49 }
50 
51 
52 
54 {
55  return IDXFEM_TETRA4;
56 }
57 
59 {
60  return 3;
61 }
62 
63 
65 {
67 }
68 
70 {
72 }
73 
75 {
77 }
78 
79 
81 {
83 }
84 
85 void XFEM_TETRA4::enregistrer(std::ostream& o,double version)
86 {
87  if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=XFEM_TETRA4($"<< femmai->get_id() << ",$" << topo->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << "," << etat << ");" << std::endl;
88  else o << "%" << get_id() << "=XFEM_TETRA4($"<< femmai->get_id() << ",NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << "," << etat << ");" << std::endl;
89 
90 }
91 
92 
93 
94 
96 {
97 return 4;
98 }
99 double XFEM_TETRA4::get_fonction_interpolation(int num,double *uv)
100 {
101 double val;
102  switch (num)
103  {
104  case 1:
105  val=1-uv[0]-uv[1]-uv[2];
106  break;
107  case 2:
108  val=uv[0];
109  break;
110  case 3:
111  val=uv[1];
112  break;
113  case 4:
114  val=uv[2];
115  break;
116  }
117  return val;
118 }
119 double XFEM_TETRA4::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
120 {
121 double val;
122 
123  switch (num)
124  {
125  case 1:
126  switch (num_variable)
127  {
128  case 1:
129  val=-1;
130  break;
131  case 2:
132  val=-1;
133  break;
134  case 3:
135  val=-1;
136  break;
137  } break;
138  case 2:
139  switch (num_variable)
140  {
141  case 1:
142  val=1;
143  break;
144  case 2:
145  val=0;
146  break;
147  case 3:
148  val=0;
149  break;
150  }break;
151  case 3:
152  switch (num_variable)
153  {
154  case 1:
155  val=0;
156  break;
157  case 2:
158  val=1;
159  break;
160  case 3:
161  val=0;
162  break;
163  }break;
164  case 4:
165  switch (num_variable)
166  {
167  case 1:
168  val=0;
169  break;
170  case 2:
171  val=0;
172  break;
173  case 3:
174  val=1;
175  break;
176  }break;
177 
178  }
179  return val;
180 }
181 double XFEM_TETRA4::get_jacobien(double* jac,double *uv,int& li,int& col,double unite)
182 {
183 li=3;
184  col=3;
185  double *xyz1=tab[0]->get_coord();
186  double *xyz2=tab[1]->get_coord();
187  double *xyz3=tab[2]->get_coord();
188  double *xyz4=tab[3]->get_coord();
189 
190  jac[0]=unite*(xyz2[0] - xyz1[0]) ;
191  jac[1]=unite*(xyz2[1] - xyz1[1]) ;
192  jac[2]=unite*(xyz2[2] - xyz1[2]) ;
193 
194  jac[3]=unite*(xyz3[0] - xyz1[0]) ;
195  jac[4]=unite*(xyz3[1] - xyz1[1]) ;
196  jac[5]=unite*(xyz3[2] - xyz1[2]) ;
197 
198  jac[6]=unite*(xyz4[0] - xyz1[0]) ;
199  jac[7]=unite*(xyz4[1] - xyz1[1]) ;
200  jac[8]=unite*(xyz4[2] - xyz1[2]) ;
201 
202  double SIX_V= jac[0]*(jac[4]*jac[8]-jac[7]*jac[5])+jac[1]*(jac[5]*jac[6]-jac[8]*jac[3])+jac[2]*(jac[3]*jac[7]-jac[6]*jac[4]);
203 
204  return SIX_V;
205 }
206 void XFEM_TETRA4::get_inverse_jacob(double* j,double *uv,double unite)
207 {
208 double *xyz1=tab[0]->get_coord();
209  double *xyz2=tab[1]->get_coord();
210  double *xyz3=tab[2]->get_coord();
211  double *xyz4=tab[3]->get_coord();
212 
213  double jac[9];
214 
215  jac[0*3+0]= unite*(xyz2[0] - xyz1[0]) ;
216  jac[0*3+1]= unite*(xyz2[1] - xyz1[1]) ;
217  jac[0*3+2]= unite*(xyz2[2] - xyz1[2]) ;
218 
219  jac[1*3+0]= unite*(xyz3[0] - xyz1[0]) ;
220  jac[1*3+1]= unite*(xyz3[1] - xyz1[1]) ;
221  jac[1*3+2]= unite*(xyz3[2] - xyz1[2]) ;
222 
223  jac[2*3+0]= unite*(xyz4[0] - xyz1[0]) ;
224  jac[2*3+1]= unite*(xyz4[1] - xyz1[1]) ;
225  jac[2*3+2]= unite*(xyz4[2] - xyz1[2]) ;
226 
227  double detj=(jac[0*3+0]*jac[1*3+1]*jac[2*3+2]-jac[0*3+0]*jac[1*3+2]*jac[2*3+1]-jac[1*3+0]*jac[0*3+1]*jac[2*3+2]+jac[1*3+0]*jac[0*3+2]*jac[2*3+1]+jac[2*3+0]*jac[0*3+1]*jac[1*3+2]-jac[2*3+0]*jac[0*3+2]*jac[1*3+1]);
228 
229  j[0*3+0] = (jac[1*3+1]*jac[2*3+2]-jac[1*3+2]*jac[2*3+1])/(detj);
230  j[0*3+1] = -(jac[0*3+1]*jac[2*3+2]-jac[0*3+2]*jac[2*3+1])/(detj);
231  j[0*3+2] =-(-jac[0*3+1]*jac[1*3+2]+jac[0*3+2]*jac[1*3+1])/(detj);
232 
233  j[1*3+0] = -(jac[1*3+0]*jac[2*3+2]-jac[1*3+2]*jac[2*3+0])/(detj);
234  j[1*3+1] = (jac[0*3+0]*jac[2*3+2]-jac[0*3+2]*jac[2*3+0])/(detj);
235  j[1*3+2] = -(jac[0*3+0]*jac[1*3+2]-jac[0*3+2]*jac[1*3+0])/(detj);
236 
237  j[2*3+0] =-(-jac[1*3+0]*jac[2*3+1]+jac[1*3+1]*jac[2*3+0])/(detj);
238  j[2*3+1] = -(jac[0*3+0]*jac[2*3+1]-jac[0*3+1]*jac[2*3+0])/(detj);
239  j[2*3+2] = (jac[0*3+0]*jac[1*3+1]-jac[0*3+1]*jac[1*3+0])/(detj);
240 
241 }
XFEM_TETRA4::get_jacobien
virtual double get_jacobien(double *jac, double *uv, int &li, int &col, double unite=1.)
Definition: xfem_tetra4.cpp:181
FEM_ELEMENT_MAILLAGE::supprimer_xfem
virtual void supprimer_xfem(XFEM_ELEMENT_MAILLAGE *xele)
Definition: fem_element_maillage.cpp:134
gestionversion.h
XFEM_TETRA4::get_fem_noeud
virtual FEM_NOEUD * get_fem_noeud(int num)
Definition: xfem_tetra4.cpp:69
XFEM_ELEMENT3
Definition: xfem_element3.h:34
XFEM_ELEMENT_MAILLAGE::topo
MG_ELEMENT_TOPOLOGIQUE * topo
Definition: xfem_element_maillage.h:57
FEM_TEMPLATE_ELEMENT::get_boite_3D
virtual BOITE_3D & get_boite_3D(void)
Definition: fem_template_element.cpp:127
XFEM_TETRA4::get_fonction_derive_interpolation
virtual double get_fonction_derive_interpolation(int num, int numvariable, double *uv)
Definition: xfem_tetra4.cpp:119
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
fem_maillage.h
fem_noeud.h
XFEM_TETRA4::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)
Definition: xfem_tetra4.cpp:64
XFEM_TETRA4::XFEM_TETRA4
XFEM_TETRA4(unsigned long num, class FEM_ELEMENT_MAILLAGE *mai, class MG_ELEMENT_TOPOLOGIQUE *mgtopo, class FEM_NOEUD **tabnoeud)
Definition: xfem_tetra4.cpp:32
mg_element_maillage.h
XFEM_TETRA4::get_dimension
virtual int get_dimension(void)
Definition: xfem_tetra4.cpp:58
XFEM_ELEMENT_MAILLAGE::femmai
FEM_ELEMENT_MAILLAGE * femmai
Definition: xfem_element_maillage.h:56
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
FEM_NOEUD::get_coord
virtual double * get_coord(void)
Definition: fem_noeud.cpp:254
XFEM_TETRA4::nb_fonction_interpolation
virtual int nb_fonction_interpolation(void)
Definition: xfem_tetra4.cpp:95
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
XFEM_TETRA4::~XFEM_TETRA4
virtual ~XFEM_TETRA4()
Definition: xfem_tetra4.cpp:46
XFEM_TETRA4::get_boite_3D
virtual BOITE_3D & get_boite_3D(void)
Definition: xfem_tetra4.cpp:80
FEM_ELEMENT_MAILLAGE::ajouter_xfem
virtual void ajouter_xfem(class XFEM_ELEMENT_MAILLAGE *xele)
Definition: fem_element_maillage.cpp:129
XFEM_TETRA4
Definition: xfem_tetra4.h:34
XFEM_TETRA4::get_fonction_interpolation
virtual double get_fonction_interpolation(int num, double *uv)
Definition: xfem_tetra4.cpp:99
XFEM_TETRA4::change_noeud
virtual void change_noeud(int num, FEM_NOEUD *noeud)
Definition: xfem_tetra4.cpp:74
IDXFEM_TETRA4
const unsigned int IDXFEM_TETRA4
Definition: xfem_tetra4.h:31
FEM_NOEUD
Definition: fem_noeud.h:35
XFEM_ELEMENT_MAILLAGE::etat
int etat
Definition: xfem_element_maillage.h:59
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_tetra4.h
XFEM_ELEMENT_MAILLAGE::get_lien_topologie
virtual class MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: xfem_element_maillage.cpp:91
FEM_TEMPLATE_ELEMENT< 4 >::tab
FEM_NOEUD * tab[N]
Definition: fem_template_element.h:57
XFEM_TETRA4::get_type_entite
virtual int get_type_entite(void)
Definition: xfem_tetra4.cpp:53
XFEM_TETRA4::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: xfem_tetra4.cpp:85
XFEM_TETRA4::get_inverse_jacob
virtual void get_inverse_jacob(double *jac, double *uv, double unite=1.)
Definition: xfem_tetra4.cpp:206
FEM_TEMPLATE_ELEMENT
Definition: fem_template_element.h:35