ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_hexa20.cpp
Revision: 684
Committed: Tue Jun 30 15:21:22 2015 UTC (9 years, 10 months ago) by francois
File size: 32062 byte(s)
Log Message:
mise a jour de la boite englobante quand une coordonnees change  dans un fem_noeud

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