ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_quadrangle4.cpp
Revision: 638
Committed: Mon Jan 26 21:56:20 2015 UTC (10 years, 7 months ago) by francois
File size: 11033 byte(s)
Log Message:
ajout d'une méthode qui renvoit le degre max des fonctions d'interpolation et changement de nom de la fonction qui renvoie le nombre de fonction d'interpolation (ajout d'un get pour uniformiser)

File Contents

# Content
1 //------------------------------------------------------------
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_quadrangle4.h"
27 #include "fem_maillage.h"
28 #include "fem_noeud.h"
29 #include "mg_element_maillage.h"
30
31
32 FEM_QUADRANGLE4::FEM_QUADRANGLE4(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,mai),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
33 {
34 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
35 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 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
40 }
41
42 FEM_QUADRANGLE4::FEM_QUADRANGLE4(class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(mai),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
43 {
44 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
45 tab[0]->get_lien_element2()->ajouter(this);
46 tab[1]->get_lien_element2()->ajouter(this);
47 tab[2]->get_lien_element2()->ajouter(this);
48 tab[3]->get_lien_element2()->ajouter(this);
49 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
50 }
51
52 FEM_QUADRANGLE4::FEM_QUADRANGLE4(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT2(num,topo),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
53 {
54 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
55 tab[0]->get_lien_element2()->ajouter(this);
56 tab[1]->get_lien_element2()->ajouter(this);
57 tab[2]->get_lien_element2()->ajouter(this);
58 tab[3]->get_lien_element2()->ajouter(this);
59 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
60 }
61
62 FEM_QUADRANGLE4::FEM_QUADRANGLE4(class MG_ELEMENT_TOPOLOGIQUE* topo,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(topo),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
63 {
64 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
65 tab[0]->get_lien_element2()->ajouter(this);
66 tab[1]->get_lien_element2()->ajouter(this);
67 tab[2]->get_lien_element2()->ajouter(this);
68 tab[3]->get_lien_element2()->ajouter(this);
69 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
70 }
71 FEM_QUADRANGLE4::FEM_QUADRANGLE4(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<4>(tabnoeud)
72 {
73 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
74 tab[0]->get_lien_element2()->ajouter(this);
75 tab[1]->get_lien_element2()->ajouter(this);
76 tab[2]->get_lien_element2()->ajouter(this);
77 tab[3]->get_lien_element2()->ajouter(this);
78 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
79 }
80
81 FEM_QUADRANGLE4::FEM_QUADRANGLE4(class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT2(topo,mai),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
82 {
83 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
84 tab[0]->get_lien_element2()->ajouter(this);
85 tab[1]->get_lien_element2()->ajouter(this);
86 tab[2]->get_lien_element2()->ajouter(this);
87 tab[3]->get_lien_element2()->ajouter(this);
88 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
89 }
90
91
92
93
94
95
96
97
98
99
100
101 FEM_QUADRANGLE4::FEM_QUADRANGLE4(FEM_QUADRANGLE4& mdd):FEM_ELEMENT2(mdd),FEM_TEMPLATE_ELEMENT<4>(mdd)
102 {
103 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
104 tab[0]->get_lien_element2()->ajouter(this);
105 tab[1]->get_lien_element2()->ajouter(this);
106 tab[2]->get_lien_element2()->ajouter(this);
107 tab[3]->get_lien_element2()->ajouter(this);
108 get_fem_noeudpetitid()->get_lien_petit_element2()->ajouter(this);
109 }
110 FEM_QUADRANGLE4::~FEM_QUADRANGLE4()
111 {
112 if (liaison_topologique==NULL) return;
113 if (liaison_topologique->get_dimension()==0) liaison_topologique->get_lien_fem_maillage()->supprimer(this);
114 tab[0]->get_lien_element2()->supprimer(this);
115 tab[1]->get_lien_element2()->supprimer(this);
116 tab[2]->get_lien_element2()->supprimer(this);
117 tab[3]->get_lien_element2()->supprimer(this);
118 get_fem_noeudpetitid()->get_lien_petit_element2()->supprimer(this);
119 }
120
121
122 FEM_ELEMENT_MAILLAGE* FEM_QUADRANGLE4::dupliquer(FEM_MAILLAGE *femmai,long decalage)
123 {
124 FEM_NOEUD* tabnoeud[4];
125 tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
126 tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
127 tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
128 tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
129 FEM_QUADRANGLE4* quad=new FEM_QUADRANGLE4(get_id()+decalage,maillage,tabnoeud);
130 femmai->ajouter_fem_element2(quad);
131 return quad;
132 }
133
134
135
136
137
138 int FEM_QUADRANGLE4::get_type_entite(void)
139 {
140 return IDFEM_QUADRANGLE4;
141 }
142
143 int FEM_QUADRANGLE4::get_dimension(void)
144 {
145 return 2;
146 }
147
148
149
150 int FEM_QUADRANGLE4::get_nb_fem_noeud(void)
151 {
152 return FEM_TEMPLATE_ELEMENT<4>::get_nb_fem_noeud();
153 }
154
155 FEM_NOEUD* FEM_QUADRANGLE4::get_fem_noeud(int num)
156 {
157 return FEM_TEMPLATE_ELEMENT<4>::get_fem_noeud(num);
158 }
159
160 void FEM_QUADRANGLE4::change_noeud(int num,FEM_NOEUD* noeud)
161 {
162 FEM_TEMPLATE_ELEMENT<4>::change_noeud(num,noeud);
163 }
164
165 BOITE_3D& FEM_QUADRANGLE4::get_boite_3D(void)
166 {
167 return FEM_TEMPLATE_ELEMENT<4>::get_boite_3D();
168 }
169
170
171 void FEM_QUADRANGLE4::enregistrer(std::ostream& o)
172 {
173 if (maillage!=NULL)
174 if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_QUADRANGLE4($"<< get_lien_topologie()->get_id() << ",$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id()<< ");" << std::endl;
175 else o << "%" << get_id() << "=FEM_QUADRANGLE4(NULL,$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id()<< ");" << std::endl;
176 else
177 if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_QUADRANGLE4($"<< get_lien_topologie()->get_id() << ",NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id()<< ");" << std::endl;
178 else o << "%" << get_id() << "=FEM_QUADRANGLE4(NULL,NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id()<< ");" << std::endl;
179
180 }
181
182
183 int FEM_QUADRANGLE4::get_nb_pt_gauss(int degre)
184 {
185 if (degre<3) return 3;
186 if (degre<4) return 4;
187 if (degre<6) return 7;
188 return 0;
189 }
190
191 void FEM_QUADRANGLE4::get_pt_gauss(int degre,int num,double &w,double *uv)
192 {
193 if (degre<3)
194 {
195 if (num==0) {w=1.333333333333333;uv[0]=0.816496580927726;uv[1]=0.;}
196 if (num==1) {w=1.333333333333333;uv[0]=-0.408248290463863;uv[1]=-0.707106781186548;}
197 if (num==2) {w=1.333333333333333;uv[0]=-0.408248290463863;uv[1]=0.707106781186548;}
198 return;
199 }
200 if (degre<4)
201 {
202 if (num==0) {w=1.;uv[0]=0.816496580927726;uv[1]=0.;}
203 if (num==1) {w=1.;uv[0]=-0.816496580927726;uv[1]=0.;}
204 if (num==2) {w=1.;uv[0]=0.;uv[1]=0.816496580927726;}
205 if (num==3) {w=1.;uv[0]=0.;uv[1]=-0.816496580927726;}
206 return;
207 }
208 if (degre<6)
209 {
210 if (num==0) {w=1.142857142857140;uv[0]=0.;uv[1]=0.;}
211 if (num==1) {w=0.317460317460317;uv[0]=0.;uv[1]=0.966091783079296;}
212 if (num==2) {w=0.317460317460317;uv[0]=0.;uv[1]=-0.966091783079296;}
213 if (num==3) {w=0.555555555555556;uv[0]=0.774596669241483;uv[1]=-0.577350269189626;}
214 if (num==4) {w=0.555555555555556;uv[0]=-0.774596669241483;uv[1]=-0.577350269189626;}
215 if (num==5) {w=0.555555555555556;uv[0]=-0.774596669241483;uv[1]=0.577350269189626;}
216 if (num==6) {w=0.555555555555556;uv[0]=0.774596669241483;uv[1]=0.577350269189626;}
217 return;
218 }
219 }
220 int FEM_QUADRANGLE4::get_nb_fonction_interpolation(void)
221 {
222 return 4;
223 }
224 int FEM_QUADRANGLE4::get_degremax_fonction_interpolation(void)
225 {
226 return 2;
227 }
228
229 double FEM_QUADRANGLE4::get_fonction_interpolation(int num,double *uv)
230 {
231 double val;
232 switch (num)
233 {
234 case 1:
235 val=0.25*(1-uv[0])*(1-uv[1]);
236 break;
237 case 2:
238 val=0.25*(1+uv[0])*(1-uv[1]);
239 break;
240 case 3:
241 val=0.25*(1+uv[0])*(1+uv[1]);
242 break;
243 case 4:
244 val=0.25*(1-uv[0])*(1+uv[1]);
245 break;
246 }
247 return val;
248 }
249
250 double FEM_QUADRANGLE4::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
251 {
252 double val;
253
254 switch (num)
255 {
256 case 1:
257 switch (num_variable)
258 {
259 case 1:
260 val=0.25*(-1+uv[1]);
261 break;
262 case 2:
263 val=0.25*(-1+uv[0]);
264 break;
265 } break;
266 case 2:
267 switch (num_variable)
268 {
269 case 1:
270 val=0.25*(1-uv[1]);
271 break;
272 case 2:
273 val=0.25*(-1-uv[0]);
274 break;
275 }break;
276 case 3:
277 switch (num_variable)
278 {
279 case 1:
280 val=0.25*(1+uv[1]);
281 break;
282 case 2:
283 val=0.25*(1+uv[0]);
284 break;
285 }break;
286 case 4:
287 switch (num_variable)
288 {
289 case 1:
290 val=0.25*(-1-uv[1]);
291 break;
292 case 2:
293 val=0.25*(1-uv[0]);
294 break;
295 }break;
296
297 }
298 return val;
299 }
300
301 bool FEM_QUADRANGLE4::valide_parametre_EF(double* uvw)
302 {
303 if (uvw[0]>=-1e-10)
304 if (uvw[1]>=-1e-10)
305 if (uvw[0]<=1.+1e-10)
306 if (uvw[1]<=1.+1e-10)
307 return true;
308 return false;
309 }
310
311 double FEM_QUADRANGLE4::get_jacobien(double* jac,double *uv,int& li,int& col,double unite)
312 {
313
314 }
315
316 void FEM_QUADRANGLE4::get_inverse_jacob(double* j,double *uv,double unite)
317 {
318
319 }