ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_element3.cpp
Revision: 909
Committed: Wed Nov 22 20:17:05 2017 UTC (7 years, 5 months ago) by couturad
File size: 4724 byte(s)
Log Message:
Ajout d'une nouvelle carte de taille FCT_TAILLE_FEM_SOLUTION_GENERATEUR_MICROSTRUCTURE
Suppression d'une fonction erronee d'extrapolation aux noeuds dans FEM_ELEMENT3

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�e et Vincent FRANCOIS
5     // D�artement de G�ie M�anique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�artement
8     // de g�ie m�anique de l'Universit�du Qu�ec �
9     // Trois Rivi�es
10     // Les librairies ne peuvent �re utilis�s sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // fem_tetra.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 �11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <math.h>
27 francois 309 #include "fem_element3.h"
28 francois 339 #include "xfem_element3.h"
29 francois 283 #include "fem_noeud.h"
30 francois 339 #include "fem_maillage.h"
31 francois 283 #include "mg_element_maillage.h"
32 francois 481 #include "ot_boite_3d.h"
33 francois 628 #include "ot_mathematique.h"
34 francois 283
35 francois 399 FEM_ELEMENT3::FEM_ELEMENT3(unsigned long num,class MG_ELEMENT_MAILLAGE* mai):FEM_ELEMENT_MAILLAGE(num,mai)
36 francois 283 {
37     }
38 francois 399 FEM_ELEMENT3::FEM_ELEMENT3(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo):FEM_ELEMENT_MAILLAGE(num,topo)
39 francois 378 {
40     }
41 francois 399 FEM_ELEMENT3::FEM_ELEMENT3(unsigned long num,class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai):FEM_ELEMENT_MAILLAGE(num,topo,mai)
42 francois 378 {
43     }
44 francois 283
45 francois 399 FEM_ELEMENT3::FEM_ELEMENT3(class MG_ELEMENT_MAILLAGE* mai):FEM_ELEMENT_MAILLAGE(mai)
46 francois 283 {
47     }
48    
49 francois 399 FEM_ELEMENT3::FEM_ELEMENT3(class MG_ELEMENT_TOPOLOGIQUE* topo):FEM_ELEMENT_MAILLAGE(topo)
50 francois 378 {
51     }
52 francois 399 FEM_ELEMENT3::FEM_ELEMENT3(class MG_ELEMENT_TOPOLOGIQUE* topo,class MG_ELEMENT_MAILLAGE* mai):FEM_ELEMENT_MAILLAGE(topo,mai)
53 francois 378 {
54     }
55 francois 283
56 francois 378
57 francois 399 FEM_ELEMENT3::FEM_ELEMENT3(FEM_ELEMENT3& mdd):FEM_ELEMENT_MAILLAGE(mdd)
58 francois 283 {
59     }
60    
61    
62    
63 francois 309 FEM_ELEMENT3::~FEM_ELEMENT3()
64 francois 283 {
65     }
66    
67 francois 635 bool FEM_ELEMENT3::get_param_element_fini(double *xyz,double *uvw)
68 francois 628 {
69     OT_MATRICE_3D mat;
70     OT_VECTEUR_3D vec;
71     uvw[0]=0.;
72     uvw[1]=0.;
73     uvw[2]=0.;
74 francois 283
75 francois 684 int compteur=0;
76 francois 628 int ok=0;
77 francois 684 while (ok!=1)
78     {
79     ok=0;
80     int cas=compteur/100-1;
81     int base=4;
82     if (compteur!=0)
83     {
84     int i=cas%base;
85     int j=(cas/base)%base;
86     int k=(cas/base/base)%base;
87     uvw[0]=-1.+2.*i/(base-1);
88     uvw[1]=-1.+2.*j/(base-1);
89     uvw[2]=-1.+2.*k/(base-1);
90     }
91     if (cas>base*base*base) return false;
92 francois 628 while (ok==0)
93     {
94     mat(0,0)=0.;mat(0,1)=0.;mat(0,2)=0.;
95     mat(1,0)=0.;mat(1,1)=0.;mat(1,2)=0.;
96     mat(2,0)=0.;mat(2,1)=0.;mat(2,2)=0.;
97     vec(0)=xyz[0];vec(1)=xyz[1];vec(2)=xyz[2];
98    
99     for (int i=0;i<get_nb_fem_noeud();i++)
100     {
101     mat(0,0)=mat(0,0)+get_fonction_derive_interpolation(i+1,1,uvw)*get_fem_noeud(i)->get_x();
102     mat(0,1)=mat(0,1)+get_fonction_derive_interpolation(i+1,2,uvw)*get_fem_noeud(i)->get_x();
103     mat(0,2)=mat(0,2)+get_fonction_derive_interpolation(i+1,3,uvw)*get_fem_noeud(i)->get_x();
104     mat(1,0)=mat(1,0)+get_fonction_derive_interpolation(i+1,1,uvw)*get_fem_noeud(i)->get_y();
105     mat(1,1)=mat(1,1)+get_fonction_derive_interpolation(i+1,2,uvw)*get_fem_noeud(i)->get_y();
106     mat(1,2)=mat(1,2)+get_fonction_derive_interpolation(i+1,3,uvw)*get_fem_noeud(i)->get_y();
107     mat(2,0)=mat(2,0)+get_fonction_derive_interpolation(i+1,1,uvw)*get_fem_noeud(i)->get_z();
108     mat(2,1)=mat(2,1)+get_fonction_derive_interpolation(i+1,2,uvw)*get_fem_noeud(i)->get_z();
109     mat(2,2)=mat(2,2)+get_fonction_derive_interpolation(i+1,3,uvw)*get_fem_noeud(i)->get_z();
110     vec(0)=vec(0)-get_fonction_interpolation(i+1,uvw)*get_fem_noeud(i)->get_x();
111     vec(1)=vec(1)-get_fonction_interpolation(i+1,uvw)*get_fem_noeud(i)->get_y();
112     vec(2)=vec(2)-get_fonction_interpolation(i+1,uvw)*get_fem_noeud(i)->get_z();
113     }
114     double det=mat.get_determinant();
115 francois 684 if (fabs(det)<1e-12) ok=3;
116 francois 628 OT_MATRICE_3D mat1(vec,mat.get_vecteur2(),mat.get_vecteur3());
117     OT_MATRICE_3D mat2(mat.get_vecteur1(),vec,mat.get_vecteur3());
118     OT_MATRICE_3D mat3(mat.get_vecteur1(),mat.get_vecteur2(),vec);
119     double d1=mat1.get_determinant()/det;
120     double d2=mat2.get_determinant()/det;
121     double d3=mat3.get_determinant()/det;
122 francois 635 compteur++;
123 francois 684 if (compteur%100==0) ok=2;
124 francois 628 if ((fabs(d1)<1e-8)&&(fabs(d2)<1e-8)&&(fabs(d3)<1e-8)) ok=1;
125     uvw[0]=uvw[0]+d1;
126     uvw[1]=uvw[1]+d2;
127     uvw[2]=uvw[2]+d3;
128     }
129 francois 684 }
130 francois 674 return true;
131 francois 628 }
132    
133    
134     void FEM_ELEMENT3::get_interpolation_xyz(double* uvw, double* xyz)
135     {
136     xyz[0]=0.;xyz[1]=0.;xyz[2]=0;
137     for (int i=0;i<get_nb_fem_noeud();i++)
138     {
139     xyz[0]=xyz[0]+get_fonction_interpolation(i+1,uvw)*get_fem_noeud(i)->get_x();
140     xyz[1]=xyz[1]+get_fonction_interpolation(i+1,uvw)*get_fem_noeud(i)->get_y();
141     xyz[2]=xyz[2]+get_fonction_interpolation(i+1,uvw)*get_fem_noeud(i)->get_z();
142     }
143     }
144