MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mg_volume.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
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 //####// mg_volume.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:54 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 #include "mg_volume.h"
26 #include "ot_mathematique.h"
27 #include "mg_maillage.h"
28 #include "vct_volume.h"
29 
30 MG_VOLUME::MG_VOLUME(std::string idori,unsigned long num):MG_ELEMENT_TOPOLOGIQUE(num,idori),num_materiau(-1),vect(NULL),mince(false)
31 {
32 }
33 
34 MG_VOLUME::MG_VOLUME(std::string idori):MG_ELEMENT_TOPOLOGIQUE(idori),num_materiau(-1),vect(NULL),mince(false)
35 {
36 }
37 
38 MG_VOLUME::MG_VOLUME(MG_VOLUME& mdd):MG_ELEMENT_TOPOLOGIQUE(mdd),lst_coquille(mdd.lst_coquille),vect(mdd.vect),mince(mdd.mince)
39 {
40 }
41 
43 {
44 }
45 
47 {
48  lst_coquille.insert(lst_coquille.end(),mgcoq);
49 }
50 
52 {
53  std::vector<MG_COQUILLE*>::iterator i;
54  for (i=lst_coquille.begin();i!=lst_coquille.end();i++)
55  {
56  if ((*i)==mgcoq)
57  {
58  lst_coquille.erase(i);
59  return;
60  }
61  }
62 }
63 
64 
66 {
67  return lst_coquille.size();
68 }
69 
71 {
72  return lst_coquille[num];
73 }
74 
76 {
77  return 3;
78 }
79 
81 {
82  return TYPE_ELEMENT_TOPOLOGIQUE::VOLUME;
83 }
84 
86 {
87  if (vect==NULL) vect=new VCT_VOLUME(this);
88  return *vect;
89 }
91 {
92  int nbcoq=lst_coquille.size();
93  for (int i=0;i<nbcoq;i++)
94  {
95  MG_COQUILLE* coq=lst_coquille[i];
96  int nbface=coq->get_nb_mg_coface();
97  for (int j=0;j<nbface;j++)
98  {
99  MG_FACE* face=coq->get_mg_coface(j)->get_face();
100  lst->ajouter(face);
101  face->get_topologie_sousjacente(lst);
102  }
103  }
104 }
105 
106 
107 
108 
110 {
111 BOITE_3D boitevol;
112 int nb_coquille=get_nb_mg_coquille();
113 for (int i=0;i<nb_coquille;i++)
114  {
116  int nb_face=coq->get_nb_mg_coface();
117  for (int j=0;j<nb_face;j++)
118  {
119  MG_FACE* face=coq->get_mg_coface(j)->get_face();
120  BOITE_3D tmp=face->get_boite_3D();
121  if ((i==0) && (j==0)) boitevol=tmp;
122  else boitevol=tmp+boitevol;
123  }
124  }
125 return boitevol;
126 }
127 
128 void MG_VOLUME::enregistrer(std::ostream& o,double version)
129 {
130  o << "%" << get_id() << "=VOLUME(" << get_idoriginal() << ",(";
131  for (unsigned int i=0;i<lst_coquille.size();i++)
132  {
133  o << "$" << lst_coquille[i]->get_id();
134  if (i!=lst_coquille.size()-1) o << ",";
135  else o << ")";
136  }
137  int nb=get_nb_ccf();
138  if (version<2)
139  {
140  o << "," << num_materiau << "," << nb;
141  if (nb!=0)
142  {
143  o << ",(";
144  for (int i=0;i<nb;i++)
145  {
146  char nom[3];
147  get_type_ccf(i,nom);
148  o << "(" << nom << "," << get_valeur_ccf(i) << ")";
149  if (i!=nb-1) o << "," ;
150  }
151  o << ")";
152  }
153  o << ");" << std::endl;
154  }
155  else
156  {
157  if (version>2.2)
158  {
159  if (mince) o << ",1" ;
160  else o << ",0" ;
161  if (mince)
162  {
163  o << ",(" ;
164  for (int i=0;i<get_nb_face_correspondante()-1;i++)
165  o << "$" << lst_base[i]->get_id() << "," << "$" << lst_extrude[i]->get_id() << "," ;
166  o << "$" << lst_base[get_nb_face_correspondante()-1]->get_id() << "," << "$" << lst_extrude[get_nb_face_correspondante()-1]->get_id();
167  o << ")" ;
168  }
169  }
170  o << "," ;
171  enregistrer_ccf(o,version);
172  o << ");" << std::endl;
173  }
174 }
175 
177 {
178  num_materiau=num;
179 }
180 
182 {
183  return num_materiau;
184 }
185 
186 
188 {
189 return false;
190 }
191 
192 
193 
194 
196 {
197 lst_base.push_back(face1);
198 lst_extrude.push_back(face2);
199 mince=true;
200 }
201 
203 {
204 (*face1)=lst_base[num];
205 (*face2)=lst_extrude[num];
206 }
207 
209 {
210 return lst_base.size();
211 }
212 
214 {
215 return mince;
216 }
217 
218 
219 
220 void MG_VOLUME::get_propriete_massique(class MG_MAILLAGE* mai,double& volume,double &masse,class OT_VECTEUR_3D& cdm,class OT_MATRICE_3D& inertieglobale,class OT_MATRICE_3D& inertiecdm,double dens,int sens)
221 {
222  double vol=0.;
223  double xg=0.;
224  double yg=0.;
225  double zg=0.;
226  double a=0.;
227  double b=0.;
228  double c=0.;
229  double d=0.;
230  double e=0.;
231  double f=0.;
232  int nbcoquille=get_nb_mg_coquille();
233  for (int i=0;i<nbcoquille;i++)
234  {
236  int nbface=coq->get_nb_mg_coface();
237  for (int j=0;j<nbface;j++)
238  {
239  MG_COFACE* coface=coq->get_mg_coface(j);
240  MG_FACE* face=coface->get_face();
242  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))
243  {
244  if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
245  MG_NOEUD* noeud1=tri->get_noeud1();
246  MG_NOEUD* noeud2=tri->get_noeud2();
247  MG_NOEUD* noeud3=tri->get_noeud3();
248  double *xyz1=noeud1->get_coord();
249  double *xyz2=noeud2->get_coord();
250  double *xyz3=noeud3->get_coord();
251  OT_VECTEUR_3D vec1(xyz1,xyz2);
252  OT_VECTEUR_3D vec2(xyz1,xyz3);
253  OT_VECTEUR_3D n=vec1&vec2;
254  n=sens*n;
255  double detj=n.get_longueur();
256  n.norme();
257  n=-1.*coface->get_orientation()*n;
258  for (int k=0;k<3;k++)
259  {
260  double xsi=1./6.;
261  double eta=1./6.;
262  double wi=1./6.;
263  if (k==1) xsi=2./3.;
264  if (k==2) eta=2./3.;
265  double x=(1-xsi-eta)*xyz1[0]+xsi*xyz2[0]+eta*xyz3[0];
266  double y=(1-xsi-eta)*xyz1[1]+xsi*xyz2[1]+eta*xyz3[1];
267  double z=(1-xsi-eta)*xyz1[2]+xsi*xyz2[2]+eta*xyz3[2];
268  OT_VECTEUR_3D psi1(x,0,0);
269  OT_VECTEUR_3D psi2(0.5*x*x,0,0);
270  OT_VECTEUR_3D psi3(0,0.5*y*y,0);
271  OT_VECTEUR_3D psi4(0,0,0.5*z*z);
272  OT_VECTEUR_3D psi5(0,y*y*y/3.,z*z*z/3.);
273  OT_VECTEUR_3D psi6(x*x*x/3.,0,z*z*z/3.);
274  OT_VECTEUR_3D psi7(x*x*x/3.,y*y*y/3.,0);
275  OT_VECTEUR_3D psi8(0.,y*y*z/2.,0);
276  OT_VECTEUR_3D psi9(x*x*z/2.,0.,0);
277  OT_VECTEUR_3D psi10(x*x*y/2.,0,0);
278  vol=vol+detj*wi*(psi1*n);
279  xg=xg+wi*detj*(psi2*n);
280  yg=yg+wi*detj*(psi3*n);
281  zg=zg+wi*detj*(psi4*n);
282  a=a+wi*detj*(psi5*n);
283  b=b+wi*detj*(psi6*n);
284  c=c+wi*detj*(psi7*n);
285  d=d+wi*detj*(psi8*n);
286  e=e+wi*detj*(psi9*n);
287  f=f+wi*detj*(psi10*n);
288  }
289  }
290  }
291  }
292  volume=vol;
293  masse=vol*dens;
294  cdm.change_x(xg/volume);
295  cdm.change_y(yg/volume);
296  cdm.change_z(zg/volume);
297  inertieglobale(0,0)=a*dens;
298  inertieglobale(1,1)=b*dens;
299  inertieglobale(2,2)=c*dens;
300  inertieglobale(1,0)=f*dens;
301  inertieglobale(0,1)=f*dens;
302  inertieglobale(2,0)=e*dens;
303  inertieglobale(0,2)=e*dens;
304  inertieglobale(2,1)=d*dens;
305  inertieglobale(1,2)=d*dens;
306  OT_VECTEUR_3D m1(masse*(cdm.get_y()*cdm.get_y()+cdm.get_z()*cdm.get_z()),masse*cdm.get_x()*cdm.get_y(),masse*cdm.get_x()*cdm.get_z());
307  OT_VECTEUR_3D m2(masse*cdm.get_x()*cdm.get_y(),masse*(cdm.get_x()*cdm.get_x()+cdm.get_z()*cdm.get_z()),masse*cdm.get_y()*cdm.get_z());
308  OT_VECTEUR_3D m3(masse*cdm.get_x()*cdm.get_z(),masse*cdm.get_y()*cdm.get_z(),masse*(cdm.get_x()*cdm.get_x()+cdm.get_y()*cdm.get_y()));
309  m1=(-1.)*m1;
310  m2=(-1.)*m2;
311  m3=(-1.)*m3;
312  OT_MATRICE_3D change(m1,m2,m3);
313  inertiecdm=inertieglobale+change;
314 }
315 
MG_VOLUME::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: mg_volume.cpp:128
MG_VOLUME::mince
bool mince
Definition: mg_volume.h:68
OT_VECTEUR_3D::change_z
virtual void change_z(double z)
Definition: ot_mathematique.cpp:444
MG_VOLUME::get_nb_mg_coquille
virtual int get_nb_mg_coquille(void)
Definition: mg_volume.cpp:65
MG_VOLUME::get_propriete_massique
virtual void get_propriete_massique(class MG_MAILLAGE *mai, double &masse, double &volume, class OT_VECTEUR_3D &cdm, class OT_MATRICE_3D &inertieglobale, class OT_MATRICE_3D &inertiecdm, double dens=1., int sens=1)
Definition: mg_volume.cpp:220
gestionversion.h
MG_VOLUME::ajouter_mg_coquille
virtual void ajouter_mg_coquille(class MG_COQUILLE *mgcoq)
Definition: mg_volume.cpp:46
TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE * >
MG_VOLUME::est_mince
virtual bool est_mince(void)
Definition: mg_volume.cpp:213
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
TPL_SET
Definition: tpl_set.h:34
BOITE_3D::y
double y
Definition: ot_boite_3d.h:64
a
#define a(i, j)
MG_VOLUME::get_vectorisation
virtual VCT & get_vectorisation(void)
Definition: mg_volume.cpp:85
OT_VECTEUR_3D::change_y
virtual void change_y(double y)
Definition: ot_mathematique.cpp:439
MG_COFACE::get_face
virtual MG_FACE * get_face(void)
Definition: mg_coface.cpp:58
MG_VOLUME::get_num_materiau
virtual int get_num_materiau(void)
Definition: mg_volume.cpp:181
TPL_SET::get_premier
X get_premier(ITERATEUR &it)
Definition: tpl_set.h:99
MG_FACE::get_topologie_sousjacente
virtual void get_topologie_sousjacente(TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE * > *lst)
Definition: mg_face.cpp:114
MG_VOLUME::est_une_topo_element
virtual bool est_une_topo_element(void)
Definition: mg_volume.cpp:187
MG_VOLUME::get_type
virtual int get_type(void)
Definition: mg_volume.cpp:80
MG_COFACE::get_orientation
virtual int get_orientation(void)
Definition: mg_coface.cpp:69
MG_TRIANGLE
Definition: mg_triangle.h:38
MG_VOLUME
Definition: mg_volume.h:33
MG_COQUILLE
Definition: mg_coquille.h:34
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
MG_COFACE
Definition: mg_coface.h:33
MG_VOLUME::get_face_correspondante
virtual void get_face_correspondante(int num, MG_FACE **face1, MG_FACE **face2)
Definition: mg_volume.cpp:202
MG_VOLUME::vect
class VCT_VOLUME * vect
Definition: mg_volume.h:67
MG_VOLUME::get_mg_coquille
virtual MG_COQUILLE * get_mg_coquille(int num)
Definition: mg_volume.cpp:70
MG_ELEMENT_TOPOLOGIQUE::get_lien_maillage
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
Definition: mg_element_topologique.cpp:62
MG_ELEMENT_TOPOLOGIQUE::get_type_ccf
virtual void get_type_ccf(int num, char *nom)
Definition: mg_element_topologique.cpp:95
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
f
double f(double x, long nb, double *xfonc, double *fonc, double eng, double eni, double lambda, double nor, double *fonc2)
Definition: fct_generateur_calibrage.cpp:96
MG_VOLUME::lst_extrude
std::vector< MG_FACE * > lst_extrude
Definition: mg_volume.h:70
MG_VOLUME::change_num_materiau
virtual void change_num_materiau(int num)
Definition: mg_volume.cpp:176
BOITE_3D::x
double x
Definition: ot_boite_3d.h:63
MG_VOLUME::get_dimension
virtual int get_dimension(void)
Definition: mg_volume.cpp:75
MG_FACE::get_boite_3D
virtual BOITE_3D get_boite_3D(void)
Definition: mg_face.cpp:336
MG_ELEMENT_TOPOLOGIQUE::get_nb_ccf
virtual int get_nb_ccf(void)
Definition: mg_element_topologique.cpp:154
MG_NOEUD
Definition: mg_noeud.h:41
OT_MATRICE_3D
Definition: ot_mathematique.h:160
MG_NOEUD::get_coord
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
MG_VOLUME::get_boite_3D
virtual BOITE_3D get_boite_3D(void)
Definition: mg_volume.cpp:109
MG_VOLUME::MG_VOLUME
MG_VOLUME(std::string idori, unsigned long num)
Definition: mg_volume.cpp:30
MG_VOLUME::ajouter_face_correspondante
virtual void ajouter_face_correspondante(MG_FACE *face1, MG_FACE *face2)
Definition: mg_volume.cpp:195
ot_mathematique.h
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
vct_volume.h
MG_VOLUME::supprimer_mg_coquille
virtual void supprimer_mg_coquille(class MG_COQUILLE *mgcoq)
Definition: mg_volume.cpp:51
MG_VOLUME::lst_coquille
std::vector< MG_COQUILLE * > lst_coquille
Definition: mg_volume.h:65
BOITE_3D
Definition: ot_boite_3d.h:27
MG_VOLUME::num_materiau
int num_materiau
Definition: mg_volume.h:66
mg_maillage.h
MG_VOLUME::~MG_VOLUME
virtual ~MG_VOLUME()
Definition: mg_volume.cpp:42
MG_ELEMENT_TOPOLOGIQUE::enregistrer_ccf
virtual void enregistrer_ccf(std::ostream &o, double version)
Definition: mg_element_topologique.cpp:364
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
MG_VOLUME::lst_base
std::vector< MG_FACE * > lst_base
Definition: mg_volume.h:69
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
VCT_VOLUME
Definition: vct_volume.h:38
MG_MAILLAGE
Definition: mg_maillage.h:62
MG_COQUILLE::get_nb_mg_coface
virtual int get_nb_mg_coface(void)
Definition: mg_coquille.cpp:76
MG_COQUILLE::get_mg_coface
virtual MG_COFACE * get_mg_coface(int num)
Definition: mg_coquille.cpp:90
MG_VOLUME::get_nb_face_correspondante
virtual int get_nb_face_correspondante(void)
Definition: mg_volume.cpp:208
MG_FACE
Definition: mg_face.h:34
MG_ELEMENT_TOPOLOGIQUE::get_valeur_ccf
virtual bool get_valeur_ccf(char *nom, double &val)
Definition: mg_element_topologique.cpp:310
MG_ELEMENT_TOPOLOGIQUE::get_idoriginal
virtual std::string get_idoriginal(void)
Definition: mg_element_topologique.cpp:299
BOITE_3D::z
double z
Definition: ot_boite_3d.h:65
MG_MAILLAGE::get_mg_triangleid
MG_TRIANGLE * get_mg_triangleid(unsigned long num)
Definition: mg_maillage.cpp:772
VCT
Definition: vct.h:33
OT_VECTEUR_3D::change_x
virtual void change_x(double x)
Definition: ot_mathematique.cpp:434
MG_VOLUME::get_topologie_sousjacente
virtual void get_topologie_sousjacente(TPL_MAP_ENTITE< MG_ELEMENT_TOPOLOGIQUE * > *lst)
Definition: mg_volume.cpp:90
mg_volume.h
TPL_SET::get_suivant
X get_suivant(ITERATEUR &it)
Definition: tpl_set.h:107