ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_hexa20.cpp
Revision: 754
Committed: Thu Oct 29 21:49:15 2015 UTC (9 years, 6 months ago) by francois
File size: 30358 byte(s)
Log Message:
Centralisation et unification de la définition des points de gauss des elements finis et arrangement dans le meme ordre que Aster

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     double FEM_HEXA20::get_fonction_interpolation(int num,double *uv)
348     {
349     double val;
350     switch (num)
351     {
352     case 1:
353     {double a=-1;
354     double b=-1;
355     double c=-1;
356     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);
357     break;}
358     case 3:
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 5:
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 7:
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 13:
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 15:
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 17:
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 19:
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 2:
401     {double a=0.;
402     double b=-1;
403     double c=-1;
404     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
405     break;}
406     case 6:
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 14:
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 18:
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 4:
425     {double a=1.;
426     double b=0.;
427     double c=-1;
428     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
429     break;}
430     case 8:
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 16:
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 20:
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 9:
449     {double a=-1.;
450     double b=-1.;
451     double c=0.;
452     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
453     break;}
454     case 10:
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 11:
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 12:
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    
473    
474     }
475     return val;
476     }
477 francois 684 void FEM_HEXA20::reinit_boite_3D(void)
478     {
479     FEM_TEMPLATE_ELEMENT<20>::reinit_boite_3D();
480     }
481 francois 310
482     double FEM_HEXA20::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
483     {
484     double val;
485     switch (num)
486     {
487     case 1:
488     {
489     double a=-1;
490     double b=-1;
491     double c=-1;
492     switch (num_variable)
493     {
494     case 1:
495     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
496     break;
497     case 2:
498     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
499     break;
500     case 3:
501     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
502     break;
503     } break;}
504     case 3:
505     {
506     double a=1;
507     double b=-1;
508     double c=-1;
509     switch (num_variable)
510     {
511     case 1:
512     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
513     break;
514     case 2:
515     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
516     break;
517     case 3:
518     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
519     break;
520     } break;}
521     case 5:
522     {
523     double a=1;
524     double b=1;
525     double c=-1;
526     switch (num_variable)
527     {
528     case 1:
529     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
530     break;
531     case 2:
532     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
533     break;
534     case 3:
535     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
536     break;
537     } break;}
538     case 7:
539     {
540     double a=-1;
541     double b=1;
542     double c=-1;
543     switch (num_variable)
544     {
545     case 1:
546     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
547     break;
548     case 2:
549     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
550     break;
551     case 3:
552     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
553     break;
554     } break;}
555     case 13:
556     {
557     double a=-1;
558     double b=-1;
559     double c=1;
560     switch (num_variable)
561     {
562     case 1:
563     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
564     break;
565     case 2:
566     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
567     break;
568     case 3:
569     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
570     break;
571     } break;}
572     case 15:
573     {
574     double a=1;
575     double b=-1;
576     double c=1;
577     switch (num_variable)
578     {
579     case 1:
580     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
581     break;
582     case 2:
583     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
584     break;
585     case 3:
586     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
587     break;
588     } break;}
589     case 17:
590     {
591     double a=1;
592     double b=1;
593     double c=1;
594     switch (num_variable)
595     {
596     case 1:
597     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
598     break;
599     case 2:
600     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
601     break;
602     case 3:
603     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
604     break;
605     } break;}
606     case 19:
607     {
608     double a=-1;
609     double b=1;
610     double c=1;
611     switch (num_variable)
612     {
613     case 1:
614     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
615     break;
616     case 2:
617     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
618     break;
619     case 3:
620     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
621     break;
622     } break;}
623     case 2:
624     {
625     double a=0;
626     double b=-1;
627     double c=-1;
628     switch (num_variable)
629     {
630     case 1:
631     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
632     break;
633     case 2:
634     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
635     break;
636     case 3:
637     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
638     break;
639     } break;}
640     case 18:
641     {
642     double a=0;
643     double b=1;
644     double c=1;
645     switch (num_variable)
646     {
647     case 1:
648     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
649     break;
650     case 2:
651     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
652     break;
653     case 3:
654     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
655     break;
656     } break;}
657     case 14:
658     {
659     double a=0;
660     double b=-1;
661     double c=1;
662     switch (num_variable)
663     {
664     case 1:
665     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
666     break;
667     case 2:
668     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
669     break;
670     case 3:
671     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
672     break;
673     } break;}
674     case 6:
675     {
676     double a=0;
677     double b=1;
678     double c=-1;
679     switch (num_variable)
680     {
681     case 1:
682     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
683     break;
684     case 2:
685     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
686     break;
687     case 3:
688     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
689     break;
690     } break;}
691     case 4:
692     {
693     double a=1;
694     double b=0;
695     double c=-1;
696     switch (num_variable)
697     {
698     case 1:
699     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
700     break;
701     case 2:
702     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
703     break;
704     case 3:
705     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
706     break;
707     } break;}
708     case 8:
709     {
710     double a=-1;
711     double b=0;
712     double c=-1;
713     switch (num_variable)
714     {
715     case 1:
716     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
717     break;
718     case 2:
719     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
720     break;
721     case 3:
722     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
723     break;
724     } break;}
725     case 16:
726     {
727     double a=1;
728     double b=0;
729     double c=1;
730     switch (num_variable)
731     {
732     case 1:
733     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
734     break;
735     case 2:
736     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
737     break;
738     case 3:
739     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
740     break;
741     } break;}
742     case 20:
743     {
744     double a=-1;
745     double b=0;
746     double c=1;
747     switch (num_variable)
748     {
749     case 1:
750     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
751     break;
752     case 2:
753     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
754     break;
755     case 3:
756     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
757     break;
758     } break;}
759     case 9:
760     {
761     double a=-1;
762     double b=-1;
763     double c=0.;
764     switch (num_variable)
765     {
766     case 1:
767     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
768     break;
769     case 2:
770     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
771     break;
772     case 3:
773     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
774     break;
775     } break;}
776     case 10:
777     {
778     double a=1;
779     double b=-1;
780     double c=0.;
781     switch (num_variable)
782     {
783     case 1:
784     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
785     break;
786     case 2:
787     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
788     break;
789     case 3:
790     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
791     break;
792     } break;}
793     case 11:
794     {
795     double a=1;
796     double b=1;
797     double c=0.;
798     switch (num_variable)
799     {
800     case 1:
801     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
802     break;
803     case 2:
804     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
805     break;
806     case 3:
807     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
808     break;
809     } break;}
810     case 12:
811     {
812     double a=-1;
813     double b=1;
814     double c=0.;
815     switch (num_variable)
816     {
817     case 1:
818     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
819     break;
820     case 2:
821     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
822     break;
823     case 3:
824     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
825     break;
826     } break;}
827    
828     }
829     return val;
830     }
831    
832     double FEM_HEXA20::get_jacobien(double* jac,double *uv,int& li,int& col,double unite)
833     {
834     li=3;col=3;
835     OT_TENSEUR Ni(3,20),Xi(20,3);
836     for (int i=0;i<3;i++)
837     for (int j=0;j<20;j++)
838     Ni(i,j)=get_fonction_derive_interpolation(j+1,i+1,uv);
839     for (int i=0;i<20;i++)
840     {
841     double *xyz=tab[i]->get_coord();
842     Xi(i,0)=xyz[0]*unite;
843     Xi(i,1)=xyz[1]*unite;
844     Xi(i,2)=xyz[2]*unite;
845     }
846     OT_TENSEUR jacobi=Ni*Xi;
847     jac[0]=jacobi(0,0).get_x();
848     jac[1]=jacobi(0,1).get_x();
849     jac[2]=jacobi(0,2).get_x();
850     jac[3]=jacobi(1,0).get_x();
851     jac[4]=jacobi(1,1).get_x();
852     jac[5]=jacobi(1,2).get_x();
853     jac[6]=jacobi(2,0).get_x();
854     jac[7]=jacobi(2,1).get_x();
855     jac[8]=jacobi(2,2).get_x();
856     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];
857     return det;
858    
859     }
860    
861     void FEM_HEXA20::get_inverse_jacob(double* j,double *uv,double unite)
862     {
863     double jac[9];
864     int li,col;
865     double detj=get_jacobien(jac,uv,li,col,unite);
866     j[0*3+0] = (jac[1*3+1]*jac[2*3+2]-jac[1*3+2]*jac[2*3+1])/(detj);
867     j[0*3+1] = -(jac[0*3+1]*jac[2*3+2]-jac[0*3+2]*jac[2*3+1])/(detj);
868     j[0*3+2] =-(-jac[0*3+1]*jac[1*3+2]+jac[0*3+2]*jac[1*3+1])/(detj);
869    
870     j[1*3+0] = -(jac[1*3+0]*jac[2*3+2]-jac[1*3+2]*jac[2*3+0])/(detj);
871     j[1*3+1] = (jac[0*3+0]*jac[2*3+2]-jac[0*3+2]*jac[2*3+0])/(detj);
872     j[1*3+2] = -(jac[0*3+0]*jac[1*3+2]-jac[0*3+2]*jac[1*3+0])/(detj);
873    
874     j[2*3+0] =-(-jac[1*3+0]*jac[2*3+1]+jac[1*3+1]*jac[2*3+0])/(detj);
875     j[2*3+1] = -(jac[0*3+0]*jac[2*3+1]-jac[0*3+1]*jac[2*3+0])/(detj);
876     j[2*3+2] = (jac[0*3+0]*jac[1*3+1]-jac[0*3+1]*jac[1*3+0])/(detj);
877    
878 francois 405 }
879    
880 francois 635 bool FEM_HEXA20::valide_parametre_EF(double* uvw)
881     {
882 francois 674 if (uvw[0]>=-1.-1e-10)
883     if (uvw[1]>=-1.-1e-10)
884     if (uvw[2]>=-1.-1e-10)
885 francois 635 if (uvw[0]<=1.+1e-10)
886     if (uvw[1]<=1.+1e-10)
887     if (uvw[2]<=1.+1e-10)
888     return true;
889     return false;
890     }
891 francois 405
892 francois 406 int FEM_HEXA20::verifie_validite_decoupage_xfem(double *vol)
893 francois 405 {
894    
895 francois 310 }