ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/solveur/src/sl_tetra24.cpp
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (17 years, 11 months ago)
Original Path: magic/lib/solveur/solveur/src/sl_tetra24.cpp
File size: 6927 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 #include "gestionversion.h"
2     //---------------------------------------------------------------------------
3    
4     #pragma hdrstop
5    
6     #include "sl_tetra24.h"
7     //---------------------------------------------------------------------------
8     #include "fem_tetra.h"
9     #include "fem_noeud.h"
10     #include "tpl_map_entite.h"
11     //---------------------------------------------------------------------------
12     #pragma package(smart_init)
13    
14    
15     SL_TETRA24::SL_TETRA24(class FEM_TETRA *femtetra):SL_TETRA(femtetra)
16     {
17     }
18    
19     SL_TETRA24::SL_TETRA24(SL_TETRA24& mdd):SL_TETRA(mdd)
20     {
21     }
22    
23     SL_TETRA24::~SL_TETRA24()
24     {
25     }
26    
27     int SL_TETRA24::nb_point_gauss(void)
28     {
29     return 4;
30     }
31    
32    
33    
34     int SL_TETRA24::nb_fonction_interpolation(void)
35     {
36     return 10;
37     }
38    
39     void SL_TETRA24::get_point_gauss(int num,double *xyz,double& poids)
40     {
41     double a= 0.13819660112501051517954131656344 ;
42     double b= 0.58541019662496845446137605030969 ;
43     double c= 0.041666666666666666666666666666667 ;
44     switch (num)
45     {
46     case 1:xyz[0]=a;
47     xyz[1]=a;
48     xyz[2]=a;
49     poids=c;
50     break;
51     case 2:xyz[0]=a;
52     xyz[1]=a;
53     xyz[2]=b;
54     poids=c;
55     break;
56    
57     case 3:xyz[0]=a;
58     xyz[1]=b;
59     xyz[2]=a;
60     poids=c;
61     break;
62     case 4:xyz[0]=b;
63     xyz[1]=a;
64     xyz[2]=a;
65     poids=c;
66     break;
67     }
68     }
69    
70     double SL_TETRA24::get_fonction_interpolation(int num,double *uv)
71     {
72     double val;
73     double landa=1-uv[0]-uv[1]-uv[2];
74     switch (num)
75     {
76     case 1:val=-landa*(1-2*landa);break;
77     case 2:val=4*uv[0]*landa;break;
78     case 3:val=-uv[0]*(1-2*uv[0]);break;
79     case 4:val=4*uv[0]*uv[1];break;
80     case 5:val=-uv[1]*(1-2*uv[1]);break;
81     case 6:val=4*uv[1]*landa;break;
82     case 7:val=4*uv[2]*landa;break;
83     case 8:val=4*uv[0]*uv[2];break;
84     case 9:val=4*uv[1]*uv[2];break;
85     case 10:val=-uv[2]*(1-2*uv[2]);break;
86     }
87     return val;
88     }
89    
90     double SL_TETRA24::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
91     {
92     double val;
93     double landa=1-uv[0]-uv[1]-uv[2];
94     switch (num)
95     {
96     case 1:switch (num_variable)
97     {
98     case 1:val=1-4*landa;break;
99     case 2:val=1-4*landa;break;
100     case 3:val=1-4*landa;break;
101     } break;
102     case 2:switch (num_variable)
103     {
104     case 1:val=4*(landa-uv[0]);break;
105     case 2:val=-4*uv[0];break;
106     case 3:val=-4*uv[0];break;
107     }break;
108     case 3:switch (num_variable)
109     {
110     case 1:val=-1+4*uv[0];break;
111     case 2:val=0.;break;
112     case 3:val=0.;break;
113     }break;
114     case 4:switch (num_variable)
115     {
116     case 1:val=4*uv[1];break;
117     case 2:val=4*uv[0];break;
118     case 3:val=0.;break;
119     }break;
120     case 5:switch (num_variable)
121     {
122     case 1:val=0.;break;
123     case 2:val=-1+4*uv[1];break;
124     case 3:val=0.;break;
125     }break;
126     case 6:switch (num_variable)
127     {
128     case 1:val=-4*uv[1];break;
129     case 2:val=4*(landa-uv[1]);break;
130     case 3:val=-4*uv[1];break;
131     }break;
132     case 7:switch (num_variable)
133     {
134     case 1:val=-4*uv[2];break;
135     case 2:val=-4*uv[2];break;
136     case 3:val=4*(landa-uv[2]);break;
137     }break;
138     case 8:switch (num_variable)
139     {
140     case 1:val=4*uv[2];break;
141     case 2:val=0;break;
142     case 3:val=4*uv[0];break;
143     }break;
144     case 9:switch (num_variable)
145     {
146     case 1:val=0.;break;
147     case 2:val=4*uv[2];break;
148     case 3:val=4*uv[1];break;
149     }break;
150     case 10:switch (num_variable)
151     {
152     case 1:val=0.;break;
153     case 2:val=0.;break;
154     case 3:val=-1+4*uv[2];break;
155     }break;
156     }
157     return val;
158    
159     }
160    
161     double SL_TETRA24::get_jacobien(double* jac,double *uv,int& lig,int& col,double unite)
162     {
163    
164     lig=3;
165     col=3;
166    
167     double nb_fct_int=this->nb_fonction_interpolation();
168    
169     double xyz[30];
170     int nb_nd=((FEM_TETRA*) mai)->get_nb_fem_noeud();
171    
172     for(int i=0;i<nb_nd;i++)
173     {
174     FEM_NOEUD* fmnd=((FEM_TETRA*) mai)->get_fem_noeud(i);
175     double *xyz1=fmnd->get_coord();
176    
177     xyz[3*i]=unite*xyz1[0];
178     xyz[3*i+1]=unite*xyz1[1];
179     xyz[3*i+2]=unite*xyz1[2];
180    
181     }
182    
183     for(int i=0;i<lig;i++)
184     {
185     for(int j=0;j<col;j++)
186     {
187     jac[i*col+j]=0.0;
188     for(int k=0;k<nb_fct_int;k++)
189     {
190     double NDERI=this->get_fonction_derive_interpolation(k+1,i+1,uv);
191    
192     jac[i*col+j]+=NDERI*xyz[3*k+j];
193     }
194     }
195     }
196    
197     double SIX_V= jac[0]*(jac[4]*jac[8]-jac[7]*jac[5])+jac[1]*(jac[5]*jac[6]-jac[8]*jac[3])+jac[2]*(jac[3]*jac[7]-jac[6]*jac[4]);
198    
199     return SIX_V;
200    
201     }
202    
203    
204     void SL_TETRA24::get_inverse_jacob(double* j,double *uv,double unite)
205     {
206     double jac[9];
207     int lig,col;
208     double detj=this->get_jacobien(jac,uv,lig,col,unite);
209    
210    
211     j[0*3+0] = (jac[1*3+1]*jac[2*3+2]-jac[1*3+2]*jac[2*3+1])/(detj);
212     j[0*3+1] = -(jac[0*3+1]*jac[2*3+2]-jac[0*3+2]*jac[2*3+1])/(detj);
213     j[0*3+2] =-(-jac[0*3+1]*jac[1*3+2]+jac[0*3+2]*jac[1*3+1])/(detj);
214    
215     j[1*3+0] = -(jac[1*3+0]*jac[2*3+2]-jac[1*3+2]*jac[2*3+0])/(detj);
216     j[1*3+1] = (jac[0*3+0]*jac[2*3+2]-jac[0*3+2]*jac[2*3+0])/(detj);
217     j[1*3+2] = -(jac[0*3+0]*jac[1*3+2]-jac[0*3+2]*jac[1*3+0])/(detj);
218    
219     j[2*3+0] =-(-jac[1*3+0]*jac[2*3+1]+jac[1*3+1]*jac[2*3+0])/(detj);
220     j[2*3+1] = -(jac[0*3+0]*jac[2*3+1]-jac[0*3+1]*jac[2*3+0])/(detj);
221     j[2*3+2] = (jac[0*3+0]*jac[1*3+1]-jac[0*3+1]*jac[1*3+0])/(detj);
222    
223    
224     }
225    
226    
227     int SL_TETRA24::nb_point_extrapolation()
228     {
229     return 4;
230     }
231    
232    
233     void SL_TETRA24::get_cord_ref_noauds(double* sommet)
234     {
235     sommet[0]=0; sommet[1]=0; sommet[2]=0;
236     sommet[3]=0.5; sommet[4]=0; sommet[5]=0;
237     sommet[6]=1; sommet[7]=0; sommet[8]=0;
238     sommet[9]=0.5; sommet[10]=0.5; sommet[11]=0;
239     sommet[12]=0; sommet[13]=1; sommet[14]=0;
240     sommet[15]=0; sommet[16]=0.5; sommet[17]=0;
241     sommet[18]=0; sommet[19]=0; sommet[20]=0.5;
242     sommet[21]=0.5; sommet[22]=0; sommet[23]=0.5;
243     sommet[24]=0; sommet[25]=0.5; sommet[26]=0.5;
244     sommet[27]=0; sommet[28]=0; sommet[29]=1;
245    
246     }
247    
248