ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/fem_tetra10.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months, 1 week ago) by francois
File size: 16577 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_tetra10.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:58:54 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 283
23    
24     #include "gestionversion.h"
25     #include "fem_tetra10.h"
26     #include "fem_noeud.h"
27     #include "mg_element_maillage.h"
28     #include "fem_maillage.h"
29 francois 754 #include "ot_quadrature_gauss.h"
30 francois 283
31    
32 francois 309 FEM_TETRA10::FEM_TETRA10(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,mai),FEM_TEMPLATE_ELEMENT<10>(tabnoeud)
33 francois 283 {
34     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
35 francois 309 tab[0]->get_lien_element3()->ajouter(this);
36     tab[1]->get_lien_element3()->ajouter(this);
37     tab[2]->get_lien_element3()->ajouter(this);
38     tab[3]->get_lien_element3()->ajouter(this);
39     tab[4]->get_lien_element3()->ajouter(this);
40     tab[5]->get_lien_element3()->ajouter(this);
41     tab[6]->get_lien_element3()->ajouter(this);
42     tab[7]->get_lien_element3()->ajouter(this);
43     tab[8]->get_lien_element3()->ajouter(this);
44     tab[9]->get_lien_element3()->ajouter(this);
45     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
46 francois 283 }
47    
48 francois 309 FEM_TETRA10::FEM_TETRA10(class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT3(mai),FEM_TEMPLATE_ELEMENT<10>(tabnoeud)
49 francois 283 {
50     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
51 francois 309 tab[0]->get_lien_element3()->ajouter(this);
52     tab[1]->get_lien_element3()->ajouter(this);
53     tab[2]->get_lien_element3()->ajouter(this);
54     tab[3]->get_lien_element3()->ajouter(this);
55     tab[4]->get_lien_element3()->ajouter(this);
56     tab[5]->get_lien_element3()->ajouter(this);
57     tab[6]->get_lien_element3()->ajouter(this);
58     tab[7]->get_lien_element3()->ajouter(this);
59     tab[8]->get_lien_element3()->ajouter(this);
60     tab[9]->get_lien_element3()->ajouter(this);
61     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
62 francois 283 }
63 francois 378 FEM_TETRA10::FEM_TETRA10(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,topo),FEM_TEMPLATE_ELEMENT<10>(tabnoeud)
64     {
65     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
66     tab[0]->get_lien_element3()->ajouter(this);
67     tab[1]->get_lien_element3()->ajouter(this);
68     tab[2]->get_lien_element3()->ajouter(this);
69     tab[3]->get_lien_element3()->ajouter(this);
70     tab[4]->get_lien_element3()->ajouter(this);
71     tab[5]->get_lien_element3()->ajouter(this);
72     tab[6]->get_lien_element3()->ajouter(this);
73     tab[7]->get_lien_element3()->ajouter(this);
74     tab[8]->get_lien_element3()->ajouter(this);
75     tab[9]->get_lien_element3()->ajouter(this);
76     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
77     }
78 francois 283
79 francois 378 FEM_TETRA10::FEM_TETRA10(class MG_ELEMENT_TOPOLOGIQUE* topo,FEM_NOEUD** tabnoeud):FEM_ELEMENT3(topo),FEM_TEMPLATE_ELEMENT<10>(tabnoeud)
80     {
81     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
82     tab[0]->get_lien_element3()->ajouter(this);
83     tab[1]->get_lien_element3()->ajouter(this);
84     tab[2]->get_lien_element3()->ajouter(this);
85     tab[3]->get_lien_element3()->ajouter(this);
86     tab[4]->get_lien_element3()->ajouter(this);
87     tab[5]->get_lien_element3()->ajouter(this);
88     tab[6]->get_lien_element3()->ajouter(this);
89     tab[7]->get_lien_element3()->ajouter(this);
90     tab[8]->get_lien_element3()->ajouter(this);
91     tab[9]->get_lien_element3()->ajouter(this);
92     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
93     }
94     FEM_TETRA10::FEM_TETRA10(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,topo,mai),FEM_TEMPLATE_ELEMENT<10>(tabnoeud)
95     {
96     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
97     tab[0]->get_lien_element3()->ajouter(this);
98     tab[1]->get_lien_element3()->ajouter(this);
99     tab[2]->get_lien_element3()->ajouter(this);
100     tab[3]->get_lien_element3()->ajouter(this);
101     tab[4]->get_lien_element3()->ajouter(this);
102     tab[5]->get_lien_element3()->ajouter(this);
103     tab[6]->get_lien_element3()->ajouter(this);
104     tab[7]->get_lien_element3()->ajouter(this);
105     tab[8]->get_lien_element3()->ajouter(this);
106     tab[9]->get_lien_element3()->ajouter(this);
107     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
108     }
109    
110     FEM_TETRA10::FEM_TETRA10(class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT3(topo,mai),FEM_TEMPLATE_ELEMENT<10>(tabnoeud)
111     {
112     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
113     tab[0]->get_lien_element3()->ajouter(this);
114     tab[1]->get_lien_element3()->ajouter(this);
115     tab[2]->get_lien_element3()->ajouter(this);
116     tab[3]->get_lien_element3()->ajouter(this);
117     tab[4]->get_lien_element3()->ajouter(this);
118     tab[5]->get_lien_element3()->ajouter(this);
119     tab[6]->get_lien_element3()->ajouter(this);
120     tab[7]->get_lien_element3()->ajouter(this);
121     tab[8]->get_lien_element3()->ajouter(this);
122     tab[9]->get_lien_element3()->ajouter(this);
123     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
124     }
125    
126    
127    
128    
129    
130    
131    
132 francois 309 FEM_TETRA10::FEM_TETRA10(FEM_TETRA10& mdd):FEM_ELEMENT3(mdd),FEM_TEMPLATE_ELEMENT<10>(mdd)
133 francois 283 {
134     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
135 francois 309 tab[0]->get_lien_element3()->ajouter(this);
136     tab[1]->get_lien_element3()->ajouter(this);
137     tab[2]->get_lien_element3()->ajouter(this);
138     tab[3]->get_lien_element3()->ajouter(this);
139     tab[4]->get_lien_element3()->ajouter(this);
140     tab[5]->get_lien_element3()->ajouter(this);
141     tab[6]->get_lien_element3()->ajouter(this);
142     tab[7]->get_lien_element3()->ajouter(this);
143     tab[8]->get_lien_element3()->ajouter(this);
144     tab[9]->get_lien_element3()->ajouter(this);
145     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
146 francois 283 }
147     FEM_TETRA10::~FEM_TETRA10()
148     {
149 francois 663 if (liaison_topologique!=NULL)
150     if (liaison_topologique->get_dimension()==0) liaison_topologique->get_lien_fem_maillage()->supprimer(this);
151 francois 309 tab[0]->get_lien_element3()->supprimer(this);
152     tab[1]->get_lien_element3()->supprimer(this);
153     tab[2]->get_lien_element3()->supprimer(this);
154     tab[3]->get_lien_element3()->supprimer(this);
155     tab[4]->get_lien_element3()->supprimer(this);
156     tab[5]->get_lien_element3()->supprimer(this);
157     tab[6]->get_lien_element3()->supprimer(this);
158     tab[7]->get_lien_element3()->supprimer(this);
159     tab[8]->get_lien_element3()->supprimer(this);
160     tab[9]->get_lien_element3()->supprimer(this);
161     get_fem_noeudpetitid()->get_lien_petit_element3()->supprimer(this);
162 francois 283 }
163    
164     FEM_ELEMENT_MAILLAGE* FEM_TETRA10::dupliquer(FEM_MAILLAGE *femmai,long decalage)
165     {
166     FEM_NOEUD* tabnoeud[10];
167     tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
168     tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
169     tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
170     tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
171     tabnoeud[4]=femmai->get_fem_noeudid(tab[4]->get_id()+decalage);
172     tabnoeud[5]=femmai->get_fem_noeudid(tab[5]->get_id()+decalage);
173     tabnoeud[6]=femmai->get_fem_noeudid(tab[6]->get_id()+decalage);
174     tabnoeud[7]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
175     tabnoeud[8]=femmai->get_fem_noeudid(tab[8]->get_id()+decalage);
176     tabnoeud[9]=femmai->get_fem_noeudid(tab[9]->get_id()+decalage);
177     FEM_TETRA10* tet=new FEM_TETRA10(get_id()+decalage,maillage,tabnoeud);
178 francois 309 femmai->ajouter_fem_element3(tet);
179 francois 283 return tet;
180     }
181 francois 786 void FEM_TETRA10::get_voisin_noeud(class FEM_NOEUD* no,TPL_LISTE_ENTITE<FEM_NOEUD*> &voisin)
182     {
183     voisin.vide();
184     if (no==tab[0])
185     {
186     voisin.ajouter(tab[1]);
187     voisin.ajouter(tab[5]);
188     voisin.ajouter(tab[6]);
189     }
190     if (no==tab[1])
191     {
192     voisin.ajouter(tab[0]);
193     voisin.ajouter(tab[2]);
194     }
195     if (no==tab[2])
196     {
197     voisin.ajouter(tab[1]);
198     voisin.ajouter(tab[3]);
199     voisin.ajouter(tab[7]);
200     }
201     if (no==tab[3])
202     {
203     voisin.ajouter(tab[2]);
204     voisin.ajouter(tab[4]);
205     }
206     if (no==tab[4])
207     {
208     voisin.ajouter(tab[3]);
209     voisin.ajouter(tab[5]);
210     voisin.ajouter(tab[8]);
211     }
212     if (no==tab[5])
213     {
214     voisin.ajouter(tab[0]);
215     voisin.ajouter(tab[4]);
216     }
217     if (no==tab[6])
218     {
219     voisin.ajouter(tab[0]);
220     voisin.ajouter(tab[9]);
221     }
222     if (no==tab[7])
223     {
224     voisin.ajouter(tab[2]);
225     voisin.ajouter(tab[9]);
226     }
227     if (no==tab[8])
228     {
229     voisin.ajouter(tab[4]);
230     voisin.ajouter(tab[9]);
231     }
232     if (no==tab[9])
233     {
234     voisin.ajouter(tab[6]);
235     voisin.ajouter(tab[7]);
236     voisin.ajouter(tab[8]);
237     }
238     }
239 francois 283
240    
241 francois 684 void FEM_TETRA10::reinit_boite_3D(void)
242     {
243     FEM_TEMPLATE_ELEMENT<10>::reinit_boite_3D();
244     }
245 francois 283
246    
247     int FEM_TETRA10::get_type_entite(void)
248     {
249 francois 1150 return MAGIC::TYPE_ENTITE::IDFEM_TETRA10;
250 francois 283 }
251    
252     int FEM_TETRA10::get_dimension(void)
253     {
254     return 3;
255     }
256    
257    
258     int FEM_TETRA10::get_nb_fem_noeud(void)
259     {
260     return FEM_TEMPLATE_ELEMENT<10>::get_nb_fem_noeud();
261     }
262    
263     FEM_NOEUD* FEM_TETRA10::get_fem_noeud(int num)
264     {
265     return FEM_TEMPLATE_ELEMENT<10>::get_fem_noeud(num);
266     }
267    
268     void FEM_TETRA10::change_noeud(int num,FEM_NOEUD* noeud)
269     {
270     FEM_TEMPLATE_ELEMENT<10>::change_noeud(num,noeud);
271     }
272    
273     BOITE_3D& FEM_TETRA10::get_boite_3D(void)
274     {
275     return FEM_TEMPLATE_ELEMENT<10>::get_boite_3D();
276     }
277    
278    
279 francois 637 int FEM_TETRA10::get_nb_pt_gauss(int degre)
280     {
281 francois 754 return OT_POINTS_GAUSS::get_nb_point_tetra(degre);
282 francois 637 }
283     void FEM_TETRA10::get_pt_gauss(int degre,int num,double &w,double *uvw)
284     {
285 francois 754 return OT_POINTS_GAUSS::get_pt_gauss_tet(degre,num,w,uvw);
286 francois 637 }
287 francois 283
288 francois 757 int FEM_TETRA10::get_degre_gauss(int num)
289     {
290     return OT_POINTS_GAUSS::get_degre_gauss_tetra(num);
291     }
292 francois 637
293 francois 638 int FEM_TETRA10::get_nb_fonction_interpolation(void)
294 francois 283 {
295     return 10;
296     }
297    
298 francois 638 int FEM_TETRA10::get_degremax_fonction_interpolation(void)
299     {
300     return 2;
301     }
302 francois 283 double FEM_TETRA10::get_fonction_interpolation(int num,double* uv)
303     {
304     double val;
305     double landa=1-uv[0]-uv[1]-uv[2];
306     switch (num)
307     {
308     case 1:
309     val=-landa*(1-2*landa);
310     break;
311     case 2:
312     val=4*uv[0]*landa;
313     break;
314     case 3:
315     val=-uv[0]*(1-2*uv[0]);
316     break;
317     case 4:
318     val=4*uv[0]*uv[1];
319     break;
320     case 5:
321     val=-uv[1]*(1-2*uv[1]);
322     break;
323     case 6:
324     val=4*uv[1]*landa;
325     break;
326     case 7:
327     val=4*uv[2]*landa;
328     break;
329     case 8:
330     val=4*uv[0]*uv[2];
331     break;
332     case 9:
333     val=4*uv[1]*uv[2];
334     break;
335     case 10:
336     val=-uv[2]*(1-2*uv[2]);
337     break;
338     }
339     return val;
340     }
341    
342     double FEM_TETRA10::get_fonction_derive_interpolation(int num,int num_variable,double* uv)
343     {
344     double val;
345     double landa=1-uv[0]-uv[1]-uv[2];
346     switch (num)
347     {
348     case 1:
349     switch (num_variable)
350     {
351     case 1:
352     val=1-4*landa;
353     break;
354     case 2:
355     val=1-4*landa;
356     break;
357     case 3:
358     val=1-4*landa;
359     break;
360     } break;
361     case 2:
362     switch (num_variable)
363     {
364     case 1:
365     val=4*(landa-uv[0]);
366     break;
367     case 2:
368     val=-4*uv[0];
369     break;
370     case 3:
371     val=-4*uv[0];
372     break;
373     }break;
374     case 3:
375     switch (num_variable)
376     {
377     case 1:
378     val=-1+4*uv[0];
379     break;
380     case 2:
381     val=0.;
382     break;
383     case 3:
384     val=0.;
385     break;
386     }break;
387     case 4:
388     switch (num_variable)
389     {
390     case 1:
391     val=4*uv[1];
392     break;
393     case 2:
394     val=4*uv[0];
395     break;
396     case 3:
397     val=0.;
398     break;
399     }break;
400     case 5:
401     switch (num_variable)
402     {
403     case 1:
404     val=0.;
405     break;
406     case 2:
407     val=-1+4*uv[1];
408     break;
409     case 3:
410     val=0.;
411     break;
412     }break;
413     case 6:
414     switch (num_variable)
415     {
416     case 1:
417     val=-4*uv[1];
418     break;
419     case 2:
420     val=4*(landa-uv[1]);
421     break;
422     case 3:
423     val=-4*uv[1];
424     break;
425     }break;
426     case 7:
427     switch (num_variable)
428     {
429     case 1:
430     val=-4*uv[2];
431     break;
432     case 2:
433     val=-4*uv[2];
434     break;
435     case 3:
436     val=4*(landa-uv[2]);
437     break;
438     }break;
439     case 8:
440     switch (num_variable)
441     {
442     case 1:
443     val=4*uv[2];
444     break;
445     case 2:
446     val=0;
447     break;
448     case 3:
449     val=4*uv[0];
450     break;
451     }break;
452     case 9:
453     switch (num_variable)
454     {
455     case 1:
456     val=0.;
457     break;
458     case 2:
459     val=4*uv[2];
460     break;
461     case 3:
462     val=4*uv[1];
463     break;
464     }break;
465     case 10:
466     switch (num_variable)
467     {
468     case 1:
469     val=0.;
470     break;
471     case 2:
472     val=0.;
473     break;
474     case 3:
475     val=-1+4*uv[2];
476     break;
477     }break;
478     }
479     return val;
480    
481     }
482    
483    
484    
485 francois 635 bool FEM_TETRA10::valide_parametre_EF(double* uvw)
486     {
487     if (uvw[0]>=-1e-10)
488     if (uvw[1]>=-1e-10)
489     if (uvw[2]>=-1e-10)
490     if (uvw[0]+uvw[1]+uvw[2]<=1.+1e-10)
491     return true;
492     return false;
493     }
494 francois 283
495    
496 francois 763 void FEM_TETRA10::enregistrer(std::ostream& o,double version)
497 francois 283 {
498 francois 378 if (maillage!=NULL)
499     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TETRA10($"<< 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() << ",$" << tab[8]->get_id() << ",$" << tab[9]->get_id()<< ");" << std::endl;
500     else o << "%" << get_id() << "=FEM_TETRA10(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() << ",$" << tab[8]->get_id() << ",$" << tab[9]->get_id() << ");" << std::endl;
501     else
502     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TETRA10($"<< 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() << ",$" << tab[8]->get_id() << ",$" << tab[9]->get_id()<< ");" << std::endl;
503     else o << "%" << get_id() << "=FEM_TETRA10(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() << ",$" << tab[8]->get_id() << ",$" << tab[9]->get_id() << ");" << std::endl;
504    
505 francois 283 }
506 francois 405
507    
508 francois 406 int FEM_TETRA10::verifie_validite_decoupage_xfem(double *vol)
509 francois 405 {
510 francois 1075 return 0;
511 francois 405 }