MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fem_element3.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_element3.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 <math.h>
26 #include "fem_element3.h"
27 #include "xfem_element3.h"
28 #include "fem_noeud.h"
29 #include "fem_maillage.h"
30 #include "mg_element_maillage.h"
31 #include "ot_boite_3d.h"
32 #include "ot_mathematique.h"
33 
35 {
36 }
38 {
39 }
40 FEM_ELEMENT3::FEM_ELEMENT3(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai):FEM_ELEMENT_MAILLAGE(num,topo,mai)
41 {
42 }
43 
45 {
46 }
47 
49 {
50 }
52 {
53 }
54 
55 
57 {
58 }
59 
60 
61 
63 {
64 }
65 
66 bool FEM_ELEMENT3::get_param_element_fini(double *xyz,double *uvw)
67 {
69 OT_VECTEUR_3D vec;
70 uvw[0]=0.;
71 uvw[1]=0.;
72 uvw[2]=0.;
73 
74 int compteur=0;
75 int ok=0;
76 while (ok!=1)
77 {
78 ok=0;
79 int cas=compteur/100-1;
80 int base=4;
81 if (compteur!=0)
82  {
83  int i=cas%base;
84  int j=(cas/base)%base;
85  int k=(cas/base/base)%base;
86  uvw[0]=-1.+2.*i/(base-1);
87  uvw[1]=-1.+2.*j/(base-1);
88  uvw[2]=-1.+2.*k/(base-1);
89  }
90 if (cas>base*base*base) return false;
91 while (ok==0)
92 {
93 mat(0,0)=0.;mat(0,1)=0.;mat(0,2)=0.;
94 mat(1,0)=0.;mat(1,1)=0.;mat(1,2)=0.;
95 mat(2,0)=0.;mat(2,1)=0.;mat(2,2)=0.;
96 vec(0)=xyz[0];vec(1)=xyz[1];vec(2)=xyz[2];
97 
98 for (int i=0;i<get_nb_fem_noeud();i++)
99  {
100  mat(0,0)=mat(0,0)+get_fonction_derive_interpolation(i+1,1,uvw)*get_fem_noeud(i)->get_x();
101  mat(0,1)=mat(0,1)+get_fonction_derive_interpolation(i+1,2,uvw)*get_fem_noeud(i)->get_x();
102  mat(0,2)=mat(0,2)+get_fonction_derive_interpolation(i+1,3,uvw)*get_fem_noeud(i)->get_x();
103  mat(1,0)=mat(1,0)+get_fonction_derive_interpolation(i+1,1,uvw)*get_fem_noeud(i)->get_y();
104  mat(1,1)=mat(1,1)+get_fonction_derive_interpolation(i+1,2,uvw)*get_fem_noeud(i)->get_y();
105  mat(1,2)=mat(1,2)+get_fonction_derive_interpolation(i+1,3,uvw)*get_fem_noeud(i)->get_y();
106  mat(2,0)=mat(2,0)+get_fonction_derive_interpolation(i+1,1,uvw)*get_fem_noeud(i)->get_z();
107  mat(2,1)=mat(2,1)+get_fonction_derive_interpolation(i+1,2,uvw)*get_fem_noeud(i)->get_z();
108  mat(2,2)=mat(2,2)+get_fonction_derive_interpolation(i+1,3,uvw)*get_fem_noeud(i)->get_z();
109  vec(0)=vec(0)-get_fonction_interpolation(i+1,uvw)*get_fem_noeud(i)->get_x();
110  vec(1)=vec(1)-get_fonction_interpolation(i+1,uvw)*get_fem_noeud(i)->get_y();
111  vec(2)=vec(2)-get_fonction_interpolation(i+1,uvw)*get_fem_noeud(i)->get_z();
112  }
113 double det=mat.get_determinant();
114 if (fabs(det)<1e-12) ok=3;
115 OT_MATRICE_3D mat1(vec,mat.get_vecteur2(),mat.get_vecteur3());
116 OT_MATRICE_3D mat2(mat.get_vecteur1(),vec,mat.get_vecteur3());
117 OT_MATRICE_3D mat3(mat.get_vecteur1(),mat.get_vecteur2(),vec);
118 double d1=mat1.get_determinant()/det;
119 double d2=mat2.get_determinant()/det;
120 double d3=mat3.get_determinant()/det;
121 compteur++;
122 if (compteur%100==0) ok=2;
123 if ((fabs(d1)<1e-8)&&(fabs(d2)<1e-8)&&(fabs(d3)<1e-8)) ok=1;
124 uvw[0]=uvw[0]+d1;
125 uvw[1]=uvw[1]+d2;
126 uvw[2]=uvw[2]+d3;
127 }
128 }
129 return true;
130 }
131 
132 
133 void FEM_ELEMENT3::get_interpolation_xyz(double* uvw, double* xyz)
134 {
135 xyz[0]=0.;xyz[1]=0.;xyz[2]=0;
136 for (int i=0;i<get_nb_fem_noeud();i++)
137  {
141  }
142 }
143 
144 double FEM_ELEMENT3::get_jacobien(double* jac,double *uv,double unite)
145 {
146  int nb=get_nb_fem_noeud();
147 
148  OT_MATRICE_3D jacobien;
149  for (int i=0;i<3;i++)
150  {
151  jacobien(i,0)=0.;jacobien(i,1)=0.;jacobien(i,2)=0.;
152  for (int k=0;k<nb;k++)
153  {
154  double valderiv=get_fonction_derive_interpolation(k+1,i+1,uv);
155  double *xyz=get_fem_noeud(k)->get_coord();
156  jacobien(i,0)=jacobien(i,0)+valderiv*xyz[0]*unite;
157  jacobien(i,1)=jacobien(i,1)+valderiv*xyz[1]*unite;
158  jacobien(i,2)=jacobien(i,2)+valderiv*xyz[2]*unite;
159  }
160  }
161  jac[0]=jacobien(0,0);
162  jac[1]=jacobien(0,1);
163  jac[2]=jacobien(0,2);
164 
165  jac[3]=jacobien(1,0);
166  jac[4]=jacobien(1,1);
167  jac[5]=jacobien(1,2);
168 
169  jac[6]=jacobien(2,0);
170  jac[7]=jacobien(2,1);
171  jac[8]=jacobien(2,2);
172 
173  double det=jacobien.get_determinant();
174  return det;
175 }
176 
177 void FEM_ELEMENT3::get_inverse_jacob(double* j,double *uv,double unite)
178 {
179  double jac[9];
180  get_jacobien(jac,uv,unite);
181  OT_MATRICE_3D J;
182  J(0,0)=jac[0];
183  J(0,1)=jac[1];
184  J(0,2)=jac[2];
185  J(1,0)=jac[3];
186  J(1,1)=jac[4];
187  J(1,2)=jac[5];
188  J(2,0)=jac[6];
189  J(2,1)=jac[7];
190  J(2,2)=jac[8];
191  OT_MATRICE_3D j_i=J.inverse();
192 
193 
194  j[0]=j_i(0,0);
195  j[1]=j_i(0,1);
196  j[2]=j_i(0,2);
197 
198  j[3]=j_i(1,0);
199  j[4]=j_i(1,1);
200  j[5]=j_i(1,2);
201 
202  j[6]=j_i(2,0);
203  j[7]=j_i(2,1);
204  j[8]=j_i(2,2);
205 }
OT_MATRICE_3D::get_determinant
double get_determinant()
Definition: ot_mathematique.cpp:735
gestionversion.h
fem_element3.h
FEM_ELEMENT3::get_inverse_jacob
virtual void get_inverse_jacob(double *jac, double *uv, double unite=1.)
Definition: fem_element3.cpp:177
FEM_ELEMENT3::FEM_ELEMENT3
FEM_ELEMENT3(unsigned long num, class MG_ELEMENT_MAILLAGE *mai)
Definition: fem_element3.cpp:34
FEM_ELEMENT3::get_fem_noeud
virtual class FEM_NOEUD * get_fem_noeud(int num)=0
mat2
#define mat2(i, j)
fem_maillage.h
fem_noeud.h
MG_ELEMENT_MAILLAGE
Definition: mg_element_maillage.h:38
mat1
#define mat1(i, j)
FEM_ELEMENT3
Definition: fem_element3.h:34
mg_element_maillage.h
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
FEM_ELEMENT3::get_param_element_fini
virtual bool get_param_element_fini(double *xyz, double *uvw)
Definition: fem_element3.cpp:66
FEM_NOEUD::get_y
virtual double get_y(double coef=0.)
Definition: fem_noeud.cpp:210
FEM_NOEUD::get_coord
virtual double * get_coord(void)
Definition: fem_noeud.cpp:254
FEM_ELEMENT_MAILLAGE
Definition: fem_element_maillage.h:35
FEM_ELEMENT3::get_fonction_derive_interpolation
virtual double get_fonction_derive_interpolation(int num, int numvariable, double *uv)=0
OT_MATRICE_3D
Definition: ot_mathematique.h:160
FEM_ELEMENT3::get_fonction_interpolation
virtual double get_fonction_interpolation(int num, double *uv)=0
FEM_ELEMENT3::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
FEM_ELEMENT3::get_jacobien
virtual double get_jacobien(double *jac, double *uv, double unite=1.)
Definition: fem_element3.cpp:144
FEM_ELEMENT3::get_interpolation_xyz
virtual void get_interpolation_xyz(double *uvw, double *xyz)
Definition: fem_element3.cpp:133
ot_mathematique.h
FEM_NOEUD::get_x
virtual double get_x(double coef=0.)
Definition: fem_noeud.cpp:205
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
FEM_NOEUD::get_z
virtual double get_z(double coef=0.)
Definition: fem_noeud.cpp:215
ot_boite_3d.h
FEM_NOEUD::xyz
double xyz[3]
Definition: fem_noeud.h:105
FEM_ELEMENT3::~FEM_ELEMENT3
virtual ~FEM_ELEMENT3()
Definition: fem_element3.cpp:62
xfem_element3.h
OT_MATRICE_3D::inverse
OT_MATRICE_3D inverse() const
Definition: ot_mathematique.cpp:767
mat
#define mat(i, j)