ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/fem_quadrangle8.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months, 1 week ago) by francois
File size: 14491 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

# User Rev Content
1 francois 1158 //####//------------------------------------------------------------
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_quadrangle8.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:58:54 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 310
23    
24     #include "gestionversion.h"
25     #include "fem_quadrangle8.h"
26     #include "fem_maillage.h"
27     #include "fem_noeud.h"
28     #include "mg_element_maillage.h"
29 francois 754 #include "ot_quadrature_gauss.h"
30 francois 310
31    
32     FEM_QUADRANGLE8::FEM_QUADRANGLE8(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,mai),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
33     {
34     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
35     tab[0]->get_lien_element2()->ajouter(this);
36     tab[1]->get_lien_element2()->ajouter(this);
37     tab[2]->get_lien_element2()->ajouter(this);
38     tab[3]->get_lien_element2()->ajouter(this);
39     tab[4]->get_lien_element2()->ajouter(this);
40     tab[5]->get_lien_element2()->ajouter(this);
41     tab[6]->get_lien_element2()->ajouter(this);
42     tab[7]->get_lien_element2()->ajouter(this);
43     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
44     }
45    
46     FEM_QUADRANGLE8::FEM_QUADRANGLE8(class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(mai),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
47     {
48     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
49     tab[0]->get_lien_element2()->ajouter(this);
50     tab[1]->get_lien_element2()->ajouter(this);
51     tab[2]->get_lien_element2()->ajouter(this);
52     tab[3]->get_lien_element2()->ajouter(this);
53     tab[4]->get_lien_element2()->ajouter(this);
54     tab[5]->get_lien_element2()->ajouter(this);
55     tab[6]->get_lien_element2()->ajouter(this);
56     tab[7]->get_lien_element2()->ajouter(this);
57     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
58     }
59 francois 378 FEM_QUADRANGLE8::FEM_QUADRANGLE8(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,topo),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
60     {
61     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
62     tab[0]->get_lien_element2()->ajouter(this);
63     tab[1]->get_lien_element2()->ajouter(this);
64     tab[2]->get_lien_element2()->ajouter(this);
65     tab[3]->get_lien_element2()->ajouter(this);
66     tab[4]->get_lien_element2()->ajouter(this);
67     tab[5]->get_lien_element2()->ajouter(this);
68     tab[6]->get_lien_element2()->ajouter(this);
69     tab[7]->get_lien_element2()->ajouter(this);
70     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
71     }
72 francois 310
73 francois 378 FEM_QUADRANGLE8::FEM_QUADRANGLE8(class MG_ELEMENT_TOPOLOGIQUE* topo,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(topo),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
74     {
75     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
76     tab[0]->get_lien_element2()->ajouter(this);
77     tab[1]->get_lien_element2()->ajouter(this);
78     tab[2]->get_lien_element2()->ajouter(this);
79     tab[3]->get_lien_element2()->ajouter(this);
80     tab[4]->get_lien_element2()->ajouter(this);
81     tab[5]->get_lien_element2()->ajouter(this);
82     tab[6]->get_lien_element2()->ajouter(this);
83     tab[7]->get_lien_element2()->ajouter(this);
84     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
85     }
86     FEM_QUADRANGLE8::FEM_QUADRANGLE8(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<8>(tabnoeud)
87     {
88     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
89     tab[0]->get_lien_element2()->ajouter(this);
90     tab[1]->get_lien_element2()->ajouter(this);
91     tab[2]->get_lien_element2()->ajouter(this);
92     tab[3]->get_lien_element2()->ajouter(this);
93     tab[4]->get_lien_element2()->ajouter(this);
94     tab[5]->get_lien_element2()->ajouter(this);
95     tab[6]->get_lien_element2()->ajouter(this);
96     tab[7]->get_lien_element2()->ajouter(this);
97     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
98     }
99    
100     FEM_QUADRANGLE8::FEM_QUADRANGLE8(class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(topo,mai),FEM_TEMPLATE_ELEMENT<8>(tabnoeud)
101     {
102     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
103     tab[0]->get_lien_element2()->ajouter(this);
104     tab[1]->get_lien_element2()->ajouter(this);
105     tab[2]->get_lien_element2()->ajouter(this);
106     tab[3]->get_lien_element2()->ajouter(this);
107     tab[4]->get_lien_element2()->ajouter(this);
108     tab[5]->get_lien_element2()->ajouter(this);
109     tab[6]->get_lien_element2()->ajouter(this);
110     tab[7]->get_lien_element2()->ajouter(this);
111     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
112     }
113    
114    
115    
116    
117    
118    
119    
120    
121    
122 francois 310 FEM_QUADRANGLE8::FEM_QUADRANGLE8(FEM_QUADRANGLE8& mdd):FEM_ELEMENT2(mdd),FEM_TEMPLATE_ELEMENT<8>(mdd)
123     {
124     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
125     tab[0]->get_lien_element2()->ajouter(this);
126     tab[1]->get_lien_element2()->ajouter(this);
127     tab[2]->get_lien_element2()->ajouter(this);
128     tab[3]->get_lien_element2()->ajouter(this);
129     tab[4]->get_lien_element2()->ajouter(this);
130     tab[5]->get_lien_element2()->ajouter(this);
131     tab[6]->get_lien_element2()->ajouter(this);
132     tab[7]->get_lien_element2()->ajouter(this);
133     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
134     }
135     FEM_QUADRANGLE8::~FEM_QUADRANGLE8()
136     {
137 francois 663 if (liaison_topologique!=NULL)
138     if (liaison_topologique->get_dimension()==0) liaison_topologique->get_lien_fem_maillage()->supprimer(this);
139 francois 310 tab[0]->get_lien_element2()->supprimer(this);
140     tab[1]->get_lien_element2()->supprimer(this);
141     tab[2]->get_lien_element2()->supprimer(this);
142     tab[3]->get_lien_element2()->supprimer(this);
143     tab[4]->get_lien_element2()->supprimer(this);
144     tab[5]->get_lien_element2()->supprimer(this);
145     tab[6]->get_lien_element2()->supprimer(this);
146     tab[7]->get_lien_element2()->supprimer(this);
147     get_fem_noeudpetitid()->get_lien_petit_element2()->supprimer(this);
148     }
149    
150    
151     FEM_ELEMENT_MAILLAGE* FEM_QUADRANGLE8::dupliquer(FEM_MAILLAGE *femmai,long decalage)
152     {
153     FEM_NOEUD* tabnoeud[8];
154     tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
155     tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
156     tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
157     tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
158     tabnoeud[4]=femmai->get_fem_noeudid(tab[4]->get_id()+decalage);
159     tabnoeud[5]=femmai->get_fem_noeudid(tab[5]->get_id()+decalage);
160     tabnoeud[6]=femmai->get_fem_noeudid(tab[6]->get_id()+decalage);
161     tabnoeud[7]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
162     FEM_QUADRANGLE8* quad=new FEM_QUADRANGLE8(get_id()+decalage,maillage,tabnoeud);
163     femmai->ajouter_fem_element2(quad);
164     return quad;
165     }
166    
167 francois 635 bool FEM_QUADRANGLE8::valide_parametre_EF(double* uvw)
168     {
169 francois 674 if (uvw[0]>=-1.-1e-10)
170     if (uvw[1]>=-1.-1e-10)
171 francois 635 if (uvw[0]<=1.+1e-10)
172     if (uvw[1]<=1.+1e-10)
173     return true;
174     return false;
175     }
176 francois 310
177 francois 786 void FEM_QUADRANGLE8::get_voisin_noeud(FEM_NOEUD* no, TPL_LISTE_ENTITE< FEM_NOEUD* >& voisin)
178     {
179     voisin.vide();
180     if (no==tab[0])
181     {
182     voisin.ajouter(tab[1]);
183     voisin.ajouter(tab[7]);
184     }
185     if (no==tab[1])
186     {
187     voisin.ajouter(tab[0]);
188     voisin.ajouter(tab[2]);
189     }
190     if (no==tab[2])
191     {
192     voisin.ajouter(tab[1]);
193     voisin.ajouter(tab[3]);
194     }
195     if (no==tab[3])
196     {
197     voisin.ajouter(tab[2]);
198     voisin.ajouter(tab[4]);
199     }
200     if (no==tab[4])
201     {
202     voisin.ajouter(tab[3]);
203     voisin.ajouter(tab[5]);
204     }
205     if (no==tab[5])
206     {
207     voisin.ajouter(tab[4]);
208     voisin.ajouter(tab[6]);
209     }
210     if (no==tab[6])
211     {
212     voisin.ajouter(tab[5]);
213     voisin.ajouter(tab[7]);
214     }
215     if (no==tab[7])
216     {
217     voisin.ajouter(tab[6]);
218     voisin.ajouter(tab[0]);
219     }
220     }
221 francois 310
222    
223     int FEM_QUADRANGLE8::get_type_entite(void)
224     {
225 francois 1150 return MAGIC::TYPE_ENTITE::IDFEM_QUADRANGLE8;
226 francois 310 }
227    
228     int FEM_QUADRANGLE8::get_dimension(void)
229     {
230     return 2;
231     }
232    
233 francois 684 void FEM_QUADRANGLE8::reinit_boite_3D(void)
234     {
235     FEM_TEMPLATE_ELEMENT<8>::reinit_boite_3D();
236     }
237 francois 310
238     int FEM_QUADRANGLE8::get_nb_fem_noeud(void)
239     {
240     return FEM_TEMPLATE_ELEMENT<8>::get_nb_fem_noeud();
241     }
242    
243     FEM_NOEUD* FEM_QUADRANGLE8::get_fem_noeud(int num)
244     {
245     return FEM_TEMPLATE_ELEMENT<8>::get_fem_noeud(num);
246     }
247    
248     void FEM_QUADRANGLE8::change_noeud(int num,FEM_NOEUD* noeud)
249     {
250     FEM_TEMPLATE_ELEMENT<8>::change_noeud(num,noeud);
251     }
252    
253     BOITE_3D& FEM_QUADRANGLE8::get_boite_3D(void)
254     {
255     return FEM_TEMPLATE_ELEMENT<8>::get_boite_3D();
256     }
257    
258    
259 francois 763 void FEM_QUADRANGLE8::enregistrer(std::ostream& o,double version)
260 francois 310 {
261 francois 378 if (maillage!=NULL)
262     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_QUADRANGLE8($"<< 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() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<< ");" << std::endl;
263     else o << "%" << get_id() << "=FEM_QUADRANGLE8(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() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<<");" << std::endl;
264     else
265     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_QUADRANGLE8($"<< 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() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<< ");" << std::endl;
266     else o << "%" << get_id() << "=FEM_QUADRANGLE8(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() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<<");" << std::endl;
267    
268 francois 310 }
269 francois 637
270     int FEM_QUADRANGLE8::get_nb_pt_gauss(int degre)
271     {
272 francois 755 return OT_POINTS_GAUSS::get_nb_point_quad_prod(degre);
273 francois 637 }
274    
275     void FEM_QUADRANGLE8::get_pt_gauss(int degre,int num,double &w,double *uv)
276     {
277 francois 755 return OT_POINTS_GAUSS::get_pt_gauss_qua_prod(degre,num,w,uv);
278 francois 637 }
279 francois 757
280     int FEM_QUADRANGLE8::get_degre_gauss(int num)
281     {
282     return OT_POINTS_GAUSS::get_degre_gauss_quad_prod(num);
283     }
284    
285    
286 francois 638 int FEM_QUADRANGLE8::get_nb_fonction_interpolation(void)
287 francois 310 {
288     return 8;
289     }
290    
291 francois 638 int FEM_QUADRANGLE8::get_degremax_fonction_interpolation(void)
292     {
293     return 3;
294     }
295 francois 310 double FEM_QUADRANGLE8::get_fonction_interpolation(int num,double *uv)
296     {
297     double val;
298     switch (num)
299     {
300     case 1:
301     val=-0.25*(1-uv[0])*(1-uv[1])*(1.+uv[0]+uv[1]);
302     break;
303     case 2:
304     val=0.5*(1-uv[0]*uv[0])*(1-uv[1]);
305     break;
306     case 3:
307     val=-0.25*(1+uv[0])*(1-uv[1])*(1.-uv[0]+uv[1]);
308     break;
309     case 4:
310     val=0.5*(1+uv[0])*(1-uv[1]*uv[1]);
311     break;
312     case 5:
313     val=-0.25*(1+uv[0])*(1+uv[1])*(1.-uv[0]-uv[1]);
314     break;
315     case 6:
316     val=0.5*(1-uv[0]*uv[0])*(1+uv[1]);
317     break;
318     case 7:
319     val=-0.25*(1-uv[0])*(1+uv[1])*(1.+uv[0]-uv[1]);
320     break;
321     case 8:
322     val=0.5*(1-uv[0])*(1-uv[1]*uv[1]);
323     break;
324     }
325     return val;
326     }
327    
328     double FEM_QUADRANGLE8::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
329     {
330     double val;
331    
332     switch (num)
333     {
334     case 1:
335     switch (num_variable)
336     {
337     case 1:
338 francois 1104 val=0.25*(1.-uv[1])*(2.*uv[0]+uv[1]);
339 francois 310 break;
340     case 2:
341 francois 1104 val=0.25*(1.-uv[0])*(uv[0]+2.*uv[1]);
342 francois 310 break;
343     } break;
344     case 2:
345     switch (num_variable)
346     {
347     case 1:
348     val=-uv[0]*(1.-uv[1]);
349     break;
350     case 2:
351 francois 1104 val=-0.5*(1.-uv[0]*uv[0]);
352 francois 310 break;
353     }break;
354     case 3:
355     switch (num_variable)
356     {
357     case 1:
358 francois 1104 val=0.25*(1.-uv[1])*(2.*uv[0]-uv[1]);
359 francois 310 break;
360     case 2:
361     val=-0.25*(1.+uv[0])*(uv[0]-2.*uv[1]);
362     break;
363     }break;
364     case 4:
365     switch (num_variable)
366     {
367     case 1:
368     val=0.5*(1.-uv[1]*uv[1]);
369     break;
370     case 2:
371 francois 1104 val=-uv[1]*(1.+uv[0]);
372 francois 310 break;
373     }break;
374     case 5:
375     switch (num_variable)
376     {
377     case 1:
378 francois 1104 val=0.25*(1.+uv[1])*(2.*uv[0]+uv[1]);
379 francois 310 break;
380     case 2:
381 francois 1104 val=0.25*(1.+uv[0])*(uv[0]+2.*uv[1]);
382 francois 310 break;
383     } break;
384     case 6:
385     switch (num_variable)
386     {
387     case 1:
388     val=-uv[0]*(1.+uv[1]);
389     break;
390     case 2:
391 francois 1104 val=0.5*(1.-uv[0]*uv[0]);
392 francois 310 break;
393     }break;
394     case 7:
395     switch (num_variable)
396     {
397     case 1:
398 francois 1104 val=0.25*(1.+uv[1])*(2.*uv[0]-uv[1]);
399 francois 310 break;
400     case 2:
401     val=-0.25*(1.-uv[0])*(uv[0]-2.*uv[1]);
402     break;
403     }break;
404     case 8:
405     switch (num_variable)
406     {
407     case 1:
408     val=-0.5*(1.-uv[1]*uv[1]);
409     break;
410     case 2:
411 francois 1104 val=-uv[1]*(1.-uv[0]);
412 francois 310 break;
413     }break;
414    
415     }
416     return val;
417     }
418    
419