70 arbre =
new MG_ARBRE(
"Arbre");
114 affiche((
char*)
"Evaluation de la geometrie :\n");
167 affiche((
char*)
"Generation VER Homogene :\n");
169 arbre->ajouter_mg_primitive(cube);
177 affiche((
char*)
"Generation VER Une Inclusion :\n");
179 arbre->ajouter_mg_primitive(cube);
182 MG_PRIMITIVE *matrice;
183 MG_PRIMITIVE *inclusion;
184 MG_PRIMITIVE *inclusion_outil;
188 switch(type_inclusion)
192 double xmin,ymin,zmin,xmax,ymax,zmax;
193 double longueur_x,longueur_y,longueur_z;
197 xmin =
dim_VES[0]/2.-(longueur_x/2.);
198 ymin =
dim_VES[1]/2.-(longueur_y/2.);
199 zmin =
dim_VES[2]/2.-(longueur_z/2.);
200 xmax =
dim_VES[0]/2.+(longueur_x/2.);
201 ymax =
dim_VES[1]/2.+(longueur_y/2.);
202 zmax =
dim_VES[2]/2.+(longueur_z/2.);
203 inclusion =
new MG_PRIMITIVE_BOITE(xmin,ymin,zmin,xmax,ymax,zmax);
204 inclusion_outil =
new MG_PRIMITIVE_BOITE(xmin,ymin,zmin,xmax,ymax,zmax);
220 arbre->ajouter_mg_primitive(inclusion_outil);
221 arbre->ajouter_mg_primitive(inclusion);
222 inclusion_outil->construit();
223 inclusion->construit();
225 matrice=op_difference->construit();
226 arbre->ajouter_mg_operateur_boolean(op_difference);
227 arbre->ajouter_mg_primitive(matrice);
235 affiche((
char*)
"Generation VES Aleatoire :\n");
237 arbre->ajouter_mg_primitive(cube);
243 double facteur_distance=1.1;
244 switch(type_inclusion)
254 std::random_device seed;
255 std::mt19937_64 generateur(seed());
256 std::normal_distribution<double> distribution_longueur_x(mu_longueur_x,sigma_longueur_x);
257 std::normal_distribution<double> distribution_longueur_y(mu_longueur_y,sigma_longueur_y);
258 std::normal_distribution<double> distribution_longueur_z(mu_longueur_z,sigma_longueur_z);
260 std::uniform_real_distribution<double> distribution_position_x(-mu_longueur_x,
dim_VES[0]+mu_longueur_x);
261 std::uniform_real_distribution<double> distribution_position_y(-mu_longueur_y,
dim_VES[1]+mu_longueur_y);
262 std::uniform_real_distribution<double> distribution_position_z(-mu_longueur_z,
dim_VES[2]+mu_longueur_z);
263 double frac_volumique=0;
264 double volume_inclusion=0;
268 double nb_pas_grille;
269 nb_pas_grille = std::max(
dim_VES[0]/(mu_longueur_x-3*sigma_longueur_x),
dim_VES[1]/(mu_longueur_y-3*sigma_longueur_y));
270 nb_pas_grille = std::max(nb_pas_grille,
dim_VES[2]/(mu_longueur_z-3*sigma_longueur_z));
272 long id_sphere_grille=0;
273 std::vector<SPHERE_GRILLE*> vector_sphere_grille;
274 MG_PRIMITIVE* matrice_ves = cube;
275 while(frac_volumique< cible_frac_volumique && nb_inclusion<nb_max_inclusion && it<it_max)
278 position[0] = distribution_position_x(generateur);
279 position[1] = distribution_position_y(generateur);
280 position[2] = distribution_position_z(generateur);
282 longueur[0] = distribution_longueur_x(generateur);
283 longueur[1] = distribution_longueur_y(generateur);
284 longueur[2] = distribution_longueur_z(generateur);
285 double rayon_sphere_grille =
sqrt(0.5*longueur[0]*0.5*longueur[0]+0.5*longueur[1]*0.5*longueur[1]+0.5*longueur[2]*0.5*longueur[2]);
286 bool ok_position=
true;
287 if((position[0])<0.05) ok_position=
false;
288 else if((position[1])<0.05) ok_position=
false;
289 else if((position[2])<0.05) ok_position=
false;
290 else if((position[0]+longueur[0])>(
dim_VES[0]-0.05)) ok_position=
false;
291 else if((position[1]+longueur[1])>(
dim_VES[1]-0.05)) ok_position=
false;
292 else if((position[2]+longueur[2])>(
dim_VES[2]-0.05)) ok_position=
false;
295 double rayon_recherche = rayon_sphere_grille*facteur_distance;
297 grille.
rechercher(position[0]+0.5*longueur[0],position[1]+0.5*longueur[1],position[2]+0.5*longueur[2],rayon_recherche,map_recherche);
299 if(map_recherche.
get_nb()>0)
305 sph->get_xyz(xyz_sph);
306 if(
sqrt((xyz_sph[0]-(position[0]+0.5*longueur[0]))*(xyz_sph[0]-(position[0]+0.5*longueur[0]))+
307 (xyz_sph[1]-(position[1]+0.5*longueur[1]))*(xyz_sph[1]-(position[1]+0.5*longueur[1]))+
308 (xyz_sph[2]-(position[2]+0.5*longueur[2]))*(xyz_sph[2]-(position[2]+0.5*longueur[2])))<(1.1*(sph->get_rayon()+rayon_sphere_grille)))
312 else if(map_recherche.
get_nb()==0) ok_insert=
true;
315 MG_PRIMITIVE_BOITE *boite =
new MG_PRIMITIVE_BOITE(position[0],position[1],position[2],position[0]+longueur[0],position[1]+longueur[1],position[2]+longueur[2]);
317 MG_PRIMITIVE_BOITE *boite_outil =
new MG_PRIMITIVE_BOITE(position[0],position[1],position[2],position[0]+longueur[0],position[1]+longueur[1],position[2]+longueur[2]);
318 boite_outil->construit();
319 if(((position[0] > 0.0) && ((position[0]+longueur[0]) <
dim_VES[0])) &&
320 ((position[1] > 0.0) && ((position[1]+longueur[1]) <
dim_VES[1])) &&
321 ((position[2] > 0.0) && ((position[2]+longueur[2]) <
dim_VES[0])))
324 sprintf(message,
"Inclusion #%li",id_sphere_grille);
327 arbre->ajouter_mg_primitive(boite);
328 arbre->ajouter_mg_primitive(boite_outil);
329 MG_OPERATEUR_BOOLEAN_DIFFERENCE *op_difference=
new MG_OPERATEUR_BOOLEAN_DIFFERENCE(
MAGIC::SEMANTIQUECSG::SANS,matrice_ves,boite_outil);
330 matrice_ves=op_difference->construit();
331 arbre->ajouter_mg_operateur_boolean(op_difference);
333 volume_inclusion+=boite->get_volume();
334 SPHERE_GRILLE *sp =
new SPHERE_GRILLE(position[0]+0.5*longueur[0],position[1]+0.5*longueur[1],position[2]+0.5*longueur[2],rayon_sphere_grille,id_sphere_grille);
335 vector_sphere_grille.push_back(sp);
344 cube_inter->construit();
345 MG_OPERATEUR_BOOLEAN_INTERSECTION *op_intersection =
new MG_OPERATEUR_BOOLEAN_INTERSECTION(
MAGIC::SEMANTIQUECSG::SANS,boite,cube_inter);
347 MG_PRIMITIVE *boite_inter = op_intersection->construit();
348 if(boite_inter->get_volume()> 0.25*(boite->get_volume()))
350 volume_inclusion+=boite_inter->get_volume();
352 sprintf(message,
"Inclusion #%li : COUPÉE",id_sphere_grille);
355 MG_OPERATEUR_BOOLEAN_DIFFERENCE *op_difference=
new MG_OPERATEUR_BOOLEAN_DIFFERENCE(
MAGIC::SEMANTIQUECSG::SANS,matrice_ves,boite_outil);
356 matrice_ves=op_difference->construit();
357 arbre->ajouter_mg_primitive(boite);
358 arbre->ajouter_mg_primitive(boite_outil);
359 arbre->ajouter_mg_operateur_boolean(op_difference);
360 arbre->ajouter_mg_primitive(boite_inter);
361 arbre->ajouter_mg_primitive(cube_inter);
362 assemblage->ajouter_mg_primitive(boite_inter);
363 SPHERE_GRILLE *sp =
new SPHERE_GRILLE(position[0]+0.5*longueur[0],position[1]+0.5*longueur[1],position[2]+0.5*longueur[2],rayon_sphere_grille,id_sphere_grille);
364 vector_sphere_grille.push_back(sp);
375 delete op_intersection;
378 frac_volumique = volume_inclusion/(cube->get_volume());
383 arbre->ajouter_mg_primitive(matrice_ves);
384 assemblage->ajouter_mg_primitive(matrice_ves);
386 sprintf(message,
"echo -n %li:%lf: >> resultats.txt",nb_inclusion,frac_volumique);
396 char nom_fichier[1000];
398 bool export_STEP, avec_fusion,import_STL;
402 double precision,eps;
405 arbre->evaluer_geometrie(
assemblage,nom_fichier,avec_fusion,export_STEP,import_STL,precision,eps);
411 affiche((
char*)
"Maillage du VER :");
416 affiche((
char*)
" Maillage 0D :");
419 affiche((
char*)
" Maillage 1D :");
423 affiche((
char*)
" Maillage 2D :");
427 affiche((
char*)
" Maillage 3D :");
440 affiche((
char*)
"Generation de carte de taille constante V1");
445 affiche((
char*)
"Construction de la carte");
446 carte->
construit(fechantillonnage,festimation);
447 affiche((
char*)
"Enregistrement de la carte");
448 char nom_fichier[1000];
464 face->ajouter_ccf(condition,valeur);
465 if(topo_sous_jacente==
true)
468 face->get_topologie_sousjacente(&map_topo);
472 topo->ajouter_ccf(condition,valeur);
485 face->ajouter_ccf(condition,formule,listvariable);
486 if(topo_sous_jacente==
true)
489 face->get_topologie_sousjacente(&map_topo);
493 topo->ajouter_ccf(condition,formule,listvariable);
516 std::map<unsigned long,MG_FACE*,std::less<unsigned long>>::iterator it_face;
552 std::map<unsigned long,MG_SOMMET*,std::less<unsigned long>>::iterator it_sommet;
578 switch(type_chargement)
622 char chr_valeur_cl[1000];
623 sprintf(chr_valeur_cl,
"%lf",valeur_cl);
624 std::string str_valeur_cl = chr_valeur_cl;
625 std::string formule_Dx = str_valeur_cl+
"*Y";
626 std::string formule_Dy = str_valeur_cl+
"*Z";
627 std::string formule_Dz = str_valeur_cl+
"*X";
628 std::vector<std::string> liste_variable_formule_Dx;
629 std::vector<std::string> liste_variable_formule_Dy;
630 std::vector<std::string> liste_variable_formule_Dz;
631 liste_variable_formule_Dx.push_back((std::string)
"Y");
632 liste_variable_formule_Dy.push_back((std::string)
"Z");
633 liste_variable_formule_Dz.push_back((std::string)
"X");
698 std::map<unsigned long,MG_VOLUME*,std::less<unsigned long>>::iterator it_volume;
702 volume->ajouter_ccf((
char*)
"Em",Em_inclu);
751 double traces=sxx+syy+szz;
752 double tracee=exx+eyy+ezz;
755 sprintf(message,
"Tenseur des deformations :");
affiche(message);
756 sprintf(message,
" | exx=% 3.2le exy=% 3.2le exz=% 3.2le |",exx,exy,exz);
affiche(message);
757 sprintf(message,
" | exy=% 3.2le eyy=% 3.2le eyz=% 3.2le |",exy,eyy,eyz);
affiche(message);
758 sprintf(message,
" | exz=% 3.2le eyz=% 3.2le ezz=% 3.2le |",exz,eyz,ezz);
affiche(message);
760 sprintf(message,
" Trace e = % 3.2le",tracee);
affiche(message);
762 sprintf(message,
"Tenseur des contraintes :");
affiche(message);
763 sprintf(message,
" | sxx=% 3.2le sxy=% 3.2le sxz=% 3.2le |",sxx,sxy,sxz);
affiche(message);
764 sprintf(message,
" | sxy=% 3.2le syy=% 3.2le syz=% 3.2le |",sxy,syy,syz);
affiche(message);
765 sprintf(message,
" | sxz=% 3.2le syz=% 3.2le szz=% 3.2le |",sxz,syz,szz);
affiche(message);
767 sprintf(message,
" Trace s = % 3.2le",traces);
affiche(message);
772 double K = traces/3./tracee;
773 sprintf(message,
"Module de compressibilite apparent :");
affiche(message);
774 sprintf(message,
" Kapp = % 3.5le",K);
affiche(message);
775 char messagesortie[1000];
776 sprintf(messagesortie,
"echo %lf >> resultats.txt",K);
777 system(messagesortie);
781 double G = (1./3.)*((syz/(2.*eyz))+(sxz/(2.*exz))+(sxy/(2.*exy)));
782 sprintf(message,
"Module de cisaillement apparent :");
affiche(message);
783 sprintf(message,
" Gapp = % 3.5le",G);
affiche(message);
784 char messagesortie[1000];
785 sprintf(messagesortie,
"echo %lf >> resultats.txt",G);
786 system(messagesortie);