ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/solveur/src/sl_tetra21.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_tetra21.cpp
File size: 6248 byte(s)
Log Message:

File Contents

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