ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/microstructure/src/ve_ves.cpp
Revision: 1075
Committed: Tue Aug 10 17:02:54 2021 UTC (4 years ago) by francois
File size: 33544 byte(s)
Log Message:
suppression de warning avec le dernier compilateur

File Contents

# Content
1 //------------------------------------------------------------
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_ves.cpp
16 //
17 //------------------------------------------------------------
18 //------------------------------------------------------------
19 // COPYRIGHT 2000
20 // Version du 02/03/2006 � 11H23
21 //------------------------------------------------------------
22 //------------------------------------------------------------
23
24 #include "ve_ves.h"
25 #include "ve_definition.h"
26 #include "gestionversion.h"
27 #include "mg_gestionnaire.h"
28 #include "mg_arbre.h"
29 #include "mg_assemblage.h"
30 #include "mg_primitive.h"
31 #include "mg_primitive_boite.h"
32 #include "mg_primitive_sphere.h"
33 #include "mg_primitive_cylindre.h"
34 #include "mg_primitive_cone.h"
35 #include "mg_primitive_tore.h"
36 #include "mg_primitive_complexe.h"
37 #include "mg_operateur_boolean.h"
38 #include "mg_operateur_boolean_difference.h"
39 #include "mg_operateur_boolean_intersection.h"
40 #include "mg_operateur_boolean_union.h"
41 #include "mg_sommet_noeud.h"
42 #include "fct_taille.h"
43 #include "fct_generateur_frontiere.h"
44 #include "fct_generateur_constante.h"
45 #include "fct_generateur_fichier.h"
46 #include "fct_taille_fem_solution_generateur_constant.h"
47 #include "fct_taille_fem_solution_generateur_echantillon_frontiere.h"
48 #include "fct_taille_fem_solution_generateur_fichier.h"
49 #include "mailleur.h"
50 #include "mailleur0d.h"
51 #include "mailleur1d.h"
52 #include "mailleur2d.h"
53 #include "mailleur3d.h"
54 #include "mailleur_fem.h"
55 #include "tpl_map_entite.h"
56 #include "ot_mathematique.h"
57 #include "fem_maillage.h"
58 #include "mgaster.h"
59 #include "mg_export.h"
60 #include "sphere_grille.h"
61 #include <string.h>
62 #include <map>
63 #include <random>
64 #include <stdio.h>
65 #include <iostream>
66 #include <chrono>
67
68 VE_VES::VE_VES()
69 {
70 gest = new MG_GESTIONNAIRE;
71 arbre = new MG_ARBRE("Arbre");
72 assemblage = new MG_ASSEMBLAGE("Assemblage");
73 param_ver = new OT_PARAMETRES();
74 gest->ajouter_mg_arbre(arbre);
75 arbre->ajouter_mg_assemblage(assemblage);
76 ini_param_VER(param_ver);
77 dim_VES[0] = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_Dim_longueur_x]);
78 dim_VES[1] = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_Dim_longueur_y]);
79 dim_VES[2] = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_Dim_longueur_z]);
80 }
81
82 VE_VES::VE_VES(VE_VES& mdd)
83 {
84
85 }
86
87 VE_VES::~VE_VES()
88 {
89 delete assemblage;
90 delete param_ver;
91 delete gest;
92 }
93
94 int VE_VES::construire(void)
95 {
96 int type_ver = (int)param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_Type]);
97 switch(type_ver)
98 {
99 case VE_TYPE_VER::HOMOGENE:
100 {
101 generer_VES_homogene();
102 break;
103 }
104 case VE_TYPE_VER::UNE_INCLUSION:
105 {
106 generer_VES_une_inclusion();
107 break;
108 }
109 case VE_TYPE_VER::ALEATOIRE:
110 {
111 generer_VES_aleatoire();
112 break;
113 }
114 }
115 affiche((char*)"Evaluation de la geometrie :\n");
116 evaluer_geometrie();
117 creer_carte();
118 creer_mg_maillage();
119 appliquer_conditions_limites(param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_CL_CHARGEMENT_type]));
120 appliquer_materiaux();
121 creer_fem_maillage();
122 calcul_aster();
123 homogeneisation();
124 // char nom_fichier_magic[1000];
125 // sprintf(nom_fichier_magic,"%s",param_ver->get_nom(VE_PARAM_CHAR[VE_PARAM::VE_IO_nom_fichier_MAGiC]).c_str());
126 // gest->enregistrer(nom_fichier_magic);
127 return 0;
128 }
129
130 MG_GESTIONNAIRE* VE_VES::get_gestionnaire(void)
131 {
132 return gest;
133 }
134
135 MG_ARBRE* VE_VES::get_arbre(void)
136 {
137 return arbre;
138 }
139
140 MG_ASSEMBLAGE* VE_VES::get_assemblage(void)
141 {
142 return assemblage;
143 }
144
145 void VE_VES::active_affichage(fonction_affiche* fonc)
146 {
147 fonc_affiche = fonc;
148 affichageactif = 1;
149 }
150
151 void VE_VES::affiche(char* message)
152 {
153 if(affichageactif==1) fonc_affiche(message);
154 }
155
156 void VE_VES::lire_param_VES(char* fichier)
157 {
158 param_ver->lire(fichier);
159 dim_VES[0] = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_Dim_longueur_x]);
160 dim_VES[1] = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_Dim_longueur_y]);
161 dim_VES[2] = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_Dim_longueur_z]);
162 }
163
164 void VE_VES::ecrire_param_VES(char* fichier)
165 {
166 param_ver->enregistrer(fichier);
167 }
168
169 int VE_VES::generer_VES_homogene(void)
170 {
171 affiche((char*)"Generation VER Homogene :\n");
172 MG_PRIMITIVE_BOITE *cube = new MG_PRIMITIVE_BOITE(0,0,0,dim_VES[0],dim_VES[1],dim_VES[2]);
173 arbre->ajouter_mg_primitive(cube);
174 cube->construit();
175 assemblage->ajouter_mg_primitive(cube);
176 return 0;
177 }
178
179 int VE_VES::generer_VES_une_inclusion(void)
180 {
181 affiche((char*)"Generation VER Une Inclusion :\n");
182 MG_PRIMITIVE_BOITE *cube = new MG_PRIMITIVE_BOITE(0,0,0,dim_VES[0],dim_VES[1],dim_VES[2]);
183 arbre->ajouter_mg_primitive(cube);
184 cube->construit();
185
186 MG_PRIMITIVE *matrice;
187 MG_PRIMITIVE *inclusion;
188 MG_PRIMITIVE *inclusion_outil;
189
190
191 int type_inclusion = (int)param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Type_INCLUSION]);
192 switch(type_inclusion)
193 {
194 case VE_TYPE_INCLUSION::BOITE:
195 {
196 double xmin,ymin,zmin,xmax,ymax,zmax;
197 double longueur_x,longueur_y,longueur_z;
198 longueur_x = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_mu_longueur_x]);
199 longueur_y = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_mu_longueur_y]);
200 longueur_z = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_mu_longueur_z]);
201 xmin = dim_VES[0]/2.-(longueur_x/2.);
202 ymin = dim_VES[1]/2.-(longueur_y/2.);
203 zmin = dim_VES[2]/2.-(longueur_z/2.);
204 xmax = dim_VES[0]/2.+(longueur_x/2.);
205 ymax = dim_VES[1]/2.+(longueur_y/2.);
206 zmax = dim_VES[2]/2.+(longueur_z/2.);
207 inclusion = new MG_PRIMITIVE_BOITE(xmin,ymin,zmin,xmax,ymax,zmax);
208 inclusion_outil = new MG_PRIMITIVE_BOITE(xmin,ymin,zmin,xmax,ymax,zmax);
209 break;
210 }
211 case VE_TYPE_INCLUSION::SPHERE:
212 {
213 double rayon;
214 rayon = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_mu_rayon]);
215 inclusion = new MG_PRIMITIVE_SPHERE(dim_VES[0]/2.,dim_VES[1]/2.,dim_VES[2]/2.,rayon);
216 inclusion_outil = new MG_PRIMITIVE_SPHERE(dim_VES[0]/2.,dim_VES[1]/2.,dim_VES[2]/2.,rayon);
217 break;
218 }
219 case VE_TYPE_INCLUSION::CYLINDRE:
220 {
221 break;
222 }
223 }
224 arbre->ajouter_mg_primitive(inclusion_outil);
225 arbre->ajouter_mg_primitive(inclusion);
226 inclusion_outil->construit();
227 inclusion->construit();
228 MG_OPERATEUR_BOOLEAN_DIFFERENCE *op_difference=new MG_OPERATEUR_BOOLEAN_DIFFERENCE(MAGIC::SEMANTIQUECSG::SOUSTRACTION,cube,inclusion_outil);
229 matrice=op_difference->construit();
230 arbre->ajouter_mg_operateur_boolean(op_difference);
231 arbre->ajouter_mg_primitive(matrice);
232 assemblage->ajouter_mg_primitive(inclusion);
233 assemblage->ajouter_mg_primitive(matrice);
234 return 0;
235 }
236
237 int VE_VES::generer_VES_aleatoire(void)
238 {
239 affiche((char*)"Generation VES Aleatoire :\n");
240 MG_PRIMITIVE_BOITE *cube = new MG_PRIMITIVE_BOITE(0,0,0,dim_VES[0],dim_VES[1],dim_VES[2]);
241 arbre->ajouter_mg_primitive(cube);
242 cube->construit();
243 TPL_GRILLE<SPHERE_GRILLE*> grille;
244 double cible_frac_volumique = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_pourcentage_volumique]);
245 long nb_max_inclusion = (long)param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_nb_max]);
246 int type_inclusion = (int)param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Type_INCLUSION]);
247 double facteur_distance=1.1;
248 switch(type_inclusion)
249 {
250 case VE_TYPE_INCLUSION::BOITE:
251 {
252 double mu_longueur_x = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_mu_longueur_x]);
253 double sigma_longueur_x = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_sigma_longueur_x]);
254 double mu_longueur_y = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_mu_longueur_y]);
255 double sigma_longueur_y = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_sigma_longueur_y]);
256 double mu_longueur_z = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_mu_longueur_z]);
257 double sigma_longueur_z = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_sigma_longueur_z]);
258 std::random_device seed;
259 std::mt19937_64 generateur(seed());
260 std::normal_distribution<double> distribution_longueur_x(mu_longueur_x,sigma_longueur_x);
261 std::normal_distribution<double> distribution_longueur_y(mu_longueur_y,sigma_longueur_y);
262 std::normal_distribution<double> distribution_longueur_z(mu_longueur_z,sigma_longueur_z);
263
264 std::uniform_real_distribution<double> distribution_position_x(-mu_longueur_x,dim_VES[0]+mu_longueur_x);
265 std::uniform_real_distribution<double> distribution_position_y(-mu_longueur_y,dim_VES[1]+mu_longueur_y);
266 std::uniform_real_distribution<double> distribution_position_z(-mu_longueur_z,dim_VES[2]+mu_longueur_z);
267 double frac_volumique=0;
268 double volume_inclusion=0;
269 long nb_inclusion=0;
270 long it_max=10000;
271 long it=0;
272 double nb_pas_grille;
273 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));
274 nb_pas_grille = std::max(nb_pas_grille,dim_VES[2]/(mu_longueur_z-3*sigma_longueur_z));
275 grille.initialiser(0,0,0,dim_VES[0],dim_VES[1],dim_VES[2],nb_pas_grille,nb_pas_grille,nb_pas_grille);
276 long id_sphere_grille=0;
277 std::vector<SPHERE_GRILLE*> vector_sphere_grille;
278 MG_PRIMITIVE* matrice_ves = cube;
279 while(frac_volumique< cible_frac_volumique && nb_inclusion<nb_max_inclusion && it<it_max)
280 {
281 double position[3];
282 position[0] = distribution_position_x(generateur);
283 position[1] = distribution_position_y(generateur);
284 position[2] = distribution_position_z(generateur);
285 double longueur[3];
286 longueur[0] = distribution_longueur_x(generateur);
287 longueur[1] = distribution_longueur_y(generateur);
288 longueur[2] = distribution_longueur_z(generateur);
289 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]);
290 bool ok_position=true;
291 // if((position[0])>0.0 && (position[0])<0.2) ok_position=false;
292 // else if((position[1])>0.0 && (position[1])<0.2) ok_position=false;
293 // else if((position[2])>0.0 && (position[2])<0.2) ok_position=false;
294 // else if((position[0]+longueur[0])<dim_VES[0] && (position[0]+longueur[0])>(dim_VES[0]-0.2)) ok_position=false;
295 // else if((position[1]+longueur[1])<dim_VES[1] && (position[1]+longueur[1])>(dim_VES[1]-0.2)) ok_position=false;
296 // else if((position[2]+longueur[2])<dim_VES[2] && (position[2]+longueur[2])>(dim_VES[2]-0.2)) ok_position=false;
297 if((position[0])<0.05) ok_position=false;
298 else if((position[1])<0.05) ok_position=false;
299 else if((position[2])<0.05) ok_position=false;
300 else if((position[0]+longueur[0])>(dim_VES[0]-0.05)) ok_position=false;
301 else if((position[1]+longueur[1])>(dim_VES[1]-0.05)) ok_position=false;
302 else if((position[2]+longueur[2])>(dim_VES[2]-0.05)) ok_position=false;
303 if(ok_position)
304 {
305 double rayon_recherche = rayon_sphere_grille*facteur_distance;
306 TPL_MAP_ENTITE<SPHERE_GRILLE*> map_recherche;
307 grille.rechercher(position[0]+0.5*longueur[0],position[1]+0.5*longueur[1],position[2]+0.5*longueur[2],rayon_recherche,map_recherche);
308 bool ok_insert=true;
309 if(map_recherche.get_nb()>0)
310 {
311 TPL_MAP_ENTITE<SPHERE_GRILLE*>::ITERATEUR it_map_recherche;
312 for(SPHERE_GRILLE* sph = map_recherche.get_premier(it_map_recherche);sph!=NULL;sph=map_recherche.get_suivant(it_map_recherche))
313 {
314 double xyz_sph[3];
315 sph->get_xyz(xyz_sph);
316 if(sqrt((xyz_sph[0]-(position[0]+0.5*longueur[0]))*(xyz_sph[0]-(position[0]+0.5*longueur[0]))+
317 (xyz_sph[1]-(position[1]+0.5*longueur[1]))*(xyz_sph[1]-(position[1]+0.5*longueur[1]))+
318 (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)))
319 ok_insert=false;
320 }
321 }
322 else if(map_recherche.get_nb()==0) ok_insert=true;
323 if(ok_insert)
324 {
325 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]);
326 boite->construit();
327 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]);
328 boite_outil->construit();
329 if(((position[0] > 0.0) && ((position[0]+longueur[0]) < dim_VES[0])) &&
330 ((position[1] > 0.0) && ((position[1]+longueur[1]) < dim_VES[1])) &&
331 ((position[2] > 0.0) && ((position[2]+longueur[2]) < dim_VES[0])))
332 {
333 char message[1000];
334 sprintf(message,"Inclusion #%li",id_sphere_grille);
335 affiche(message);
336 nb_inclusion++;
337 arbre->ajouter_mg_primitive(boite);
338 arbre->ajouter_mg_primitive(boite_outil);
339 MG_OPERATEUR_BOOLEAN_DIFFERENCE *op_difference=new MG_OPERATEUR_BOOLEAN_DIFFERENCE(MAGIC::SEMANTIQUECSG::SANS,matrice_ves,boite_outil);
340 matrice_ves=op_difference->construit();
341 arbre->ajouter_mg_operateur_boolean(op_difference);
342 assemblage->ajouter_mg_primitive(boite);
343 volume_inclusion+=boite->get_volume();
344 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);
345 vector_sphere_grille.push_back(sp);
346 grille.inserer(sp);
347 id_sphere_grille++;
348 it=0;
349 }
350 else
351 {
352
353 MG_PRIMITIVE_BOITE *cube_inter = new MG_PRIMITIVE_BOITE(0,0,0,dim_VES[0],dim_VES[1],dim_VES[2]);
354 cube_inter->construit();
355 MG_OPERATEUR_BOOLEAN_INTERSECTION *op_intersection = new MG_OPERATEUR_BOOLEAN_INTERSECTION(MAGIC::SEMANTIQUECSG::SANS,boite,cube_inter);
356 //MG_OPERATEUR_BOOLEAN_INTERSECTION *op_intersection = new MG_OPERATEUR_BOOLEAN_INTERSECTION(MAGIC::SEMANTIQUECSG::SANS,cube_inter,boite);
357 MG_PRIMITIVE *boite_inter = op_intersection->construit();
358 if(boite_inter->get_volume()> 0.25*(boite->get_volume()))
359 {
360 volume_inclusion+=boite_inter->get_volume();
361 char message[1000];
362 sprintf(message,"Inclusion #%li : COUPÉE",id_sphere_grille);
363 affiche(message);
364 nb_inclusion++;
365 MG_OPERATEUR_BOOLEAN_DIFFERENCE *op_difference=new MG_OPERATEUR_BOOLEAN_DIFFERENCE(MAGIC::SEMANTIQUECSG::SANS,matrice_ves,boite_outil);
366 matrice_ves=op_difference->construit();
367 arbre->ajouter_mg_primitive(boite);
368 arbre->ajouter_mg_primitive(boite_outil);
369 arbre->ajouter_mg_operateur_boolean(op_difference);
370 arbre->ajouter_mg_primitive(boite_inter);
371 arbre->ajouter_mg_primitive(cube_inter);
372 assemblage->ajouter_mg_primitive(boite_inter);
373 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);
374 vector_sphere_grille.push_back(sp);
375 grille.inserer(sp);
376 id_sphere_grille++;
377 it=0;
378 }
379 else
380 {
381 delete boite;
382 delete boite_outil;
383 delete boite_inter;
384 delete cube_inter;
385 delete op_intersection;
386 }
387 }
388 frac_volumique = volume_inclusion/(cube->get_volume());
389 }
390 it++;
391 }
392 }
393 arbre->ajouter_mg_primitive(matrice_ves);
394 assemblage->ajouter_mg_primitive(matrice_ves);
395 char message[1000];
396 sprintf(message,"echo -n %li:%lf: >> resultats.txt",nb_inclusion,frac_volumique);
397 system(message);
398 break;
399 }
400 }
401 return 0;
402 }
403
404 int VE_VES::evaluer_geometrie(void)
405 {
406 char nom_fichier[1000];
407 sprintf(nom_fichier,"%s",param_ver->get_nom(VE_PARAM_CHAR[VE_PARAM::VE_IO_nom_fichier_STEP_BREP]).c_str());
408 bool export_STEP, avec_fusion,import_STL;
409 export_STEP = (int)param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_IO_Bool_export_STEP]);
410 avec_fusion = (int)param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_IO_Bool_fusion]);
411 import_STL = (int)param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_IO_Bool_import_STL]);
412 double precision,eps;
413 precision = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_Dim_precision]);
414 eps = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_IO_STL_eps]);
415 arbre->evaluer_geometrie(assemblage,nom_fichier,avec_fusion,export_STEP,import_STL,precision,eps);
416 return 0;
417 }
418
419 int VE_VES::creer_mg_maillage(void)
420 {
421 affiche((char*)"Maillage du VER :");
422 MG_GEOMETRIE *geo = gest->get_mg_geometrie(0);
423 MG_MAILLAGE *maillage = new MG_MAILLAGE(geo);
424 gest->ajouter_mg_maillage(maillage);
425 MAILLEUR0D m0d(maillage,geo);
426 affiche((char*)" Maillage 0D :");
427 m0d.maille();
428 MAILLEUR1D m1d(maillage,geo,metrique);
429 affiche((char*)" Maillage 1D :");
430 //m1d.active_affichage(fonc_affiche);
431 m1d.maille();
432 MAILLEUR2D m2d(maillage,geo,metrique);
433 affiche((char*)" Maillage 2D :");
434 //m2d.active_affichage(fonc_affiche);
435 m2d.maille();
436 MAILLEUR3D m3d(maillage,geo,metrique,false);
437 affiche((char*)" Maillage 3D :");
438 m3d.active_affichage(fonc_affiche);
439 m3d.maille();
440 return 0;
441 }
442
443 int VE_VES::creer_carte(void)
444 {
445 int type_carte = (int)param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_CARTE_Type]);
446 switch(type_carte)
447 {
448 case VE_TYPE_CARTE::CONSTANTE:
449 {
450 affiche((char*)"Generation de carte de taille constante V1");
451 double ecart_nodal = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_CARTE_Dim_ecart_nodal]);
452 double fechantillonnage = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_CARTE_Dim_fechantillonnage]);
453 double festimation = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_CARTE_Dim_festimation]);
454 FCT_GENERATEUR_CONSTANTE *carte = new FCT_GENERATEUR_CONSTANTE(*gest,ecart_nodal);
455 affiche((char*)"Construction de la carte");
456 carte->construit(fechantillonnage,festimation);
457 affiche((char*)"Enregistrement de la carte");
458 char nom_fichier[1000];
459 sprintf(nom_fichier,"%s",param_ver->get_nom(VE_PARAM_CHAR[VE_PARAM::VE_IO_nom_fichier_CARTE]).c_str());
460 carte->enregistrer(nom_fichier);
461 metrique = carte;
462 affiche((char*)"Fin");
463 break;
464 }
465 }
466 return 0;
467 }
468
469 int VE_VES::appliquer_conditions_limites_plan(TPL_MAP_ENTITE< MG_FACE* >* plan, char* condition, double valeur,bool topo_sous_jacente)
470 {
471 TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face_plan;
472 for(MG_FACE *face = plan->get_premier(it_face_plan);face!=NULL;face=plan->get_suivant(it_face_plan))
473 {
474 face->ajouter_ccf(condition,valeur);
475 if(topo_sous_jacente==true)
476 {
477 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> map_topo;
478 face->get_topologie_sousjacente(&map_topo);
479 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it_topo;
480 for(MG_ELEMENT_TOPOLOGIQUE *topo=map_topo.get_premier(it_topo);topo!=NULL;topo=map_topo.get_suivant(it_topo))
481 {
482 topo->ajouter_ccf(condition,valeur);
483 }
484 }
485 }
486 return 0;
487
488 }
489
490 int VE_VES::appliquer_conditions_limites_plan(TPL_MAP_ENTITE< MG_FACE* >* plan, char* condition, std::string formule,std::vector<std::string> &listvariable,bool topo_sous_jacente)
491 {
492 TPL_MAP_ENTITE<MG_FACE*>::ITERATEUR it_face_plan;
493 for(MG_FACE *face = plan->get_premier(it_face_plan);face!=NULL;face=plan->get_suivant(it_face_plan))
494 {
495 face->ajouter_ccf(condition,formule,listvariable);
496 if(topo_sous_jacente==true)
497 {
498 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> map_topo;
499 face->get_topologie_sousjacente(&map_topo);
500 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it_topo;
501 for(MG_ELEMENT_TOPOLOGIQUE *topo=map_topo.get_premier(it_topo);topo!=NULL;topo=map_topo.get_suivant(it_topo))
502 {
503 topo->ajouter_ccf(condition,formule,listvariable);
504 }
505 }
506 }
507 return 0;
508
509 }
510
511 int VE_VES::appliquer_conditions_limites(int type_chargement)
512 {
513 TPL_MAP_ENTITE<MG_FACE*> plan_xy_z0;
514 TPL_MAP_ENTITE<MG_FACE*> plan_xy_z1;
515 TPL_MAP_ENTITE<MG_FACE*> plan_yz_x0;
516 TPL_MAP_ENTITE<MG_FACE*> plan_yz_x1;
517 TPL_MAP_ENTITE<MG_FACE*> plan_xz_y0;
518 TPL_MAP_ENTITE<MG_FACE*> plan_xz_y1;
519 MG_SOMMET* sommet_origine;
520 MG_SOMMET* sommet_x1y0z0;
521 MG_SOMMET* sommet_x0y1z0;
522 MG_SOMMET* sommet_x0y0z1;
523 double eps = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_Dim_precision]);
524
525 MG_GEOMETRIE *geo = gest->get_mg_geometrie(0);
526 std::map<unsigned long,MG_FACE*,std::less<unsigned long>>::iterator it_face;
527 for(MG_FACE *face = geo->get_premier_face(it_face);face!=NULL;face=geo->get_suivant_face(it_face))
528 {
529 TPL_SET<MG_ELEMENT_MAILLAGE*> *liste_element_maillage = face->get_lien_maillage();
530 MG_TRIANGLE *tri = (MG_TRIANGLE*)liste_element_maillage->get(0);
531 MG_NOEUD *nd[3];
532 nd[0] = tri->get_noeud1();
533 nd[1] = tri->get_noeud2();
534 nd[2] = tri->get_noeud3();
535
536 if(OPERATEUR::egal(nd[0]->get_z(),0,eps) && OPERATEUR::egal(nd[1]->get_z(),0,eps) && OPERATEUR::egal(nd[2]->get_z(),0,eps))
537 {
538 plan_xy_z0.ajouter(face);
539 }
540 else if(OPERATEUR::egal(nd[0]->get_z(),dim_VES[2],eps) && OPERATEUR::egal(nd[1]->get_z(),dim_VES[2],eps) && OPERATEUR::egal(nd[2]->get_z(),dim_VES[2],eps))
541 {
542 plan_xy_z1.ajouter(face);
543 }
544 else if(OPERATEUR::egal(nd[0]->get_x(),0,eps) && OPERATEUR::egal(nd[1]->get_x(),0,eps) && OPERATEUR::egal(nd[2]->get_x(),0,eps))
545 {
546 plan_yz_x0.ajouter(face);
547 }
548 else if(OPERATEUR::egal(nd[0]->get_x(),dim_VES[0],eps) && OPERATEUR::egal(nd[1]->get_x(),dim_VES[0],eps) && OPERATEUR::egal(nd[2]->get_x(),dim_VES[0],eps))
549 {
550 plan_yz_x1.ajouter(face);
551 }
552 else if(OPERATEUR::egal(nd[0]->get_y(),0,eps) && OPERATEUR::egal(nd[1]->get_y(),0,eps) && OPERATEUR::egal(nd[2]->get_y(),0,eps))
553 {
554 plan_xz_y0.ajouter(face);
555 }
556 else if(OPERATEUR::egal(nd[0]->get_y(),dim_VES[1],eps) && OPERATEUR::egal(nd[1]->get_y(),dim_VES[1],eps) && OPERATEUR::egal(nd[2]->get_y(),dim_VES[1],eps))
557 {
558 plan_xz_y1.ajouter(face);
559 }
560 }
561
562 std::map<unsigned long,MG_SOMMET*,std::less<unsigned long>>::iterator it_sommet;
563 for(MG_SOMMET* som=geo->get_premier_sommet(it_sommet);som!=NULL;som=geo->get_suivant_sommet(it_sommet))
564 {
565 TPL_SET<MG_ELEMENT_MAILLAGE*> *liste_element_maillage = som->get_lien_maillage();
566 MG_NOEUD* nd = (MG_NOEUD*)liste_element_maillage->get(0);
567 if(OPERATEUR::egal(nd->get_x(),0,eps) && OPERATEUR::egal(nd->get_y(),0,eps) && OPERATEUR::egal(nd->get_z(),0,eps))
568 {
569 sommet_origine=som;
570 }
571 else if(OPERATEUR::egal(nd->get_x(),dim_VES[0],eps) && OPERATEUR::egal(nd->get_y(),0,eps) && OPERATEUR::egal(nd->get_z(),0,eps))
572 {
573 sommet_x1y0z0=som;
574 }
575 else if(OPERATEUR::egal(nd->get_x(),0,eps) && OPERATEUR::egal(nd->get_y(),dim_VES[1],eps) && OPERATEUR::egal(nd->get_z(),0,eps))
576 {
577 sommet_x0y1z0=som;
578 }
579 else if(OPERATEUR::egal(nd->get_x(),0,eps) && OPERATEUR::egal(nd->get_y(),0,eps) && OPERATEUR::egal(nd->get_z(),dim_VES[2],eps))
580 {
581 sommet_x0y0z1=som;
582 }
583 }
584
585 int type_cl = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_CL_Type]);
586 double valeur_cl = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_CL_Dim_valeur]);
587
588 switch(type_chargement)
589 {
590 case VE_TYPE_CHARGEMENT::SPHERIQUE:
591 {
592 switch(type_cl)
593 {
594 case VE_TYPE_CL::DEFORMATION_HOMOGENE:
595 {
596 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dz",0.0,true);
597 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dz",valeur_cl,true);
598 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dx",0.0,true);
599 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dx",valeur_cl,true);
600 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dy",0.0,true);
601 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dy",valeur_cl,true);
602 break;
603 }
604 case VE_TYPE_CL::CONTRAINTE_HOMOGENE:
605 {
606 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dz",0.0,true);
607 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Pz",valeur_cl,false);
608 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dx",0.0,true);
609 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Px",valeur_cl,false);
610 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dy",0.0,true);
611 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Py",valeur_cl,false);
612 break;
613 }
614 case VE_TYPE_CL::FLUX_CHALEUR_HOMOGENE:
615 {
616 break;
617 }
618 case VE_TYPE_CL::GRADIENT_TEMPERATURE_HOMOGENE:
619 {
620 break;
621 }
622 }
623 break;
624 }
625
626 case VE_TYPE_CHARGEMENT::DEVIATORIQUE:
627 {
628 switch(type_cl)
629 {
630 case VE_TYPE_CL::DEFORMATION_HOMOGENE:
631 {
632 char chr_valeur_cl[1000];
633 sprintf(chr_valeur_cl,"%lf",valeur_cl);
634 std::string str_valeur_cl = chr_valeur_cl;
635 std::string formule_Dx = str_valeur_cl+ "*Y";
636 std::string formule_Dy = str_valeur_cl+ "*Z";
637 std::string formule_Dz = str_valeur_cl+ "*X";
638 std::vector<std::string> liste_variable_formule_Dx;
639 std::vector<std::string> liste_variable_formule_Dy;
640 std::vector<std::string> liste_variable_formule_Dz;
641 liste_variable_formule_Dx.push_back((std::string)"Y");
642 liste_variable_formule_Dy.push_back((std::string)"Z");
643 liste_variable_formule_Dz.push_back((std::string)"X");
644 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
645 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
646 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
647 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
648 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
649 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
650 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
651 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
652 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
653 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
654 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
655 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
656 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
657 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
658 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
659 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dx",formule_Dx,liste_variable_formule_Dx,true);
660 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dy",formule_Dy,liste_variable_formule_Dy,true);
661 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Dz",formule_Dz,liste_variable_formule_Dz,true);
662 break;
663 }
664
665 case VE_TYPE_CL::CONTRAINTE_HOMOGENE:
666 {
667 sommet_origine->ajouter_ccf((char*)"Dt",0.0);
668 sommet_x1y0z0->ajouter_ccf((char*)"Dy",0.0);
669 sommet_x1y0z0->ajouter_ccf((char*)"Dz",0.0);
670 sommet_x0y1z0->ajouter_ccf((char*)"Dz",0.0);
671 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Px",-valeur_cl,true);
672 appliquer_conditions_limites_plan(&plan_xy_z0,(char*)"Py",-valeur_cl,true);
673 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Px",valeur_cl,true);
674 appliquer_conditions_limites_plan(&plan_xy_z1,(char*)"Py",valeur_cl,true);
675 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Px",-valeur_cl,true);
676 appliquer_conditions_limites_plan(&plan_xz_y0,(char*)"Pz",-valeur_cl,true);
677 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Px",valeur_cl,true);
678 appliquer_conditions_limites_plan(&plan_xz_y1,(char*)"Pz",valeur_cl,true);
679 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Py",-valeur_cl,true);
680 appliquer_conditions_limites_plan(&plan_yz_x0,(char*)"Pz",-valeur_cl,true);
681 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Py",valeur_cl,true);
682 appliquer_conditions_limites_plan(&plan_yz_x1,(char*)"Pz",valeur_cl,true);
683 break;
684 }
685 case VE_TYPE_CL::FLUX_CHALEUR_HOMOGENE:
686 {
687 break;
688 }
689 case VE_TYPE_CL::GRADIENT_TEMPERATURE_HOMOGENE:
690 {
691 break;
692 }
693 }
694 break;
695 }
696 }
697 return 0;
698 }
699
700 int VE_VES::appliquer_materiaux(void)
701 {
702 double nu_inclu = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_mu_nu]);
703 double nu_matrice = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_MATRICE_Dim_mu_nu]);
704 double Em_inclu = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_INCLU_Dim_mu_Em]);
705 double Em_matrice = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_MATRICE_Dim_mu_Em]);
706 MG_GEOMETRIE *geo = gest->get_mg_geometrie(0);
707 MG_VOLUME *matrice = geo->get_mg_volume(geo->get_nb_mg_volume()-1);
708 std::map<unsigned long,MG_VOLUME*,std::less<unsigned long>>::iterator it_volume;
709 for(MG_VOLUME *volume = geo->get_premier_volume(it_volume);volume!=matrice;volume=geo->get_suivant_volume(it_volume))
710 {
711 volume->ajouter_ccf((char*)"nu",nu_inclu);
712 volume->ajouter_ccf((char*)"Em",Em_inclu);
713 }
714 matrice->ajouter_ccf((char*)"nu",nu_matrice);
715 matrice->ajouter_ccf((char*)"Em",Em_matrice);
716 return 0;
717 }
718
719 int VE_VES::creer_fem_maillage(void)
720 {
721 MG_GEOMETRIE *geo = gest->get_mg_geometrie(0);
722 MG_MAILLAGE *mai = gest->get_mg_maillage(gest->get_nb_mg_maillage()-1);
723 int degre_mail = (int)param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_MAIL_Dim_degre_maillage]);
724 FEM_MAILLAGE *fem = new FEM_MAILLAGE(geo,mai,degre_mail);
725 gest->ajouter_fem_maillage(fem);
726 MAILLEUR_FEM m;
727 m.maille(fem);
728 return 0;
729 }
730
731 int VE_VES::calcul_aster(void)
732 {
733 char coderesu[500];
734 char nomparam[500];
735 char nometude[500];
736 sprintf(nometude,"%s",param_ver->get_nom(VE_PARAM_CHAR[VE_PARAM::VE_IO_nom_fichier_ETUDE]).c_str());
737 sprintf(nomparam,"%s",param_ver->get_nom(VE_PARAM_CHAR[VE_PARAM::VE_IO_nom_fichier_param_ASTER]).c_str());
738 sprintf(coderesu,"%s",param_ver->get_nom(VE_PARAM_CHAR[VE_PARAM::VE_IO_code_resu]).c_str());
739 MGASTER mgaster;
740 mgaster.active_affichage(fonc_affiche);
741 mgaster.calcule(nomparam,gest->get_fem_maillage(0),nometude,MAGIC::CALCUL_ASTER::ELASTIQUE,coderesu);
742 return 0;
743 }
744
745 int VE_VES::homogeneisation(void)
746 {
747 FEM_SOLUTION* sol=gest->get_fem_solution(1);
748 FEM_SOLUTION* sol2=gest->get_fem_solution(2);
749 double exx=sol->get_moyenne_volumique_champs(NULL,0);
750 double eyy=sol->get_moyenne_volumique_champs(NULL,1);
751 double ezz=sol->get_moyenne_volumique_champs(NULL,2);
752 double exy=sol->get_moyenne_volumique_champs(NULL,3);
753 double exz=sol->get_moyenne_volumique_champs(NULL,4);
754 double eyz=sol->get_moyenne_volumique_champs(NULL,5);
755 double sxx=sol2->get_moyenne_volumique_champs(NULL,0);
756 double syy=sol2->get_moyenne_volumique_champs(NULL,1);
757 double szz=sol2->get_moyenne_volumique_champs(NULL,2);
758 double sxy=sol2->get_moyenne_volumique_champs(NULL,3);
759 double sxz=sol2->get_moyenne_volumique_champs(NULL,4);
760 double syz=sol2->get_moyenne_volumique_champs(NULL,5);
761 double traces=sxx+syy+szz;
762 double tracee=exx+eyy+ezz;
763 char message[1000];
764 affiche((char*)"");
765 sprintf(message, "Tenseur des deformations :"); affiche(message);
766 sprintf(message, " | exx=% 3.2le exy=% 3.2le exz=% 3.2le |",exx,exy,exz); affiche(message);
767 sprintf(message, " | exy=% 3.2le eyy=% 3.2le eyz=% 3.2le |",exy,eyy,eyz); affiche(message);
768 sprintf(message, " | exz=% 3.2le eyz=% 3.2le ezz=% 3.2le |",exz,eyz,ezz); affiche(message);
769 affiche((char*)"");
770 sprintf(message, " Trace e = % 3.2le",tracee); affiche(message);
771 affiche((char*)"");
772 sprintf(message, "Tenseur des contraintes :"); affiche(message);
773 sprintf(message, " | sxx=% 3.2le sxy=% 3.2le sxz=% 3.2le |",sxx,sxy,sxz); affiche(message);
774 sprintf(message, " | sxy=% 3.2le syy=% 3.2le syz=% 3.2le |",sxy,syy,syz); affiche(message);
775 sprintf(message, " | sxz=% 3.2le syz=% 3.2le szz=% 3.2le |",sxz,syz,szz); affiche(message);
776 affiche((char*)"");
777 sprintf(message, " Trace s = % 3.2le",traces); affiche(message);
778 affiche((char*)"");
779 int type_chargement = param_ver->get_valeur(VE_PARAM_CHAR[VE_PARAM::VE_VER_CL_CHARGEMENT_type]);
780 if(type_chargement==VE_TYPE_CHARGEMENT::SPHERIQUE)
781 {
782 double K = traces/3./tracee;
783 sprintf(message, "Module de compressibilite apparent :"); affiche(message);
784 sprintf(message, " Kapp = % 3.5le",K); affiche(message);
785 char messagesortie[1000];
786 sprintf(messagesortie,"echo %lf >> resultats.txt",K);
787 system(messagesortie);
788 }
789 else if(type_chargement==VE_TYPE_CHARGEMENT::DEVIATORIQUE)
790 {
791 double G = (1./3.)*((syz/(2.*eyz))+(sxz/(2.*exz))+(sxy/(2.*exy)));
792 sprintf(message, "Module de cisaillement apparent :"); affiche(message);
793 sprintf(message, " Gapp = % 3.5le",G); affiche(message);
794 char messagesortie[1000];
795 sprintf(messagesortie,"echo %lf >> resultats.txt",G);
796 system(messagesortie);
797 }
798 return 0;
799 }