ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_triangle6.cpp
Revision: 378
Committed: Tue Nov 27 20:54:58 2012 UTC (12 years, 5 months ago) by francois
File size: 10929 byte(s)
Log Message:
ajout de methode de construction pour les fem elements compatible avec le decoupage XFEM. + bug de format de fichier dans les fem elements non visible en dehors du xfem

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_triangle6.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_triangle6.h"
27     #include "fem_noeud.h"
28     #include "mg_element_maillage.h"
29     #include "fem_maillage.h"
30    
31    
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    
106    
107    
108    
109    
110 francois 309 FEM_TRIANGLE6::FEM_TRIANGLE6(FEM_TRIANGLE6& mdd):FEM_ELEMENT2(mdd),FEM_TEMPLATE_ELEMENT<6>(mdd)
111 francois 283 {
112     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
113 francois 309 tab[0]->get_lien_element2()->ajouter(this);
114     tab[1]->get_lien_element2()->ajouter(this);
115     tab[2]->get_lien_element2()->ajouter(this);
116     tab[3]->get_lien_element2()->ajouter(this);
117     tab[4]->get_lien_element2()->ajouter(this);
118     tab[5]->get_lien_element2()->ajouter(this);
119     get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
120 francois 283 }
121     FEM_TRIANGLE6::~FEM_TRIANGLE6()
122     {
123     if (liaison_topologique==NULL) return;
124     if (liaison_topologique->get_dimension()==0) liaison_topologique->get_lien_fem_maillage()->supprimer(this);
125 francois 309 tab[0]->get_lien_element2()->supprimer(this);
126     tab[1]->get_lien_element2()->supprimer(this);
127     tab[2]->get_lien_element2()->supprimer(this);
128     tab[3]->get_lien_element2()->supprimer(this);
129     tab[4]->get_lien_element2()->supprimer(this);
130     tab[5]->get_lien_element2()->supprimer(this);
131     get_fem_noeudpetitid()->get_lien_petit_element2()->supprimer(this);
132 francois 283 }
133    
134     FEM_ELEMENT_MAILLAGE* FEM_TRIANGLE6::dupliquer(FEM_MAILLAGE *femmai,long decalage)
135     {
136     FEM_NOEUD* tabnoeud[6];
137     tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
138     tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
139     tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
140     tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
141     tabnoeud[4]=femmai->get_fem_noeudid(tab[4]->get_id()+decalage);
142     tabnoeud[5]=femmai->get_fem_noeudid(tab[5]->get_id()+decalage);
143     FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(get_id()+decalage,maillage,tabnoeud);
144 francois 309 femmai->ajouter_fem_element2(tri);
145 francois 283 return tri;
146     }
147    
148    
149    
150    
151     int FEM_TRIANGLE6::get_type_entite(void)
152     {
153     return IDFEM_TRIANGLE6;
154     }
155    
156     int FEM_TRIANGLE6::get_dimension(void)
157     {
158     return 2;
159     }
160    
161    
162     int FEM_TRIANGLE6::get_nb_fem_noeud(void)
163     {
164     return FEM_TEMPLATE_ELEMENT<6>::get_nb_fem_noeud();
165     }
166    
167     FEM_NOEUD* FEM_TRIANGLE6::get_fem_noeud(int num)
168     {
169     return FEM_TEMPLATE_ELEMENT<6>::get_fem_noeud(num);
170     }
171    
172     void FEM_TRIANGLE6::change_noeud(int num,FEM_NOEUD* noeud)
173     {
174     FEM_TEMPLATE_ELEMENT<6>::change_noeud(num,noeud);
175     }
176    
177     BOITE_3D& FEM_TRIANGLE6::get_boite_3D(void)
178     {
179     return FEM_TEMPLATE_ELEMENT<6>::get_boite_3D();
180     }
181    
182    
183     void FEM_TRIANGLE6::enregistrer(std::ostream& o)
184     {
185 francois 378 if (maillage!=NULL)
186     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;
187     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;
188     else
189     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;
190     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;
191    
192 francois 283 }
193 francois 310
194    
195     int FEM_TRIANGLE6::nb_fonction_interpolation(void)
196     {
197     return 6;
198     }
199    
200     double FEM_TRIANGLE6::get_fonction_interpolation(int num,double *uv)
201     {
202     double val;
203     switch (num)
204     {
205     case 1:
206     val=(-1+uv[0]+uv[1])*(-1+2*uv[0]+2*uv[1]);
207     break;
208     case 2:
209     val=4.*uv[0]*(1-uv[0]-uv[1]);
210     break;
211     case 3:
212     val=-uv[0]*(1.-2.*uv[0]);
213     break;
214     case 4:
215     val=4.*uv[0]*uv[1];
216     break;
217     case 5:
218     val=-uv[1]*(1-2*uv[1]);
219     break;
220     case 6:
221     val=4.*uv[1]*(1-uv[0]-uv[1]);
222     break;
223    
224     }
225     return val;
226     }
227    
228     double FEM_TRIANGLE6::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
229     {
230     double val;
231    
232     switch (num)
233     {
234     case 1:
235     switch (num_variable)
236     {
237     case 1:
238     val=-3.+4*uv[0]+4*uv[1];
239     break;
240     case 2:
241     val=-3.+4*uv[0]+4*uv[1];
242     break;
243     } break;
244     case 2:
245     switch (num_variable)
246     {
247     case 1:
248     val=4.-8*uv[0]-4*uv[1];
249     break;
250     case 2:
251     val=-4.*uv[0];
252     break;
253     }break;
254     case 3:
255     switch (num_variable)
256     {
257     case 1:
258     val=1.+4*uv[0];
259     break;
260     case 2:
261     val=0.;
262     break;
263     }break;
264     case 4:
265     switch (num_variable)
266     {
267     case 1:
268     val=4*uv[1];
269     break;
270     case 2:
271     val=4*uv[0];
272     break;
273     }break;
274     case 5:
275     switch (num_variable)
276     {
277     case 1:
278     val=0.;
279     break;
280     case 2:
281     val=-1+4.*uv[1];
282     break;
283     }break;
284     case 6:
285     switch (num_variable)
286     {
287     case 1:
288     val=-4*uv[1];
289     break;
290     case 2:
291     val=4-4*uv[0]-8*uv[1];
292     break;
293     }break;
294    
295     }
296     return val;
297     }
298    
299     double FEM_TRIANGLE6::get_jacobien(double* jac,double *uv,int& li,int& col,double unite)
300     {
301    
302     }
303    
304     void FEM_TRIANGLE6::get_inverse_jacob(double* j,double *uv,double unite)
305     {
306    
307     }