ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/solveur/src/sl_tetra21.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months ago) by francois
File size: 7165 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

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