ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_triangle3.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 10639 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     // fem_triangle3.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_triangle3.h"
27     #include "fem_maillage.h"
28     #include "fem_noeud.h"
29     #include "mg_element_maillage.h"
30 francois 754 #include "ot_quadrature_gauss.h"
31 francois 283
32    
33 francois 309 FEM_TRIANGLE3::FEM_TRIANGLE3(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,mai),FEM_TEMPLATE_ELEMENT<3>(tabnoeud)
34 francois 283 {
35     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
36 francois 309 tab[0]->get_lien_element2()->ajouter(this);
37     tab[1]->get_lien_element2()->ajouter(this);
38     tab[2]->get_lien_element2()->ajouter(this);
39     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
40 francois 283 }
41    
42 francois 309 FEM_TRIANGLE3::FEM_TRIANGLE3(class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(mai),FEM_TEMPLATE_ELEMENT<3>(tabnoeud)
43 francois 283 {
44     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
45 francois 309 tab[0]->get_lien_element2()->ajouter(this);
46     tab[1]->get_lien_element2()->ajouter(this);
47     tab[2]->get_lien_element2()->ajouter(this);
48     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
49 francois 283 }
50 francois 378 FEM_TRIANGLE3::FEM_TRIANGLE3(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,topo),FEM_TEMPLATE_ELEMENT<3>(tabnoeud)
51     {
52     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
53     tab[0]->get_lien_element2()->ajouter(this);
54     tab[1]->get_lien_element2()->ajouter(this);
55     tab[2]->get_lien_element2()->ajouter(this);
56     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
57     }
58 francois 283
59 francois 378 FEM_TRIANGLE3::FEM_TRIANGLE3(class MG_ELEMENT_TOPOLOGIQUE* topo,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(topo),FEM_TEMPLATE_ELEMENT<3>(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     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
66     }
67     FEM_TRIANGLE3::FEM_TRIANGLE3(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<3>(tabnoeud)
68     {
69     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
70     tab[0]->get_lien_element2()->ajouter(this);
71     tab[1]->get_lien_element2()->ajouter(this);
72     tab[2]->get_lien_element2()->ajouter(this);
73     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
74     }
75    
76     FEM_TRIANGLE3::FEM_TRIANGLE3(class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(topo,mai),FEM_TEMPLATE_ELEMENT<3>(tabnoeud)
77     {
78     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
79     tab[0]->get_lien_element2()->ajouter(this);
80     tab[1]->get_lien_element2()->ajouter(this);
81     tab[2]->get_lien_element2()->ajouter(this);
82     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
83     }
84 francois 309 FEM_TRIANGLE3::FEM_TRIANGLE3(FEM_TRIANGLE3& mdd):FEM_ELEMENT2(mdd),FEM_TEMPLATE_ELEMENT<3>(mdd)
85 francois 283 {
86     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
87 francois 309 tab[0]->get_lien_element2()->ajouter(this);
88     tab[1]->get_lien_element2()->ajouter(this);
89     tab[2]->get_lien_element2()->ajouter(this);
90     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
91 francois 283 }
92     FEM_TRIANGLE3::~FEM_TRIANGLE3()
93     {
94 francois 663 if (liaison_topologique!=NULL)
95     if (liaison_topologique->get_dimension()==0) liaison_topologique->get_lien_fem_maillage()->supprimer(this);
96 francois 309 tab[0]->get_lien_element2()->supprimer(this);
97     tab[1]->get_lien_element2()->supprimer(this);
98     tab[2]->get_lien_element2()->supprimer(this);
99     get_fem_noeudpetitid()->get_lien_petit_element2()->supprimer(this);
100 francois 283 }
101    
102    
103     FEM_ELEMENT_MAILLAGE* FEM_TRIANGLE3::dupliquer(FEM_MAILLAGE *femmai,long decalage)
104     {
105     FEM_NOEUD* tabnoeud[3];
106     tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
107     tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
108     tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
109     FEM_TRIANGLE3* tri=new FEM_TRIANGLE3(get_id()+decalage,maillage,tabnoeud);
110 francois 309 femmai->ajouter_fem_element2(tri);
111 francois 283 return tri;
112     }
113    
114    
115 francois 684 void FEM_TRIANGLE3::reinit_boite_3D(void)
116     {
117     FEM_TEMPLATE_ELEMENT<3>::reinit_boite_3D();
118     }
119 francois 283
120    
121     int FEM_TRIANGLE3::get_type_entite(void)
122     {
123     return IDFEM_TRIANGLE3;
124     }
125    
126     int FEM_TRIANGLE3::get_dimension(void)
127     {
128     return 2;
129     }
130    
131    
132    
133     int FEM_TRIANGLE3::get_nb_fem_noeud(void)
134     {
135     return FEM_TEMPLATE_ELEMENT<3>::get_nb_fem_noeud();
136     }
137    
138     FEM_NOEUD* FEM_TRIANGLE3::get_fem_noeud(int num)
139     {
140     return FEM_TEMPLATE_ELEMENT<3>::get_fem_noeud(num);
141     }
142    
143     void FEM_TRIANGLE3::change_noeud(int num,FEM_NOEUD* noeud)
144     {
145     FEM_TEMPLATE_ELEMENT<3>::change_noeud(num,noeud);
146     }
147    
148     BOITE_3D& FEM_TRIANGLE3::get_boite_3D(void)
149     {
150     return FEM_TEMPLATE_ELEMENT<3>::get_boite_3D();
151     }
152    
153    
154 francois 763 void FEM_TRIANGLE3::enregistrer(std::ostream& o,double version)
155 francois 283 {
156 francois 378 if (maillage!=NULL)
157     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TRIANGLE3($"<< get_lien_topologie()->get_id() << ",$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ");" << std::endl;
158     else o << "%" << get_id() << "=FEM_TRIANGLE3(NULL,$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ");" << std::endl;
159     else
160     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_TRIANGLE3($"<< get_lien_topologie()->get_id() << ",NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ");" << std::endl;
161     else o << "%" << get_id() << "=FEM_TRIANGLE3(NULL,NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ");" << std::endl;
162    
163 francois 637 }
164 francois 310
165 francois 637 int FEM_TRIANGLE3::get_nb_pt_gauss(int degre)
166     {
167 francois 754 return OT_POINTS_GAUSS::get_nb_point_tri(degre);
168 francois 637 }
169    
170     void FEM_TRIANGLE3::get_pt_gauss(int degre,int num,double &w,double *uv)
171     {
172 francois 754 return OT_POINTS_GAUSS::get_pt_gauss_tri(degre,num,w,uv);
173 francois 637 }
174 francois 757
175     int FEM_TRIANGLE3::get_degre_gauss(int num)
176     {
177     return OT_POINTS_GAUSS::get_degre_gauss_tri(num);
178     }
179 francois 637
180 francois 638 int FEM_TRIANGLE3::get_nb_fonction_interpolation(void)
181 francois 310 {
182     return 3;
183     }
184 francois 638 int FEM_TRIANGLE3::get_degremax_fonction_interpolation(void)
185     {
186     return 1;
187     }
188 francois 310 double FEM_TRIANGLE3::get_fonction_interpolation(int num,double *uv)
189     {
190     double val;
191     switch (num)
192     {
193     case 1:
194     val=1-uv[0]-uv[1];
195     break;
196     case 2:
197     val=uv[0];
198     break;
199     case 3:
200     val=uv[1];
201     break;
202    
203     }
204     return val;
205     }
206    
207     double FEM_TRIANGLE3::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
208     {
209     double val;
210    
211     switch (num)
212     {
213     case 1:
214     switch (num_variable)
215     {
216     case 1:
217     val=-1;
218     break;
219     case 2:
220     val=-1;
221     break;
222     } break;
223     case 2:
224     switch (num_variable)
225     {
226     case 1:
227     val=1;
228     break;
229     case 2:
230     val=0.;
231     break;
232     }break;
233     case 3:
234     switch (num_variable)
235     {
236     case 1:
237     val=0.;
238     break;
239     case 2:
240     val=1.;
241     break;
242     }break;
243    
244     }
245     return val;
246     }
247    
248     double FEM_TRIANGLE3::get_jacobien(double* jac,double *uv,int& li,int& col,double unite)
249 gervaislavoie 382 {
250 francois 647 int nb=get_nb_fem_noeud();
251     OT_VECTEUR_3D *point= new OT_VECTEUR_3D[nb];
252 gervaislavoie 382
253 francois 647 for (int i=0;i<nb;i++)
254     {
255     point[i].change_x(get_fem_noeud(i)->get_x());
256     point[i].change_y(get_fem_noeud(i)->get_y());
257     point[i].change_z(get_fem_noeud(i)->get_z());
258     }
259    
260     OT_MATRICE_3D J;
261     for (int i=0;i<2;i++)
262     {
263     J(i,0)=0.;J(i,1)=0.;J(i,2)=0.;
264     for (int k=0;k<nb;k++)
265     {
266     J(i,0)=J(i,0)+get_fonction_derive_interpolation(k+1,i+1,uv)*point[k].get_x();
267     J(i,1)=J(i,1)+get_fonction_derive_interpolation(k+1,i+1,uv)*point[k].get_y();
268     J(i,2)=J(i,2)+get_fonction_derive_interpolation(k+1,i+1,uv)*point[k].get_z();
269     }
270     }
271     OT_VECTEUR_3D J1(J(0,0),J(0,1),J(0,2));
272     OT_VECTEUR_3D J2(J(1,0),J(1,1),J(1,2));
273     OT_VECTEUR_3D J3=J1&J2;
274     J3.norme();
275     J(2,0)=J3(0);
276     J(2,1)=J3(1);
277     J(2,2)=J3(2);
278 gervaislavoie 389
279 francois 647 jac[0]=J(0,0);
280     jac[1]=J(0,1);
281     jac[2]=J(0,2);
282 gervaislavoie 389
283 francois 647 jac[3]=J(1,0);
284     jac[4]=J(1,1);
285     jac[5]=J(1,2);
286 gervaislavoie 389
287 francois 647 jac[6]=J(2,0);
288     jac[7]=J(2,1);
289     jac[8]=J(2,2);
290     li=3;col=3;
291 gervaislavoie 389
292 francois 647 return J.get_determinant();
293 francois 310 }
294    
295 francois 635
296     bool FEM_TRIANGLE3::valide_parametre_EF(double* uvw)
297     {
298     if (uvw[0]>=-1e-10)
299     if (uvw[1]>=-1e-10)
300     if (uvw[0]+uvw[1]<=1.+1e-10)
301     return true;
302     return false;
303     }
304    
305 francois 310 void FEM_TRIANGLE3::get_inverse_jacob(double* j,double *uv,double unite)
306     {
307 francois 647 double jac[9];
308     int li,col;
309     get_jacobien(jac,uv,li,col);
310     OT_MATRICE_3D J;
311     J(0,0)=jac[0];
312     J(0,1)=jac[1];
313     J(0,2)=jac[2];
314     J(1,0)=jac[3];
315     J(1,1)=jac[4];
316     J(1,2)=jac[5];
317     J(2,0)=jac[6];
318     J(2,1)=jac[7];
319     J(2,2)=jac[8];
320     OT_MATRICE_3D j_i=J.inverse();
321    
322 gervaislavoie 382
323     j[0]=j_i(0,0);
324 francois 647 j[1]=j_i(0,1);
325     j[2]=j_i(0,2);
326 gervaislavoie 382
327 francois 647 j[3]=j_i(1,0);
328 gervaislavoie 382 j[4]=j_i(1,1);
329 francois 647 j[5]=j_i(1,2);
330 gervaislavoie 382
331 francois 647 j[6]=j_i(2,0);
332     j[7]=j_i(2,1);
333 gervaislavoie 382 j[8]=j_i(2,2);
334 francois 310 }