ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_hexa20.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 30478 byte(s)
Log Message:
Le fichier MAGiC est maintenant versionné. LA version actuelle est 2.0. L'ancienne version est 1.0.
Tout est transparent pour l'utilisateur. Les vieilles versions sont lisibles mais les nouveaux enregistrements sont dans la version la plus récente.
Changement des conditions aux limites : ajout d'un parametre pour dire si la condition numerique est une valeur ou une formule ou un lien vers une autre entité magic.
Les parametres pour saisir sont maintenant -ccf -ccfi -ccff -ccft -ccfit -ccfft

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 francois 763 void FEM_HEXA20::enregistrer(std::ostream& o,double version)
317 francois 310 {
318 francois 378 if (maillage!=NULL)
319     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_HEXA20($"<< get_lien_topologie()->get_id() << ",$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<< ",$" << tab[8]->get_id() << ",$" << tab[9]->get_id() << ",$" << tab[10]->get_id()<< ",$" << tab[11]->get_id() << ",$" << tab[12]->get_id() << ",$" << tab[13]->get_id() << ",$" << tab[14]->get_id() << ",$" << tab[15]->get_id() << ",$" << tab[16]->get_id()<< ",$" << tab[17]->get_id()<< ",$" << tab[18]->get_id()<< ",$" << tab[19]->get_id()<< ");" << std::endl;
320     else o << "%" << get_id() << "=FEM_HEXA20(NULL,$" << maillage->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<< ",$" << tab[8]->get_id() << ",$" << tab[9]->get_id() << ",$" << tab[10]->get_id()<< ",$" << tab[11]->get_id() << ",$" << tab[12]->get_id() << ",$" << tab[13]->get_id() << ",$" << tab[14]->get_id() << ",$" << tab[15]->get_id() << ",$" << tab[16]->get_id()<< ",$" << tab[17]->get_id()<< ",$" << tab[18]->get_id()<< ",$" << tab[19]->get_id()<<");" << std::endl;
321     else
322     if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=FEM_HEXA20($"<< get_lien_topologie()->get_id() << ",NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<< ",$" << tab[8]->get_id() << ",$" << tab[9]->get_id() << ",$" << tab[10]->get_id()<< ",$" << tab[11]->get_id() << ",$" << tab[12]->get_id() << ",$" << tab[13]->get_id() << ",$" << tab[14]->get_id() << ",$" << tab[15]->get_id() << ",$" << tab[16]->get_id()<< ",$" << tab[17]->get_id()<< ",$" << tab[18]->get_id()<< ",$" << tab[19]->get_id()<< ");" << std::endl;
323     else o << "%" << get_id() << "=FEM_HEXA20(NULL,NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id()<< ",$" << tab[3]->get_id() << ",$" << tab[4]->get_id() << ",$" << tab[5]->get_id() << ",$" << tab[6]->get_id()<< ",$" << tab[7]->get_id()<< ",$" << tab[8]->get_id() << ",$" << tab[9]->get_id() << ",$" << tab[10]->get_id()<< ",$" << tab[11]->get_id() << ",$" << tab[12]->get_id() << ",$" << tab[13]->get_id() << ",$" << tab[14]->get_id() << ",$" << tab[15]->get_id() << ",$" << tab[16]->get_id()<< ",$" << tab[17]->get_id()<< ",$" << tab[18]->get_id()<< ",$" << tab[19]->get_id()<<");" << std::endl;
324    
325 francois 310 }
326 francois 637
327    
328    
329     int FEM_HEXA20::get_nb_pt_gauss(int degre)
330     {
331 francois 754 return OT_POINTS_GAUSS::get_nb_point_hexa_prod(degre);
332 francois 637 }
333    
334     void FEM_HEXA20::get_pt_gauss(int degre,int num,double &w,double *uvw)
335     {
336 francois 754 return OT_POINTS_GAUSS::get_pt_gauss_hex_prod(degre,num,w,uvw);
337 francois 637 }
338 francois 638 int FEM_HEXA20::get_nb_fonction_interpolation(void)
339 francois 310 {
340     return 20;
341     }
342 francois 638 int FEM_HEXA20::get_degremax_fonction_interpolation(void)
343     {
344     return 4;
345     }
346 francois 310
347 francois 757 int FEM_HEXA20::get_degre_gauss(int num)
348     {
349     return OT_POINTS_GAUSS::get_degre_gauss_hexa_prod(num);
350     }
351    
352    
353 francois 310 double FEM_HEXA20::get_fonction_interpolation(int num,double *uv)
354     {
355     double val;
356     switch (num)
357     {
358     case 1:
359     {double a=-1;
360     double b=-1;
361     double c=-1;
362     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
363     break;}
364     case 3:
365     {double a=1;
366     double b=-1;
367     double c=-1;
368     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
369     break;}
370     case 5:
371     {double a=1;
372     double b=1;
373     double c=-1;
374     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
375     break;}
376     case 7:
377     {double a=-1;
378     double b=1;
379     double c=-1;
380     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
381     break;}
382     case 13:
383     {double a=-1;
384     double b=-1;
385     double c=1;
386     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
387     break;}
388     case 15:
389     {double a=1;
390     double b=-1;
391     double c=1;
392     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
393     break;}
394     case 17:
395     {double a=1;
396     double b=1;
397     double c=1;
398     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
399     break;}
400     case 19:
401     {double a=-1;
402     double b=1;
403     double c=1;
404     val=0.125*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.+uv[2]*c)*(-2.+uv[0]*a+uv[1]*b+uv[2]*c);
405     break;}
406     case 2:
407     {double a=0.;
408     double b=-1;
409     double c=-1;
410     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
411     break;}
412     case 6:
413     {double a=0.;
414     double b=1;
415     double c=-1;
416     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
417     break;}
418     case 14:
419     {double a=0.;
420     double b=-1;
421     double c=1;
422     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
423     break;}
424     case 18:
425     {double a=0.;
426     double b=1;
427     double c=1;
428     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
429     break;}
430     case 4:
431     {double a=1.;
432     double b=0.;
433     double c=-1;
434     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
435     break;}
436     case 8:
437     {double a=-1.;
438     double b=0.;
439     double c=-1;
440     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
441     break;}
442     case 16:
443     {double a=1.;
444     double b=0.;
445     double c=1;
446     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
447     break;}
448     case 20:
449     {double a=-1.;
450     double b=0.;
451     double c=1;
452     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
453     break;}
454     case 9:
455     {double a=-1.;
456     double b=-1.;
457     double c=0.;
458     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
459     break;}
460     case 10:
461     {double a=1.;
462     double b=-1.;
463     double c=0.;
464     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
465     break;}
466     case 11:
467     {double a=1.;
468     double b=1.;
469     double c=0.;
470     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
471     break;}
472     case 12:
473     {double a=-1.;
474     double b=1.;
475     double c=0.;
476     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
477     break;}
478    
479    
480     }
481     return val;
482     }
483 francois 684 void FEM_HEXA20::reinit_boite_3D(void)
484     {
485     FEM_TEMPLATE_ELEMENT<20>::reinit_boite_3D();
486     }
487 francois 310
488     double FEM_HEXA20::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
489     {
490     double val;
491     switch (num)
492     {
493     case 1:
494     {
495     double a=-1;
496     double b=-1;
497     double c=-1;
498     switch (num_variable)
499     {
500     case 1:
501     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
502     break;
503     case 2:
504     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
505     break;
506     case 3:
507     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
508     break;
509     } break;}
510     case 3:
511     {
512     double a=1;
513     double b=-1;
514     double c=-1;
515     switch (num_variable)
516     {
517     case 1:
518     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
519     break;
520     case 2:
521     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
522     break;
523     case 3:
524     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
525     break;
526     } break;}
527     case 5:
528     {
529     double a=1;
530     double b=1;
531     double c=-1;
532     switch (num_variable)
533     {
534     case 1:
535     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
536     break;
537     case 2:
538     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
539     break;
540     case 3:
541     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
542     break;
543     } break;}
544     case 7:
545     {
546     double a=-1;
547     double b=1;
548     double c=-1;
549     switch (num_variable)
550     {
551     case 1:
552     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
553     break;
554     case 2:
555     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
556     break;
557     case 3:
558     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
559     break;
560     } break;}
561     case 13:
562     {
563     double a=-1;
564     double b=-1;
565     double c=1;
566     switch (num_variable)
567     {
568     case 1:
569     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
570     break;
571     case 2:
572     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
573     break;
574     case 3:
575     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
576     break;
577     } break;}
578     case 15:
579     {
580     double a=1;
581     double b=-1;
582     double c=1;
583     switch (num_variable)
584     {
585     case 1:
586     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
587     break;
588     case 2:
589     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
590     break;
591     case 3:
592     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
593     break;
594     } break;}
595     case 17:
596     {
597     double a=1;
598     double b=1;
599     double c=1;
600     switch (num_variable)
601     {
602     case 1:
603     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
604     break;
605     case 2:
606     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
607     break;
608     case 3:
609     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
610     break;
611     } break;}
612     case 19:
613     {
614     double a=-1;
615     double b=1;
616     double c=1;
617     switch (num_variable)
618     {
619     case 1:
620     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
621     break;
622     case 2:
623     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
624     break;
625     case 3:
626     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
627     break;
628     } break;}
629     case 2:
630     {
631     double a=0;
632     double b=-1;
633     double c=-1;
634     switch (num_variable)
635     {
636     case 1:
637     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
638     break;
639     case 2:
640     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
641     break;
642     case 3:
643     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
644     break;
645     } break;}
646     case 18:
647     {
648     double a=0;
649     double b=1;
650     double c=1;
651     switch (num_variable)
652     {
653     case 1:
654     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
655     break;
656     case 2:
657     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
658     break;
659     case 3:
660     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
661     break;
662     } break;}
663     case 14:
664     {
665     double a=0;
666     double b=-1;
667     double c=1;
668     switch (num_variable)
669     {
670     case 1:
671     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
672     break;
673     case 2:
674     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
675     break;
676     case 3:
677     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
678     break;
679     } break;}
680     case 6:
681     {
682     double a=0;
683     double b=1;
684     double c=-1;
685     switch (num_variable)
686     {
687     case 1:
688     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
689     break;
690     case 2:
691     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
692     break;
693     case 3:
694     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
695     break;
696     } break;}
697     case 4:
698     {
699     double a=1;
700     double b=0;
701     double c=-1;
702     switch (num_variable)
703     {
704     case 1:
705     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
706     break;
707     case 2:
708     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
709     break;
710     case 3:
711     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
712     break;
713     } break;}
714     case 8:
715     {
716     double a=-1;
717     double b=0;
718     double c=-1;
719     switch (num_variable)
720     {
721     case 1:
722     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
723     break;
724     case 2:
725     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
726     break;
727     case 3:
728     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
729     break;
730     } break;}
731     case 16:
732     {
733     double a=1;
734     double b=0;
735     double c=1;
736     switch (num_variable)
737     {
738     case 1:
739     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
740     break;
741     case 2:
742     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
743     break;
744     case 3:
745     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
746     break;
747     } break;}
748     case 20:
749     {
750     double a=-1;
751     double b=0;
752     double c=1;
753     switch (num_variable)
754     {
755     case 1:
756     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
757     break;
758     case 2:
759     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
760     break;
761     case 3:
762     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
763     break;
764     } break;}
765     case 9:
766     {
767     double a=-1;
768     double b=-1;
769     double c=0.;
770     switch (num_variable)
771     {
772     case 1:
773     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
774     break;
775     case 2:
776     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
777     break;
778     case 3:
779     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
780     break;
781     } break;}
782     case 10:
783     {
784     double a=1;
785     double b=-1;
786     double c=0.;
787     switch (num_variable)
788     {
789     case 1:
790     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
791     break;
792     case 2:
793     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
794     break;
795     case 3:
796     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
797     break;
798     } break;}
799     case 11:
800     {
801     double a=1;
802     double b=1;
803     double c=0.;
804     switch (num_variable)
805     {
806     case 1:
807     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
808     break;
809     case 2:
810     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
811     break;
812     case 3:
813     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
814     break;
815     } break;}
816     case 12:
817     {
818     double a=-1;
819     double b=1;
820     double c=0.;
821     switch (num_variable)
822     {
823     case 1:
824     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
825     break;
826     case 2:
827     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
828     break;
829     case 3:
830     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
831     break;
832     } break;}
833    
834     }
835     return val;
836     }
837    
838     double FEM_HEXA20::get_jacobien(double* jac,double *uv,int& li,int& col,double unite)
839     {
840     li=3;col=3;
841     OT_TENSEUR Ni(3,20),Xi(20,3);
842     for (int i=0;i<3;i++)
843     for (int j=0;j<20;j++)
844     Ni(i,j)=get_fonction_derive_interpolation(j+1,i+1,uv);
845     for (int i=0;i<20;i++)
846     {
847     double *xyz=tab[i]->get_coord();
848     Xi(i,0)=xyz[0]*unite;
849     Xi(i,1)=xyz[1]*unite;
850     Xi(i,2)=xyz[2]*unite;
851     }
852     OT_TENSEUR jacobi=Ni*Xi;
853     jac[0]=jacobi(0,0).get_x();
854     jac[1]=jacobi(0,1).get_x();
855     jac[2]=jacobi(0,2).get_x();
856     jac[3]=jacobi(1,0).get_x();
857     jac[4]=jacobi(1,1).get_x();
858     jac[5]=jacobi(1,2).get_x();
859     jac[6]=jacobi(2,0).get_x();
860     jac[7]=jacobi(2,1).get_x();
861     jac[8]=jacobi(2,2).get_x();
862     double det=jac[0]*jac[4]*jac[8]+jac[3]*jac[7]*jac[2]+jac[6]*jac[1]*jac[5]-jac[2]*jac[4]*jac[6]-jac[5]*jac[7]*jac[0]-jac[8]*jac[1]*jac[3];
863     return det;
864    
865     }
866    
867     void FEM_HEXA20::get_inverse_jacob(double* j,double *uv,double unite)
868     {
869     double jac[9];
870     int li,col;
871     double detj=get_jacobien(jac,uv,li,col,unite);
872     j[0*3+0] = (jac[1*3+1]*jac[2*3+2]-jac[1*3+2]*jac[2*3+1])/(detj);
873     j[0*3+1] = -(jac[0*3+1]*jac[2*3+2]-jac[0*3+2]*jac[2*3+1])/(detj);
874     j[0*3+2] =-(-jac[0*3+1]*jac[1*3+2]+jac[0*3+2]*jac[1*3+1])/(detj);
875    
876     j[1*3+0] = -(jac[1*3+0]*jac[2*3+2]-jac[1*3+2]*jac[2*3+0])/(detj);
877     j[1*3+1] = (jac[0*3+0]*jac[2*3+2]-jac[0*3+2]*jac[2*3+0])/(detj);
878     j[1*3+2] = -(jac[0*3+0]*jac[1*3+2]-jac[0*3+2]*jac[1*3+0])/(detj);
879    
880     j[2*3+0] =-(-jac[1*3+0]*jac[2*3+1]+jac[1*3+1]*jac[2*3+0])/(detj);
881     j[2*3+1] = -(jac[0*3+0]*jac[2*3+1]-jac[0*3+1]*jac[2*3+0])/(detj);
882     j[2*3+2] = (jac[0*3+0]*jac[1*3+1]-jac[0*3+1]*jac[1*3+0])/(detj);
883    
884 francois 405 }
885    
886 francois 635 bool FEM_HEXA20::valide_parametre_EF(double* uvw)
887     {
888 francois 674 if (uvw[0]>=-1.-1e-10)
889     if (uvw[1]>=-1.-1e-10)
890     if (uvw[2]>=-1.-1e-10)
891 francois 635 if (uvw[0]<=1.+1e-10)
892     if (uvw[1]<=1.+1e-10)
893     if (uvw[2]<=1.+1e-10)
894     return true;
895     return false;
896     }
897 francois 405
898 francois 406 int FEM_HEXA20::verifie_validite_decoupage_xfem(double *vol)
899 francois 405 {
900    
901 francois 310 }