72 char* nom_mgcg_modele,
74 int nb_pas_x,
int nb_pas_y,
int nb_pas_z):
MSTRUCT_GENERATEUR(mg_gestionnaire,nom_mgcg_modele)
83 nb_pas_x,nb_pas_y,nb_pas_z);
113 double mu_rayon,
double sigma_rayon,
int type_distribution_rayon,
114 double fraction_volumique_cible,
double eps_frac_vol,
115 double &fraction_volumique_actuelle,
116 std::vector< double >* vector_epaisseur_couches,
121 std::vector<MG_CG_GROUPE_FORME*> vct_groupe_forme;
123 std::random_device seed;
124 std::mt19937_64 generateur(seed());
132 std::normal_distribution<double> normal_distribution_rayon(mu_rayon,sigma_rayon);
133 std::uniform_real_distribution<double> uniform_distribution_rayon(mu_rayon-sigma_rayon,mu_rayon+sigma_rayon);
149 double fraction_volumique=fraction_volumique_actuelle;
152 while(fraction_volumique<fraction_volumique_cible-eps_frac_vol && iteration<
m_nb_iteration_max)
155 centre[0]=uniform_distribution_position_x(generateur);
156 centre[1]=uniform_distribution_position_y(generateur);
157 centre[2]=uniform_distribution_position_z(generateur);
168 std::vector<MG_CG_FORME*> vector_forme;
169 int position_relative;
170 if(
insertion_inclusion(sphere_test,fraction_volumique_cible,eps_frac_vol,fraction_volumique,vector_forme,position_relative,vector_epaisseur_couches,porosite)==
OK)
173 std::vector<MG_CG_FORME*>::iterator it_forme;
174 std::vector<MG_CG_GROUPE_FORME*>::iterator it_groupe_forme;
175 it_groupe_forme=vct_groupe_forme.begin();
176 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++,it_groupe_forme++)
181 if(it_forme==vector_forme.begin())
195 sprintf(message,
"IT [%6li/%6li max] : Sphere # [%4li] : Fraction volumique [%.6lf / %.6lf] : Position %s",
196 iteration,
m_nb_iteration_max,nb_inclusion,fraction_volumique,fraction_volumique_cible,position);
201 fraction_volumique_actuelle=fraction_volumique;
202 return fraction_volumique;
207 double mu_rayon,
double sigma_rayon,
int type_distribution_rayon,
208 double mu_longueur,
double sigma_longueur,
int type_distribution_longueur,
209 double mu_theta,
double sigma_theta,
int type_distribution_theta,
210 double mu_phi,
double sigma_phi,
int type_distribution_phi,
211 double fraction_volumique_cible,
double eps_frac_vol,
212 double &fraction_volumique_actuelle,
213 std::vector< double >* vector_epaisseur_couches,
218 std::vector<MG_CG_GROUPE_FORME*> vct_groupe_forme;
220 std::random_device seed;
221 std::mt19937_64 generateur(seed());
227 std::normal_distribution<double> normal_distribution_rayon(mu_rayon,sigma_rayon);
228 std::uniform_real_distribution<double> uniform_distribution_rayon(mu_rayon-sigma_rayon,mu_rayon+sigma_rayon);
229 std::normal_distribution<double> normal_distribution_longueur(mu_longueur,sigma_longueur);
230 std::uniform_real_distribution<double> uniform_distribution_longueur(mu_longueur-sigma_longueur,mu_longueur+sigma_longueur);
231 std::normal_distribution<double> normal_distribution_theta(mu_theta,sigma_theta);
232 std::uniform_real_distribution<double> uniform_distribution_theta(0,sigma_theta);
233 std::normal_distribution<double> normal_distribution_phi(mu_phi,sigma_phi);
234 std::uniform_real_distribution<double> uniform_distribution_phi(0,sigma_phi);
247 double fraction_volumique=fraction_volumique_actuelle;
250 while(fraction_volumique<fraction_volumique_cible-eps_frac_vol && iteration<
m_nb_iteration_max)
253 extremite[0]=uniform_distribution_position_x(generateur);
254 extremite[1]=uniform_distribution_position_y(generateur);
255 extremite[2]=uniform_distribution_position_z(generateur);
277 theta = 2.0*M_PI*theta;
278 phi=
acos(2.0*phi-1.0);
279 axe[0]=
sin(phi)*
cos(theta);
280 axe[1]=
sin(phi)*
sin(theta);
284 axe[0]=vct_axe.
get_x();
285 axe[1]=vct_axe.
get_y();
286 axe[2]=vct_axe.
get_z();
289 std::vector<MG_CG_FORME*> vector_forme;
290 int position_relative;
291 if(
insertion_inclusion(cylindre_test,fraction_volumique_cible,eps_frac_vol,fraction_volumique,vector_forme,position_relative,vector_epaisseur_couches,porosite)==
OK)
294 std::vector<MG_CG_FORME*>::iterator it_forme;
295 std::vector<MG_CG_GROUPE_FORME*>::iterator it_groupe_forme;
296 it_groupe_forme=vct_groupe_forme.begin();
297 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++,it_groupe_forme++)
302 if(it_forme==vector_forme.begin())
318 sprintf(message,
"IT [%6li/%6li max] : Cylindre # [%4li] : Fraction volumique [%.6lf / %.6lf] : Position %s",
319 iteration,
m_nb_iteration_max,nb_inclusion,fraction_volumique,fraction_volumique_cible,position);
324 fraction_volumique_actuelle=fraction_volumique;
325 return fraction_volumique;
333 double mu_rayon_cercle,
double sigma_rayon_cercle,
int type_distribution_rayon_cercle,
334 double mu_rayon_tore,
double sigma_rayon_tore,
int type_distribution_rayon_tore,
335 double mu_theta,
double sigma_theta,
int type_distribution_theta,
336 double mu_phi,
double sigma_phi,
int type_distribution_phi,
337 double mu_angle_seg,
double sigma_angle_seg,
int type_distribution_angle_seg,
338 double fraction_volumique_cible,
double eps_frac_vol,
339 double &fraction_volumique_actuelle,
340 std::vector< double >* vector_epaisseur_couches,
345 std::vector<MG_CG_GROUPE_FORME*> vct_groupe_forme;
347 std::random_device seed;
348 std::mt19937_64 generateur(seed());
358 std::normal_distribution<double> normal_distribution_rayon_cercle(mu_rayon_cercle,sigma_rayon_cercle);
359 std::uniform_real_distribution<double> uniform_distribution_rayon_cercle(mu_rayon_cercle-sigma_rayon_cercle,mu_rayon_cercle+sigma_rayon_cercle);
360 std::normal_distribution<double> normal_distribution_rayon_tore(mu_rayon_tore,sigma_rayon_tore);
361 std::uniform_real_distribution<double> uniform_distribution_rayon_tore(mu_rayon_tore-sigma_rayon_tore,mu_rayon_tore+sigma_rayon_tore);
364 std::normal_distribution<double> normal_distribution_theta(mu_theta,sigma_theta);
365 std::uniform_real_distribution<double> uniform_distribution_theta(0,sigma_theta);
366 std::normal_distribution<double> normal_distribution_phi(mu_phi,sigma_phi);
367 std::uniform_real_distribution<double> uniform_distribution_phi(0,sigma_phi);
370 std::normal_distribution<double> normal_distribution_angle_seg(mu_angle_seg,sigma_angle_seg);
371 std::uniform_real_distribution<double> uniform_distribution_angle_seg(0,sigma_angle_seg);
386 double fraction_volumique=fraction_volumique_actuelle;
389 while(fraction_volumique<fraction_volumique_cible-eps_frac_vol && iteration<
m_nb_iteration_max)
401 double centre_prim[3];
402 centre_prim[0]=uniform_distribution_position_x(generateur);
403 centre_prim[1]=uniform_distribution_position_y(generateur);
404 centre_prim[2]=uniform_distribution_position_z(generateur);
408 double rayon_cercle=-1;
413 double rayon_tore=-1;
437 double angle_rotation=0.0;
438 angle_rotation=-angle_seg/2.;
442 theta = 2.0*M_PI*theta;
443 phi=
acos(2.0*phi-1.0);
444 axe[0]=
sin(phi)*
cos(theta);
445 axe[1]=
sin(phi)*
sin(theta);
449 axe[0]=vct_axe.
get_x();
450 axe[1]=vct_axe.
get_y();
451 axe[2]=vct_axe.
get_z();
460 double centre_loc[3];
461 centre_loc[0]=((
cos(phi)*
cos(theta)*centre_prim[0])+(
sin(theta)*
cos(phi)*centre_prim[1])-(
sin(phi)*centre_prim[2]))-rayon_cercle;
462 centre_loc[1]=((
cos(theta)*centre_prim[1])-(
sin(theta)*centre_prim[0]));
463 centre_loc[2]=((
sin(phi)*
cos(theta)*centre_prim[0])+(
sin(phi)*
sin(theta)*centre_prim[1])+(
cos(phi)*centre_prim[2]));
466 centre[0]=(
sin(phi)*
cos(theta)*centre_loc[2])+(
cos(phi)*
cos(theta)*centre_loc[0])-(
sin(theta)*centre_loc[1]);
467 centre[1]=(
sin(phi)*
sin(theta)*centre_loc[2])+(
sin(theta)*
cos(phi)*centre_loc[0])+(
cos(theta)*centre_loc[1]);
468 centre[2]=(
cos(phi)*centre_loc[2])-(
sin(phi)*centre_loc[0]);
471 MG_CG_FORME_VOLUME_TORE* tore_test =
MG_CG::creer_MG_CG_FORME_VOLUME_TORE(
m_mgcg_modele,centre[0],centre[1],centre[2],axe[0],axe[1],axe[2],rayon_cercle,rayon_tore,angle_seg,angle_rotation);
476 std::vector<MG_CG_FORME*> vector_forme;
477 int position_relative;
479 if(
insertion_inclusion(tore_test,fraction_volumique_cible,eps_frac_vol,fraction_volumique,vector_forme,position_relative,vector_epaisseur_couches,porosite)==
OK)
482 std::vector<MG_CG_FORME*>::iterator it_forme;
483 std::vector<MG_CG_GROUPE_FORME*>::iterator it_groupe_forme;
484 it_groupe_forme=vct_groupe_forme.begin();
485 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++,it_groupe_forme++)
491 if(it_forme==vector_forme.begin())
509 sprintf(message,
"IT [%6li/%6li max] : Torus # [%4li] : Fraction volumique [%.6lf / %.6lf] : Position %s",
510 iteration,
m_nb_iteration_max,nb_inclusion,fraction_volumique,fraction_volumique_cible,position);
517 fraction_volumique_actuelle=fraction_volumique;
518 return fraction_volumique;
692 double mu_rayon_majeur,
double sigma_rayon_majeur,
int type_distribution_rayon_majeur,
693 double mu_rayon_mineur,
double sigma_rayon_mineur,
int type_distribution_rayon_mineur,
694 double mu_theta,
double sigma_theta,
int type_distribution_theta,
695 double mu_phi,
double sigma_phi,
int type_distribution_phi,
696 double fraction_volumique_cible ,
double eps_frac_vol,
697 double& fraction_volumique_actuelle,
698 std::vector<double>* vector_epaisseur_couches,
703 std::vector<MG_CG_GROUPE_FORME*> vct_groupe_forme;
705 std::random_device seed;
706 std::mt19937_64 generateur(seed());
710 std::normal_distribution<double> normal_distribution_rayon_majeur(mu_rayon_majeur,sigma_rayon_majeur);
711 std::uniform_real_distribution<double> uniform_distribution_rayon_majeur(mu_rayon_majeur-sigma_rayon_majeur,mu_rayon_majeur+sigma_rayon_majeur);
712 std::normal_distribution<double> normal_distribution_rayon_mineur(mu_rayon_mineur,sigma_rayon_mineur);
713 std::uniform_real_distribution<double> uniform_distribution_rayon_mineur(mu_rayon_mineur-sigma_rayon_mineur,mu_rayon_mineur+sigma_rayon_mineur);
714 std::normal_distribution<double> normal_distribution_theta(mu_theta,sigma_theta);
715 std::uniform_real_distribution<double> uniform_distribution_theta(0,sigma_theta);
716 std::normal_distribution<double> normal_distribution_phi(mu_phi,sigma_phi);
717 std::uniform_real_distribution<double> uniform_distribution_phi(0,sigma_phi);
730 double fraction_volumique=fraction_volumique_actuelle;
733 while(fraction_volumique<fraction_volumique_cible-eps_frac_vol && iteration<
m_nb_iteration_max)
736 extremite[0]=uniform_distribution_position_x(generateur);
737 extremite[1]=uniform_distribution_position_y(generateur);
738 extremite[2]=uniform_distribution_position_z(generateur);
739 double rayon_majeur=-1;
743 double rayon_mineur=-1;
756 theta = 2.0*M_PI*theta;
757 phi=
acos(2.0*phi-1.0);
758 axe[0]=
sin(phi)*
cos(theta);
759 axe[1]=
sin(phi)*
sin(theta);
763 axe[0]=vct_axe.
get_x();
764 axe[1]=vct_axe.
get_y();
765 axe[2]=vct_axe.
get_z();
768 std::vector<MG_CG_FORME*> vector_forme;
769 int position_relative;
770 if(
insertion_inclusion(ellipsoide_test,fraction_volumique_cible,eps_frac_vol,fraction_volumique,vector_forme,position_relative,vector_epaisseur_couches,porosite)==
OK)
773 std::vector<MG_CG_FORME*>::iterator it_forme;
774 std::vector<MG_CG_GROUPE_FORME*>::iterator it_groupe_forme;
775 it_groupe_forme=vct_groupe_forme.begin();
776 for(it_forme=vector_forme.begin();it_forme!=vector_forme.end();it_forme++,it_groupe_forme++)
781 if(it_forme==vector_forme.begin())
797 sprintf(message,
"IT [%6li/%6li max] : Ellipsoide # [%4li] : Fraction volumique [%.6lf / %.6lf] : Position %s",
798 iteration,
m_nb_iteration_max,nb_inclusion,fraction_volumique,fraction_volumique_cible,position);
803 fraction_volumique_actuelle=fraction_volumique;
804 return fraction_volumique;
815 std::vector<MG_CG_GROUPE_FORME*>::iterator it_gr_forme;
819 std::map<long,MG_CG_FORME*>::iterator it_forme;
822 MG_CG_INFO* info_porosite = forme->get_mgcg_info((
char*)
"POROSITE");
823 if(info_porosite!=NULL)
continue;