MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mstruct_generateur_polycristaux.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 //####// mstruct_generateur_polycristaux.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2025
19 //####// Derniere modification par francois
20 //####// mer 14 mai 2025 17:54:57 EDT
21 //####//------------------------------------------------------------
22 //####//------------------------------------------------------------
23  #include "gestionversion.h"
24  #include "mg_file.h"
26  #include "tpl_grille.h"
27  #ifdef PROJECT_POLYCRISTAUX
28  #include "polycristal.h"
29  #endif
30  #include "occ_import.h"
32  #include "mailleur0d.h"
33  #include "mailleur1d.h"
34  #include "mailleur2d.h"
35  #include "mailleur3d.h"
36  #include "mailleur_fem.h"
37  #include "mailleur_analyse.h"
38  #include "mg_export.h"
39  #include "mstruct_outils.h"
40  #include "mstruct_definition.h"
41  #include "mgaster.h"
42  #include "lc_point.h"
43  #include "mailleur_analyse.h"
44  #include <fstream>
45  #include <math.h>
46  #include <random>
47  #include "mstruct_borne.h"
48 #include "ot_tenseur.h"
49 #include <sys/stat.h>
50 #include <mutex>
51 
52 
54 {
55 nbcristaux=-1;
56 degre=-1;
57 dg=-1;
58 KDH=-1.;
59 GDH=-1.;
60 EDH=-1.;
61 KCH=-1.;
62 GCH=-1.;
63 ECH=-1.;
64 nbphase=0;
65 }
66 
67 MSTRUCT_GENERATEUR_POLYCRISTAUX_RESULTAT::MSTRUCT_GENERATEUR_POLYCRISTAUX_RESULTAT(MSTRUCT_GENERATEUR_POLYCRISTAUX_RESULTAT& mdd):nbcristaux(mdd.nbcristaux),degre(mdd.degre),dg(mdd.dg),KDH(mdd.KDH),GDH(mdd.GDH),EDH(mdd.EDH),KCH(mdd.KCH),GCH(mdd.GCH),ECH(mdd.ECH),nbphase(mdd.nbphase),nbcristauxphase(mdd.nbcristauxphase),masse(mdd.masse),volume(mdd.volume),cdm(mdd.cdm)
68 {
69 memcpy(tens1,mdd.tens1,sizeof(double)*9);
70 memcpy(tens2,mdd.tens2,sizeof(double)*9);
71 memcpy(tens3,mdd.tens3,sizeof(double)*9);
72 
73 }
74 
76 {
77 }
78 
79 
81 {
82 Evoigt=-1;
83 Ereuss=-1;
84 Kvoigt=-1;
85 Kreuss=-1;
86 Gvoigt=-1;
87 Greuss=-1;
88 nuvoigt=-1;
89 nureuss=-1;
90 }
91 
92 MSTRUCT_GENERATEUR_POLYCRISTAUX_BORNE::MSTRUCT_GENERATEUR_POLYCRISTAUX_BORNE(MSTRUCT_GENERATEUR_POLYCRISTAUX_BORNE& mdd):Evoigt(mdd.Evoigt),Ereuss(mdd.Ereuss),Kvoigt(mdd.Kvoigt),Kreuss(mdd.Kreuss),Gvoigt(mdd.Gvoigt),Greuss(mdd.Greuss),nuvoigt(mdd.nuvoigt),nureuss(mdd.nureuss)
93 {
94 }
95 
97 {
98 }
99 
100 
101 
103  {
104  ini_param(NULL);
105  }
106 
107 
109  {
110  ini_param(nomparam);
111  }
112 
114  {
115  MG_FILE gest(fichierin);
116  MG_GEOMETRIE *mggeo=gest.get_mg_geometrie(0);
117  FILE *out=fopen(fichierout,"wt");
118  LISTE_MG_POINT::iterator it;
119  for (MG_POINT* pt=mggeo->get_premier_point(it);pt!=NULL;pt=mggeo->get_suivant_point(it))
120  if (pt->get_type()==MG_ELEMENT_GEOMETRIQUE::TYPE_ELEMENT_GEOMETRIQUE::LC_POINT)
121  {
122  double xyz[3];
123  pt->evaluer(xyz);
124  fprintf(out,"%e %e %e\n",xyz[0],xyz[1],xyz[2]);
125  }
126  fclose(out);
127  }
128 
129 
131  {
132 
133  }
134 
136  {
137 
138  }
139 
141  {
142  affiche2=fonc;
143  affichageactif=1;
144  }
145 
147  {
148  if (affichageactif==1) affiche2(mess);
149  }
150 
152  {
153  param.ajouter("nommateriau","Cuivre",OT_PARAMETRES::STRING,"nom du matériaux");
154  //param.ajouter("bornereuss",109e9,OT_PARAMETRES::DOUBLE,"Valeur de la borne de Reuss en Pa");
155  //param.ajouter("bornevoigt",143e9,OT_PARAMETRES::DOUBLE,"Valeur de la borne de Voigt en Pa");
156  param.ajouter("boitexmin",0,OT_PARAMETRES::DOUBLE,"valeur x min de l'échantillon");
157  param.ajouter("boiteymin",0,OT_PARAMETRES::DOUBLE,"valeur y min de l'échantillon");
158  param.ajouter("boitezmin",0,OT_PARAMETRES::DOUBLE,"valeur z min de l'échantillon");
159  param.ajouter("boitexmax",1,OT_PARAMETRES::DOUBLE,"valeur x max de l'échantillon");
160  param.ajouter("boiteymax",1,OT_PARAMETRES::DOUBLE,"valeur y max de l'échantillon");
161  param.ajouter("boitezmax",1,OT_PARAMETRES::DOUBLE,"valeur z max de l'échantillon");
162  param.ajouter("nb_cristaux",100,OT_PARAMETRES::DOUBLE,"Nombre de cristaux à tirer aléatoirement");
163  param.ajouter("rayon",0.05,OT_PARAMETRES::DOUBLE,"Distance séparant deux points tirés aléatoirement en % de la longueur totale");
164  param.ajouter("nomfichier","nomcao",OT_PARAMETRES::STRING,"Nom du fichier de l'étude sans extension");
165  param.ajouter("enregistrementstep",0.,OT_PARAMETRES::DOUBLE,"0. pas de fichier step 1. avec fichier step");
166  param.ajouter("epsfusion",1e-6,OT_PARAMETRES::DOUBLE,"epsilon de la fusion des noeuds des Voronoi");
167  param.ajouter("dg",0.1,OT_PARAMETRES::DOUBLE,"ecart nodale pour la carte de taille");
168  param.ajouter("gradient",0.25,OT_PARAMETRES::DOUBLE,"gradient max visé pour la carte de taille");
169  param.ajouter("bornemin_carte",0.1,OT_PARAMETRES::DOUBLE,"Borne minimal de l'écart nodal");
170  param.ajouter("type_bornemin",1,OT_PARAMETRES::DOUBLE,"0. borne min absolue 1. borne min relative");
171  param.ajouter("Nbphase",2.0,OT_PARAMETRES::DOUBLE,"Nombre de phase du polycristal");
172  std::vector<std::string> nomphase;
173  nomphase.push_back("phase1");
174  nomphase.push_back("phase2");
175  param.ajouter("Nomphase",nomphase,OT_PARAMETRES::STRING,"Nom des phases");
176  std::vector<double> lstphase;
177  lstphase.push_back(0.68);
178  lstphase.push_back(0.32);
179  param.ajouter("Proportionphase",lstphase,OT_PARAMETRES::DOUBLE,"Proportion de chacune des phases en masse");
180  std::vector<double> lstdens;
181  lstdens.push_back(5.);
182  lstdens.push_back(12.);
183  param.ajouter("Densite",lstdens,OT_PARAMETRES::DOUBLE,"Densité de chacune des phases");
184  std::vector<double> lst1,lst2,lst3;
185  lst1.push_back(66.69e9);
186  lst1.push_back(120.1e9);
187  lst2.push_back(0.4189);
188  lst2.push_back(0.3);
189  lst3.push_back(75.4e9);
190  lst3.push_back(85.2e9);
191 
192  param.ajouter("E1",lst1,OT_PARAMETRES::DOUBLE,"Module d'Young dans la direction 1 du polycristal");
193  param.ajouter("E2",lst1,OT_PARAMETRES::DOUBLE,"Module d'Young dans la direction 2 du polycristal");
194  param.ajouter("E3",lst1,OT_PARAMETRES::DOUBLE,"Module d'Young dans la direction 3 du polycristal");
195  param.ajouter("n1",lst2,OT_PARAMETRES::DOUBLE,"Coefficent de Poisson dans le plan 12 du polycristal");
196  param.ajouter("n2",lst2,OT_PARAMETRES::DOUBLE,"Coefficent de Poisson dans le plan 23 du polycristal");
197  param.ajouter("n3",lst2,OT_PARAMETRES::DOUBLE,"Coefficent de Poisson dans le plan 13 du polycristal");
198  param.ajouter("G1",lst3,OT_PARAMETRES::DOUBLE,"Module de Cisaillement dans le plan 12 du polycristal");
199  param.ajouter("G2",lst3,OT_PARAMETRES::DOUBLE,"Module de Cisaillement dans le plan 23 du polycristal");
200  param.ajouter("G3",lst3,OT_PARAMETRES::DOUBLE,"Module de Cisaillement dans le plan 13 du polycristal");
201  param.ajouter("Degre",1,OT_PARAMETRES::DOUBLE,"1 maillage lineaire 2 maillage quadratique");
202  param.ajouter("fichiercumul","cumul",OT_PARAMETRES::STRING,"Nom du fichier sans extension du cumul des resultats");
203  param.ajouter("enregistrerres","1.0",OT_PARAMETRES::DOUBLE,"0. pas d'enregistrement des résultats et statistiques 1. enregistrement");
204  param.ajouter("paramaster","param_aster.txt",OT_PARAMETRES::STRING,"Nom du fichier des parametres aster");
205  param.ajouter("reprise_geo",0.,OT_PARAMETRES::DOUBLE,"0. nouvelle géométrie 1. reprise de la dernière géométrie");
206  param.ajouter("reprise_ori",0.,OT_PARAMETRES::DOUBLE,"0. nouvelle orientation 1. reprise des dernières orientations");
207  param.ajouter("reprise_mai",0.,OT_PARAMETRES::DOUBLE,"0. nouveau maillage 1. reprise du dernier maillage");
208  param.ajouter("operationaeffectuer",3.,OT_PARAMETRES::DOUBLE,"0. rien 1. generation 2. maillage 3. calcul");
209  if (nom!=NULL) param.lire(nom);
210  }
211 
212 
213  void MSTRUCT_GENERATEUR_POLYCRISTAUX::cree_param(char* nom,char *nomexe)
214  {
215  affiche((char*)"\nCreation du fichier de parametre");
216  param.change_valeur("operationaeffectuer", 2.);
217  param.change_valeur("enregistrerres", 0.);
218  param.enregistrer(nom);
219 
220  char nom2[500];
221  strcpy(nom2, nom);
222  strcat(nom2, "2");
223  FILE *paraout2=fopen(nom2,"wt");
224  fprintf(paraout2,"-> %s\n",nom);
225  fprintf(paraout2,"operationaeffectuer = 3.000000\n");
226  fprintf(paraout2,"reprise_geo = 1.000000\n");
227  fprintf(paraout2,"reprise_ori = 1.000000\n");
228  fprintf(paraout2,"reprise_mai = 1.000000\n");
229  fprintf(paraout2,"enregistrerres = 1.000000\n");
230 
231 
232  fclose(paraout2);
233 
234 
235 
236 
237  FILE *out = fopen("vasy", "wt");
238  fprintf(out, "#!/bin/bash\n");
239 fprintf(out, "for ((c=1;c<=$1;c++))\n");
240 fprintf(out, "do\n");
241 fprintf(out, "timeout 900s %s -polycristaux -out cristal.magic -param %s\n", nomexe,nom);
242 fprintf(out, "VAR=$?\n");
243 fprintf(out, "if (( $VAR )) ; then\n");
244 fprintf(out, " echo \"Timeout\"\n");
245 fprintf(out, "else\n");
246 fprintf(out, " %s -polycristaux -out cristal.magic -param %s\n", nomexe,nom2);
247 fprintf(out, "fi\n");
248 fprintf(out, "done\n");
249 
250 
251  fclose(out);
252  out = fopen("vasy_par", "wt");
253  fprintf(out, "#!/bin/bash\n");
254 fprintf(out, "VAR=1\n");
255 fprintf(out, "while (($VAR))\n");
256 fprintf(out, "do\n");
257 bool chemindanspath=false;
258 if ((nomexe[0]>='a') && (nomexe[0]<='z')) chemindanspath=true;
259 if ((nomexe[0]>='A') && (nomexe[0]<='Z')) chemindanspath=true;
260 if (chemindanspath)
261  fprintf(out, "timeout 1800s %s -polycristaux -out cristal.magic -param %s\n", nomexe,nom);
262 else
263  fprintf(out, "timeout 1800s ../%s -polycristaux -out cristal.magic -param %s\n", nomexe,nom);
264 fprintf(out, "VAR=$?\n");
265 fprintf(out, "if (( $VAR )) ; then\n");
266 fprintf(out, " echo \"Timeout\"\n");
267 fprintf(out, "else\n");
268 if (chemindanspath)
269  fprintf(out, " %s -polycristaux -out cristal.magic -param %s\n", nomexe,nom2);
270 else
271  fprintf(out, " ../%s -polycristaux -out cristal.magic -param %s\n", nomexe,nom2);
272 fprintf(out, "fi\n");
273 fprintf(out, "done\n");
274 
275 
276  fclose(out);
277  chmod ("vasy",strtol("0777", NULL,8));
278  chmod ("vasy_par",strtol("0777", NULL,8));
279  MG_EXPORT exp;
280  exp.change_param_aster((char*)"Noeud_ele",2.);
281  exp.ecrire_params_aster((char*)"param_aster.txt");
282 
283  }
284 
285 
287  {
288  int reprendgeo=(int)param.get_valeur("reprise_geo");
289  int reprendmai=(int)param.get_valeur("reprise_mai");
290  int reprendori=(int)param.get_valeur("reprise_ori");
291 
292 
293 
294 
295  #ifdef PROJECT_POLYCRISTAUX
298  MG_GESTIONNAIRE *gest;
299  int afaire=(int)param.get_valeur("operationaeffectuer");
300  MG_GEOMETRIE* mggeo;
301  double dg=param.get_valeur("dg");
302  statres.dg=dg;
303  double epsfusion=param.get_valeur("epsfusion");
304  std::string nomfichier=param.get_nom("nomfichier");
305  std::string nomfichierbrep=nomfichier+".brep";
306  std::string nomfichierocaf=nomfichier+".ocaf";
307  std::string nomfichiercarte=nomfichier+".sol";
308  std::string nomfichierborne=nomfichier+".borne";
309  double xmin=param.get_valeur("boitexmin");
310  double ymin=param.get_valeur("boiteymin");
311  double zmin=param.get_valeur("boitezmin");
312  double xmax=param.get_valeur("boitexmax");
313  double ymax=param.get_valeur("boiteymax");
314  double zmax=param.get_valeur("boitezmax");
315  BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
316  BOITE_3D boite2=boite;
317  boite2.change_grosseur(1.01);
318  if (afaire>0)
319  {
320  std::random_device seed;
321  std::mt19937_64 generateur(seed());
322  affiche((char*)"\nInitialisation");
323 
324  if (reprendgeo==0)
325  {
326  gest=new MG_GESTIONNAIRE;
328  grille.initialiser(boite2.get_xmin(),boite2.get_ymin(),boite2.get_zmin(),boite2.get_xmax(),boite2.get_ymax(),boite2.get_zmax(),100,100,100);
329  /*POLYCRISTAUX::POINT_TIRE p1(0,0,0,0);grille.inserer(&p1);
330  POLYCRISTAUX::POINT_TIRE p2(1,1000,0,0);grille.inserer(&p2);
331  POLYCRISTAUX::POINT_TIRE p3(2,1000,1000,0);grille.inserer(&p3);
332  POLYCRISTAUX::POINT_TIRE p4(3,0,1000,0);grille.inserer(&p4);
333  POLYCRISTAUX::POINT_TIRE p5(4,0,0,0);grille.inserer(&p5);
334  POLYCRISTAUX::POINT_TIRE p6(5,1000,0,0);grille.inserer(&p6);
335  POLYCRISTAUX::POINT_TIRE p7(6,1000,1000,0);grille.inserer(&p7);
336  POLYCRISTAUX::POINT_TIRE p8(7,0,1000,0);grille.inserer(&p8);*/
337  double dx=boite.get_xmax()-boite.get_xmin();
338  double dy=boite.get_ymax()-boite.get_ymin();
339  double dz=boite.get_zmax()-boite.get_zmin();
340  affiche((char*)"Generation de cristaux aléatoires");
341  double rayon=param.get_valeur("rayon")*0.3333333333333333333*(dx+dy+dz);
342  std::uniform_real_distribution<double> distribution_position_x(boite.get_xmin(),boite.get_xmax());
343  std::uniform_real_distribution<double> distribution_position_y(boite.get_ymin(),boite.get_ymax());
344  std::uniform_real_distribution<double> distribution_position_z(boite.get_zmin(),boite.get_zmax());
345  int nbinsere=0;
346  int nbainsere=param.get_valeur("nb_cristaux");
347  std::vector<POLYCRISTAUX::POINT_TIRE*> listepointainserer;
348  std::vector<double> listedepointvoro;
349  listedepointvoro.push_back(boite.get_xmin());listedepointvoro.push_back(boite.get_ymin());listedepointvoro.push_back(boite.get_zmin());
350  listedepointvoro.push_back(boite.get_xmin());listedepointvoro.push_back(boite.get_ymax());listedepointvoro.push_back(boite.get_zmin());
351  listedepointvoro.push_back(boite.get_xmax());listedepointvoro.push_back(boite.get_ymax());listedepointvoro.push_back(boite.get_zmin());
352  listedepointvoro.push_back(boite.get_xmax());listedepointvoro.push_back(boite.get_ymin());listedepointvoro.push_back(boite.get_zmin());
353  listedepointvoro.push_back(boite.get_xmin());listedepointvoro.push_back(boite.get_ymin());listedepointvoro.push_back(boite.get_zmax());
354  listedepointvoro.push_back(boite.get_xmin());listedepointvoro.push_back(boite.get_ymax());listedepointvoro.push_back(boite.get_zmax());
355  listedepointvoro.push_back(boite.get_xmax());listedepointvoro.push_back(boite.get_ymax());listedepointvoro.push_back(boite.get_zmax());
356  listedepointvoro.push_back(boite.get_xmax());listedepointvoro.push_back(boite.get_ymin());listedepointvoro.push_back(boite.get_zmax());
357 
358  while (nbinsere<nbainsere)
359  {
360  double x=distribution_position_x(generateur);
361  double y=distribution_position_y(generateur);
362  double z=distribution_position_z(generateur);
364  grille.rechercher(x,y,z,rayon,lsttrouve);
366  bool bonpoint=true;
367  for (POLYCRISTAUX::POINT_TIRE* pt=lsttrouve.get_premier(it);pt!=NULL;pt=lsttrouve.get_suivant(it))
368  {
369  OT_VECTEUR_3D vec(x-pt->x,y-pt->y,z-pt->z);
370  if (vec.get_longueur()<rayon) bonpoint=false;
371  }
372  if (bonpoint)
373  {
374  listedepointvoro.push_back(x);
375  listedepointvoro.push_back(y);
376  listedepointvoro.push_back(z);
377  POLYCRISTAUX::POINT_TIRE *pt=new POLYCRISTAUX::POINT_TIRE(nbinsere+8,x,y,z);
378  grille.inserer(pt);
379  listepointainserer.push_back(pt);
380  nbinsere++;
381  }
382  }
383 
384  for (int i=0;i<listepointainserer.size();i++)
385  delete listepointainserer[i];
386 
387  char message[1000];
388  sprintf(message," Construction des Voronoi avec borne de fusion de %lf",epsfusion);
389  affiche(message);
390  Polycristal poly(listedepointvoro,(char*)nomfichierbrep.c_str(),epsfusion);
392  bool avecstep=false;
393  int valeur=(int)param.get_valeur("enregistrementstep");
394  if (valeur==0) avecstep=false;
395  if (valeur==1) avecstep=true;
396  poly.construit(avecstep);
397  OCC_IMPORT occ_import;
398  mggeo = occ_import.importer_fichier_brep_V2017(*gest,(char*)nomfichierbrep.c_str(),(char*)nomfichierocaf.c_str(),FICHIEROCC,1e-6,false);
399  occ_import.importer_triangulation_V2017(*gest,mggeo,0.1,1);
400  mggeo->change_valeur_unite(1.);
401  int nb=listedepointvoro.size()/3;
402  for (int i=8;i<nb;i++)
403  {
404  double x=listedepointvoro[3*i];
405  double y=listedepointvoro[3*i+1];
406  double z=listedepointvoro[3*i+2];
407  LC_POINT* pt=new LC_POINT(x,y,z);
408  mggeo->ajouter_mg_point(pt);
409  }
410 
411  }
412  else
413  {
414  affiche((char*)"Reprise de calcul d'un ancien polycristal");
415  gest=new MG_FILE(nommagic);
416  mggeo=gest->get_mg_geometrie(0);
417 
418  }
419  statres.nbcristaux=mggeo->get_nb_mg_volume();
420 
421  char mess[500];
422  sprintf(mess," Nombre de cristaux MAGiC assemblés = %d ", mggeo->get_nb_mg_volume());;
423  affiche(mess);
424  double tens1[9],tens2[9],tens3[9];
425  for (int i=0;i<9;i++)
426  {
427  tens1[i]=0.;
428  tens2[i]=0.;
429  tens3[i]=0.;
430  }
431  if (reprendori==0)
432  {
433  std::uniform_real_distribution<double> distribution_angle1(0.,360.);
434  std::uniform_real_distribution<double> distribution_angle2(-1.,1.);
435  std::uniform_real_distribution<double> distribution_angle3(0.,360.);
436  affiche((char*)"Conditions aux limites");
437  LISTE_MG_VOLUME::iterator it;
438  int nbphase=(int)param.get_valeur("Nbphase");
439  statres.nbphase=nbphase;
440  statres.volume.resize(statres.nbphase+1);
441  statres.masse.resize(statres.nbphase+1);
442  statres.nbcristauxphase.resize(statres.nbphase+1);
443  statres.cdm.resize(statres.nbphase+1);
444  //std::discrete_distribution<int> d({20, 80});
445  //std::map<int, int> m;
446  std::vector<double> volume(nbphase);
447  std::vector<double> tirage(nbphase);
448  std::vector<OT_VECTEUR_3D> cdm(nbphase);
449  std::vector<double> cible(nbphase);
450  std::vector<int> ordrecible(nbphase);
451  std::vector<double> densite(nbphase);
452  std::vector<int> nbcristaux(nbphase);
453  //OT_TENSEUR rigtot(6,6),soutot(6,6);
454  //MSTRUCT_BORNE borne;
455  for (int i=0;i<nbphase;i++)
456  {
457  volume[i]=0.;
458  tirage[i]=0.;
459  cdm[i].change_x(0.);
460  cdm[i].change_y(0.);
461  cdm[i].change_z(0.);
462  cible[i]=param.get_valeur("Proportionphase",i);
463  ordrecible[i]=i;
464  densite[i]=param.get_valeur("Densite",i);
465  nbcristaux[i]=0;
466  /*double E1=param.get_valeur("E1",i);
467  double E2=param.get_valeur("E2",i);
468  double E3=param.get_valeur("E3",i);
469  double n1=param.get_valeur("n1",i);
470  double n2=param.get_valeur("n2",i);
471  double n3=param.get_valeur("n3",i);
472  double G1=param.get_valeur("G1",i);
473  double G2=param.get_valeur("G2",i);
474  double G3=param.get_valeur("G3",i);
475  OT_TENSEUR rig(6,6),rigphase(6,6),souphase(6,6);
476  borne.get_tenseur_rigidite(E1/1e9,E2/1e9,E3/1e9,2.*G1/1e9,2.*G2/1e9,2.*G3/1e9,n1,n2,n3,rig);
477  borne.get_VoigtReuss_poly(rig,rigphase,souphase);
478  rigphase=cible[i]*rigphase;
479  souphase=cible[i]*souphase;
480  rigtot=rigtot+rigphase;
481  soutot=soutot+souphase;*/
482  }
483  /*double Ev,Gv,Kv,nuv;
484  double Er,Gr,Kr,nur;
485  borne.get_VoigtReuss_poly(rigtot,soutot,Kv,Gv,Ev,nuv,Kr,Gr,Er,nur);
486  statborne.Evoigt=Ev*1e9;
487  statborne.Kvoigt=Kv/3.*1e9;
488  statborne.Gvoigt=Gv/2.*1e9;
489  statborne.nuvoigt=nuv;
490  statborne.Ereuss=Er*1e9;
491  statborne.Kreuss=Kr/3.*1e9;
492  statborne.Greuss=Gr/2.*1e9;
493  statborne.nureuss=nur;
494 
495  FILE *inborne=fopen(nomfichierborne.c_str(),"wb");
496  fwrite(&statborne,sizeof(statborne),1,inborne);
497  fclose(inborne);*/
498 
499  std::shuffle(ordrecible.begin(),ordrecible.end(),generateur);
500  std::vector<MG_VOLUME*> listevolume;
501  for (MG_VOLUME* vol=mggeo->get_premier_volume(it);vol!=NULL;vol=mggeo->get_suivant_volume(it))
502  listevolume.push_back(vol);
503  std::shuffle(listevolume.begin(),listevolume.end(),generateur);
504  double voltot=(boite.get_xmax()-boite.get_xmin())*(boite.get_ymax()-boite.get_ymin())*(boite.get_zmax()-boite.get_zmin());
505  double nume=voltot;
506  std::vector<double> deno(nbphase);
507  for (int i=0;i<nbphase;i++)
508  deno[i]=1.;
509  for (int i=0;i<nbphase;i++)
510  {
511  nume=nume*densite[i];
512  for (int j=0;j<nbphase;j++)
513  if (i!=j) deno[j]=deno[j]*densite[i];
514  else deno[j]=deno[j]*cible[i];
515  }
516  double massetot=0.;
517  for (int i=0;i<nbphase;i++)
518  massetot=massetot+deno[i];
519  massetot=nume/massetot;
520 
521 
522  for (int i=0;i<listevolume.size();i++)
523  {
524  MG_VOLUME *vol=listevolume[i];
525  int tir=-1,j=0;
526  while (tir==-1)
527  {
528  if (tirage[ordrecible[j]]/massetot<cible[ordrecible[j]]) tir=ordrecible[j];
529  j++;
530  //if (j>=nbphase) tir=j-1;
531  }
532  double volu,masse;
533  OT_VECTEUR_3D cdm2;
534  OT_MATRICE_3D m1,m2;
535  double dens=densite[tir];
536  vol->get_propriete_massique(gest->get_mg_maillage(0),volu,masse,cdm2,m1,m2,dens,-1);
537  volume[tir]=volume[tir]+volu;
538  tirage[tir]=tirage[tir]+masse;
539  cdm[tir]=cdm[tir]+masse*cdm2;
540  nbcristaux[tir]=nbcristaux[tir]+1;
541 
542 
543  for (int i=0;i<vol->get_nb_ccf();i++)
544  vol->supprimer_ccf(0);
545  double E1=param.get_valeur("E1",tir);
546  double E2=param.get_valeur("E2",tir);
547  double E3=param.get_valeur("E3",tir);
548  double n1=param.get_valeur("n1",tir);
549  double n2=param.get_valeur("n2",tir);
550  double n3=param.get_valeur("n3",tir);
551  double G1=param.get_valeur("G1",tir);
552  double G2=param.get_valeur("G2",tir);
553  double G3=param.get_valeur("G3",tir);
554  vol->ajouter_ccf((char*)"Ph",(double)tir);
555  vol->ajouter_ccf((char*)"E1",E1);
556  vol->ajouter_ccf((char*)"E2",E2);
557  vol->ajouter_ccf((char*)"E3",E3);
558  vol->ajouter_ccf((char*)"n1",n1);
559  vol->ajouter_ccf((char*)"n2",n2);
560  vol->ajouter_ccf((char*)"n3",n3);
561  vol->ajouter_ccf((char*)"G1",G1);
562  vol->ajouter_ccf((char*)"G2",G2);
563  vol->ajouter_ccf((char*)"G3",G3);
564  vol->ajouter_ccf((char*)"Ro",dens);
565  double a1=distribution_angle1(generateur);
566  double a3=distribution_angle3(generateur);
567  double a2=distribution_angle2(generateur);
568  a2=acos(a2)/M_PI*180.;
569  vol->ajouter_ccf((char*)"a1",a1);
570  vol->ajouter_ccf((char*)"a2",a2);
571  vol->ajouter_ccf((char*)"a3",a3);
572  double x1[3],x2[3],x3[3];
573  double psi=a1/180.*M_PI;
574  double teta=a2/180.*M_PI;
575  double phi=a3/180.*M_PI;
576  x1[0]=cos(phi)*cos(psi)-sin(phi)*cos(teta)*sin(psi);
577  x1[1]=cos(phi)*sin(psi)+sin(phi)*cos(teta)*cos(psi);
578  x1[2]=sin(phi)*sin(teta);
579  x2[0]=-sin(phi)*cos(psi)-cos(phi)*cos(teta)*sin(psi);
580  x2[1]=-sin(phi)*sin(psi)+cos(phi)*cos(teta)*cos(psi);
581  x2[2]=cos(phi)*sin(teta);
582  x3[0]=sin(teta)*sin(psi);
583  x3[1]=-sin(teta)*cos(psi);
584  x3[2]=cos(teta);
585  for (int i=0;i<3;i++)
586  for (int j=0;j<3;j++)
587  {
588  tens1[i*3+j]+=x1[i]*x1[j];
589  tens2[i*3+j]+=x2[i]*x2[j];
590  tens3[i*3+j]+=x3[i]*x3[j];
591  }
592 
593  }
594  double massetotale=0.;
595  double volumetotal=0.;
596  for (int i=0;i<nbphase;i++)
597  {
598  volumetotal=volumetotal+volume[i];
599  massetotale=massetotale+tirage[i];
600  }
601  char mess[500];
602  sprintf(mess," Masse estimée %lf calculée %lf",massetot,massetotale);
603  affiche(mess);
604  statres.masse[nbphase]=massetotale;
605  statres.volume[nbphase]=volumetotal;
606  for (int i=0;i<nbphase;i++)
607  {
608  char mess[500];
609  sprintf(mess," Phase %d (%d cristaux) = tirage %d \n masse %lf ou %lf%% \n volume %lf ou %lf%%", i+1,nbcristaux[i],ordrecible[i]+1,tirage[i],tirage[i]/massetotale*100.,volume[i],volume[i]/volumetotal*100.);
610  affiche(mess);
611  sprintf(mess," Centre de masse x = %lf ",cdm[i].get_x()/tirage[i]);
612  affiche(mess);
613  sprintf(mess," y = %lf ",cdm[i].get_y()/tirage[i]);
614  affiche(mess);
615  sprintf(mess," z = %lf ",cdm[i].get_z()/tirage[i]);
616  affiche(mess);
617  statres.masse[i]=tirage[i];
618  statres.volume[i]=volume[i];
619  statres.cdm[i]=cdm[i]/tirage[i];
620  statres.cdm[nbphase]=statres.cdm[nbphase]+cdm[i];
621  statres.nbcristauxphase[i]=nbcristaux[i];
622  }
623  statres.cdm[statres.nbphase]=(1./statres.masse[statres.nbphase])*statres.cdm[statres.nbphase];
624  sprintf(mess," Centre de masse global x = %lf ",statres.cdm[statres.nbphase].get_x());
625  affiche(mess);
626  sprintf(mess," y = %lf ",statres.cdm[statres.nbphase].get_y());
627  affiche(mess);
628  sprintf(mess," z = %lf ",statres.cdm[statres.nbphase].get_z());
629  affiche(mess);
630  }
631  else
632  {
633  affiche((char*)"Reprise conditions aux limites");
634  LISTE_MG_VOLUME::iterator it;
635  statres.nbphase=(int)param.get_valeur("Nbphase");
636  statres.volume.resize(statres.nbphase+1);
637  statres.masse.resize(statres.nbphase+1);
638  statres.nbcristauxphase.resize(statres.nbphase+1);
639  statres.cdm.resize(statres.nbphase+1);
640  for (int i=0;i<statres.nbphase;i++)
641  {
642  statres.volume[i]=0.;
643  statres.masse[i]=0.;
644  statres.nbcristauxphase[i]=0;
645  statres.cdm[i].change_x(0.);
646  statres.cdm[i].change_y(0.);
647  statres.cdm[i].change_z(0.);
648  }
649  for (MG_VOLUME* vol=mggeo->get_premier_volume(it);vol!=NULL;vol=mggeo->get_suivant_volume(it))
650  {
651  double a1,a2,a3;
652  vol->get_valeur_ccf((char*)"a1",a1);
653  vol->get_valeur_ccf((char*)"a2",a2);
654  vol->get_valeur_ccf((char*)"a3",a3);
655  double x1[3],x2[3],x3[3];
656  double psi=a1/180.*M_PI;
657  double teta=a2/180.*M_PI;
658  double phi=a3/180.*M_PI;
659  x1[0]=cos(phi)*cos(psi)-sin(phi)*cos(teta)*sin(psi);
660  x1[1]=cos(phi)*sin(psi)+sin(phi)*cos(teta)*cos(psi);
661  x1[2]=sin(phi)*sin(teta);
662  x2[0]=-sin(phi)*cos(psi)-cos(phi)*cos(teta)*sin(psi);
663  x2[1]=-sin(phi)*sin(psi)+cos(phi)*cos(teta)*cos(psi);
664  x2[2]=cos(phi)*sin(teta);
665  x3[0]=sin(teta)*sin(psi);
666  x3[1]=-sin(teta)*cos(psi);
667  x3[2]=cos(teta);
668  for (int i=0;i<3;i++)
669  for (int j=0;j<3;j++)
670  {
671  tens1[i*3+j]+=x1[i]*x1[j];
672  tens2[i*3+j]+=x2[i]*x2[j];
673  tens3[i*3+j]+=x3[i]*x3[j];
674  }
675  double val;
676  vol->get_valeur_ccf((char*)"Ph",val);
677  int numphase=(int)val;
678  vol->get_valeur_ccf((char*)"Ro",val);
679  double dens=val;
680  double volu,mass;
681  OT_VECTEUR_3D cdm2;
682  OT_MATRICE_3D m1,m2;
683  vol->get_propriete_massique(gest->get_mg_maillage(0),volu,mass,cdm2,m1,m2,dens,-1);
684  statres.volume[numphase]=statres.volume[numphase]+volu;
685  statres.masse[numphase]=statres.masse[numphase]+mass;
686  statres.nbcristauxphase[numphase]++;
687  statres.cdm[numphase]=statres.cdm[numphase]+mass*cdm2;
688  }
689  statres.masse[statres.nbphase]=0.;
690  statres.volume[statres.nbphase]=0.;
691  statres.cdm[statres.nbphase].change_x(0.);
692  statres.cdm[statres.nbphase].change_y(0.);
693  statres.cdm[statres.nbphase].change_z(0.);
694  for (int i=0;i<statres.nbphase;i++)
695  {
696  statres.volume[statres.nbphase]=statres.volume[statres.nbphase]+statres.volume[i];
697  statres.masse[statres.nbphase]=statres.masse[statres.nbphase]+statres.masse[i];
698  statres.cdm[i]=(1./statres.masse[i])*statres.cdm[i];
699  statres.cdm[statres.nbphase]=statres.cdm[statres.nbphase]+statres.masse[i]*statres.cdm[i];
700  }
701  statres.cdm[statres.nbphase]=(1./statres.masse[statres.nbphase])*statres.cdm[statres.nbphase];
702  for (int i=0;i<statres.nbphase;i++)
703  {
704  char mess[500];
705  sprintf(mess," Phase %d (%d cristaux) : masse %lf ou %lf%% \n volume %lf ou %lf%%", i+1,statres.nbcristauxphase[i],statres.masse[i],statres.masse[i]/statres.masse[statres.nbphase]*100.,statres.volume[i],statres.volume[i]/statres.volume[statres.nbphase]*100.);
706 
707  affiche(mess);
708 
709  sprintf(mess," Centre de masse x = %lf ",statres.cdm[i].get_x());
710  affiche(mess);
711  sprintf(mess," y = %lf ",statres.cdm[i].get_y());
712  affiche(mess);
713  sprintf(mess," z = %lf ",statres.cdm[i].get_z());
714  affiche(mess);
715 
716  }
717  sprintf(mess," Centre de masse global x = %lf ",statres.cdm[statres.nbphase].get_x());
718  affiche(mess);
719  sprintf(mess," y = %lf ",statres.cdm[statres.nbphase].get_y());
720  affiche(mess);
721  sprintf(mess," z = %lf ",statres.cdm[statres.nbphase].get_z());
722  affiche(mess);
723 
724  }
725 
726  for (int i=0;i<9;i++)
727  {
728  statres.tens1[i]=tens1[i]/mggeo->get_nb_mg_volume();
729  statres.tens2[i]=tens2[i]/mggeo->get_nb_mg_volume();
730  statres.tens3[i]=tens3[i]/mggeo->get_nb_mg_volume();
731  }
732  }
733  int degre=(int)param.get_valeur("Degre");
734  statres.degre=degre;
735  FEM_MAILLAGE* fem;
736  if (afaire>1)
737  {
738 
739  if (reprendmai==0)
740  {
743  for (int i=gest->get_nb_mg_maillage()-1;i>0;i--)
744  gest->supprimer_mg_maillage(i);
745  //FCT_TAILLE_FEM_SOLUTION_GENERATEUR_CONSTANT carte(gest,mggeo,dg,1,1,1,1,(char*)nomfichiercarte.c_str());
746  affiche((char*)"Carte de taille");
747 
748  std::vector<double> lstpoint;
749  int nbarete=mggeo->get_nb_mg_arete();
750  double bornerafmin=param.get_valeur("bornemin_carte");
751  int typeborne=(int)param.get_valeur("type_bornemin");
752  if (typeborne==1) bornerafmin=bornerafmin*dg;
753  for (int i=0;i<nbarete;i++)
754  {
755  MG_ARETE* are=mggeo->get_mg_arete(i);
756  double val=are->get_longueur(are->get_tmin(),are->get_tmax());
757  if (val<epsfusion) std::cout<< " pb" << std::endl;
758  if (val<dg)
759  {
760  double xyz[3];
761  are->get_cosommet1()->get_sommet()->get_point()->evaluer(xyz);
762  lstpoint.push_back(xyz[0]);
763  lstpoint.push_back(xyz[1]);
764  lstpoint.push_back(xyz[2]);
765  lstpoint.push_back(std::max(val,bornerafmin));
766  }
767 
768  }
769  char message[500];
770  sprintf(message," Écart nodal demande : %lf Écart nodal minimal : %lf",dg,bornerafmin);
771  affiche(message);
772  sprintf(message," %d points de raffinement",(int)(lstpoint.size())/4);
773  affiche(message);
774  //affiche((char*)"Enregistrement");
775  //gest->enregistrer(nommagic);
776  double gradient=param.get_valeur("gradient");
777  FCT_TAILLE_FEM_SOLUTION_GENERATEUR_GRADIENT carte(gest,mggeo,dg,2,50,50,50,(char*)nomfichiercarte.c_str(),lstpoint,gradient);
778  //carte.active_affichage(affiche2);
779  carte.construit();
780  carte.enregistrer(nommagic);
781 
782  MG_MAILLAGE *mai=new MG_MAILLAGE(mggeo);
783  gest->ajouter_mg_maillage(mai);
784  affiche((char*)"Maillage 0D");
785  MAILLEUR0D m0d(mai,mggeo);
787  m0d.maille();
788  affiche((char*)"Maillage 1D");
789  MAILLEUR1D m1d(mai,mggeo,&carte);
790  //m1d.active_affichage(affiche2);
791  m1d.maille();
792  affiche((char*)"Maillage 2D");
793  MAILLEUR2D m2d(mai,mggeo,&carte);
794  //m2d.active_affichage(affiche2);
795  m2d.maille();
796  affiche((char*)"Maillage 3D");
797  MAILLEUR3D m3d(mai,mggeo,&carte,false);
798  //m3d.active_affichage(affiche2);
799  LISTE_MG_VOLUME::iterator it;int ii=0;
800  for (MG_VOLUME* vol=mggeo->get_premier_volume(it);vol!=NULL;vol=mggeo->get_suivant_volume(it))
801  {
802  ii++;
803  char mess[5000];
804  if (ii!=1) sprintf(mess,"\033[A\033[K Polycristal %d / %d soit %.2lf%%",ii,mggeo->get_nb_mg_volume(),ii*100.0/mggeo->get_nb_mg_volume());
805  else sprintf(mess," Polycristal %d / %d soit %.2lf%%",ii,mggeo->get_nb_mg_volume(),ii*100.0/mggeo->get_nb_mg_volume());
806  affiche(mess);
807  m3d.maille(vol);
808  }
809  //MAILLEUR_ANALYSE mana(mai);
810  //mana.active_affichage(affiche2);
811  //mana.analyse();
812  //optimise_maillage(mai);
813  //mana.analyse();
814  fem=new FEM_MAILLAGE(mggeo,mai,degre);
815  gest->ajouter_fem_maillage(fem);
816  char mess[400];
817  sprintf(mess,"Maillage FEM degre %d",degre);
818  affiche(mess);
819  MAILLEUR_FEM mfem;
820  mfem.maille(fem,0);
821  }
822  else
823  {
824  affiche((char*)"Reprise de calcul d'un ancien maillage");
825  fem=gest->get_fem_maillage(1);
826  }
827 
828  //verification volume
829  double volume=0.;
830  LISTE_FEM_ELEMENT3::iterator it;
831  for (FEM_ELEMENT3* ele=fem->get_premier_element3(it);ele!=NULL;ele=fem->get_suivant_element3(it))
832  {
833  MG_TETRA* tet=(MG_TETRA*)ele->get_mg_element_maillage();
834  MG_NOEUD* n1=tet->get_noeud1();
835  MG_NOEUD* n2=tet->get_noeud2();
836  MG_NOEUD* n3=tet->get_noeud3();
837  MG_NOEUD* n4=tet->get_noeud4();
838  OT_VECTEUR_3D vec1(n1->get_coord(),n2->get_coord());
839  OT_VECTEUR_3D vec2(n1->get_coord(),n3->get_coord());
840  OT_VECTEUR_3D vec3(n1->get_coord(),n4->get_coord());
841  OT_VECTEUR_3D pvec=vec1&vec2;
842  double vol=fabs(pvec*vec3);
843  volume=volume+vol;
844  }
845  volume=volume/6.;
846  char message[500];
847  sprintf(message," Volume des mailles = %lf",volume);
848  affiche(message);
849 
850  /*
851  MAILLEUR_ANALYSE mana(fem);
852  mana.active_affichage(affiche2);
853  mana.analyse(NULL);
854  */}
855  if (afaire>2)
856  {
857  double epsx,epsy,epsz,epsxy,epsxz,epsyz;
858  double sigx,sigy,sigz,sigxy,sigxz,sigyz;
859  affiche((char*)"\n---> 1. CLDHS\n");
861  int erreur=calcule_cacteristique_mecanique(gest,fem,epsx,epsy,epsz,epsxy,epsxz,epsyz,sigx,sigy,sigz,sigxy,sigxz,sigyz);
862  if (erreur==0)
863  {
864  statres.KDH=1./3.*(sigx+sigy+sigz)/(epsx+epsy+epsz);
865  mggeo->efface_ccf(false,true,true,true);
866  char message[500];
867  sprintf(message," KDH=%lf",statres.KDH);
868  affiche(message);
869  }
870  else exit(EXIT_FAILURE);
871 
872  if (erreur==0)
873  {
874 
875  affiche((char*)"\n---> 2. CLDHD\n");
877  erreur=calcule_cacteristique_mecanique(gest,fem,epsx,epsy,epsz,epsxy,epsxz,epsyz,sigx,sigy,sigz,sigxy,sigxz,sigyz);
878  if (erreur==0)
879  {
880  statres.GDH=1./6.*(sigxy/epsxy+sigyz/epsyz+sigxz/epsxz);
881  statres.EDH=9*statres.KDH*statres.GDH/(3*statres.KDH+statres.GDH);
882  mggeo->efface_ccf(false,true,true,true);
883  char message[500];
884  sprintf(message," GDH=%lf\n EDH=%lf\n",statres.GDH,statres.EDH);
885  affiche(message);
886  }
887  else exit(EXIT_FAILURE);
888  }
889 
890  if (erreur==0)
891  {
892  affiche((char*)"\n---> 3. CLCHS\n");
894  erreur=calcule_cacteristique_mecanique(gest,fem,epsx,epsy,epsz,epsxy,epsxz,epsyz,sigx,sigy,sigz,sigxy,sigxz,sigyz);
895  if (erreur==0)
896  {
897  statres.KCH=1./3.*(sigx+sigy+sigz)/(epsx+epsy+epsz);
898  mggeo->efface_ccf(false,true,true,true);
899  char message[500];
900  sprintf(message," KCH=%lf\n\n",statres.KCH);
901  affiche(message);
902  }
903  else exit(EXIT_FAILURE);
904 
905  }
906 
907  if (erreur==0)
908  {
909  affiche((char*)"\n---> 4. CLCHD\n");
911  calcule_cacteristique_mecanique(gest,fem,epsx,epsy,epsz,epsxy,epsxz,epsyz,sigx,sigy,sigz,sigxy,sigxz,sigyz);
912  if (erreur==0)
913  {
914  statres.GCH=1./6.*(sigxy/epsxy+sigyz/epsyz+sigxz/epsxz);
915  statres.ECH=9*statres.KCH*statres.GCH/(3*statres.KCH+statres.GCH);
916  mggeo->efface_ccf(false,true,true,true);
917  char message[500];
918  sprintf(message," GCH=%lf\n ECH=%lf\n",statres.GCH,statres.ECH);
919  affiche(message);
920  }
921  else exit(EXIT_FAILURE);
922 
923  //double GDH,EDH,KCH,GCH,ECH;
924  affiche((char*)"\n\n Résultats \n\n");
925  char message[500];
926  sprintf(message," KDH=%lf;GDH=%lf;EDH=%lf;",statres.KDH,statres.GDH,statres.EDH);
927  affiche(message);
928  sprintf(message," KCH=%lf;GCH=%lf;ECH=%lf;\n",statres.KCH,statres.GCH,statres.ECH);
929  affiche(message);
930  gest->enregistrer(nommagic);
931 
932 
933 
934  }
935 
936  }
937  int enregistreresultat=(int)param.get_valeur("enregistrerres");
938  if (enregistreresultat==1)
939  {
940  /*FILE *outborne=fopen(nomfichierborne.c_str(),"rb");
941  fread(&statborne,sizeof(statborne),1,outborne);
942  fclose(outborne);*/
943  calcule_borne(statborne,statres);
944  std::mutex mtx;
945  std::string nomcumul=param.get_nom("fichiercumul");
946  std::string nomcumul1 = nomcumul+".txt";
947  std::string nomcumul2 = nomcumul+".gnu";
948  std::string nomcumul3 = nomcumul+".svg";
949  FILE *outtest=fopen((char*)nomcumul1.c_str(),"rt");
950  bool existe =false;
951  if (outtest!=NULL) {existe=true;fclose(outtest);}
952  mtx.lock();
953  FILE *out=fopen((char*)nomcumul1.c_str(),"at");
954  if (!existe)
955  { fprintf(out,"Nbcristaux;degre;dg;KDH;GDH;EDH;KCH;GCH;ECH;ori1_11;ori1_12;ori1_13;ori1_21;ori1_22;ori1_23;ori1_31;ori1_32;ori1_33;ori2_11;ori2_12;ori2_13;ori2_21;ori2_22;ori2_23;ori2_31;ori2_32;ori2_33;ori3_11;ori3_12;ori3_13;ori3_21;ori3_22;ori3_23;ori3_31;ori3_32;ori3_33;Nbphase;");
956  for (int i=0;i<statres.nbphase;i++)
957  fprintf(out,"N%d;VPh%d;MPh%d;CDMx%d;CDMy%d;CDMz%d;",i+1,i+1,i+1,i+1,i+1,i+1);
958  fprintf(out,"VPhtot;MPhtot;CDMxtot;CDMytot;CDMztot,Kv,Gv,Ev,nuv,Kr,Gr,Er,nur\n");
959  }
960  fprintf(out,"%d;%d;%lf;",statres.nbcristaux,statres.degre,statres.dg);
961  fprintf(out,"%lf;%lf;%lf;",statres.KDH,statres.GDH,statres.EDH);
962  fprintf(out,"%lf;%lf;%lf;",statres.KCH,statres.GCH,statres.ECH);
963  for (int i=0;i<9;i++)
964  fprintf(out,"%lf;",statres.tens1[i]);
965  for (int i=0;i<9;i++)
966  fprintf(out,"%lf;",statres.tens2[i]);
967  for (int i=0;i<9;i++)
968  fprintf(out,"%lf;",statres.tens3[i]);
969  fprintf(out,"%d;",statres.nbphase);
970  for (int i=0;i<statres.nbphase;i++)
971  fprintf(out,"%d;%lf;%lf;%lf;%lf;%lf;",statres.nbcristauxphase[i],statres.volume[i],statres.masse[i],statres.cdm[i].get_x(),statres.cdm[i].get_y(),statres.cdm[i].get_z());
972  fprintf(out,"%lf;%lf;%lf;%lf;%lf;",statres.volume[statres.nbphase],statres.masse[statres.nbphase],statres.cdm[statres.nbphase].get_x(),statres.cdm[statres.nbphase].get_y(),statres.cdm[statres.nbphase].get_z());
973  fprintf(out,"%lf;%lf;%lf;%lf;%lf;%lf;%lf;%lf;",statborne.Kvoigt,statborne.Gvoigt,statborne.Evoigt,statborne.nuvoigt,statborne.Kreuss,statborne.Greuss,statborne.Ereuss,statborne.nureuss);
974  fprintf(out,"\n");
975 
976  fclose(out);
977  mtx.unlock();
978  /*outtest=fopen((char*)nomcumul2.c_str(),"rt");
979  existe =false;
980  if (outtest!=NULL) {existe=true;fclose(outtest);}
981  if (!existe)
982  {
983  mtx.lock();
984  FILE *out=fopen((char*)nomcumul2.c_str(),"wt");
985  fprintf(out, "set terminal svg\n");
986  fprintf(out, "set output \"%s\"\n", nomcumul3.c_str());
987  fprintf(out, "set datafile separator \";\"\n");
988  fprintf(out, "set key on bmargin horizontal\n");
989  fprintf(out, "set xlabel 'Numéro d''essai'\n");
990  fprintf(out, "set ylabel 'Module d''Young (GPa)'\n");
991  fprintf(out, "set y2label 'Écart à l''isotropie'\n");
992  fprintf(out, "set pointsize 1\n");
993  fprintf(out, "set autoscale x\n");
994  fprintf(out, "set autoscale y\n");
995  fprintf(out, "set y2tics 0.5,0.1,1\n");
996  fprintf(out, "set y2r [0.5:1]\n");
997  fprintf(out, "set ytics nomirror\n");
998  fprintf(out, "set xtics nomirror\n");
999  double facteur = (param.get_valeur("bornevoigt")-param.get_valeur("bornereuss"))/3./1e9;
1000  fprintf(out, "set offsets graph 0, 0, %lf,0\n", facteur);
1001  fprintf(out, "#\n");
1002  fprintf(out, "d(x)=dd\n");
1003  fprintf(out, "fit d(x) '%s' u :($6/1e9) via dd\n",nomcumul1.c_str());
1004  fprintf(out, "c(x)=cc\n");
1005  fprintf(out, "fit c(x) '%s' u :($9/1e9) via cc\n",nomcumul1.c_str());
1006  fprintf(out, "#\n");
1007  fprintf(out, "set title \"%s\\n %d cristaux\"\n",param.get_nom("nommateriau").c_str(), (int)param.get_valeur("nb_cristaux"));
1008  fprintf(out, "plot '%s' u :($6/1e9) title 'EDH' pointtype 5 lc rgb \"blue\", '%s' u :($9/1e9) title 'ECH' pointtype 5 lc rgb \"red\",(%lf/1e9) title 'Borne Voigt' w l lc rgb \"violet\" lw 3,(%lf/1e9) title 'Borne Reuss' w l lc rgb \"dark-orange\" lw 3, '%s' u :(1.-sqrt(1./9.*(($10-1./3)*($10-1./3)+($14-1./3.)*($14-1./3)+($18-1./3.)*($18-1./3.)+($19-1./3)*($19-1./3)+($23-1./3.)*($23-1./3)+($27-1./3.)*($27-1./3.)+($28-1./3)*($28-1./3)+($32-1./3.)*($32-1./3)+($36-1./3.)*($36-1./3.)))) axis x1y2 title 'Isotropie' lc rgb \"green\" pointtype 1,c(x) title sprintf(\"moyenne %%.1f\",cc) lc rgb \"red\" dt 2 ,d(x) title sprintf(\"moyenne %%.1f\",dd) lc rgb \"blue\" dt 2", nomcumul1.c_str(),nomcumul1.c_str(),statres.Evoigt,statres.Ereuss,nomcumul1.c_str() );
1009 
1010 
1011  fclose(out);
1012  mtx.unlock();
1013  }*/
1014  }
1015 
1016 
1017 
1018  affiche((char*)"Enregistrement");
1019  gest->enregistrer(nommagic);
1020  delete gest;
1021 
1022  #endif
1023  }
1024 
1025 
1026 
1027  int MSTRUCT_GENERATEUR_POLYCRISTAUX::calcule_cacteristique_mecanique(MG_GESTIONNAIRE *gest,FEM_MAILLAGE* fem, double& epsx, double& epsy, double& epsz, double& epsxy, double& epsxz, double& epsyz, double& sigx, double& sigy, double& sigz, double& sigxy, double& sigxz, double& sigyz)
1028  {
1029 
1030  //affiche((char*)"Calcul aster");
1031  MGASTER ef;
1033  std::string nomparamaster=param.get_nom("paramaster");
1034  std::string nomfichier=param.get_nom("nomfichier");
1035  int erreur=ef.calcule((char*)nomparamaster.c_str(),fem,(char*)nomfichier.c_str(),MAGIC::CALCUL_ASTER::ELASTIQUE,(char*)"00011111",false);
1036  if (erreur!=0) return erreur;
1037  int nb=gest->get_nb_fem_solution();
1038  for (int i=0;i<nb;i++)
1039  {
1040 
1041  FEM_SOLUTION* sol=gest->get_fem_solution(i);
1042  std::string nom=sol->get_nom();
1043  nom.erase(2,1000);
1044  if (nom=="GE")
1045  {
1046  epsx=sol->get_moyenne_volumique_champs(NULL,0);
1047  epsy=sol->get_moyenne_volumique_champs(NULL,1);
1048  epsz=sol->get_moyenne_volumique_champs(NULL,2);
1049  epsxy=sol->get_moyenne_volumique_champs(NULL,3);
1050  epsxz=sol->get_moyenne_volumique_champs(NULL,4);
1051  epsyz=sol->get_moyenne_volumique_champs(NULL,5);
1052  }
1053  if ((nom=="GS") && (sol->get_nb_champ()==6))
1054  {
1055  sigx=sol->get_moyenne_volumique_champs(NULL,0);
1056  sigy=sol->get_moyenne_volumique_champs(NULL,1);
1057  sigz=sol->get_moyenne_volumique_champs(NULL,2);
1058  sigxy=sol->get_moyenne_volumique_champs(NULL,3);
1059  sigxz=sol->get_moyenne_volumique_champs(NULL,4);
1060  sigyz=sol->get_moyenne_volumique_champs(NULL,5);
1061  }
1062  }
1063  return erreur;
1064  }
1065 
1066 
1067 
1068 
1069 
1070 
1072 {
1073 double bornerafmin=param.get_valeur("bornemin_carte");
1074 int typeborne=(int)param.get_valeur("type_bornemin");
1075 double dg=param.get_valeur("dg");
1076 if (typeborne==1) bornerafmin=bornerafmin*dg;
1078 std::multimap<MG_NOEUD*,MG_NOEUD*> lst1;
1079 std::map<MG_NOEUD*,MG_NOEUD*> lst2;
1080 LISTE_MG_SEGMENT::iterator it;
1081 for (MG_SEGMENT* seg=mai->get_premier_segment(it);seg!=NULL;seg=mai->get_suivant_segment(it))
1082  {
1083  if (seg->get_longueur()<bornerafmin)
1084  {
1085  int nb1=seg->get_noeud1()->get_lien_tetra()->get_nb();
1086  int nb2=seg->get_noeud2()->get_lien_tetra()->get_nb();
1087  MG_NOEUD* no1=seg->get_noeud1();
1088  MG_NOEUD* no2=seg->get_noeud2();
1089  if (no1>no2)
1090  {
1091  MG_NOEUD* tmp=no1;
1092  no1=no2;
1093  no2=tmp;
1094  }
1095  std::map<MG_NOEUD*,MG_NOEUD*>::iterator itn=lst2.find(no1);
1096  if (itn!=lst2.end())
1097  no1=itn->second;
1098  std::pair<MG_NOEUD*,MG_NOEUD*> tmp1(no1,no2);
1099  std::pair<MG_NOEUD*,MG_NOEUD*> tmp2(no2,no1);
1100  std::pair<std::map<MG_NOEUD*,MG_NOEUD*>::iterator,bool> ret=lst2.insert(tmp2);
1101  if (ret.second==false) continue;
1102  lst1.insert(tmp1);
1103  for (int i=0;i<nb1;i++)
1104  for (int j=0;j<nb2;j++)
1105  if (seg->get_noeud1()->get_lien_tetra()->get(i)==seg->get_noeud2()->get_lien_tetra()->get(j))
1106  {
1107  MG_TETRA* tet=seg->get_noeud1()->get_lien_tetra()->get(i);
1108  coq.ajouter(tet);
1109  }
1110  }
1111  }
1113 for (MG_TETRA* tet=coq.get_premier(it2);tet!=NULL;tet=coq.get_suivant(it2))
1114  mai->supprimer_mg_tetraid(tet->get_id());
1115 for (std::multimap<MG_NOEUD*,MG_NOEUD*>::iterator itn=lst1.begin();itn!=lst1.end();itn++)
1116  {
1117  TPL_LISTE_ENTITE<MG_NOEUD*> lsttetaconstruire;
1118  TPL_LISTE_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lsttetaconstruire2;
1119  coq.vide();
1120  MG_NOEUD* no1=itn->first;
1121  MG_NOEUD* no2=itn->second;
1122  int nb=no2->get_lien_tetra()->get_nb();
1123  for (int i=0;i<nb;i++)
1124  {
1125  MG_TETRA* tet=no2->get_lien_tetra()->get(i);
1126  if (tet->get_noeud1()==no2) lsttetaconstruire.ajouter(no1); else lsttetaconstruire.ajouter(tet->get_noeud1());
1127  if (tet->get_noeud2()==no2) lsttetaconstruire.ajouter(no1); else lsttetaconstruire.ajouter(tet->get_noeud2());
1128  if (tet->get_noeud3()==no2) lsttetaconstruire.ajouter(no1); else lsttetaconstruire.ajouter(tet->get_noeud3());
1129  if (tet->get_noeud4()==no2) lsttetaconstruire.ajouter(no1); else lsttetaconstruire.ajouter(tet->get_noeud4());
1130  lsttetaconstruire2.ajouter(tet->get_lien_topologie());
1131  coq.ajouter(tet);
1132  }
1133 
1134 for (int i=0;i<lsttetaconstruire.get_nb()/4;i++)
1135  {
1136  double qual=OPERATEUR::qualite_tetra(lsttetaconstruire.get(4*i)->get_coord(),lsttetaconstruire.get(4*i+1)->get_coord(),lsttetaconstruire.get(4*i+2)->get_coord(),lsttetaconstruire.get(4*i+3)->get_coord());
1137  if (qual<1e-14) std::cout << qual << std::endl;
1138  mai->ajouter_mg_tetra(lsttetaconstruire2.get(i),lsttetaconstruire.get(4*i),lsttetaconstruire.get(4*i+1),lsttetaconstruire.get(4*i+2),lsttetaconstruire.get(4*i+3),MAGIC::ORIGINE::MAILLEUR_AUTO);
1139  }
1140 
1141  }
1142 for (MG_TETRA* tet=coq.get_premier(it2);tet!=NULL;tet=coq.get_suivant(it2))
1143  mai->supprimer_mg_tetraid(tet->get_id());
1144 
1145 
1146 
1147 
1148 
1149 }
1150 
1152 {
1153  OT_TENSEUR rigtot(6,6),soutot(6,6);
1154  MSTRUCT_BORNE borne;
1155  for (int i=0;i<echantillon.nbphase;i++)
1156  {
1157  double E1=param.get_valeur("E1",i);
1158  double E2=param.get_valeur("E2",i);
1159  double E3=param.get_valeur("E3",i);
1160  double n1=param.get_valeur("n1",i);
1161  double n2=param.get_valeur("n2",i);
1162  double n3=param.get_valeur("n3",i);
1163  double G1=param.get_valeur("G1",i);
1164  double G2=param.get_valeur("G2",i);
1165  double G3=param.get_valeur("G3",i);
1166  OT_TENSEUR rig(6,6),rigphase(6,6),souphase(6,6);
1167  borne.get_tenseur_rigidite(E1/1e9,E2/1e9,E3/1e9,2.*G1/1e9,2.*G2/1e9,2.*G3/1e9,n1,n2,n3,rig);
1168  borne.get_VoigtReuss_poly(rig,rigphase,souphase);
1169  double proportion=echantillon.masse[i]/echantillon.masse[echantillon.nbphase];
1170  rigphase=proportion*rigphase;
1171  souphase=proportion*souphase;
1172  rigtot=rigtot+rigphase;
1173  soutot=soutot+souphase;
1174  }
1175  double Ev,Gv,Kv,nuv;
1176  double Er,Gr,Kr,nur;
1177  borne.get_VoigtReuss_poly(rigtot,soutot,Kv,Gv,Ev,nuv,Kr,Gr,Er,nur);
1178  statborne.Evoigt=Ev*1e9;
1179  statborne.Kvoigt=Kv/3.*1e9;
1180  statborne.Gvoigt=Gv/2.*1e9;
1181  statborne.nuvoigt=nuv;
1182  statborne.Ereuss=Er*1e9;
1183  statborne.Kreuss=Kr/3.*1e9;
1184  statborne.Greuss=Gr/2.*1e9;
1185  statborne.nureuss=nur;
1186 
1187 }
1188 
double get_xmin(void)
double get_zmin(void)
double get_zmax(void)
double get_xmax(void)
void change_grosseur(double f)
double get_ymax(void)
double get_ymin(void)
virtual void enregistrer(char *nom)
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
FEM_ELEMENT3 * get_premier_element3(LISTE_FEM_ELEMENT3::iterator &it)
double get_moyenne_volumique_champs(class MG_VOLUME *vol, int numchamps, int coord=0)
int get_nb_champ(void)
std::string get_nom(void)
virtual void active_affichage(fonction_affiche *fonc)
int maille(MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
Definition: mailleur0d.cpp:43
int maille(MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
Definition: mailleur1d.cpp:50
int maille(MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
Definition: mailleur2d.cpp:49
virtual int maille(MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
Definition: mailleur3d.cpp:55
virtual int maille(class FEM_MAILLAGE *fem, bool courbure_discrete=false, int num=0)
virtual double get_tmax(void)
Definition: mg_arete.cpp:184
virtual double get_tmin(void)
Definition: mg_arete.cpp:179
virtual double get_longueur(double t1, double t2, double precis=1e-6)
Definition: mg_arete.cpp:193
virtual class MG_COSOMMET * get_cosommet1(void)
Definition: mg_arete.cpp:81
virtual MG_SOMMET * get_sommet(void)
Definition: mg_cosommet.cpp:83
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual void ajouter_ccf(char *nom, double val, std::string suiv="NS")
virtual void supprimer_ccf(int num)
void ecrire_params_aster(char *fichier)
Definition: mg_export.cpp:115
void change_param_aster(char *nomparam, double val)
Definition: mg_export.cpp:105
unsigned int get_nb_mg_arete(void)
void change_valeur_unite(double val)
MG_POINT * get_premier_point(LISTE_MG_POINT::iterator &it)
void efface_ccf(bool volume, bool face, bool arete, bool sommet)
virtual int ajouter_mg_point(MG_POINT *mgpt)
MG_ARETE * get_mg_arete(unsigned int num)
MG_POINT * get_suivant_point(LISTE_MG_POINT::iterator &it)
unsigned int get_nb_mg_volume(void)
MG_VOLUME * get_suivant_volume(LISTE_MG_VOLUME::iterator &it)
MG_VOLUME * get_premier_volume(LISTE_MG_VOLUME::iterator &it)
unsigned int get_nb_mg_maillage(void)
MG_MAILLAGE * get_mg_maillage(unsigned int num)
int supprimer_mg_maillage(unsigned int num)
FEM_SOLUTION * get_fem_solution(unsigned int num)
int ajouter_fem_maillage(FEM_MAILLAGE *femmai)
MG_GEOMETRIE * get_mg_geometrie(unsigned int num)
virtual void enregistrer(std::ostream &o, double version=MAGIC_VERSION_FICHIER_DOUBLE)
FEM_MAILLAGE * get_fem_maillage(unsigned int num)
void supprimer_tout_fem_maillage(void)
void supprimer_tout_fem_solution(void)
int ajouter_mg_maillage(MG_MAILLAGE *mgmai)
unsigned int get_nb_fem_solution(void)
MG_SEGMENT * get_premier_segment(LISTE_MG_SEGMENT::iterator &)
MG_SEGMENT * get_suivant_segment(LISTE_MG_SEGMENT::iterator &)
MG_TETRA * ajouter_mg_tetra(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, class MG_NOEUD *mgnoeud4, int origine, unsigned long num=0)
int supprimer_mg_tetraid(unsigned long num)
TPL_LISTE_ENTITE< class MG_TETRA * > * get_lien_tetra(void)
Definition: mg_noeud.cpp:175
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
virtual void evaluer(double *xyz)=0
virtual MG_POINT * get_point(void)
Definition: mg_sommet.cpp:52
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_tetra.cpp:143
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_tetra.cpp:148
virtual MG_NOEUD * get_noeud4(void)
Definition: mg_tetra.cpp:158
virtual MG_NOEUD * get_noeud3(void)
Definition: mg_tetra.cpp:153
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
virtual int calcule(char *nomfichierparam, class FEM_MAILLAGE *fem, char *nometude, int typeetude, char *code=NULL, bool avecenreg=true)
Definition: mgaster.cpp:62
virtual void active_affichage(void(*fonc)(char *))
Definition: mgaster.cpp:56
void get_VoigtReuss_poly(double c11, double c12, double c13, double c23, double c22, double c33, double c44, double c55, double c66, double &troisKvoigt, double &deuxGvoigt, double &Evoigt, double &nuvoigt, double &troisKreuss, double &deuxGreuss, double &Ereuss, double &nureuss)
void get_tenseur_rigidite(double E1, double E2, double E3, double G1, double G2, double G3, double nu1, double nu2, double nu3, OT_TENSEUR &rigE)
virtual void calcule_borne(MSTRUCT_GENERATEUR_POLYCRISTAUX_BORNE &statborne, MSTRUCT_GENERATEUR_POLYCRISTAUX_RESULTAT &echantillon)
int calcule_cacteristique_mecanique(MG_GESTIONNAIRE *gest, FEM_MAILLAGE *fem, double &epsx, double &epsy, double &epsz, double &epsxy, double &epsxz, double &epsyz, double &sigx, double &sigy, double &sigz, double &sigxy, double &sigxz, double &sigyz)
virtual void cree_param(char *nom, char *nomexe)
virtual void active_affichage(fonction_affiche *fonc)
static int appliquer_conditions_limites(MG_GEOMETRIE *m_mg_geometrie, BOITE_3D boite3D_ves, int Type_etude, int Type_CL, int Type_Chargement, double Valeur_CL, int Direction=0, double eps=1.0e-06)
class MG_MAILLAGE * importer_triangulation_V2017(class MG_GESTIONNAIRE &gest, MG_GEOMETRIE *mggeo, double epsilon=1., int mode=1)
class MG_GEOMETRIE * importer_fichier_brep_V2017(class MG_GESTIONNAIRE &gest, char *path_brep, char *nom_caf, int typefichier, double precision=1e-6, bool fusionner_entite_similaire=false)
Definition: occ_import.cpp:92
static double qualite_tetra(double *noeud1, double *noeud2, double *noeud3, double *noeud4)
void enregistrer(char *nom)
void change_valeur(std::string chaine, double val, int num=0)
int lire(char *nom)
std::string get_nom(std::string chaine, int num=0)
void ajouter(std::string chaine, double valeur, int typep, std::string aide="")
double get_valeur(std::string chaine, int num=0)
virtual double get_longueur(void) const
virtual void active_affichage(fonction_affiche *fonc)
virtual void construit(bool avecstep=false)
Definition: polycristal.cpp:75
virtual void inserer(A a)
Definition: tpl_grille.h:274
virtual void rechercher(BOITE_3D bt, TPL_MAP_ENTITE< A > &liste_entite_trouve)
Definition: tpl_grille.h:202
virtual void initialiser(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax, int nb_pasx, int nb_pasy, int nb_pasz)
Definition: tpl_grille.h:142
virtual X get(int num)
virtual void ajouter(X x)
virtual int get_nb(void)
virtual X get_premier(ITERATEUR &it)
virtual int get_nb(void)
virtual X get_suivant(ITERATEUR &it)
virtual void ajouter(X x)
virtual void vide(void)
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
void fonction_affiche(char *)
Definition: fct_taille.h:28
#define FICHIEROCC
Definition: occ_import.h:58
double2 sin(double2 &val)
double2 acos(double2 &val)
double2 cos(double2 &val)
int existe(const std::vector< T > &vct, double val, int &idx)
@ CONTRAINTE_HOMOGENE
Definition: ve_definition.h:42
@ DEFORMATION_HOMOGENE
Definition: ve_definition.h:41
@ SPHERIQUE
Definition: ve_definition.h:46
@ DEVIATORIQUE
Definition: ve_definition.h:47