ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_element2.cpp
Revision: 1104
Committed: Fri Sep 16 19:46:33 2022 UTC (2 years, 11 months ago) by francois
File size: 5580 byte(s)
Log Message:
Generalisation du calcul du Jacobien en 2D et 3D

File Contents

# Content
1 //------------------------------------------------------------
2 //------------------------------------------------------------
3 // MAGiC
4 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5 // D�partement de G�nie M�canique - UQTR
6 //------------------------------------------------------------
7 // Le projet MAGIC est un projet de recherche du d�partement
8 // de g�nie m�canique de l'Universit� du Qu�bec �
9 // Trois Rivi�res
10 // Les librairies ne peuvent �tre utilis�es sans l'accord
11 // des auteurs (contact : francois@uqtr.ca)
12 //------------------------------------------------------------
13 //------------------------------------------------------------
14 //
15 // fem_triangle.cpp
16 //
17 //------------------------------------------------------------
18 //------------------------------------------------------------
19 // COPYRIGHT 2000
20 // Version du 02/03/2006 � 11H22
21 //------------------------------------------------------------
22 //------------------------------------------------------------
23
24
25 #include "gestionversion.h"
26 #include <math.h>
27 #include "fem_element2.h"
28 #include "fem_noeud.h"
29 #include "mg_element_maillage.h"
30 #include "ot_mathematique.h"
31
32 FEM_ELEMENT2::FEM_ELEMENT2(unsigned long num,class MG_ELEMENT_MAILLAGE* mai):FEM_ELEMENT_MAILLAGE(num,mai)
33 {
34 }
35 FEM_ELEMENT2::FEM_ELEMENT2(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo):FEM_ELEMENT_MAILLAGE(num,topo)
36 {
37 }
38 FEM_ELEMENT2::FEM_ELEMENT2(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai):FEM_ELEMENT_MAILLAGE(num,topo,mai)
39 {
40 }
41
42 FEM_ELEMENT2::FEM_ELEMENT2(class MG_ELEMENT_MAILLAGE* mai):FEM_ELEMENT_MAILLAGE(mai)
43 {
44 }
45 FEM_ELEMENT2::FEM_ELEMENT2(class MG_ELEMENT_TOPOLOGIQUE* topo):FEM_ELEMENT_MAILLAGE(topo)
46 {
47 }
48 FEM_ELEMENT2::FEM_ELEMENT2(class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai):FEM_ELEMENT_MAILLAGE(topo,mai)
49 {
50 }
51
52 FEM_ELEMENT2::FEM_ELEMENT2(FEM_ELEMENT2& mdd):FEM_ELEMENT_MAILLAGE(mdd)
53 {
54 }
55
56 int FEM_ELEMENT2::get_etat(void)
57 {
58 return etat;
59 }
60 void FEM_ELEMENT2::change_etat(int num)
61 {
62 etat=num;
63 }
64
65 FEM_ELEMENT2::~FEM_ELEMENT2()
66 {
67 }
68
69
70 void FEM_ELEMENT2::extrapoler_solution_noeud(void)
71 {
72 int nb=get_nb_fem_noeud();
73 for (int i=0;i<nb;i++)
74 for (int j=0;j<MAX_TYPE_SOLUTION;j++)
75 get_fem_noeud(i)->change_solution(solution[j],j);
76 }
77
78 bool FEM_ELEMENT2::get_param_element_fini_2D(double *xyz,double *uv)
79 {
80 OT_MATRICE_3D mat;
81 OT_VECTEUR_3D vec;
82 uv[0]=0.;
83 uv[1]=0.;
84
85 int compteur=0;
86 int ok=0;
87
88 while (ok==0)
89 {
90 mat(0,0)=0.;mat(0,1)=0.;mat(0,2)=0.;
91 mat(1,0)=0.;mat(1,1)=0.;mat(1,2)=0.;
92 mat(2,0)=0.;mat(2,1)=0.;mat(2,2)=0.;
93 vec(0)=xyz[0];vec(1)=xyz[1];vec(2)=xyz[2];
94
95 for (int i=0;i<get_nb_fem_noeud();i++)
96 {
97 mat(0,0)=mat(0,0)+get_fonction_derive_interpolation(i+1,1,uv)*get_fem_noeud(i)->get_x();
98 mat(0,1)=mat(0,1)+get_fonction_derive_interpolation(i+1,2,uv)*get_fem_noeud(i)->get_x();
99 mat(1,0)=mat(1,0)+get_fonction_derive_interpolation(i+1,1,uv)*get_fem_noeud(i)->get_y();
100 mat(1,1)=mat(1,1)+get_fonction_derive_interpolation(i+1,2,uv)*get_fem_noeud(i)->get_y();
101 vec(0)=vec(0)-get_fonction_interpolation(i+1,uv)*get_fem_noeud(i)->get_x();
102 vec(1)=vec(1)-get_fonction_interpolation(i+1,uv)*get_fem_noeud(i)->get_y();
103 }
104 double det=mat(0,0)*mat(1,1)-mat(0,1)*mat(1,0);
105 if (fabs(det)<1e-12) return false;
106 double d1=(vec(0)*mat(1,1)-vec(1)*mat(0,1))/det;
107 double d2=(vec(1)*mat(0,0)-vec(0)*mat(1,0))/det;
108 compteur++;
109 if (compteur>100) return false;
110 if ((fabs(d1)<1e-8)&&(fabs(d2)<1e-8)) ok=1;
111 uv[0]=uv[0]+d1;
112 uv[1]=uv[1]+d2;
113 }
114 return true;
115
116 }
117
118
119 void FEM_ELEMENT2::get_interpolation_xyz(double* uv, double* xyz)
120 {
121 xyz[0]=0.;xyz[1]=0.;xyz[2]=0;
122 for (int i=0;i<get_nb_fem_noeud();i++)
123 {
124 xyz[0]=xyz[0]+get_fonction_interpolation(i+1,uv)*get_fem_noeud(i)->get_x();
125 xyz[1]=xyz[1]+get_fonction_interpolation(i+1,uv)*get_fem_noeud(i)->get_y();
126 xyz[2]=xyz[2]+get_fonction_interpolation(i+1,uv)*get_fem_noeud(i)->get_z();
127 }
128 }
129
130 double FEM_ELEMENT2::get_jacobien(double* jac,double *uv,double unite)
131 {
132 int nb=get_nb_fem_noeud();
133
134 OT_MATRICE_3D jacobien;
135 for (int i=0;i<2;i++)
136 {
137 jacobien(i,0)=0.;jacobien(i,1)=0.;jacobien(i,2)=0.;
138 for (int k=0;k<nb;k++)
139 {
140 double valderiv=get_fonction_derive_interpolation(k+1,i+1,uv);
141 double *xyz=get_fem_noeud(k)->get_coord();
142 jacobien(i,0)=jacobien(i,0)+valderiv*xyz[0]*unite;
143 jacobien(i,1)=jacobien(i,1)+valderiv*xyz[1]*unite;
144 jacobien(i,2)=jacobien(i,2)+valderiv*xyz[2]*unite;
145 }
146 }
147 OT_VECTEUR_3D j1(jacobien(0,0),jacobien(0,1),jacobien(0,2));
148 OT_VECTEUR_3D j2(jacobien(1,0),jacobien(1,1),jacobien(1,2));
149 OT_VECTEUR_3D j3=j1&j2;
150 j3.norme();
151 jacobien(2,0)=j3(0);
152 jacobien(2,1)=j3(1);
153 jacobien(2,2)=j3(2);
154
155 jac[0]=jacobien(0,0);
156 jac[1]=jacobien(0,1);
157 jac[2]=jacobien(0,2);
158
159 jac[3]=jacobien(1,0);
160 jac[4]=jacobien(1,1);
161 jac[5]=jacobien(1,2);
162
163 jac[6]=jacobien(2,0);
164 jac[7]=jacobien(2,1);
165 jac[8]=jacobien(2,2);
166
167 double det=jacobien.get_determinant();
168 return det;
169 }
170
171 void FEM_ELEMENT2::get_inverse_jacob(double* j,double *uv,double unite)
172 {
173 double jac[9];
174 get_jacobien(jac,uv,unite);
175 OT_MATRICE_3D J;
176 J(0,0)=jac[0];
177 J(0,1)=jac[1];
178 J(0,2)=jac[2];
179 J(1,0)=jac[3];
180 J(1,1)=jac[4];
181 J(1,2)=jac[5];
182 J(2,0)=jac[6];
183 J(2,1)=jac[7];
184 J(2,2)=jac[8];
185 OT_MATRICE_3D j_i=J.inverse();
186
187
188 j[0]=j_i(0,0);
189 j[1]=j_i(0,1);
190 j[2]=j_i(0,2);
191
192 j[3]=j_i(1,0);
193 j[4]=j_i(1,1);
194 j[5]=j_i(1,2);
195
196 j[6]=j_i(2,0);
197 j[7]=j_i(2,1);
198 j[8]=j_i(2,2);
199 }