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