ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_tetra10.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 17082 byte(s)
Log Message:
Le fichier MAGiC est maintenant versionné. LA version actuelle est 2.0. L'ancienne version est 1.0.
Tout est transparent pour l'utilisateur. Les vieilles versions sont lisibles mais les nouveaux enregistrements sont dans la version la plus récente.
Changement des conditions aux limites : ajout d'un parametre pour dire si la condition numerique est une valeur ou une formule ou un lien vers une autre entité magic.
Les parametres pour saisir sont maintenant -ccf -ccfi -ccff -ccft -ccfit -ccfft

File Contents

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