ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_hexa20.cpp
Revision: 674
Committed: Tue Jun 9 18:30:54 2015 UTC (9 years, 11 months ago) by francois
File size: 31972 byte(s)
Log Message:
Transformation d'un support de carte de taille non structure en structure (formule à preciser et a revoir)
Calcul du temps CPU pour toutes les applications en incluant le temps CPU de code aster
Changement dans la projection et la comparaison de solution pour la generaliser à tous les maillages
Divers bug petit sur maillage hex/quadra

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