ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/xfem_tetra4.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 6664 byte(s)
Log Message:
Le fichier MAGiC est maintenant versionné. LA version actuelle est 2.0. L'ancienne version est 1.0.
Tout est transparent pour l'utilisateur. Les vieilles versions sont lisibles mais les nouveaux enregistrements sont dans la version la plus récente.
Changement des conditions aux limites : ajout d'un parametre pour dire si la condition numerique est une valeur ou une formule ou un lien vers une autre entité magic.
Les parametres pour saisir sont maintenant -ccf -ccfi -ccff -ccft -ccfit -ccfft

File Contents

# User Rev Content
1 francois 340 //------------------------------------------------------------
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_element34.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include "xfem_tetra4.h"
27     #include "fem_tetra4.h"
28     #include "fem_noeud.h"
29     #include "mg_element_maillage.h"
30     #include "fem_maillage.h"
31    
32    
33 francois 399 XFEM_TETRA4::XFEM_TETRA4(unsigned long num,class FEM_ELEMENT_MAILLAGE *mai,class MG_ELEMENT_TOPOLOGIQUE *mgtopo,class FEM_NOEUD** tabnoeud):XFEM_ELEMENT3(num,mai,mgtopo),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
34 francois 340 {
35 francois 399 femmai->ajouter_xfem(this);
36 francois 340 }
37    
38 francois 399 XFEM_TETRA4::XFEM_TETRA4(class FEM_ELEMENT_MAILLAGE *mai,class MG_ELEMENT_TOPOLOGIQUE *mgtopo,FEM_NOEUD** tabnoeud):XFEM_ELEMENT3(mai,mgtopo),FEM_TEMPLATE_ELEMENT<4>(tabnoeud)
39 francois 340 {
40 francois 399 femmai->ajouter_xfem(this);
41 francois 340 }
42    
43 francois 399 XFEM_TETRA4::XFEM_TETRA4(XFEM_TETRA4& mdd):XFEM_ELEMENT3(mdd),FEM_TEMPLATE_ELEMENT<4>(mdd)
44 francois 340 {
45     }
46    
47     XFEM_TETRA4::~XFEM_TETRA4()
48     {
49 francois 399 femmai->supprimer_xfem(this);
50 francois 340 }
51    
52    
53    
54     int XFEM_TETRA4::get_type_entite(void)
55     {
56     return IDXFEM_TETRA4;
57     }
58    
59     int XFEM_TETRA4::get_dimension(void)
60     {
61     return 3;
62     }
63    
64    
65     int XFEM_TETRA4::get_nb_fem_noeud(void)
66     {
67     return FEM_TEMPLATE_ELEMENT<4>::get_nb_fem_noeud();
68     }
69    
70     FEM_NOEUD* XFEM_TETRA4::get_fem_noeud(int num)
71     {
72     return FEM_TEMPLATE_ELEMENT<4>::get_fem_noeud(num);
73     }
74    
75     void XFEM_TETRA4::change_noeud(int num,FEM_NOEUD* noeud)
76     {
77     FEM_TEMPLATE_ELEMENT<4>::change_noeud(num,noeud);
78     }
79    
80    
81     BOITE_3D& XFEM_TETRA4::get_boite_3D(void)
82     {
83     return FEM_TEMPLATE_ELEMENT<4>::get_boite_3D();
84     }
85    
86 francois 763 void XFEM_TETRA4::enregistrer(std::ostream& o,double version)
87 francois 340 {
88 francois 404 if (get_lien_topologie()!=NULL) o << "%" << get_id() << "=XFEM_TETRA4($"<< femmai->get_id() << ",$" << topo->get_id() << ",$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << "," << etat << ");" << std::endl;
89     else o << "%" << get_id() << "=XFEM_TETRA4($"<< femmai->get_id() << ",NULL,$" << tab[0]->get_id() << ",$" << tab[1]->get_id() << ",$" << tab[2]->get_id() << ",$" << tab[3]->get_id() << "," << etat << ");" << std::endl;
90 francois 340
91     }
92    
93    
94    
95    
96     int XFEM_TETRA4::nb_fonction_interpolation(void)
97     {
98     return 4;
99     }
100     double XFEM_TETRA4::get_fonction_interpolation(int num,double *uv)
101     {
102     double val;
103     switch (num)
104     {
105     case 1:
106     val=1-uv[0]-uv[1]-uv[2];
107     break;
108     case 2:
109     val=uv[0];
110     break;
111     case 3:
112     val=uv[1];
113     break;
114     case 4:
115     val=uv[2];
116     break;
117     }
118     return val;
119     }
120     double XFEM_TETRA4::get_fonction_derive_interpolation(int num,int num_variable,double *uv)
121     {
122     double val;
123    
124     switch (num)
125     {
126     case 1:
127     switch (num_variable)
128     {
129     case 1:
130     val=-1;
131     break;
132     case 2:
133     val=-1;
134     break;
135     case 3:
136     val=-1;
137     break;
138     } break;
139     case 2:
140     switch (num_variable)
141     {
142     case 1:
143     val=1;
144     break;
145     case 2:
146     val=0;
147     break;
148     case 3:
149     val=0;
150     break;
151     }break;
152     case 3:
153     switch (num_variable)
154     {
155     case 1:
156     val=0;
157     break;
158     case 2:
159     val=1;
160     break;
161     case 3:
162     val=0;
163     break;
164     }break;
165     case 4:
166     switch (num_variable)
167     {
168     case 1:
169     val=0;
170     break;
171     case 2:
172     val=0;
173     break;
174     case 3:
175     val=1;
176     break;
177     }break;
178    
179     }
180     return val;
181     }
182     double XFEM_TETRA4::get_jacobien(double* jac,double *uv,int& li,int& col,double unite)
183     {
184     li=3;
185     col=3;
186     double *xyz1=tab[0]->get_coord();
187     double *xyz2=tab[1]->get_coord();
188     double *xyz3=tab[2]->get_coord();
189     double *xyz4=tab[3]->get_coord();
190    
191     jac[0]=unite*(xyz2[0] - xyz1[0]) ;
192     jac[1]=unite*(xyz2[1] - xyz1[1]) ;
193     jac[2]=unite*(xyz2[2] - xyz1[2]) ;
194    
195     jac[3]=unite*(xyz3[0] - xyz1[0]) ;
196     jac[4]=unite*(xyz3[1] - xyz1[1]) ;
197     jac[5]=unite*(xyz3[2] - xyz1[2]) ;
198    
199     jac[6]=unite*(xyz4[0] - xyz1[0]) ;
200     jac[7]=unite*(xyz4[1] - xyz1[1]) ;
201     jac[8]=unite*(xyz4[2] - xyz1[2]) ;
202    
203     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]);
204    
205     return SIX_V;
206     }
207     void XFEM_TETRA4::get_inverse_jacob(double* j,double *uv,double unite)
208     {
209     double *xyz1=tab[0]->get_coord();
210     double *xyz2=tab[1]->get_coord();
211     double *xyz3=tab[2]->get_coord();
212     double *xyz4=tab[3]->get_coord();
213    
214     double jac[9];
215    
216     jac[0*3+0]= unite*(xyz2[0] - xyz1[0]) ;
217     jac[0*3+1]= unite*(xyz2[1] - xyz1[1]) ;
218     jac[0*3+2]= unite*(xyz2[2] - xyz1[2]) ;
219    
220     jac[1*3+0]= unite*(xyz3[0] - xyz1[0]) ;
221     jac[1*3+1]= unite*(xyz3[1] - xyz1[1]) ;
222     jac[1*3+2]= unite*(xyz3[2] - xyz1[2]) ;
223    
224     jac[2*3+0]= unite*(xyz4[0] - xyz1[0]) ;
225     jac[2*3+1]= unite*(xyz4[1] - xyz1[1]) ;
226     jac[2*3+2]= unite*(xyz4[2] - xyz1[2]) ;
227    
228     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]);
229    
230     j[0*3+0] = (jac[1*3+1]*jac[2*3+2]-jac[1*3+2]*jac[2*3+1])/(detj);
231     j[0*3+1] = -(jac[0*3+1]*jac[2*3+2]-jac[0*3+2]*jac[2*3+1])/(detj);
232     j[0*3+2] =-(-jac[0*3+1]*jac[1*3+2]+jac[0*3+2]*jac[1*3+1])/(detj);
233    
234     j[1*3+0] = -(jac[1*3+0]*jac[2*3+2]-jac[1*3+2]*jac[2*3+0])/(detj);
235     j[1*3+1] = (jac[0*3+0]*jac[2*3+2]-jac[0*3+2]*jac[2*3+0])/(detj);
236     j[1*3+2] = -(jac[0*3+0]*jac[1*3+2]-jac[0*3+2]*jac[1*3+0])/(detj);
237    
238     j[2*3+0] =-(-jac[1*3+0]*jac[2*3+1]+jac[1*3+1]*jac[2*3+0])/(detj);
239     j[2*3+1] = -(jac[0*3+0]*jac[2*3+1]-jac[0*3+1]*jac[2*3+0])/(detj);
240     j[2*3+2] = (jac[0*3+0]*jac[1*3+1]-jac[0*3+1]*jac[1*3+0])/(detj);
241    
242     }