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

File Contents

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