ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_volume.cpp
Revision: 632
Committed: Thu Jan 15 18:40:00 2015 UTC (10 years, 3 months ago) by francois
File size: 8078 byte(s)
Log Message:
Changement de l'espace de voisinage dans le mailleur 2D et 3D. On utilise un ntree (octree "anisotrope" qui ne se divise pas necessairement en 8). En 2D l'espace de voisinage est maintenant sur l'espace reelle au lieu d'être sur l'espace parametrique.
+Mise sous forme de parametres de certains choix stratégiques du mailleur

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
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     // mg_volume.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 ? 11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include "mg_volume.h"
27     #include "ot_mathematique.h"
28     #include "mg_maillage.h"
29     #include "vct_volume.h"
30     //#include "message.h"
31    
32     MG_VOLUME::MG_VOLUME(std::string idori,unsigned long num):MG_ELEMENT_TOPOLOGIQUE(num,idori),num_materiau(-1),vect(NULL)
33     {
34     }
35    
36     MG_VOLUME::MG_VOLUME(std::string idori):MG_ELEMENT_TOPOLOGIQUE(idori),num_materiau(-1),vect(NULL)
37     {
38     }
39    
40     MG_VOLUME::MG_VOLUME(MG_VOLUME& mdd):MG_ELEMENT_TOPOLOGIQUE(mdd),lst_coquille(mdd.lst_coquille),vect(mdd.vect)
41     {
42     }
43    
44     MG_VOLUME::~MG_VOLUME()
45     {
46     }
47    
48     void MG_VOLUME::ajouter_mg_coquille(class MG_COQUILLE* mgcoq)
49     {
50     lst_coquille.insert(lst_coquille.end(),mgcoq);
51     }
52    
53     void MG_VOLUME::supprimer_mg_coquille(class MG_COQUILLE* mgcoq)
54     {
55     std::vector<MG_COQUILLE*>::iterator i;
56     for (i=lst_coquille.begin();i!=lst_coquille.end();i++)
57     {
58     if ((*i)==mgcoq)
59     {
60     lst_coquille.erase(i);
61     return;
62     }
63     }
64     }
65    
66    
67     int MG_VOLUME::get_nb_mg_coquille(void)
68     {
69     return lst_coquille.size();
70     }
71    
72     MG_COQUILLE* MG_VOLUME::get_mg_coquille(int num)
73     {
74     return lst_coquille[num];
75     }
76    
77     int MG_VOLUME::get_dimension(void)
78     {
79     return 3;
80     }
81     VCT& MG_VOLUME::get_vectorisation(void)
82     {
83     //VCT* p=NULL;
84     //return *p;
85     if (vect==NULL) vect=new VCT_VOLUME(this);
86     return *vect;
87     }
88     void MG_VOLUME::get_topologie_sousjacente(TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lst)
89     {
90     int nbcoq=lst_coquille.size();
91     for (int i=0;i<nbcoq;i++)
92     {
93     MG_COQUILLE* coq=lst_coquille[i];
94     int nbface=coq->get_nb_mg_coface();
95     for (int j=0;j<nbface;j++)
96     {
97     MG_FACE* face=coq->get_mg_coface(j)->get_face();
98     lst->ajouter(face);
99     face->get_topologie_sousjacente(lst);
100     }
101     }
102     }
103    
104    
105 francois 632
106    
107     BOITE_3D MG_VOLUME::get_boite_3D(int pas_echantillon)
108     {
109     BOITE_3D boitevol;
110     int nb_coquille=get_nb_mg_coquille();
111     for (int i=0;i<nb_coquille;i++)
112     {
113     MG_COQUILLE* coq=get_mg_coquille(i);
114     int nb_face=coq->get_nb_mg_coface();
115     for (int j=0;j<nb_face;j++)
116     {
117     MG_FACE* face=coq->get_mg_coface(j)->get_face();
118     BOITE_3D tmp=face->get_boite_3D(pas_echantillon);
119     if ((i==0) && (j==0)) boitevol=tmp;
120     else boitevol=tmp+boitevol;
121     }
122     }
123     return boitevol;
124     }
125    
126 francois 283 void MG_VOLUME::enregistrer(std::ostream& o)
127     {
128     o << "%" << get_id() << "=VOLUME(" << get_idoriginal() << ",(";
129     for (unsigned int i=0;i<lst_coquille.size();i++)
130     {
131     o << "$" << lst_coquille[i]->get_id();
132     if (i!=lst_coquille.size()-1) o << ",";
133     else o << ")";
134     }
135     int nb=get_nb_ccf();
136     o << "," << num_materiau << "," << nb;
137     if (nb!=0)
138     {
139     o << ",(";
140     for (int i=0;i<nb;i++)
141     {
142     char nom[3];
143     get_type_ccf(i,nom);
144     o << "(" << nom << "," << get_valeur_ccf(i) << ")";
145     if (i!=nb-1) o << "," ;
146     }
147     o << ")";
148     }
149     o << ");" << std::endl;
150     }
151    
152     void MG_VOLUME::change_num_materiau(int num)
153     {
154     num_materiau=num;
155     }
156    
157     int MG_VOLUME::get_num_materiau(void)
158     {
159     return num_materiau;
160     }
161    
162 francois 576
163     bool MG_VOLUME::est_un_volume_element(void)
164     {
165     return false;
166     }
167 francois 283 void MG_VOLUME::get_propriete_massique(class MG_MAILLAGE* mai,double& volume,class OT_VECTEUR_3D& cdm,class OT_MATRICE_3D& inertieglobale,class OT_MATRICE_3D& inertiecdm,double dens)
168     {
169     double vol=0.;
170     double xg=0.;
171     double yg=0.;
172     double zg=0.;
173     double a=0.;
174     double b=0.;
175     double c=0.;
176     double d=0.;
177     double e=0.;
178     double f=0.;
179     int nbcoquille=get_nb_mg_coquille();
180     for (int i=0;i<nbcoquille;i++)
181     {
182     MG_COQUILLE* coq=get_mg_coquille(i);
183     int nbface=coq->get_nb_mg_coface();
184     for (int j=0;j<nbface;j++)
185     {
186     MG_COFACE* coface=coq->get_mg_coface(j);
187     MG_FACE* face=coface->get_face();
188     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
189     for (MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get_premier(it);tri!=NULL;tri=(MG_TRIANGLE*)face->get_lien_maillage()->get_suivant(it))
190     {
191     if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
192     MG_NOEUD* noeud1=tri->get_noeud1();
193     MG_NOEUD* noeud2=tri->get_noeud2();
194     MG_NOEUD* noeud3=tri->get_noeud3();
195     double *xyz1=noeud1->get_coord();
196     double *xyz2=noeud2->get_coord();
197     double *xyz3=noeud3->get_coord();
198     OT_VECTEUR_3D vec1(xyz1,xyz2);
199     OT_VECTEUR_3D vec2(xyz1,xyz3);
200     OT_VECTEUR_3D n=vec1&vec2;
201     double detj=n.get_longueur();
202     n.norme();
203     n=-1.*coface->get_orientation()*n;
204     for (int k=0;k<3;k++)
205     {
206     double xsi=1./6.;
207     double eta=1./6.;
208     double wi=1./6.;
209     if (k==1) xsi=2./3.;
210     if (k==2) eta=2./3.;
211     double x=(1-xsi-eta)*xyz1[0]+xsi*xyz2[0]+eta*xyz3[0];
212     double y=(1-xsi-eta)*xyz1[1]+xsi*xyz2[1]+eta*xyz3[1];
213     double z=(1-xsi-eta)*xyz1[2]+xsi*xyz2[2]+eta*xyz3[2];
214     OT_VECTEUR_3D psi1(x,0,0);
215     OT_VECTEUR_3D psi2(0.5*x*x,0,0);
216     OT_VECTEUR_3D psi3(0,0.5*y*y,0);
217     OT_VECTEUR_3D psi4(0,0,0.5*z*z);
218     OT_VECTEUR_3D psi5(0,y*y*y/3.,z*z*z/3.);
219     OT_VECTEUR_3D psi6(x*x*x/3.,0,z*z*z/3.);
220     OT_VECTEUR_3D psi7(x*x*x/3.,y*y*y/3.,0);
221     OT_VECTEUR_3D psi8(0.,y*y*z/2.,0);
222     OT_VECTEUR_3D psi9(x*x*z/2.,0.,0);
223     OT_VECTEUR_3D psi10(x*x*y/2.,0,0);
224     vol=vol+detj*wi*(psi1*n);
225     xg=xg+wi*detj*(psi2*n);
226     yg=yg+wi*detj*(psi3*n);
227     zg=zg+wi*detj*(psi4*n);
228     a=a+wi*detj*(psi5*n);
229     b=b+wi*detj*(psi6*n);
230     c=c+wi*detj*(psi7*n);
231     d=d+wi*detj*(psi8*n);
232     e=e+wi*detj*(psi9*n);
233     f=f+wi*detj*(psi10*n);
234     }
235     }
236     }
237     }
238     volume=vol;
239     cdm.change_x(xg/volume);
240     cdm.change_y(yg/volume);
241     cdm.change_z(zg/volume);
242     inertieglobale(0,0)=a*dens;
243     inertieglobale(1,1)=b*dens;
244     inertieglobale(2,2)=c*dens;
245     inertieglobale(1,0)=f*dens;
246     inertieglobale(0,1)=f*dens;
247     inertieglobale(2,0)=e*dens;
248     inertieglobale(0,2)=e*dens;
249     inertieglobale(2,1)=d*dens;
250     inertieglobale(1,2)=d*dens;
251     OT_VECTEUR_3D m1(volume*(cdm.get_y()*cdm.get_y()+cdm.get_z()*cdm.get_z()),volume*cdm.get_x()*cdm.get_y(),volume*cdm.get_x()*cdm.get_z());
252     OT_VECTEUR_3D m2(volume*cdm.get_x()*cdm.get_y(),volume*(cdm.get_x()*cdm.get_x()+cdm.get_z()*cdm.get_z()),volume*cdm.get_y()*cdm.get_z());
253     OT_VECTEUR_3D m3(volume*cdm.get_x()*cdm.get_z(),volume*cdm.get_y()*cdm.get_z(),volume*(cdm.get_x()*cdm.get_x()+cdm.get_y()*cdm.get_y()));
254     m1=(-1.)*m1;
255     m2=(-1.)*m2;
256     m3=(-1.)*m3;
257     OT_MATRICE_3D change(m1,m2,m3);
258     inertiecdm=inertieglobale+change;
259     }
260