ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_hexa20.cpp
Revision: 310
Committed: Thu Jan 26 21:14:45 2012 UTC (13 years, 3 months ago) by francois
File size: 22754 byte(s)
Log Message:
Ajout des elements quadrangle et hexaedre dans les maillages FEM
Changement de la version des fichier de visu sous GMSH. Les .pos ont disparus et tout est intégré dans les .msh

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     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
36     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     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
62     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     FEM_HEXA20::FEM_HEXA20(FEM_HEXA20& mdd):FEM_ELEMENT3(mdd),FEM_TEMPLATE_ELEMENT<20>(mdd)
86     {
87     if (liaison_topologique!=NULL) if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_fem_maillage()->ajouter(this);
88     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     FEM_HEXA20::~FEM_HEXA20()
111     {
112     if (liaison_topologique==NULL) return;
113     if (liaison_topologique->get_dimension()==0) liaison_topologique->get_lien_fem_maillage()->supprimer(this);
114     tab[0]->get_lien_element3()->supprimer(this);
115     tab[1]->get_lien_element3()->supprimer(this);
116     tab[2]->get_lien_element3()->supprimer(this);
117     tab[3]->get_lien_element3()->supprimer(this);
118     tab[4]->get_lien_element3()->supprimer(this);
119     tab[5]->get_lien_element3()->supprimer(this);
120     tab[6]->get_lien_element3()->supprimer(this);
121     tab[7]->get_lien_element3()->supprimer(this);
122     tab[8]->get_lien_element3()->supprimer(this);
123     tab[9]->get_lien_element3()->supprimer(this);
124     tab[10]->get_lien_element3()->supprimer(this);
125     tab[11]->get_lien_element3()->supprimer(this);
126     tab[12]->get_lien_element3()->supprimer(this);
127     tab[13]->get_lien_element3()->supprimer(this);
128     tab[14]->get_lien_element3()->supprimer(this);
129     tab[15]->get_lien_element3()->supprimer(this);
130     tab[16]->get_lien_element3()->supprimer(this);
131     tab[17]->get_lien_element3()->supprimer(this);
132     tab[18]->get_lien_element3()->supprimer(this);
133     tab[19]->get_lien_element3()->supprimer(this);
134     get_fem_noeudpetitid()->get_lien_petit_element3()->supprimer(this);
135     }
136    
137    
138     FEM_ELEMENT_MAILLAGE* FEM_HEXA20::dupliquer(FEM_MAILLAGE *femmai,long decalage)
139     {
140     FEM_NOEUD* tabnoeud[8];
141     tabnoeud[0]=femmai->get_fem_noeudid(tab[0]->get_id()+decalage);
142     tabnoeud[1]=femmai->get_fem_noeudid(tab[1]->get_id()+decalage);
143     tabnoeud[2]=femmai->get_fem_noeudid(tab[2]->get_id()+decalage);
144     tabnoeud[3]=femmai->get_fem_noeudid(tab[3]->get_id()+decalage);
145     tabnoeud[4]=femmai->get_fem_noeudid(tab[4]->get_id()+decalage);
146     tabnoeud[5]=femmai->get_fem_noeudid(tab[5]->get_id()+decalage);
147     tabnoeud[6]=femmai->get_fem_noeudid(tab[6]->get_id()+decalage);
148     tabnoeud[7]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
149     tabnoeud[8]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
150     tabnoeud[9]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
151     tabnoeud[10]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
152     tabnoeud[11]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
153     tabnoeud[12]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
154     tabnoeud[13]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
155     tabnoeud[14]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
156     tabnoeud[15]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
157     tabnoeud[16]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
158     tabnoeud[17]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
159     tabnoeud[18]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
160     tabnoeud[19]=femmai->get_fem_noeudid(tab[7]->get_id()+decalage);
161     FEM_HEXA20* quad=new FEM_HEXA20(get_id()+decalage,maillage,tabnoeud);
162     femmai->ajouter_fem_element3(quad);
163     return quad;
164     }
165    
166    
167    
168    
169    
170     int FEM_HEXA20::get_type_entite(void)
171     {
172     return IDFEM_HEXA20;
173     }
174    
175     int FEM_HEXA20::get_dimension(void)
176     {
177     return 3;
178     }
179    
180    
181    
182     int FEM_HEXA20::get_nb_fem_noeud(void)
183     {
184     return FEM_TEMPLATE_ELEMENT<20>::get_nb_fem_noeud();
185     }
186    
187     FEM_NOEUD* FEM_HEXA20::get_fem_noeud(int num)
188     {
189     return FEM_TEMPLATE_ELEMENT<20>::get_fem_noeud(num);
190     }
191    
192     void FEM_HEXA20::change_noeud(int num,FEM_NOEUD* noeud)
193     {
194     FEM_TEMPLATE_ELEMENT<20>::change_noeud(num,noeud);
195     }
196    
197     BOITE_3D& FEM_HEXA20::get_boite_3D(void)
198     {
199     return FEM_TEMPLATE_ELEMENT<20>::get_boite_3D();
200     }
201    
202    
203     void FEM_HEXA20::enregistrer(std::ostream& o)
204     {
205     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;
206     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;
207     }
208     int FEM_HEXA20::nb_fonction_interpolation(void)
209     {
210     return 20;
211     }
212    
213    
214     double FEM_HEXA20::get_fonction_interpolation(int num,double *uv)
215     {
216     double val;
217     switch (num)
218     {
219     case 1:
220     {double a=-1;
221     double b=-1;
222     double c=-1;
223     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);
224     break;}
225     case 3:
226     {double a=1;
227     double b=-1;
228     double c=-1;
229     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);
230     break;}
231     case 5:
232     {double a=1;
233     double b=1;
234     double c=-1;
235     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);
236     break;}
237     case 7:
238     {double a=-1;
239     double b=1;
240     double c=-1;
241     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);
242     break;}
243     case 13:
244     {double a=-1;
245     double b=-1;
246     double c=1;
247     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);
248     break;}
249     case 15:
250     {double a=1;
251     double b=-1;
252     double c=1;
253     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);
254     break;}
255     case 17:
256     {double a=1;
257     double b=1;
258     double c=1;
259     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);
260     break;}
261     case 19:
262     {double a=-1;
263     double b=1;
264     double c=1;
265     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);
266     break;}
267     case 2:
268     {double a=0.;
269     double b=-1;
270     double c=-1;
271     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
272     break;}
273     case 6:
274     {double a=0.;
275     double b=1;
276     double c=-1;
277     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
278     break;}
279     case 14:
280     {double a=0.;
281     double b=-1;
282     double c=1;
283     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
284     break;}
285     case 18:
286     {double a=0.;
287     double b=1;
288     double c=1;
289     val=0.25*(1.-uv[0]*uv[0])*(1.+uv[1]*b)*(1.+uv[2]*c);
290     break;}
291     case 4:
292     {double a=1.;
293     double b=0.;
294     double c=-1;
295     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
296     break;}
297     case 8:
298     {double a=-1.;
299     double b=0.;
300     double c=-1;
301     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
302     break;}
303     case 16:
304     {double a=1.;
305     double b=0.;
306     double c=1;
307     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
308     break;}
309     case 20:
310     {double a=-1.;
311     double b=0.;
312     double c=1;
313     val=0.25*(1.+uv[0]*a)*(1.-uv[1]*uv[1])*(1.+uv[2]*c);
314     break;}
315     case 9:
316     {double a=-1.;
317     double b=-1.;
318     double c=0.;
319     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
320     break;}
321     case 10:
322     {double a=1.;
323     double b=-1.;
324     double c=0.;
325     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
326     break;}
327     case 11:
328     {double a=1.;
329     double b=1.;
330     double c=0.;
331     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
332     break;}
333     case 12:
334     {double a=-1.;
335     double b=1.;
336     double c=0.;
337     val=0.25*(1.+uv[0]*a)*(1.+uv[1]*b)*(1.-uv[2]*uv[2]);
338     break;}
339    
340    
341     }
342     return val;
343     }
344    
345     double FEM_HEXA20::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
346     {
347     double val;
348     switch (num)
349     {
350     case 1:
351     {
352     double a=-1;
353     double b=-1;
354     double c=-1;
355     switch (num_variable)
356     {
357     case 1:
358     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
359     break;
360     case 2:
361     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
362     break;
363     case 3:
364     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
365     break;
366     } break;}
367     case 3:
368     {
369     double a=1;
370     double b=-1;
371     double c=-1;
372     switch (num_variable)
373     {
374     case 1:
375     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
376     break;
377     case 2:
378     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
379     break;
380     case 3:
381     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
382     break;
383     } break;}
384     case 5:
385     {
386     double a=1;
387     double b=1;
388     double c=-1;
389     switch (num_variable)
390     {
391     case 1:
392     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
393     break;
394     case 2:
395     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
396     break;
397     case 3:
398     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
399     break;
400     } break;}
401     case 7:
402     {
403     double a=-1;
404     double b=1;
405     double c=-1;
406     switch (num_variable)
407     {
408     case 1:
409     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
410     break;
411     case 2:
412     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
413     break;
414     case 3:
415     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
416     break;
417     } break;}
418     case 13:
419     {
420     double a=-1;
421     double b=-1;
422     double c=1;
423     switch (num_variable)
424     {
425     case 1:
426     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
427     break;
428     case 2:
429     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
430     break;
431     case 3:
432     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
433     break;
434     } break;}
435     case 15:
436     {
437     double a=1;
438     double b=-1;
439     double c=1;
440     switch (num_variable)
441     {
442     case 1:
443     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
444     break;
445     case 2:
446     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
447     break;
448     case 3:
449     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
450     break;
451     } break;}
452     case 17:
453     {
454     double a=1;
455     double b=1;
456     double c=1;
457     switch (num_variable)
458     {
459     case 1:
460     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
461     break;
462     case 2:
463     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
464     break;
465     case 3:
466     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
467     break;
468     } break;}
469     case 19:
470     {
471     double a=-1;
472     double b=1;
473     double c=1;
474     switch (num_variable)
475     {
476     case 1:
477     val=0.125*a*(1+uv[1]*b)*(1+uv[2]*c)*(-1+2*uv[0]*a+uv[1]*b+uv[2]*c);
478     break;
479     case 2:
480     val=0.125*b*(1+uv[0]*a)*(1+uv[2]*c)*(-1+uv[0]*a+2*uv[1]*b+uv[2]*c);
481     break;
482     case 3:
483     val=0.125*c*(1+uv[0]*a)*(1+uv[1]*b)*(-1+uv[0]*a+uv[1]*b+2*uv[2]*c);
484     break;
485     } break;}
486     case 2:
487     {
488     double a=0;
489     double b=-1;
490     double c=-1;
491     switch (num_variable)
492     {
493     case 1:
494     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
495     break;
496     case 2:
497     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
498     break;
499     case 3:
500     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
501     break;
502     } break;}
503     case 18:
504     {
505     double a=0;
506     double b=1;
507     double c=1;
508     switch (num_variable)
509     {
510     case 1:
511     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
512     break;
513     case 2:
514     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
515     break;
516     case 3:
517     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
518     break;
519     } break;}
520     case 14:
521     {
522     double a=0;
523     double b=-1;
524     double c=1;
525     switch (num_variable)
526     {
527     case 1:
528     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
529     break;
530     case 2:
531     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
532     break;
533     case 3:
534     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
535     break;
536     } break;}
537     case 6:
538     {
539     double a=0;
540     double b=1;
541     double c=-1;
542     switch (num_variable)
543     {
544     case 1:
545     val=-0.5*uv[0]*(1+uv[1]*b)*(1+uv[2]*c);
546     break;
547     case 2:
548     val=0.25*b*(1-uv[0]*uv[0])*(1+uv[2]*c);
549     break;
550     case 3:
551     val=0.25*c*(1-uv[0]*uv[0])*(1+uv[1]*b);
552     break;
553     } break;}
554     case 4:
555     {
556     double a=1;
557     double b=0;
558     double c=-1;
559     switch (num_variable)
560     {
561     case 1:
562     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
563     break;
564     case 2:
565     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
566     break;
567     case 3:
568     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
569     break;
570     } break;}
571     case 8:
572     {
573     double a=-1;
574     double b=0;
575     double c=-1;
576     switch (num_variable)
577     {
578     case 1:
579     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
580     break;
581     case 2:
582     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
583     break;
584     case 3:
585     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
586     break;
587     } break;}
588     case 16:
589     {
590     double a=1;
591     double b=0;
592     double c=1;
593     switch (num_variable)
594     {
595     case 1:
596     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
597     break;
598     case 2:
599     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
600     break;
601     case 3:
602     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
603     break;
604     } break;}
605     case 20:
606     {
607     double a=-1;
608     double b=0;
609     double c=1;
610     switch (num_variable)
611     {
612     case 1:
613     val=0.25*a*(1-uv[1]*uv[1])*(1+uv[2]*c);
614     break;
615     case 2:
616     val=-0.5*uv[1]*(1+uv[0]*a)*(1+uv[2]*c);
617     break;
618     case 3:
619     val=0.25*c*(1+uv[0]*a)*(1-uv[1]*uv[1]);
620     break;
621     } break;}
622     case 9:
623     {
624     double a=-1;
625     double b=-1;
626     double c=0.;
627     switch (num_variable)
628     {
629     case 1:
630     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
631     break;
632     case 2:
633     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
634     break;
635     case 3:
636     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
637     break;
638     } break;}
639     case 10:
640     {
641     double a=1;
642     double b=-1;
643     double c=0.;
644     switch (num_variable)
645     {
646     case 1:
647     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
648     break;
649     case 2:
650     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
651     break;
652     case 3:
653     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
654     break;
655     } break;}
656     case 11:
657     {
658     double a=1;
659     double b=1;
660     double c=0.;
661     switch (num_variable)
662     {
663     case 1:
664     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
665     break;
666     case 2:
667     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
668     break;
669     case 3:
670     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
671     break;
672     } break;}
673     case 12:
674     {
675     double a=-1;
676     double b=1;
677     double c=0.;
678     switch (num_variable)
679     {
680     case 1:
681     val=0.25*a*(1+uv[1]*b)*(1-uv[2]*uv[2]);
682     break;
683     case 2:
684     val=0.25*b*(1+uv[0]*a)*(1-uv[2]*uv[2]);
685     break;
686     case 3:
687     val=-0.5*uv[2]*(1+uv[0]*a)*(1+uv[1]*b);
688     break;
689     } break;}
690    
691     }
692     return val;
693     }
694    
695     double FEM_HEXA20::get_jacobien(double* jac,double *uv,int& li,int& col,double unite)
696     {
697     li=3;col=3;
698     OT_TENSEUR Ni(3,20),Xi(20,3);
699     for (int i=0;i<3;i++)
700     for (int j=0;j<20;j++)
701     Ni(i,j)=get_fonction_derive_interpolation(j+1,i+1,uv);
702     for (int i=0;i<20;i++)
703     {
704     double *xyz=tab[i]->get_coord();
705     Xi(i,0)=xyz[0]*unite;
706     Xi(i,1)=xyz[1]*unite;
707     Xi(i,2)=xyz[2]*unite;
708     }
709     OT_TENSEUR jacobi=Ni*Xi;
710     jac[0]=jacobi(0,0).get_x();
711     jac[1]=jacobi(0,1).get_x();
712     jac[2]=jacobi(0,2).get_x();
713     jac[3]=jacobi(1,0).get_x();
714     jac[4]=jacobi(1,1).get_x();
715     jac[5]=jacobi(1,2).get_x();
716     jac[6]=jacobi(2,0).get_x();
717     jac[7]=jacobi(2,1).get_x();
718     jac[8]=jacobi(2,2).get_x();
719     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];
720     return det;
721    
722     }
723    
724     void FEM_HEXA20::get_inverse_jacob(double* j,double *uv,double unite)
725     {
726     double jac[9];
727     int li,col;
728     double detj=get_jacobien(jac,uv,li,col,unite);
729     j[0*3+0] = (jac[1*3+1]*jac[2*3+2]-jac[1*3+2]*jac[2*3+1])/(detj);
730     j[0*3+1] = -(jac[0*3+1]*jac[2*3+2]-jac[0*3+2]*jac[2*3+1])/(detj);
731     j[0*3+2] =-(-jac[0*3+1]*jac[1*3+2]+jac[0*3+2]*jac[1*3+1])/(detj);
732    
733     j[1*3+0] = -(jac[1*3+0]*jac[2*3+2]-jac[1*3+2]*jac[2*3+0])/(detj);
734     j[1*3+1] = (jac[0*3+0]*jac[2*3+2]-jac[0*3+2]*jac[2*3+0])/(detj);
735     j[1*3+2] = -(jac[0*3+0]*jac[1*3+2]-jac[0*3+2]*jac[1*3+0])/(detj);
736    
737     j[2*3+0] =-(-jac[1*3+0]*jac[2*3+1]+jac[1*3+1]*jac[2*3+0])/(detj);
738     j[2*3+1] = -(jac[0*3+0]*jac[2*3+1]-jac[0*3+1]*jac[2*3+0])/(detj);
739     j[2*3+2] = (jac[0*3+0]*jac[1*3+1]-jac[0*3+1]*jac[1*3+0])/(detj);
740    
741     }