ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_triangle6.cpp
Revision: 1104
Committed: Fri Sep 16 19:46:33 2022 UTC (2 years, 11 months ago) by francois
File size: 12143 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_triangle6.cpp
16 //
17 //------------------------------------------------------------
18 //------------------------------------------------------------
19 // COPYRIGHT 2000
20 // Version du 02/03/2006 � 11H22
21 //------------------------------------------------------------
22 //------------------------------------------------------------
23
24
25 #include "gestionversion.h"
26 #include "fem_triangle6.h"
27 #include "fem_noeud.h"
28 #include "mg_element_maillage.h"
29 #include "fem_maillage.h"
30 #include "math.h"
31 #include "ot_quadrature_gauss.h"
32
33 FEM_TRIANGLE6::FEM_TRIANGLE6(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,mai),FEM_TEMPLATE_ELEMENT<6>(tabnoeud)
34 {
35 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
36 tab[0]->get_lien_element2()->ajouter(this);
37 tab[1]->get_lien_element2()->ajouter(this);
38 tab[2]->get_lien_element2()->ajouter(this);
39 tab[3]->get_lien_element2()->ajouter(this);
40 tab[4]->get_lien_element2()->ajouter(this);
41 tab[5]->get_lien_element2()->ajouter(this);
42 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
43 }
44
45 FEM_TRIANGLE6::FEM_TRIANGLE6(class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(mai),FEM_TEMPLATE_ELEMENT<6>(tabnoeud)
46 {
47 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
48 tab[0]->get_lien_element2()->ajouter(this);
49 tab[1]->get_lien_element2()->ajouter(this);
50 tab[2]->get_lien_element2()->ajouter(this);
51 tab[3]->get_lien_element2()->ajouter(this);
52 tab[4]->get_lien_element2()->ajouter(this);
53 tab[5]->get_lien_element2()->ajouter(this);
54 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
55 }
56
57 FEM_TRIANGLE6::FEM_TRIANGLE6(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,topo),FEM_TEMPLATE_ELEMENT<6>(tabnoeud)
58 {
59 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
60 tab[0]->get_lien_element2()->ajouter(this);
61 tab[1]->get_lien_element2()->ajouter(this);
62 tab[2]->get_lien_element2()->ajouter(this);
63 tab[3]->get_lien_element2()->ajouter(this);
64 tab[4]->get_lien_element2()->ajouter(this);
65 tab[5]->get_lien_element2()->ajouter(this);
66 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
67 }
68
69 FEM_TRIANGLE6::FEM_TRIANGLE6(class MG_ELEMENT_TOPOLOGIQUE* topo,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(topo),FEM_TEMPLATE_ELEMENT<6>(tabnoeud)
70 {
71 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
72 tab[0]->get_lien_element2()->ajouter(this);
73 tab[1]->get_lien_element2()->ajouter(this);
74 tab[2]->get_lien_element2()->ajouter(this);
75 tab[3]->get_lien_element2()->ajouter(this);
76 tab[4]->get_lien_element2()->ajouter(this);
77 tab[5]->get_lien_element2()->ajouter(this);
78 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
79 }
80 FEM_TRIANGLE6::FEM_TRIANGLE6(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,topo,mai),FEM_TEMPLATE_ELEMENT<6>(tabnoeud)
81 {
82 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
83 tab[0]->get_lien_element2()->ajouter(this);
84 tab[1]->get_lien_element2()->ajouter(this);
85 tab[2]->get_lien_element2()->ajouter(this);
86 tab[3]->get_lien_element2()->ajouter(this);
87 tab[4]->get_lien_element2()->ajouter(this);
88 tab[5]->get_lien_element2()->ajouter(this);
89 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
90 }
91
92 FEM_TRIANGLE6::FEM_TRIANGLE6(class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(topo,mai),FEM_TEMPLATE_ELEMENT<6>(tabnoeud)
93 {
94 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
95 tab[0]->get_lien_element2()->ajouter(this);
96 tab[1]->get_lien_element2()->ajouter(this);
97 tab[2]->get_lien_element2()->ajouter(this);
98 tab[3]->get_lien_element2()->ajouter(this);
99 tab[4]->get_lien_element2()->ajouter(this);
100 tab[5]->get_lien_element2()->ajouter(this);
101 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
102 }
103
104
105
106 void FEM_TRIANGLE6::reinit_boite_3D(void)
107 {
108 FEM_TEMPLATE_ELEMENT<6>::reinit_boite_3D();
109 }
110
111
112
113
114 FEM_TRIANGLE6::FEM_TRIANGLE6(FEM_TRIANGLE6& mdd):FEM_ELEMENT2(mdd),FEM_TEMPLATE_ELEMENT<6>(mdd)
115 {
116 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
117 tab[0]->get_lien_element2()->ajouter(this);
118 tab[1]->get_lien_element2()->ajouter(this);
119 tab[2]->get_lien_element2()->ajouter(this);
120 tab[3]->get_lien_element2()->ajouter(this);
121 tab[4]->get_lien_element2()->ajouter(this);
122 tab[5]->get_lien_element2()->ajouter(this);
123 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
124 }
125 FEM_TRIANGLE6::~FEM_TRIANGLE6()
126 {
127 if (liaison_topologique!=NULL)
128 if (liaison_topologique->get_dimension()==0) liaison_topologique->get_lien_fem_maillage()->supprimer(this);
129 tab[0]->get_lien_element2()->supprimer(this);
130 tab[1]->get_lien_element2()->supprimer(this);
131 tab[2]->get_lien_element2()->supprimer(this);
132 tab[3]->get_lien_element2()->supprimer(this);
133 tab[4]->get_lien_element2()->supprimer(this);
134 tab[5]->get_lien_element2()->supprimer(this);
135 get_fem_noeudpetitid()->get_lien_petit_element2()->supprimer(this);
136 }
137
138 FEM_ELEMENT_MAILLAGE* FEM_TRIANGLE6::dupliquer(FEM_MAILLAGE *femmai,long decalage)
139 {
140 FEM_NOEUD* tabnoeud[6];
141 tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
142 tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
143 tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
144 tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
145 tabnoeud[4]=femmai->get_fem_noeudid(tab[4]->get_id()+decalage);
146 tabnoeud[5]=femmai->get_fem_noeudid(tab[5]->get_id()+decalage);
147 FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(get_id()+decalage,maillage,tabnoeud);
148 femmai->ajouter_fem_element2(tri);
149 return tri;
150 }
151
152
153 void FEM_TRIANGLE6::get_voisin_noeud(class FEM_NOEUD* no,TPL_LISTE_ENTITE<FEM_NOEUD*> &voisin)
154 {
155 voisin.vide();
156 if (no==tab[0])
157 {
158 voisin.ajouter(tab[1]);
159 voisin.ajouter(tab[5]);
160 }
161 if (no==tab[1])
162 {
163 voisin.ajouter(tab[0]);
164 voisin.ajouter(tab[2]);
165 }
166 if (no==tab[2])
167 {
168 voisin.ajouter(tab[1]);
169 voisin.ajouter(tab[3]);
170 }
171 if (no==tab[3])
172 {
173 voisin.ajouter(tab[2]);
174 voisin.ajouter(tab[4]);
175 }
176 if (no==tab[4])
177 {
178 voisin.ajouter(tab[3]);
179 voisin.ajouter(tab[5]);
180 }
181 if (no==tab[5])
182 {
183 voisin.ajouter(tab[4]);
184 voisin.ajouter(tab[0]);
185 }
186 }
187 bool FEM_TRIANGLE6::valide_parametre_EF(double* uvw)
188 {
189 if (uvw[0]>=-1e-10)
190 if (uvw[1]>=-1e-10)
191 if (uvw[0]+uvw[1]<=1.+1e-10)
192 return true;
193 return false;
194 }
195
196
197 int FEM_TRIANGLE6::get_type_entite(void)
198 {
199 return IDFEM_TRIANGLE6;
200 }
201
202 int FEM_TRIANGLE6::get_dimension(void)
203 {
204 return 2;
205 }
206
207
208 int FEM_TRIANGLE6::get_nb_fem_noeud(void)
209 {
210 return FEM_TEMPLATE_ELEMENT<6>::get_nb_fem_noeud();
211 }
212
213 FEM_NOEUD* FEM_TRIANGLE6::get_fem_noeud(int num)
214 {
215 return FEM_TEMPLATE_ELEMENT<6>::get_fem_noeud(num);
216 }
217
218 void FEM_TRIANGLE6::change_noeud(int num,FEM_NOEUD* noeud)
219 {
220 FEM_TEMPLATE_ELEMENT<6>::change_noeud(num,noeud);
221 }
222
223 BOITE_3D& FEM_TRIANGLE6::get_boite_3D(void)
224 {
225 return FEM_TEMPLATE_ELEMENT<6>::get_boite_3D();
226 }
227
228
229 void FEM_TRIANGLE6::enregistrer(std::ostream& o,double version)
230 {
231 if (maillage!=NULL)
232 if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TRIANGLE6($"<< get_lien_topologie()->get_id() << ",$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ");" << std::endl;
233 else o << "%" << get_id() << "=FEM_TRIANGLE6(NULL,$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ");" << std::endl;
234 else
235 if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TRIANGLE6($"<< get_lien_topologie()->get_id() << ",NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ");" << std::endl;
236 else o << "%" << get_id() << "=FEM_TRIANGLE6(NULL,NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ");" << std::endl;
237
238 }
239
240 int FEM_TRIANGLE6::get_nb_pt_gauss(int degre)
241 {
242 return OT_POINTS_GAUSS::get_nb_point_tri(degre);
243 }
244
245 void FEM_TRIANGLE6::get_pt_gauss(int degre,int num,double &w,double *uv)
246 {
247 return OT_POINTS_GAUSS::get_pt_gauss_tri(degre,num,w,uv);
248 }
249
250 int FEM_TRIANGLE6::get_degre_gauss(int num)
251 {
252 return OT_POINTS_GAUSS::get_degre_gauss_tri(num);
253 }
254
255 int FEM_TRIANGLE6::get_nb_fonction_interpolation(void)
256 {
257 return 6;
258 }
259 int FEM_TRIANGLE6::get_degremax_fonction_interpolation(void)
260 {
261 return 2;
262 }
263 double FEM_TRIANGLE6::get_fonction_interpolation(int num,double *uv)
264 {
265 double val;
266 switch (num)
267 {
268 case 1:
269 val=(-1+uv[0]+uv[1])*(-1+2*uv[0]+2*uv[1]);
270 break;
271 case 2:
272 val=4.*uv[0]*(1-uv[0]-uv[1]);
273 break;
274 case 3:
275 val=-uv[0]*(1.-2.*uv[0]);
276 break;
277 case 4:
278 val=4.*uv[0]*uv[1];
279 break;
280 case 5:
281 val=-uv[1]*(1-2*uv[1]);
282 break;
283 case 6:
284 val=4.*uv[1]*(1-uv[0]-uv[1]);
285 break;
286
287 }
288 return val;
289 }
290
291 double FEM_TRIANGLE6::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
292 {
293 double val;
294
295 switch (num)
296 {
297 case 1:
298 switch (num_variable)
299 {
300 case 1:
301 val=-3.+4*uv[0]+4*uv[1];
302 break;
303 case 2:
304 val=-3.+4*uv[0]+4*uv[1];
305 break;
306 } break;
307 case 2:
308 switch (num_variable)
309 {
310 case 1:
311 val=4.-8*uv[0]-4*uv[1];
312 break;
313 case 2:
314 val=-4.*uv[0];
315 break;
316 }break;
317 case 3:
318 switch (num_variable)
319 {
320 case 1:
321 val=-1.+4*uv[0];
322 break;
323 case 2:
324 val=0.;
325 break;
326 }break;
327 case 4:
328 switch (num_variable)
329 {
330 case 1:
331 val=4*uv[1];
332 break;
333 case 2:
334 val=4*uv[0];
335 break;
336 }break;
337 case 5:
338 switch (num_variable)
339 {
340 case 1:
341 val=0.;
342 break;
343 case 2:
344 val=-1+4.*uv[1];
345 break;
346 }break;
347 case 6:
348 switch (num_variable)
349 {
350 case 1:
351 val=-4*uv[1];
352 break;
353 case 2:
354 val=4-4*uv[0]-8*uv[1];
355 break;
356 }break;
357
358 }
359 return val;
360 }
361
362