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