ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_hexa20.cpp
Revision: 757
Committed: Fri Nov 6 13:42:55 2015 UTC (9 years, 6 months ago) by francois
File size: 30463 byte(s)
Log Message:
Possibilite de calculer les comtraintes et les deformations aux points de gauss
Tester en elasticite volumique

File Contents

# User Rev Content
1 francois 310 //------------------------------------------------------------
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_hexa20.h"
27     #include "fem_maillage.h"
28     #include "fem_noeud.h"
29     #include "mg_element_maillage.h"
30     #include "ot_tenseur.h"
31 francois 754 #include "ot_quadrature_gauss.h"
32 francois 310
33    
34     FEM_HEXA20::FEM_HEXA20(unsigned long num,class MG_ELEMENT_MAILLAGE* mai,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,mai),FEM_TEMPLATE_ELEMENT<20>(tabnoeud)
35     {
36 francois 581 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
37 francois 310 tab[0]->get_lien_element3()->ajouter(this);
38     tab[1]->get_lien_element3()->ajouter(this);
39     tab[2]->get_lien_element3()->ajouter(this);
40     tab[3]->get_lien_element3()->ajouter(this);
41     tab[4]->get_lien_element3()->ajouter(this);
42     tab[5]->get_lien_element3()->ajouter(this);
43     tab[6]->get_lien_element3()->ajouter(this);
44     tab[7]->get_lien_element3()->ajouter(this);
45     tab[8]->get_lien_element3()->ajouter(this);
46     tab[9]->get_lien_element3()->ajouter(this);
47     tab[10]->get_lien_element3()->ajouter(this);
48     tab[11]->get_lien_element3()->ajouter(this);
49     tab[12]->get_lien_element3()->ajouter(this);
50     tab[13]->get_lien_element3()->ajouter(this);
51     tab[14]->get_lien_element3()->ajouter(this);
52     tab[15]->get_lien_element3()->ajouter(this);
53     tab[16]->get_lien_element3()->ajouter(this);
54     tab[17]->get_lien_element3()->ajouter(this);
55     tab[18]->get_lien_element3()->ajouter(this);
56     tab[19]->get_lien_element3()->ajouter(this);
57     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
58     }
59    
60     FEM_HEXA20::FEM_HEXA20(class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT3(mai),FEM_TEMPLATE_ELEMENT<20>(tabnoeud)
61     {
62 francois 581 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
63 francois 310 tab[0]->get_lien_element3()->ajouter(this);
64     tab[1]->get_lien_element3()->ajouter(this);
65     tab[2]->get_lien_element3()->ajouter(this);
66     tab[3]->get_lien_element3()->ajouter(this);
67     tab[4]->get_lien_element3()->ajouter(this);
68     tab[5]->get_lien_element3()->ajouter(this);
69     tab[6]->get_lien_element3()->ajouter(this);
70     tab[7]->get_lien_element3()->ajouter(this);
71     tab[8]->get_lien_element3()->ajouter(this);
72     tab[9]->get_lien_element3()->ajouter(this);
73     tab[10]->get_lien_element3()->ajouter(this);
74     tab[11]->get_lien_element3()->ajouter(this);
75     tab[12]->get_lien_element3()->ajouter(this);
76     tab[13]->get_lien_element3()->ajouter(this);
77     tab[14]->get_lien_element3()->ajouter(this);
78     tab[15]->get_lien_element3()->ajouter(this);
79     tab[16]->get_lien_element3()->ajouter(this);
80     tab[17]->get_lien_element3()->ajouter(this);
81     tab[18]->get_lien_element3()->ajouter(this);
82     tab[19]->get_lien_element3()->ajouter(this);
83     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
84     }
85    
86 francois 378 FEM_HEXA20::FEM_HEXA20(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class FEM_NOEUD** tabnoeud):FEM_ELEMENT3(num,topo),FEM_TEMPLATE_ELEMENT<20>(tabnoeud)
87     {
88 francois 581 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
89 francois 378 tab[0]->get_lien_element3()->ajouter(this);
90     tab[1]->get_lien_element3()->ajouter(this);
91     tab[2]->get_lien_element3()->ajouter(this);
92     tab[3]->get_lien_element3()->ajouter(this);
93     tab[4]->get_lien_element3()->ajouter(this);
94     tab[5]->get_lien_element3()->ajouter(this);
95     tab[6]->get_lien_element3()->ajouter(this);
96     tab[7]->get_lien_element3()->ajouter(this);
97     tab[8]->get_lien_element3()->ajouter(this);
98     tab[9]->get_lien_element3()->ajouter(this);
99     tab[10]->get_lien_element3()->ajouter(this);
100     tab[11]->get_lien_element3()->ajouter(this);
101     tab[12]->get_lien_element3()->ajouter(this);
102     tab[13]->get_lien_element3()->ajouter(this);
103     tab[14]->get_lien_element3()->ajouter(this);
104     tab[15]->get_lien_element3()->ajouter(this);
105     tab[16]->get_lien_element3()->ajouter(this);
106     tab[17]->get_lien_element3()->ajouter(this);
107     tab[18]->get_lien_element3()->ajouter(this);
108     tab[19]->get_lien_element3()->ajouter(this);
109     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
110     }
111    
112     FEM_HEXA20::FEM_HEXA20(class MG_ELEMENT_TOPOLOGIQUE* topo,FEM_NOEUD** tabnoeud):FEM_ELEMENT3(topo),FEM_TEMPLATE_ELEMENT<20>(tabnoeud)
113     {
114 francois 581 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
115 francois 378 tab[0]->get_lien_element3()->ajouter(this);
116     tab[1]->get_lien_element3()->ajouter(this);
117     tab[2]->get_lien_element3()->ajouter(this);
118     tab[3]->get_lien_element3()->ajouter(this);
119     tab[4]->get_lien_element3()->ajouter(this);
120     tab[5]->get_lien_element3()->ajouter(this);
121     tab[6]->get_lien_element3()->ajouter(this);
122     tab[7]->get_lien_element3()->ajouter(this);
123     tab[8]->get_lien_element3()->ajouter(this);
124     tab[9]->get_lien_element3()->ajouter(this);
125     tab[10]->get_lien_element3()->ajouter(this);
126     tab[11]->get_lien_element3()->ajouter(this);
127     tab[12]->get_lien_element3()->ajouter(this);
128     tab[13]->get_lien_element3()->ajouter(this);
129     tab[14]->get_lien_element3()->ajouter(this);
130     tab[15]->get_lien_element3()->ajouter(this);
131     tab[16]->get_lien_element3()->ajouter(this);
132     tab[17]->get_lien_element3()->ajouter(this);
133     tab[18]->get_lien_element3()->ajouter(this);
134     tab[19]->get_lien_element3()->ajouter(this);
135     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
136     }
137    
138     FEM_HEXA20::FEM_HEXA20(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<20>(tabnoeud)
139     {
140 francois 581 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
141 francois 378 tab[0]->get_lien_element3()->ajouter(this);
142     tab[1]->get_lien_element3()->ajouter(this);
143     tab[2]->get_lien_element3()->ajouter(this);
144     tab[3]->get_lien_element3()->ajouter(this);
145     tab[4]->get_lien_element3()->ajouter(this);
146     tab[5]->get_lien_element3()->ajouter(this);
147     tab[6]->get_lien_element3()->ajouter(this);
148     tab[7]->get_lien_element3()->ajouter(this);
149     tab[8]->get_lien_element3()->ajouter(this);
150     tab[9]->get_lien_element3()->ajouter(this);
151     tab[10]->get_lien_element3()->ajouter(this);
152     tab[11]->get_lien_element3()->ajouter(this);
153     tab[12]->get_lien_element3()->ajouter(this);
154     tab[13]->get_lien_element3()->ajouter(this);
155     tab[14]->get_lien_element3()->ajouter(this);
156     tab[15]->get_lien_element3()->ajouter(this);
157     tab[16]->get_lien_element3()->ajouter(this);
158     tab[17]->get_lien_element3()->ajouter(this);
159     tab[18]->get_lien_element3()->ajouter(this);
160     tab[19]->get_lien_element3()->ajouter(this);
161     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
162     }
163    
164     FEM_HEXA20::FEM_HEXA20(class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai,FEM_NOEUD** tabnoeud):FEM_ELEMENT3(topo,mai),FEM_TEMPLATE_ELEMENT<20>(tabnoeud)
165     {
166 francois 581 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
167 francois 378 tab[0]->get_lien_element3()->ajouter(this);
168     tab[1]->get_lien_element3()->ajouter(this);
169     tab[2]->get_lien_element3()->ajouter(this);
170     tab[3]->get_lien_element3()->ajouter(this);
171     tab[4]->get_lien_element3()->ajouter(this);
172     tab[5]->get_lien_element3()->ajouter(this);
173     tab[6]->get_lien_element3()->ajouter(this);
174     tab[7]->get_lien_element3()->ajouter(this);
175     tab[8]->get_lien_element3()->ajouter(this);
176     tab[9]->get_lien_element3()->ajouter(this);
177     tab[10]->get_lien_element3()->ajouter(this);
178     tab[11]->get_lien_element3()->ajouter(this);
179     tab[12]->get_lien_element3()->ajouter(this);
180     tab[13]->get_lien_element3()->ajouter(this);
181     tab[14]->get_lien_element3()->ajouter(this);
182     tab[15]->get_lien_element3()->ajouter(this);
183     tab[16]->get_lien_element3()->ajouter(this);
184     tab[17]->get_lien_element3()->ajouter(this);
185     tab[18]->get_lien_element3()->ajouter(this);
186     tab[19]->get_lien_element3()->ajouter(this);
187     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
188     }
189    
190    
191    
192    
193    
194    
195    
196    
197    
198 francois 310 FEM_HEXA20::FEM_HEXA20(FEM_HEXA20& mdd):FEM_ELEMENT3(mdd),FEM_TEMPLATE_ELEMENT<20>(mdd)
199     {
200 francois 581 if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
201 francois 310 tab[0]->get_lien_element3()->ajouter(this);
202     tab[1]->get_lien_element3()->ajouter(this);
203     tab[2]->get_lien_element3()->ajouter(this);
204     tab[3]->get_lien_element3()->ajouter(this);
205     tab[4]->get_lien_element3()->ajouter(this);
206     tab[5]->get_lien_element3()->ajouter(this);
207     tab[6]->get_lien_element3()->ajouter(this);
208     tab[7]->get_lien_element3()->ajouter(this);
209     tab[8]->get_lien_element3()->ajouter(this);
210     tab[9]->get_lien_element3()->ajouter(this);
211     tab[10]->get_lien_element3()->ajouter(this);
212     tab[11]->get_lien_element3()->ajouter(this);
213     tab[12]->get_lien_element3()->ajouter(this);
214     tab[13]->get_lien_element3()->ajouter(this);
215     tab[14]->get_lien_element3()->ajouter(this);
216     tab[15]->get_lien_element3()->ajouter(this);
217     tab[16]->get_lien_element3()->ajouter(this);
218     tab[17]->get_lien_element3()->ajouter(this);
219     tab[18]->get_lien_element3()->ajouter(this);
220     tab[19]->get_lien_element3()->ajouter(this);
221     get_fem_noeudpetitid()->get_lien_petit_element3()->ajouter(this);
222     }
223     FEM_HEXA20::~FEM_HEXA20()
224     {
225 francois 663 if (liaison_topologique!=NULL)
226     if (liaison_topologique->get_dimension()==3) liaison_topologique->get_lien_fem_maillage()->supprimer(this);
227 francois 310 tab[0]->get_lien_element3()->supprimer(this);
228     tab[1]->get_lien_element3()->supprimer(this);
229     tab[2]->get_lien_element3()->supprimer(this);
230     tab[3]->get_lien_element3()->supprimer(this);
231     tab[4]->get_lien_element3()->supprimer(this);
232     tab[5]->get_lien_element3()->supprimer(this);
233     tab[6]->get_lien_element3()->supprimer(this);
234     tab[7]->get_lien_element3()->supprimer(this);
235     tab[8]->get_lien_element3()->supprimer(this);
236     tab[9]->get_lien_element3()->supprimer(this);
237     tab[10]->get_lien_element3()->supprimer(this);
238     tab[11]->get_lien_element3()->supprimer(this);
239     tab[12]->get_lien_element3()->supprimer(this);
240     tab[13]->get_lien_element3()->supprimer(this);
241     tab[14]->get_lien_element3()->supprimer(this);
242     tab[15]->get_lien_element3()->supprimer(this);
243     tab[16]->get_lien_element3()->supprimer(this);
244     tab[17]->get_lien_element3()->supprimer(this);
245     tab[18]->get_lien_element3()->supprimer(this);
246     tab[19]->get_lien_element3()->supprimer(this);
247     get_fem_noeudpetitid()->get_lien_petit_element3()->supprimer(this);
248     }
249    
250    
251     FEM_ELEMENT_MAILLAGE* FEM_HEXA20::dupliquer(FEM_MAILLAGE *femmai,long decalage)
252     {
253     FEM_NOEUD* tabnoeud[8];
254     tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
255     tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
256     tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
257     tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
258     tabnoeud[4]=femmai->get_fem_noeudid(tab[4]->get_id()+decalage);
259     tabnoeud[5]=femmai->get_fem_noeudid(tab[5]->get_id()+decalage);
260     tabnoeud[6]=femmai->get_fem_noeudid(tab[6]->get_id()+decalage);
261     tabnoeud[7]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
262     tabnoeud[8]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
263     tabnoeud[9]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
264     tabnoeud[10]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
265     tabnoeud[11]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
266     tabnoeud[12]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
267     tabnoeud[13]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
268     tabnoeud[14]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
269     tabnoeud[15]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
270     tabnoeud[16]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
271     tabnoeud[17]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
272     tabnoeud[18]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
273     tabnoeud[19]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
274     FEM_HEXA20* quad=new FEM_HEXA20(get_id()+decalage,maillage,tabnoeud);
275     femmai->ajouter_fem_element3(quad);
276     return quad;
277     }
278    
279    
280    
281    
282    
283     int FEM_HEXA20::get_type_entite(void)
284     {
285     return IDFEM_HEXA20;
286     }
287    
288     int FEM_HEXA20::get_dimension(void)
289     {
290     return 3;
291     }
292    
293    
294    
295     int FEM_HEXA20::get_nb_fem_noeud(void)
296     {
297     return FEM_TEMPLATE_ELEMENT<20>::get_nb_fem_noeud();
298     }
299    
300     FEM_NOEUD* FEM_HEXA20::get_fem_noeud(int num)
301     {
302     return FEM_TEMPLATE_ELEMENT<20>::get_fem_noeud(num);
303     }
304    
305     void FEM_HEXA20::change_noeud(int num,FEM_NOEUD* noeud)
306     {
307     FEM_TEMPLATE_ELEMENT<20>::change_noeud(num,noeud);
308     }
309    
310     BOITE_3D& FEM_HEXA20::get_boite_3D(void)
311     {
312     return FEM_TEMPLATE_ELEMENT<20>::get_boite_3D();
313     }
314    
315    
316     void FEM_HEXA20::enregistrer(std::ostream& o)
317     {
318 francois 378 if (maillage!=NULL)
319     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_HEXA20($"<< 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() << ",$" << tab[10]->get_id()<< ",$" << tab[11]->get_id() << ",$" << tab[12]->get_id() << ",$" << tab[13]->get_id() << ",$" << tab[14]->get_id() << ",$" << tab[15]->get_id() << ",$" << tab[16]->get_id()<< ",$" << tab[17]->get_id()<< ",$" << tab[18]->get_id()<< ",$" << tab[19]->get_id()<< ");" << std::endl;
320     else o << "%" << get_id() << "=FEM_HEXA20(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() << ",$" << tab[10]->get_id()<< ",$" << tab[11]->get_id() << ",$" << tab[12]->get_id() << ",$" << tab[13]->get_id() << ",$" << tab[14]->get_id() << ",$" << tab[15]->get_id() << ",$" << tab[16]->get_id()<< ",$" << tab[17]->get_id()<< ",$" << tab[18]->get_id()<< ",$" << tab[19]->get_id()<<");" << std::endl;
321     else
322     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_HEXA20($"<< 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() << ",$" << tab[10]->get_id()<< ",$" << tab[11]->get_id() << ",$" << tab[12]->get_id() << ",$" << tab[13]->get_id() << ",$" << tab[14]->get_id() << ",$" << tab[15]->get_id() << ",$" << tab[16]->get_id()<< ",$" << tab[17]->get_id()<< ",$" << tab[18]->get_id()<< ",$" << tab[19]->get_id()<< ");" << std::endl;
323     else o << "%" << get_id() << "=FEM_HEXA20(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() << ",$" << tab[10]->get_id()<< ",$" << tab[11]->get_id() << ",$" << tab[12]->get_id() << ",$" << tab[13]->get_id() << ",$" << tab[14]->get_id() << ",$" << tab[15]->get_id() << ",$" << tab[16]->get_id()<< ",$" << tab[17]->get_id()<< ",$" << tab[18]->get_id()<< ",$" << tab[19]->get_id()<<");" << std::endl;
324    
325 francois 310 }
326 francois 637
327    
328    
329     int FEM_HEXA20::get_nb_pt_gauss(int degre)
330     {
331 francois 754 return OT_POINTS_GAUSS::get_nb_point_hexa_prod(degre);
332 francois 637 }
333    
334     void FEM_HEXA20::get_pt_gauss(int degre,int num,double &w,double *uvw)
335     {
336 francois 754 return OT_POINTS_GAUSS::get_pt_gauss_hex_prod(degre,num,w,uvw);
337 francois 637 }
338 francois 638 int FEM_HEXA20::get_nb_fonction_interpolation(void)
339 francois 310 {
340     return 20;
341     }
342 francois 638 int FEM_HEXA20::get_degremax_fonction_interpolation(void)
343     {
344     return 4;
345     }
346 francois 310
347 francois 757 int FEM_HEXA20::get_degre_gauss(int num)
348     {
349     return OT_POINTS_GAUSS::get_degre_gauss_hexa_prod(num);
350     }
351    
352    
353 francois 310 double FEM_HEXA20::get_fonction_interpolation(int num,double *uv)
354     {
355     double val;
356     switch (num)
357     {
358     case 1:
359     {double a=-1;
360     double b=-1;
361     double c=-1;
362     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
363     break;}
364     case 3:
365     {double a=1;
366     double b=-1;
367     double c=-1;
368     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
369     break;}
370     case 5:
371     {double a=1;
372     double b=1;
373     double c=-1;
374     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
375     break;}
376     case 7:
377     {double a=-1;
378     double b=1;
379     double c=-1;
380     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
381     break;}
382     case 13:
383     {double a=-1;
384     double b=-1;
385     double c=1;
386     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
387     break;}
388     case 15:
389     {double a=1;
390     double b=-1;
391     double c=1;
392     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
393     break;}
394     case 17:
395     {double a=1;
396     double b=1;
397     double c=1;
398     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
399     break;}
400     case 19:
401     {double a=-1;
402     double b=1;
403     double c=1;
404     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
405     break;}
406     case 2:
407     {double a=0.;
408     double b=-1;
409     double c=-1;
410     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
411     break;}
412     case 6:
413     {double a=0.;
414     double b=1;
415     double c=-1;
416     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
417     break;}
418     case 14:
419     {double a=0.;
420     double b=-1;
421     double c=1;
422     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
423     break;}
424     case 18:
425     {double a=0.;
426     double b=1;
427     double c=1;
428     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
429     break;}
430     case 4:
431     {double a=1.;
432     double b=0.;
433     double c=-1;
434     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
435     break;}
436     case 8:
437     {double a=-1.;
438     double b=0.;
439     double c=-1;
440     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
441     break;}
442     case 16:
443     {double a=1.;
444     double b=0.;
445     double c=1;
446     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
447     break;}
448     case 20:
449     {double a=-1.;
450     double b=0.;
451     double c=1;
452     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
453     break;}
454     case 9:
455     {double a=-1.;
456     double b=-1.;
457     double c=0.;
458     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
459     break;}
460     case 10:
461     {double a=1.;
462     double b=-1.;
463     double c=0.;
464     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
465     break;}
466     case 11:
467     {double a=1.;
468     double b=1.;
469     double c=0.;
470     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
471     break;}
472     case 12:
473     {double a=-1.;
474     double b=1.;
475     double c=0.;
476     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
477     break;}
478    
479    
480     }
481     return val;
482     }
483 francois 684 void FEM_HEXA20::reinit_boite_3D(void)
484     {
485     FEM_TEMPLATE_ELEMENT<20>::reinit_boite_3D();
486     }
487 francois 310
488     double FEM_HEXA20::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
489     {
490     double val;
491     switch (num)
492     {
493     case 1:
494     {
495     double a=-1;
496     double b=-1;
497     double c=-1;
498     switch (num_variable)
499     {
500     case 1:
501     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
502     break;
503     case 2:
504     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
505     break;
506     case 3:
507     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
508     break;
509     } break;}
510     case 3:
511     {
512     double a=1;
513     double b=-1;
514     double c=-1;
515     switch (num_variable)
516     {
517     case 1:
518     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
519     break;
520     case 2:
521     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
522     break;
523     case 3:
524     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
525     break;
526     } break;}
527     case 5:
528     {
529     double a=1;
530     double b=1;
531     double c=-1;
532     switch (num_variable)
533     {
534     case 1:
535     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
536     break;
537     case 2:
538     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
539     break;
540     case 3:
541     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
542     break;
543     } break;}
544     case 7:
545     {
546     double a=-1;
547     double b=1;
548     double c=-1;
549     switch (num_variable)
550     {
551     case 1:
552     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
553     break;
554     case 2:
555     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
556     break;
557     case 3:
558     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
559     break;
560     } break;}
561     case 13:
562     {
563     double a=-1;
564     double b=-1;
565     double c=1;
566     switch (num_variable)
567     {
568     case 1:
569     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
570     break;
571     case 2:
572     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
573     break;
574     case 3:
575     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
576     break;
577     } break;}
578     case 15:
579     {
580     double a=1;
581     double b=-1;
582     double c=1;
583     switch (num_variable)
584     {
585     case 1:
586     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
587     break;
588     case 2:
589     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
590     break;
591     case 3:
592     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
593     break;
594     } break;}
595     case 17:
596     {
597     double a=1;
598     double b=1;
599     double c=1;
600     switch (num_variable)
601     {
602     case 1:
603     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
604     break;
605     case 2:
606     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
607     break;
608     case 3:
609     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
610     break;
611     } break;}
612     case 19:
613     {
614     double a=-1;
615     double b=1;
616     double c=1;
617     switch (num_variable)
618     {
619     case 1:
620     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
621     break;
622     case 2:
623     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
624     break;
625     case 3:
626     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
627     break;
628     } break;}
629     case 2:
630     {
631     double a=0;
632     double b=-1;
633     double c=-1;
634     switch (num_variable)
635     {
636     case 1:
637     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
638     break;
639     case 2:
640     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
641     break;
642     case 3:
643     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
644     break;
645     } break;}
646     case 18:
647     {
648     double a=0;
649     double b=1;
650     double c=1;
651     switch (num_variable)
652     {
653     case 1:
654     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
655     break;
656     case 2:
657     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
658     break;
659     case 3:
660     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
661     break;
662     } break;}
663     case 14:
664     {
665     double a=0;
666     double b=-1;
667     double c=1;
668     switch (num_variable)
669     {
670     case 1:
671     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
672     break;
673     case 2:
674     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
675     break;
676     case 3:
677     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
678     break;
679     } break;}
680     case 6:
681     {
682     double a=0;
683     double b=1;
684     double c=-1;
685     switch (num_variable)
686     {
687     case 1:
688     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
689     break;
690     case 2:
691     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
692     break;
693     case 3:
694     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
695     break;
696     } break;}
697     case 4:
698     {
699     double a=1;
700     double b=0;
701     double c=-1;
702     switch (num_variable)
703     {
704     case 1:
705     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
706     break;
707     case 2:
708     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
709     break;
710     case 3:
711     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
712     break;
713     } break;}
714     case 8:
715     {
716     double a=-1;
717     double b=0;
718     double c=-1;
719     switch (num_variable)
720     {
721     case 1:
722     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
723     break;
724     case 2:
725     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
726     break;
727     case 3:
728     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
729     break;
730     } break;}
731     case 16:
732     {
733     double a=1;
734     double b=0;
735     double c=1;
736     switch (num_variable)
737     {
738     case 1:
739     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
740     break;
741     case 2:
742     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
743     break;
744     case 3:
745     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
746     break;
747     } break;}
748     case 20:
749     {
750     double a=-1;
751     double b=0;
752     double c=1;
753     switch (num_variable)
754     {
755     case 1:
756     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
757     break;
758     case 2:
759     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
760     break;
761     case 3:
762     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
763     break;
764     } break;}
765     case 9:
766     {
767     double a=-1;
768     double b=-1;
769     double c=0.;
770     switch (num_variable)
771     {
772     case 1:
773     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
774     break;
775     case 2:
776     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
777     break;
778     case 3:
779     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
780     break;
781     } break;}
782     case 10:
783     {
784     double a=1;
785     double b=-1;
786     double c=0.;
787     switch (num_variable)
788     {
789     case 1:
790     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
791     break;
792     case 2:
793     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
794     break;
795     case 3:
796     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
797     break;
798     } break;}
799     case 11:
800     {
801     double a=1;
802     double b=1;
803     double c=0.;
804     switch (num_variable)
805     {
806     case 1:
807     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
808     break;
809     case 2:
810     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
811     break;
812     case 3:
813     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
814     break;
815     } break;}
816     case 12:
817     {
818     double a=-1;
819     double b=1;
820     double c=0.;
821     switch (num_variable)
822     {
823     case 1:
824     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
825     break;
826     case 2:
827     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
828     break;
829     case 3:
830     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
831     break;
832     } break;}
833    
834     }
835     return val;
836     }
837    
838     double FEM_HEXA20::get_jacobien(double* jac,double *uv,int& li,int& col,double unite)
839     {
840     li=3;col=3;
841     OT_TENSEUR Ni(3,20),Xi(20,3);
842     for (int i=0;i<3;i++)
843     for (int j=0;j<20;j++)
844     Ni(i,j)=get_fonction_derive_interpolation(j+1,i+1,uv);
845     for (int i=0;i<20;i++)
846     {
847     double *xyz=tab[i]->get_coord();
848     Xi(i,0)=xyz[0]*unite;
849     Xi(i,1)=xyz[1]*unite;
850     Xi(i,2)=xyz[2]*unite;
851     }
852     OT_TENSEUR jacobi=Ni*Xi;
853     jac[0]=jacobi(0,0).get_x();
854     jac[1]=jacobi(0,1).get_x();
855     jac[2]=jacobi(0,2).get_x();
856     jac[3]=jacobi(1,0).get_x();
857     jac[4]=jacobi(1,1).get_x();
858     jac[5]=jacobi(1,2).get_x();
859     jac[6]=jacobi(2,0).get_x();
860     jac[7]=jacobi(2,1).get_x();
861     jac[8]=jacobi(2,2).get_x();
862     double det=jac[0]*jac[4]*jac[8]+jac[3]*jac[7]*jac[2]+jac[6]*jac[1]*jac[5]-jac[2]*jac[4]*jac[6]-jac[5]*jac[7]*jac[0]-jac[8]*jac[1]*jac[3];
863     return det;
864    
865     }
866    
867     void FEM_HEXA20::get_inverse_jacob(double* j,double *uv,double unite)
868     {
869     double jac[9];
870     int li,col;
871     double detj=get_jacobien(jac,uv,li,col,unite);
872     j[0*3+0] = (jac[1*3+1]*jac[2*3+2]-jac[1*3+2]*jac[2*3+1])/(detj);
873     j[0*3+1] = -(jac[0*3+1]*jac[2*3+2]-jac[0*3+2]*jac[2*3+1])/(detj);
874     j[0*3+2] =-(-jac[0*3+1]*jac[1*3+2]+jac[0*3+2]*jac[1*3+1])/(detj);
875    
876     j[1*3+0] = -(jac[1*3+0]*jac[2*3+2]-jac[1*3+2]*jac[2*3+0])/(detj);
877     j[1*3+1] = (jac[0*3+0]*jac[2*3+2]-jac[0*3+2]*jac[2*3+0])/(detj);
878     j[1*3+2] = -(jac[0*3+0]*jac[1*3+2]-jac[0*3+2]*jac[1*3+0])/(detj);
879    
880     j[2*3+0] =-(-jac[1*3+0]*jac[2*3+1]+jac[1*3+1]*jac[2*3+0])/(detj);
881     j[2*3+1] = -(jac[0*3+0]*jac[2*3+1]-jac[0*3+1]*jac[2*3+0])/(detj);
882     j[2*3+2] = (jac[0*3+0]*jac[1*3+1]-jac[0*3+1]*jac[1*3+0])/(detj);
883    
884 francois 405 }
885    
886 francois 635 bool FEM_HEXA20::valide_parametre_EF(double* uvw)
887     {
888 francois 674 if (uvw[0]>=-1.-1e-10)
889     if (uvw[1]>=-1.-1e-10)
890     if (uvw[2]>=-1.-1e-10)
891 francois 635 if (uvw[0]<=1.+1e-10)
892     if (uvw[1]<=1.+1e-10)
893     if (uvw[2]<=1.+1e-10)
894     return true;
895     return false;
896     }
897 francois 405
898 francois 406 int FEM_HEXA20::verifie_validite_decoupage_xfem(double *vol)
899 francois 405 {
900    
901 francois 310 }