25 #include "chrono/physics/ChSystemNSC.h"
26 #include "chrono/physics/ChBodyEasy.h"
27 #include "chrono/physics/ChParticlesClones.h"
28 #include "chrono/physics/ChLinkMotorRotationSpeed.h"
29 #include "chrono/assets/ChTexture.h"
38 MSTRUCT_GROUPE_PARTICULE::MSTRUCT_GROUPE_PARTICULE(std::string nom,
int type_particule)
41 m_type_particule=type_particule;
44 MSTRUCT_GROUPE_PARTICULE::~MSTRUCT_GROUPE_PARTICULE(
void)
46 std::vector<MSTRUCT_CHRONO_PARTICULE*>::iterator it;
47 for(it=m_vector_particule_chrono.begin();it!=m_vector_particule_chrono.end();it++)
delete *it;
51 std::vector<MSTRUCT_CHRONO_PARTICULE*>* MSTRUCT_GROUPE_PARTICULE::get_vector_particule(
void)
53 return &m_vector_particule_chrono;
56 int MSTRUCT_GROUPE_PARTICULE::get_type_particule(
void)
58 return m_type_particule;
61 std::string MSTRUCT_GROUPE_PARTICULE::get_nom(
void)
66 MSTRUCT_CHRONO_PARTICULE::MSTRUCT_CHRONO_PARTICULE(std::shared_ptr< chrono::ChBody > particule)
68 m_particule=particule;
72 std::shared_ptr< chrono::ChBody > MSTRUCT_CHRONO_PARTICULE::get_ChBody(
void)
77 bool MSTRUCT_CHRONO_PARTICULE::est_porosite()
82 void MSTRUCT_CHRONO_PARTICULE::est_porosite(
bool porosite)
87 MSTRUCT_CHRONO_PARTICULE_SPHERE::MSTRUCT_CHRONO_PARTICULE_SPHERE(std::shared_ptr< chrono::ChBody > particule,
double rayon_ini,
double rayon_sim): MSTRUCT_CHRONO_PARTICULE(particule)
89 m_rayon_ini=rayon_ini;
90 m_rayon_sim=rayon_sim;
93 double MSTRUCT_CHRONO_PARTICULE_SPHERE::get_rayon_ini(
void)
98 double MSTRUCT_CHRONO_PARTICULE_SPHERE::get_rayon_sim(
void)
103 MSTRUCT_CHRONO_PARTICULE_CYLINDRE::MSTRUCT_CHRONO_PARTICULE_CYLINDRE(std::shared_ptr< chrono::ChBody > particule,
104 double rayon_ini,
double rayon_sim,
double longueur_ini,
double longueur_sim): MSTRUCT_CHRONO_PARTICULE(particule)
106 m_rayon_ini=rayon_ini;
107 m_rayon_sim=rayon_sim;
108 m_longueur_ini=longueur_ini;
109 m_longueur_sim=m_longueur_sim;
112 double MSTRUCT_CHRONO_PARTICULE_CYLINDRE::get_rayon_ini(
void)
117 double MSTRUCT_CHRONO_PARTICULE_CYLINDRE::get_rayon_sim(
void)
122 double MSTRUCT_CHRONO_PARTICULE_CYLINDRE::get_longueur_ini(
void)
124 return m_longueur_ini;
127 double MSTRUCT_CHRONO_PARTICULE_CYLINDRE::get_longueur_sim(
void)
129 return m_longueur_sim;
136 m_boite3d_ves=
BOITE_3D(0.0,0.0,0.0,1.0,1.0,1.0);
137 m_boite3d_distribution=m_boite3d_ves;
138 m_intersection_bords_ves=
true;
145 m_nb_pas_echantillonnage=32;
148 m_avec_interface_graphique=
false;
150 m_systeme_physique=NULL;
152 creer_systeme_physique();
155 MSTRUCT_GENERATEUR_DCR::~MSTRUCT_GENERATEUR_DCR(
void)
158 delete m_systeme_physique;
159 std::map<std::string,MSTRUCT_GROUPE_PARTICULE*>::iterator it_gr_particule;
160 for(it_gr_particule=m_map_groupe_particule.begin();it_gr_particule!=m_map_groupe_particule.end();it_gr_particule++)
162 delete it_gr_particule->second;
166 int MSTRUCT_GENERATEUR_DCR::get_type()
172 void MSTRUCT_GENERATEUR_DCR::change_friction(
double friction)
177 void MSTRUCT_GENERATEUR_DCR::change_facteur_reduction_vitesse(
double facteur_reduction_vitesse)
179 m_facteur_reduction_vitesse=facteur_reduction_vitesse;
182 void MSTRUCT_GENERATEUR_DCR::change_eps_vitesse(
double eps_vitesse)
184 m_eps_vitesse=eps_vitesse;
187 void MSTRUCT_GENERATEUR_DCR::change_pas_temps(
double pas_temps)
189 m_pas_temps=pas_temps;
192 void MSTRUCT_GENERATEUR_DCR::change_temps_max_sim(
double temps)
194 m_temps_max_sim=temps;
198 int MSTRUCT_GENERATEUR_DCR::ajouter_spheres(std::string nom,
double mu_rayon,
double sigma_rayon,
int type_distribution_rayon,
double fraction_volumique_cible,
double eps_frac_vol,
bool porosite)
201 m_map_groupe_particule.insert(std::pair<std::string,MSTRUCT_GROUPE_PARTICULE*>(groupe_particule->get_nom(),groupe_particule));;
202 std::random_device seed;
203 std::mt19937_64 generateur(seed());
204 std::uniform_real_distribution<double> uniform_distribution_position_x(m_boite3d_distribution.get_xmin(),m_boite3d_distribution.get_xmax());
205 std::uniform_real_distribution<double> uniform_distribution_position_y(m_boite3d_distribution.get_ymin(),m_boite3d_distribution.get_ymax());
206 std::uniform_real_distribution<double> uniform_distribution_position_z(m_boite3d_distribution.get_zmin(),m_boite3d_distribution.get_zmax());
207 std::normal_distribution<double> normal_distribution_rayon(mu_rayon,sigma_rayon);
208 std::uniform_real_distribution<double> uniform_distribution_rayon(mu_rayon-sigma_rayon,mu_rayon+sigma_rayon);
209 double fraction_volumique=0.0;
211 double volume_particule=0;
212 while(fraction_volumique<fraction_volumique_cible-eps_frac_vol)
215 centre[0]=uniform_distribution_position_x(generateur);
216 centre[1]=uniform_distribution_position_y(generateur);
217 centre[2]=uniform_distribution_position_z(generateur);
222 double rayon_sim=rayon+1.1*m_distance_min;
223 auto sphere = std::make_shared<chrono::ChBodyEasySphere>(rayon_sim,1,
true,
true);
224 sphere->SetPos(chrono::ChVector<>(centre[0],centre[1],centre[2]));
225 sphere->GetMaterialSurfaceNSC()->SetFriction(m_friction);
226 sphere->GetMaterialSurfaceNSC()->SetRollingFriction(m_friction);
227 sphere->GetMaterialSurfaceNSC()->SetRestitution(1.0);
230 auto couleur = std::make_shared<chrono::ChColorAsset>(0.0,0.0,1.0);
231 sphere->AddAsset(couleur);
235 auto couleur = std::make_shared<chrono::ChColorAsset>(0.2,0.2,0.2);
236 sphere->AddAsset(couleur);
238 m_systeme_physique->Add(sphere);
239 m_vector_particule_chrono.push_back(sphere);
240 MSTRUCT_CHRONO_PARTICULE_SPHERE* particule =
new MSTRUCT_CHRONO_PARTICULE_SPHERE(sphere,rayon,rayon_sim);
241 if(porosite) particule->est_porosite(
true);
242 groupe_particule->get_vector_particule()->push_back(particule);
243 volume_particule+=(4.0/3.0)*M_PI*rayon*rayon*rayon;
244 fraction_volumique=volume_particule/m_boite3d_distribution.get_volume();
249 int MSTRUCT_GENERATEUR_DCR::ajouter_cylindres(std::string nom,
250 double mu_rayon,
double sigma_rayon,
int type_distribution_rayon,
251 double mu_longueur,
double sigma_longueur,
int type_distribution_longueur,
252 double mu_theta,
double sigma_theta,
int type_distribution_theta,
253 double mu_phi,
double sigma_phi,
int type_distribution_phi,
254 double fraction_volumique_cible,
double eps_frac_vol,
bool porosite)
257 m_map_groupe_particule.insert(std::pair<std::string,MSTRUCT_GROUPE_PARTICULE*>(groupe_particule->get_nom(),groupe_particule));;
258 std::random_device seed;
259 std::mt19937_64 generateur(seed());
260 std::uniform_real_distribution<double> uniform_distribution_position_x(m_boite3d_distribution.get_xmin(),m_boite3d_distribution.get_xmax());
261 std::uniform_real_distribution<double> uniform_distribution_position_y(m_boite3d_distribution.get_ymin(),m_boite3d_distribution.get_ymax());
262 std::uniform_real_distribution<double> uniform_distribution_position_z(m_boite3d_distribution.get_zmin(),m_boite3d_distribution.get_zmax());
263 std::normal_distribution<double> normal_distribution_rayon(mu_rayon,sigma_rayon);
264 std::uniform_real_distribution<double> uniform_distribution_rayon(mu_rayon-sigma_rayon,mu_rayon+sigma_rayon);
265 std::normal_distribution<double> normal_distribution_longueur(mu_longueur,sigma_longueur);
266 std::uniform_real_distribution<double> uniform_distribution_longueur(mu_longueur-sigma_longueur,mu_longueur+sigma_longueur);
267 std::normal_distribution<double> normal_distribution_theta(mu_theta,sigma_theta);
268 std::uniform_real_distribution<double> uniform_distribution_theta(0,sigma_theta);
269 std::normal_distribution<double> normal_distribution_phi(mu_phi,sigma_phi);
270 std::uniform_real_distribution<double> uniform_distribution_phi(0,sigma_phi);
271 double fraction_volumique=0.0;
272 double volume_particule=0;
273 while(fraction_volumique<fraction_volumique_cible-eps_frac_vol)
276 centre[0]=uniform_distribution_position_x(generateur);
277 centre[1]=uniform_distribution_position_y(generateur);
278 centre[2]=uniform_distribution_position_z(generateur);
287 double rayon_sim=rayon+1.05*m_distance_min/2.0;
288 double longueur_sim=longueur+1.05*m_distance_min;
299 theta = 2.0*M_PI*theta;
300 phi=
acos(2.0*phi-1.0);
301 axe[0]=
sin(phi)*
cos(theta);
302 axe[1]=
sin(phi)*
sin(theta);
304 auto cylindre=std::make_shared<chrono::ChBodyEasyCylinder>(rayon_sim,longueur_sim,1,
true,
true);
305 cylindre->SetPos(chrono::ChVector<>(centre[0],centre[1],centre[2]));
306 chrono::ChQuaternion<> qua;
307 qua.Q_from_Euler123(chrono::ChVector<>(phi,theta,0.0));
308 cylindre->SetRot(qua);
309 cylindre->GetMaterialSurfaceNSC()->SetFriction(m_friction);
310 cylindre->GetMaterialSurfaceNSC()->SetRollingFriction(m_friction);
311 cylindre->GetMaterialSurfaceNSC()->SetRestitution(1.0);
312 auto couleur = std::make_shared<chrono::ChColorAsset>(1.0,0.0,0.0);
313 cylindre->AddAsset(couleur);
314 m_systeme_physique->Add(cylindre);
315 m_vector_particule_chrono.push_back(cylindre);
316 MSTRUCT_CHRONO_PARTICULE_CYLINDRE* particule =
new MSTRUCT_CHRONO_PARTICULE_CYLINDRE(cylindre,rayon,rayon_sim,longueur,longueur_sim);
317 if(porosite) particule->est_porosite(
true);
318 groupe_particule->get_vector_particule()->push_back(particule);
319 volume_particule+=M_PI*rayon*rayon*longueur;
320 fraction_volumique=volume_particule/m_boite3d_distribution.get_volume();
326 int MSTRUCT_GENERATEUR_DCR::creer_systeme_physique(
void)
328 m_systeme_physique =
new chrono::ChSystemNSC();
329 chrono::collision::ChCollisionModel::SetDefaultSuggestedEnvelope(0.001);
330 chrono::collision::ChCollisionModel::SetDefaultSuggestedMargin(0.0001);
334 int MSTRUCT_GENERATEUR_DCR::creer_frontiere_boite(
void)
336 double boite_dx=m_boite3d_distribution.get_xmax()-m_boite3d_distribution.get_xmin();
337 double boite_dy=m_boite3d_distribution.get_ymax()-m_boite3d_distribution.get_ymin();
338 double boite_dz=m_boite3d_distribution.get_zmax()-m_boite3d_distribution.get_zmin();
339 auto plan_xy_z0 = std::make_shared<chrono::ChBodyEasyBox>(boite_dx+2,boite_dy+2,1, 1,
true,
false);
340 plan_xy_z0->SetPos(chrono::ChVector<>(boite_dx/2.0,boite_dy/2.0,m_boite3d_distribution.get_zmin()-0.5+1.05*m_distance_min/2.0));
341 plan_xy_z0->SetBodyFixed(
true);
342 plan_xy_z0->GetMaterialSurfaceNSC()->SetRestitution(1.0);
343 plan_xy_z0->GetMaterialSurfaceNSC()->SetFriction(m_friction);
344 plan_xy_z0->GetMaterialSurfaceNSC()->SetRollingFriction(m_friction);
345 m_systeme_physique->Add(plan_xy_z0);
346 auto plan_xy_z1 = std::make_shared<chrono::ChBodyEasyBox>(boite_dx+2,boite_dy+2,1, 1,
true,
false);
347 plan_xy_z1->SetPos(chrono::ChVector<>(boite_dx/2.0,boite_dy/2.0,m_boite3d_distribution.get_zmax()+0.5-1.05*m_distance_min/2.0));
348 plan_xy_z1->SetBodyFixed(
true);
349 plan_xy_z1->GetMaterialSurfaceNSC()->SetRestitution(1.0);
350 plan_xy_z1->GetMaterialSurfaceNSC()->SetFriction(m_friction);
351 plan_xy_z1->GetMaterialSurfaceNSC()->SetRollingFriction(m_friction);
352 m_systeme_physique->Add(plan_xy_z1);
353 auto plan_x0_yz = std::make_shared<chrono::ChBodyEasyBox>(1,boite_dy+2,boite_dz+2, 1,
true,
false);
354 plan_x0_yz->SetPos(chrono::ChVector<>(m_boite3d_distribution.get_xmin()-0.5+1.05*m_distance_min/2.0,boite_dy/2.0,boite_dz/2.0));
355 plan_x0_yz->SetBodyFixed(
true);
356 plan_x0_yz->GetMaterialSurfaceNSC()->SetRestitution(1.0);
357 plan_x0_yz->GetMaterialSurfaceNSC()->SetFriction(m_friction);
358 plan_x0_yz->GetMaterialSurfaceNSC()->SetRollingFriction(m_friction);
359 m_systeme_physique->Add(plan_x0_yz);
360 auto plan_x1_yz = std::make_shared<chrono::ChBodyEasyBox>(1,boite_dy+2,boite_dz+2, 1,
true,
false);
361 plan_x1_yz->SetPos(chrono::ChVector<>(m_boite3d_distribution.get_xmax()+0.5-1.05*m_distance_min/2.0,boite_dy/2.0,boite_dz/2.0));
362 plan_x1_yz->SetBodyFixed(
true);
363 plan_x1_yz->GetMaterialSurfaceNSC()->SetRestitution(1.0);
364 plan_x1_yz->GetMaterialSurfaceNSC()->SetFriction(m_friction);
365 plan_x1_yz->GetMaterialSurfaceNSC()->SetRollingFriction(m_friction);
366 m_systeme_physique->Add(plan_x1_yz);
367 auto plan_x_y0_z = std::make_shared<chrono::ChBodyEasyBox>(boite_dx+2,1,boite_dz+2, 1,
true,
false);
368 plan_x_y0_z->SetPos(chrono::ChVector<>(boite_dx/2.0,m_boite3d_distribution.get_ymin()-0.5+1.05*m_distance_min/2.0,boite_dz/2.0));
369 plan_x_y0_z->SetBodyFixed(
true);
370 plan_x_y0_z->GetMaterialSurfaceNSC()->SetRestitution(1.0);
371 plan_x_y0_z->GetMaterialSurfaceNSC()->SetFriction(m_friction);
372 plan_x_y0_z->GetMaterialSurfaceNSC()->SetRollingFriction(m_friction);
373 m_systeme_physique->Add(plan_x_y0_z);
374 auto plan_x_y1_z = std::make_shared<chrono::ChBodyEasyBox>(boite_dx+2,1,boite_dz+2, 1,
true,
false);
375 plan_x_y1_z->SetPos(chrono::ChVector<>(boite_dx/2.0,m_boite3d_distribution.get_ymax()+0.5-1.05*m_distance_min/2.0,boite_dz/2.0));
376 plan_x_y1_z->SetBodyFixed(
true);
377 plan_x_y1_z->GetMaterialSurfaceNSC()->SetRestitution(1.0);
378 plan_x_y1_z->GetMaterialSurfaceNSC()->SetFriction(m_friction);
379 plan_x_y1_z->GetMaterialSurfaceNSC()->SetRollingFriction(m_friction);
380 m_systeme_physique->Add(plan_x_y1_z);
384 void MSTRUCT_GENERATEUR_DCR::ralentir_particules(
void)
386 std::vector<std::shared_ptr<chrono::ChBody>>::iterator it;
387 for(it=m_vector_particule_chrono.begin();it!=m_vector_particule_chrono.end();it++)
389 std::shared_ptr<chrono::ChBody> particule = *it;
390 chrono::ChVector<double> vect=particule->GetPos_dt();
391 if(vect.Length()>m_eps_vitesse)
393 vect.Mul(vect,m_facteur_reduction_vitesse);
394 particule->SetPos_dt(vect);
398 vect.Set(0.0,0.0,0.0);
399 particule->SetPos_dt(vect);
401 chrono::ChQuaternion<double> qua=particule->GetRot_dt();
402 if(qua.Length()>m_eps_vitesse)
404 qua.Mul(qua,m_facteur_reduction_vitesse);
405 particule->SetRot_dt(qua);
409 qua.Set(0.0,0.0,0.0,0.0);
410 particule->SetRot_dt(qua);
415 int MSTRUCT_GENERATEUR_DCR::lancer_simulation(
void)
417 if(m_avec_interface_graphique) cree_interface_graphique();
418 creer_frontiere_boite();
419 if(m_avec_interface_graphique)
421 m_irrapp->AssetBindAll();
422 m_irrapp->AssetUpdateAll();
424 m_systeme_physique->SetSolverType(chrono::ChSolver::Type::SOR);
425 m_systeme_physique->SetMaxItersSolverSpeed(20);
426 m_systeme_physique->SetMaxItersSolverStab(5);
427 m_systeme_physique->SetUseSleeping(
true);
428 m_systeme_physique->Set_G_acc(0.0);
429 m_systeme_physique->SetMinBounceSpeed(0.0);
430 double temps_simulation=0;
432 long nb_objet=m_vector_particule_chrono.size();
433 std::sprintf(message,
"Temps simulation [%.4lf / %.4lf]",temps_simulation,m_temps_max_sim);
affiche(message);
434 if(m_avec_interface_graphique)
436 m_irrapp->SetStepManage(
true);
437 m_irrapp->SetTimestep(m_pas_temps);
438 while(m_irrapp->GetDevice()->run() && m_systeme_physique->GetNbodiesSleeping()<nb_objet && temps_simulation<m_temps_max_sim)
440 temps_simulation+=m_pas_temps;
441 std::sprintf(message,
"\033[1A\033[KTemps simulation [%.4lf / %.4lf] Nb objet au repos [%i / %li]",temps_simulation,m_temps_max_sim,m_systeme_physique->GetNbodiesSleeping(),nb_objet);
affiche(message);
442 m_irrapp->BeginScene(
true,
true,irr::video::SColor(255,140,161,192));
445 m_irrapp->EndScene();
446 ralentir_particules();
448 std::sprintf(message,
"\033[1A\033[KTemps simulation [%.4lf / %.4lf] Nb objet au repos [%i / %li]",temps_simulation,m_temps_max_sim,m_systeme_physique->GetNbodiesSleeping(),nb_objet);
affiche(message);
449 m_irrapp->GetDevice()->closeDevice();
453 while(m_systeme_physique->GetNbodiesSleeping()<nb_objet && temps_simulation<m_temps_max_sim)
455 temps_simulation+=m_pas_temps;
456 std::sprintf(message,
"\033[1A\033[KTemps simulation [%.4lf / %.4lf] Nb objet au repos [%i / %li]",temps_simulation,m_temps_max_sim,m_systeme_physique->GetNbodiesSleeping(),nb_objet);
affiche(message);
457 m_systeme_physique->DoStepDynamics(temps_simulation);
458 ralentir_particules();
460 std::sprintf(message,
"\033[1A\033[KTemps simulation [%.4lf / %.4lf] Nb objet au repos [%i / %li]",temps_simulation,m_temps_max_sim,m_systeme_physique->GetNbodiesSleeping(),nb_objet);
affiche(message);
462 if(m_systeme_physique->GetNbodiesSleeping()<nb_objet)
return FAIL;
466 int MSTRUCT_GENERATEUR_DCR::generer_geometrie()
468 initialiser_grille();
470 m_boite3d_ves.get_xmin(),m_boite3d_ves.get_ymin(),m_boite3d_ves.get_zmin(),
471 m_boite3d_ves.get_xmax(),m_boite3d_ves.get_ymax(),m_boite3d_ves.get_zmax());
472 m_matrice->construire();
476 std::map<std::string,MSTRUCT_GROUPE_PARTICULE*>::iterator it_groupe_particule;
477 for(it_groupe_particule=m_map_groupe_particule.begin();it_groupe_particule!=m_map_groupe_particule.end();it_groupe_particule++)
480 MSTRUCT_GROUPE_PARTICULE* groupe_particule=it_groupe_particule->second;
484 m_vector_mgcg_groupe_forme_inclusion.push_back(groupe_forme);
485 std::vector<MSTRUCT_CHRONO_PARTICULE*>::iterator it_particule;
486 std::vector<MSTRUCT_CHRONO_PARTICULE*>* vector_particule = groupe_particule->get_vector_particule();
487 double fraction_volumique_totale=0;
488 double fraction_volumique_finale=0;
490 for(it_particule=vector_particule->begin();it_particule!=vector_particule->end();it_particule++)
492 MSTRUCT_CHRONO_PARTICULE_SPHERE* sphere = (MSTRUCT_CHRONO_PARTICULE_SPHERE*)*it_particule;
493 std::shared_ptr<chrono::ChBody> chrono_sphere = sphere->get_ChBody();
494 chrono::ChVector<double> bbmin;
495 chrono::ChVector<double> bbmax;
496 chrono_sphere->GetTotalAABB(bbmin,bbmax);
497 BOITE_3D boite_3d(bbmin[0],bbmin[1],bbmin[2],bbmax[0],bbmax[1],bbmax[2]);
498 if(m_boite3d_ves.get_intersection(boite_3d)==0)
continue;
499 chrono::ChVector<double> chvector_centre = chrono_sphere->GetPos();
501 centre[0]=chvector_centre[0];
502 centre[1]=chvector_centre[1];
503 centre[2]=chvector_centre[2];
504 double rayon = sphere->get_rayon_ini();
508 std::vector<MG_CG_FORME*> vector_forme;
509 int position_relative;
510 double fraction_volumique=0;
511 if(insertion_inclusion(sphere_test,fraction_volumique,vector_forme,position_relative)==
OK)
514 fraction_volumique_totale+=fraction_volumique;
515 fraction_volumique_finale=fraction_volumique_totale/(m_boite3d_ves.get_volume());
516 std::vector<MG_CG_FORME*>::iterator it_forme;
517 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++)
521 if(it_forme==vector_forme.begin())
533 sprintf(message,
"Sphere # [%4li] : Fraction volumique [%.6lf] : Position %s",nb_inclusion,fraction_volumique_finale,position);
542 m_vector_mgcg_groupe_forme_inclusion.push_back(groupe_forme);
543 std::vector<MSTRUCT_CHRONO_PARTICULE*>::iterator it_particule;
544 std::vector<MSTRUCT_CHRONO_PARTICULE*>* vector_particule = groupe_particule->get_vector_particule();
545 double fraction_volumique_totale=0;
546 double fraction_volumique_finale=0;
549 for(it_particule=vector_particule->begin();it_particule!=vector_particule->end();it_particule++)
551 MSTRUCT_CHRONO_PARTICULE_CYLINDRE* cylindre = (MSTRUCT_CHRONO_PARTICULE_CYLINDRE*)*it_particule;
552 std::shared_ptr<chrono::ChBody> chrono_cylindre = cylindre->get_ChBody();
553 chrono::ChVector<double> bbmin;
554 chrono::ChVector<double> bbmax;
555 chrono_cylindre->GetTotalAABB(bbmin,bbmax);
556 BOITE_3D boite_3d(bbmin[0],bbmin[1],bbmin[2],bbmax[0],bbmax[1],bbmax[2]);
557 if(m_boite3d_ves.get_intersection(boite_3d)==0)
continue;
558 chrono::ChVector<double> chvector_centre = chrono_cylindre->GetPos();
559 chrono::ChVector<double> chvector_axe = chrono_cylindre->GetRot().GetYaxis();
561 axe[0]=chvector_axe[0];
562 axe[1]=chvector_axe[1];
563 axe[2]=chvector_axe[2];
564 double rayon = cylindre->get_rayon_ini();
565 double longueur = cylindre->get_longueur_ini();
567 extremite[0]=chvector_centre[0]-longueur/2.*axe[0];
568 extremite[1]=chvector_centre[1]-longueur/2.*axe[1];
569 extremite[2]=chvector_centre[2]-longueur/2.*axe[2];
572 extremite[0],extremite[1],extremite[2],
573 axe[0],axe[1],axe[2],rayon,longueur);
575 std::vector<MG_CG_FORME*> vector_forme;
576 int position_relative;
577 double fraction_volumique=0;
578 if(insertion_inclusion(cylindre_test,fraction_volumique,vector_forme,position_relative)==
OK)
581 fraction_volumique_totale+=fraction_volumique;
582 fraction_volumique_finale=fraction_volumique_totale/(m_boite3d_ves.get_volume());
583 std::vector<MG_CG_FORME*>::iterator it_forme;
584 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++)
588 if(it_forme==vector_forme.begin())
602 sprintf(message,
"Cylindre # [%4li] : Fraction volumique [%.6lf] : Position %s",nb_inclusion,fraction_volumique_finale,position);
612 int MSTRUCT_GENERATEUR_DCR::generer_geometrie_avec_changement()
614 initialiser_grille();
616 m_boite3d_ves.get_xmin(),m_boite3d_ves.get_ymin(),m_boite3d_ves.get_zmin(),
617 m_boite3d_ves.get_xmax(),m_boite3d_ves.get_ymax(),m_boite3d_ves.get_zmax());
618 m_matrice->construire();
621 std::map<std::string,MSTRUCT_GROUPE_PARTICULE*>::iterator it_groupe_particule;
622 for(it_groupe_particule=m_map_groupe_particule.begin();it_groupe_particule!=m_map_groupe_particule.end();it_groupe_particule++)
625 MSTRUCT_GROUPE_PARTICULE* groupe_particule=it_groupe_particule->second;
629 m_vector_mgcg_groupe_forme_inclusion.push_back(groupe_forme);
630 std::vector<MSTRUCT_CHRONO_PARTICULE*>::iterator it_particule;
631 std::vector<MSTRUCT_CHRONO_PARTICULE*>* vector_particule = groupe_particule->get_vector_particule();
632 double fraction_volumique_totale=0;
633 double fraction_volumique_finale=0;
635 long nb_inc_corrected=0;
636 for(it_particule=vector_particule->begin();it_particule!=vector_particule->end();it_particule++)
638 MSTRUCT_CHRONO_PARTICULE_SPHERE* sphere = (MSTRUCT_CHRONO_PARTICULE_SPHERE*)*it_particule;
639 std::shared_ptr<chrono::ChBody> chrono_sphere = sphere->get_ChBody();
640 chrono::ChVector<double> bbmin;
641 chrono::ChVector<double> bbmax;
642 chrono_sphere->GetTotalAABB(bbmin,bbmax);
643 BOITE_3D boite_3d(bbmin[0],bbmin[1],bbmin[2],bbmax[0],bbmax[1],bbmax[2]);
644 if(m_boite3d_ves.get_intersection(boite_3d)==0)
continue;
645 chrono::ChVector<double> chvector_centre = chrono_sphere->GetPos();
647 centre[0]=chvector_centre[0];
648 centre[1]=chvector_centre[1];
649 centre[2]=chvector_centre[2];
650 double rayon = sphere->get_rayon_ini();
654 std::vector<MG_CG_FORME*> vector_forme;
655 int position_relative;
656 double fraction_volumique=0;
657 if(insertion_inclusion(sphere_test,fraction_volumique,vector_forme,position_relative)==
OK)
660 fraction_volumique_totale+=fraction_volumique;
661 fraction_volumique_finale=fraction_volumique_totale/(m_boite3d_ves.get_volume());
662 std::vector<MG_CG_FORME*>::iterator it_forme;
663 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++)
667 if(it_forme==vector_forme.begin())
679 sprintf(message,
"Sphere # [%4li] : Fraction volumique [%.6lf] : Position %s",nb_inclusion,fraction_volumique_finale,position);
684 for(it_particule=vector_particule->begin();it_particule!=vector_particule->end();it_particule++)
686 MSTRUCT_CHRONO_PARTICULE_SPHERE* sphere = (MSTRUCT_CHRONO_PARTICULE_SPHERE*)*it_particule;
687 std::shared_ptr<chrono::ChBody> chrono_sphere = sphere->get_ChBody();
688 chrono::ChVector<double> bbmin;
689 chrono::ChVector<double> bbmax;
690 chrono_sphere->GetTotalAABB(bbmin,bbmax);
691 BOITE_3D boite_3d(bbmin[0],bbmin[1],bbmin[2],bbmax[0],bbmax[1],bbmax[2]);
692 if(m_boite3d_ves.get_intersection(boite_3d)==0)
continue;
693 chrono::ChVector<double> chvector_centre = chrono_sphere->GetPos();
695 centre[0]=chvector_centre[0];
696 centre[1]=chvector_centre[1];
697 centre[2]=chvector_centre[2];
698 double rayon = sphere->get_rayon_ini();
702 std::vector<MG_CG_FORME*> vector_forme;
703 int position_relative;
704 double fraction_volumique=0;
706 int it_i=0;
int it_iii=0;
int check=0;
double centre_tri[3];
708 if(!insertion_inclusion(sphere_test,fraction_volumique,vector_forme,position_relative)==
OK)
716 if(insertion_inclusion(sphere_test,fraction_volumique,vector_forme,position_relative)==
OK)
719 fraction_volumique_totale+=fraction_volumique;
720 fraction_volumique_finale=fraction_volumique_totale/(m_boite3d_ves.get_volume());
721 std::vector<MG_CG_FORME*>::iterator it_forme;
722 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++)
726 if(it_forme==vector_forme.begin())
738 sprintf(message,
"Sphere_rayon # [%4li] : Fraction volumique [%.6lf] : Position %s",nb_inclusion,fraction_volumique_finale,position);
753 centre_tri[0]=centre[0]+((it_iii+1)*m_distance_min/5);
754 centre_tri[1]=centre[1]+((it_iii+1)*m_distance_min/5);
755 centre_tri[2]=centre[2]+((it_iii+1)*m_distance_min/5);
760 centre_tri[0]=centre[0]-((it_iii+1)*m_distance_min/5);
761 centre_tri[1]=centre[1]-((it_iii+1)*m_distance_min/5);
762 centre_tri[2]=centre[2]-((it_iii+1)*m_distance_min/5);
768 if(insertion_inclusion(sphere_test,fraction_volumique,vector_forme,position_relative)==
OK)
771 fraction_volumique_totale+=fraction_volumique;
772 fraction_volumique_finale=fraction_volumique_totale/(m_boite3d_ves.get_volume());
773 std::vector<MG_CG_FORME*>::iterator it_forme;
774 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++)
778 if(it_forme==vector_forme.begin())
790 sprintf(message,
"Sphere_position # [%4li] : Fraction volumique [%.6lf] : Position %s",nb_inclusion,fraction_volumique_finale,position);
803 sprintf(message1,
"Nb_inclusion_corrected # [%4li] ",nb_inc_corrected);
811 m_vector_mgcg_groupe_forme_inclusion.push_back(groupe_forme);
812 std::vector<MSTRUCT_CHRONO_PARTICULE*>::iterator it_particule;
813 std::vector<MSTRUCT_CHRONO_PARTICULE*>* vector_particule = groupe_particule->get_vector_particule();
814 double fraction_volumique_totale=0;
815 double fraction_volumique_finale=0;
817 long nb_inc_corrected=0;
818 for(it_particule=vector_particule->begin();it_particule!=vector_particule->end();it_particule++)
820 MSTRUCT_CHRONO_PARTICULE_CYLINDRE* cylindre = (MSTRUCT_CHRONO_PARTICULE_CYLINDRE*)*it_particule;
821 std::shared_ptr<chrono::ChBody> chrono_cylindre = cylindre->get_ChBody();
822 chrono::ChVector<double> bbmin;
823 chrono::ChVector<double> bbmax;
824 chrono_cylindre->GetTotalAABB(bbmin,bbmax);
825 BOITE_3D boite_3d(bbmin[0],bbmin[1],bbmin[2],bbmax[0],bbmax[1],bbmax[2]);
826 if(m_boite3d_ves.get_intersection(boite_3d)==0)
continue;
827 chrono::ChVector<double> chvector_centre = chrono_cylindre->GetPos();
828 chrono::ChVector<double> chvector_axe = chrono_cylindre->GetRot().GetYaxis();
830 axe[0]=chvector_axe[0];
831 axe[1]=chvector_axe[1];
832 axe[2]=chvector_axe[2];
833 double rayon = cylindre->get_rayon_ini();
834 double longueur = cylindre->get_longueur_ini();
836 extremite[0]=chvector_centre[0]-longueur/2.*axe[0];
837 extremite[1]=chvector_centre[1]-longueur/2.*axe[1];
838 extremite[2]=chvector_centre[2]-longueur/2.*axe[2];
841 extremite[0],extremite[1],extremite[2],
842 axe[0],axe[1],axe[2],rayon,longueur);
844 std::vector<MG_CG_FORME*> vector_forme;
845 int position_relative;
846 double fraction_volumique=0;
847 if(insertion_inclusion(cylindre_test,fraction_volumique,vector_forme,position_relative)==
OK)
850 fraction_volumique_totale+=fraction_volumique;
851 fraction_volumique_finale=fraction_volumique_totale/(m_boite3d_ves.get_volume());
852 std::vector<MG_CG_FORME*>::iterator it_forme;
853 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++)
857 if(it_forme==vector_forme.begin())
871 sprintf(message,
"Cylindre # [%4li] : Fraction volumique [%.6lf] : Position %s",nb_inclusion,fraction_volumique_finale,position);
877 for(it_particule=vector_particule->begin();it_particule!=vector_particule->end();it_particule++)
879 MSTRUCT_CHRONO_PARTICULE_CYLINDRE* cylindre = (MSTRUCT_CHRONO_PARTICULE_CYLINDRE*)*it_particule;
880 std::shared_ptr<chrono::ChBody> chrono_cylindre = cylindre->get_ChBody();
881 chrono::ChVector<double> bbmin;
882 chrono::ChVector<double> bbmax;
883 chrono_cylindre->GetTotalAABB(bbmin,bbmax);
884 BOITE_3D boite_3d(bbmin[0],bbmin[1],bbmin[2],bbmax[0],bbmax[1],bbmax[2]);
885 if(m_boite3d_ves.get_intersection(boite_3d)==0)
continue;
886 chrono::ChVector<double> chvector_centre = chrono_cylindre->GetPos();
887 chrono::ChVector<double> chvector_axe = chrono_cylindre->GetRot().GetYaxis();
889 axe[0]=chvector_axe[0];
890 axe[1]=chvector_axe[1];
891 axe[2]=chvector_axe[2];
892 double rayon = cylindre->get_rayon_ini();
893 double longueur = cylindre->get_longueur_ini();
895 extremite[0]=chvector_centre[0]-longueur/2.*axe[0];
896 extremite[1]=chvector_centre[1]-longueur/2.*axe[1];
897 extremite[2]=chvector_centre[2]-longueur/2.*axe[2];
900 extremite[0],extremite[1],extremite[2],
901 axe[0],axe[1],axe[2],rayon,longueur);
903 std::vector<MG_CG_FORME*> vector_forme;
904 int position_relative;
905 double fraction_volumique=0;
910 int it_i=0;
int it_ii=0;
int it_iii=0;
int it_it=0;
int check=0;
911 double theta_deg;
double theta_rad;
double phi_deg;
double phi_rad;
912 double theta_deg_tri;
double theta_rad_tri;
double phi_deg_tri;
double phi_rad_tri;
913 double centre_tri[3];
915 phi_rad=
acos(axe[2]);
916 theta_rad=
acos((axe[0])/(
sin(phi_rad)));
917 phi_deg=phi_rad*180/3.14;
918 theta_deg=theta_rad*180/3.14;
920 if(!insertion_inclusion(cylindre_test,fraction_volumique,vector_forme,position_relative)==
OK)
925 longueur=longueur*0.9;
927 extremite[0]=chvector_centre[0]-longueur/2.*axe[0];
928 extremite[1]=chvector_centre[1]-longueur/2.*axe[1];
929 extremite[2]=chvector_centre[2]-longueur/2.*axe[2];
932 extremite[0],extremite[1],extremite[2],
933 axe[0],axe[1],axe[2],rayon,longueur);
935 if(insertion_inclusion(cylindre_test,fraction_volumique,vector_forme,position_relative)==
OK)
939 fraction_volumique_totale+=fraction_volumique;
940 fraction_volumique_finale=fraction_volumique_totale/(m_boite3d_ves.get_volume());
941 std::vector<MG_CG_FORME*>::iterator it_forme;
942 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++)
946 if(it_forme==vector_forme.begin())
960 sprintf(message,
"Cylindre_dimension # [%4li] : Fraction volumique [%.6lf] : Position %s",nb_inclusion,fraction_volumique_finale,position);
975 theta_deg_tri=theta_deg+((it_ii+1)*6);
976 theta_rad_tri=theta_deg_tri*3.14/180;
977 phi_deg_tri=phi_deg+((it_ii+1)*6);
978 phi_rad_tri=phi_deg_tri*3.14/180;
983 theta_deg_tri=theta_deg-((it_ii)*6);
984 theta_rad_tri=theta_deg*3.14/180;
985 phi_deg_tri=phi_deg-((it_ii)*6);
986 phi_rad_tri=phi_deg_tri*3.14/180;
988 axe[0]=
sin(phi_rad_tri)*
cos(theta_rad_tri);
989 axe[1]=
sin(phi_rad_tri)*
sin(theta_rad_tri);
990 axe[2]=
cos(phi_rad_tri);
992 extremite[0]=chvector_centre[0]-longueur/2.*axe[0];
993 extremite[1]=chvector_centre[1]-longueur/2.*axe[1];
994 extremite[2]=chvector_centre[2]-longueur/2.*axe[2];
998 extremite[0],extremite[1],extremite[2],
999 axe[0],axe[1],axe[2],rayon,longueur);
1001 if(insertion_inclusion(cylindre_test,fraction_volumique,vector_forme,position_relative)==
OK)
1005 fraction_volumique_totale+=fraction_volumique;
1006 fraction_volumique_finale=fraction_volumique_totale/(m_boite3d_ves.get_volume());
1007 std::vector<MG_CG_FORME*>::iterator it_forme;
1008 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++)
1012 if(it_forme==vector_forme.begin())
1026 sprintf(message,
"Cylindre_orientation # [%4li] : Fraction volumique [%.6lf] : Position %s",nb_inclusion,fraction_volumique_finale,position);
1040 centre_tri[0]=chvector_centre[0]+((it_iii+1)*m_distance_min/5);
1041 centre_tri[1]=chvector_centre[1]+((it_iii+1)*m_distance_min/5);
1042 centre_tri[2]=chvector_centre[2]+((it_iii+1)*m_distance_min/5);
1047 centre_tri[0]=chvector_centre[0]-((it_iii+1)*m_distance_min/5);
1048 centre_tri[1]=chvector_centre[1]-((it_iii+1)*m_distance_min/5);
1049 centre_tri[2]=chvector_centre[2]-((it_iii+1)*m_distance_min/5);
1052 axe[0]=chvector_axe[0];
1053 axe[1]=chvector_axe[1];
1054 axe[2]=chvector_axe[2];
1056 extremite[0]=centre_tri[0]-longueur/2.*axe[0];
1057 extremite[1]=centre_tri[1]-longueur/2.*axe[1];
1058 extremite[2]=centre_tri[2]-longueur/2.*axe[2];
1062 extremite[0],extremite[1],extremite[2],
1063 axe[0],axe[1],axe[2],rayon,longueur);
1065 if(insertion_inclusion(cylindre_test,fraction_volumique,vector_forme,position_relative)==
OK)
1069 fraction_volumique_totale+=fraction_volumique;
1070 fraction_volumique_finale=fraction_volumique_totale/(m_boite3d_ves.get_volume());
1071 std::vector<MG_CG_FORME*>::iterator it_forme;
1072 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++)
1076 if(it_forme==vector_forme.begin())
1090 sprintf(message,
"Cylindre_position # [%4li] : Fraction volumique [%.6lf] : Position %s",nb_inclusion,fraction_volumique_finale,position);
1104 char message2[5000];
1105 sprintf(message2,
"Nb_inclusion_corrected # [%4li] ",nb_inc_corrected);
1117 int MSTRUCT_GENERATEUR_DCR::construire(
MSTRUCT_VES* ves)
1123 std::vector<MG_CG_GROUPE_FORME*>::iterator it_gr_forme;
1124 for(it_gr_forme=m_vector_mgcg_groupe_forme_inclusion.begin();it_gr_forme!=m_vector_mgcg_groupe_forme_inclusion.end();it_gr_forme++)
1127 std::map<long,MG_CG_FORME*>::iterator it_forme;
1130 MG_CG_INFO* info_porosite = forme->get_mgcg_info((
char*)
"POROSITE");
1131 if(info_porosite!=NULL)
continue;
1141 void MSTRUCT_GENERATEUR_DCR::active_interface_graphique(
bool avec_interface_graphique)
1143 if(m_avec_interface_graphique==
false)
1145 m_avec_interface_graphique=avec_interface_graphique;
1149 int MSTRUCT_GENERATEUR_DCR::cree_interface_graphique(
void)
1151 if(!m_avec_interface_graphique)
return FAIL;
1152 m_irrapp =
new chrono::irrlicht::ChIrrApp(m_systeme_physique,(
const wchar_t*)
"MSTRUCT_GENERATEUR_DCR",irr::core::dimension2d<irr::u32>(800,600),
false);
1153 chrono::irrlicht::ChIrrWizard::add_typical_Sky(m_irrapp->GetDevice());
1154 chrono::irrlicht::ChIrrWizard::add_typical_Lights(m_irrapp->GetDevice());
1155 double distance = m_boite3d_distribution.get_rayon();
1156 chrono::irrlicht::ChIrrWizard::add_typical_Camera(m_irrapp->GetDevice(), irr::core::vector3df(distance+0.5, distance+0.5, distance+0.5));
virtual int ajouter_mgcg_forme(MG_CG_FORME *mgcg_forme, bool avec_mg_element=true)
virtual MG_SOUS_GEOMETRIE * get_mg_sous_geometrie(void)
virtual int construire(void)=0
virtual int construire(void)=0
MG_CG_FORME * get_suivante_mgcg_forme(std::map< long, MG_CG_FORME * >::iterator &it)
MG_CG_FORME * get_premiere_mgcg_forme(std::map< long, MG_CG_FORME * >::iterator &it)
int ajouter_mgcg_forme(MG_CG_FORME *mgcg_forme)
static MG_CG_INFO_VCT_DOUBLE * creer_MG_CG_INFO_VCT_DOUBLE(MG_CONSTRUCTION_GEOMETRIQUE *mg_construction_geometrique, std::string identifiant, std::vector< double > &valeur)
static MG_CG_FORME_VOLUME_SPHERE * creer_MG_CG_FORME_VOLUME_SPHERE(MG_CG_MODELE *mgcg_modele, double centre_x, double centre_y, double centre_z, double rayon)
static MG_CG_INFO_DOUBLE * creer_MG_CG_INFO_DOUBLE(MG_CONSTRUCTION_GEOMETRIQUE *mg_construction_geometrique, std::string identifiant, double valeur)
static MG_CG_ASSEMBLAGE * creer_MG_CG_ASSEMBLAGE(MG_CG_MODELE *mgcg_modele, std::string nom_mgcg_assemblage)
static MG_CG_GROUPE_FORME * creer_MG_CG_GROUPE_FORME(MG_CG_MODELE *mgcg_modele, std::string nom)
static MG_CG_FORME_VOLUME_CYLINDRE * creer_MG_CG_FORME_VOLUME_CYLINDRE(MG_CG_MODELE *mgcg_modele, double extremite_x, double extremite_y, double extremite_z, double direction_x, double direction_y, double direction_z, double rayon, double longueur)
static MG_CG_FORME_VOLUME_BOITE * creer_MG_CG_FORME_VOLUME_BOITE(MG_CG_MODELE *mgcg_modele, double x1, double y1, double z1, double x2, double y2, double z2)
virtual void change_mgcg_assemblage(MG_CG_ASSEMBLAGE *mgcg_assemblage)
virtual void change_mg_geometrie(MG_GEOMETRIE *mg_geometrie)
virtual void change_mgcg_modele(MG_CG_MODELE *mgcg_modele)
void affiche(char *message)
double2 sin(double2 &val)
double2 acos(double2 &val)
double2 cos(double2 &val)