MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mgopt_simp_adaptative.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 //####// mgopt_simp_adaptative.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:57 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
23 #include "ot_mathematique.h"
24 #include "mg_file.h"
25 #include "mg_export.h"
26 #include "fem_solution.h"
27 #include "fem_maillage.h"
28 #include "mg_gestionnaire.h"
29 #include "mgopt_simp_adaptative.h"
30 #include "mgopt_simp.h"
31 #include "ot_cpu.h"
32 #include <fct_generateur_fichier.h>
34 #include <tpl_octree.h>
35 #include <math.h>
36 #include <stdio.h>
37 #include <string.h>
38 #include <fstream>
39 
40 void affiche(char* message)
41 {
42  std::cout << message << std::endl;
43 }
44 
45 
46 
48 {
49 params.ajouter("carte_taille_structure_adapt",20.,OT_PARAMETRES::DOUBLE,"Utilisation d'un support de carte de taille structure 0-non nombre=nombre de subdivision en une direction");
50 params.ajouter("iter_adaptative_max",10.,OT_PARAMETRES::DOUBLE,"Nombre maximal d'itérations de la SIMP adaptative");
51 params.ajouter("seuil_convergence_adaptative",0.1,OT_PARAMETRES::DOUBLE,"Critere de convergence minimal dans les iterations de SIMP lors d'adaptation");
52 params.ajouter("enm",7.,OT_PARAMETRES::DOUBLE,"Ecart nodal maximal de la carte de taille de la SIMP adaptative");
53 params.ajouter("khi",0.,OT_PARAMETRES::DOUBLE,"Parametre de controle de la vitesse de raffinement toujours > 0 (si 0. maillage constant de taille enm)");
54 params.ajouter("coef_critere_convergence",1.,OT_PARAMETRES::DOUBLE,"Coefficient de multiplication du critere_convergence apres chaque cycle");
55 params.ajouter("seuil_lissage_gradient",0.3,OT_PARAMETRES::DOUBLE,"Seuil de lissage du gradient");
56 }
57 
59 {
60 }
61 
63 {
64 }
65 
66 
68 {
69  double jac[9],j[9];
70  if ((tet->get_nb_fem_noeud()==4))
71  {
72  FEM_NOEUD* n1=tet->get_fem_noeud(0);
73  FEM_NOEUD* n2=tet->get_fem_noeud(1);
74  FEM_NOEUD* n3=tet->get_fem_noeud(2);
75  FEM_NOEUD* n4=tet->get_fem_noeud(3);
76  double *xyz1=n1->get_coord();
77  double *xyz2=n2->get_coord();
78  double *xyz3=n3->get_coord();
79  double *xyz4=n4->get_coord();
80  jac[0]=(xyz2[0]-xyz1[0]);
81  jac[1]=(xyz2[1]-xyz1[1]);
82  jac[2]=(xyz2[2]-xyz1[2]);
83  jac[3]=(xyz3[0]-xyz1[0]);
84  jac[4]=(xyz3[1]-xyz1[1]);
85  jac[5]=(xyz3[2]-xyz1[2]);
86  jac[6]=(xyz4[0]-xyz1[0]);
87  jac[7]=(xyz4[1]-xyz1[1]);
88  jac[8]=(xyz4[2]-xyz1[2]);
89  double detj=jac[0]*jac[4]*jac[8]+jac[3]*jac[7]*jac[2]+jac[6]*jac[1]*jac[5]-jac[2]*jac[4]*jac[6]-jac[5]*jac[7]*jac[0]-jac[8]*jac[1]*jac[3];
90 
91  j[0*3+0] = (jac[1*3+1]*jac[2*3+2]-jac[1*3+2]*jac[2*3+1])/(detj);
92  j[0*3+1] = -(jac[0*3+1]*jac[2*3+2]-jac[0*3+2]*jac[2*3+1])/(detj);
93  j[0*3+2] =-(-jac[0*3+1]*jac[1*3+2]+jac[0*3+2]*jac[1*3+1])/(detj);
94  j[1*3+0] = -(jac[1*3+0]*jac[2*3+2]-jac[1*3+2]*jac[2*3+0])/(detj);
95  j[1*3+1] = (jac[0*3+0]*jac[2*3+2]-jac[0*3+2]*jac[2*3+0])/(detj);
96  j[1*3+2] = -(jac[0*3+0]*jac[1*3+2]-jac[0*3+2]*jac[1*3+0])/(detj);
97  j[2*3+0] =-(-jac[1*3+0]*jac[2*3+1]+jac[1*3+1]*jac[2*3+0])/(detj);
98  j[2*3+1] = -(jac[0*3+0]*jac[2*3+1]-jac[0*3+1]*jac[2*3+0])/(detj);
99  j[2*3+2] = (jac[0*3+0]*jac[1*3+1]-jac[0*3+1]*jac[1*3+0])/(detj);
100 
101  //Gradient par element Design
102  double d0 = n1->get_solution();
103  double d1 = n2->get_solution();
104  double d2 = n3->get_solution();
105  double d3 = n4->get_solution();
106 
107  double gd_x = j[0*3+0]*(d1-d0)+j[0*3+1]*(d2-d0)+j[0*3+2]*(d3-d0);
108  double gd_y = j[1*3+0]*(d1-d0)+j[1*3+1]*(d2-d0)+j[1*3+2]*(d3-d0);
109  double gd_z = j[2*3+0]*(d1-d0)+j[2*3+1]*(d2-d0)+j[2*3+2]*(d3-d0);
110 
111  OT_VECTEUR_3D gd(gd_x,gd_y,gd_z);
112  return(gd.get_longueur());
113  }
114  return 0.;
115 }
116 
117 
118 
119 void MGOPT_SIMP_ADAPTATIVE::gradient_noeud(FEM_MAILLAGE* femmai,MG_GESTIONNAIRE* gest,char* nom_solution_gradient)
120 {
121  double grdmax = 0.001;
122  double grdmax_grd = 0.001;
125  TPL_MAP_ENTITE<FEM_NOEUD*> liste_noeuds_design;
127  TPL_MAP_ENTITE<FEM_NOEUD*> liste_noeuds_nondesign;
129  TPL_MAP_ENTITE<FEM_ELEMENT3*> liste_tetras_design;
131  TPL_MAP_ENTITE<FEM_ELEMENT3*> liste_tetras_nondesign;
133 
134  affiche((char*)"Extrapolation de la densité aux noeuds ");
136  LISTE_FEM_NOEUD::iterator it;
137  for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
138  no->change_solution(0.);
139 
141  LISTE_FEM_ELEMENT3::iterator itt;
142  for (FEM_ELEMENT3* tet=femmai->get_premier_element3(itt);tet!=NULL;tet=femmai->get_suivant_element3(itt))
143  {
144  if (tet->get_mg_element_maillage()->get_origine()!=MAGIC::ORIGINE::IMPOSE)
145  {
146  FEM_NOEUD* n1=tet->get_fem_noeud(0);
147  FEM_NOEUD* n2=tet->get_fem_noeud(1);
148  FEM_NOEUD* n3=tet->get_fem_noeud(2);
149  FEM_NOEUD* n4=tet->get_fem_noeud(3);
150  liste_noeuds_design.ajouter(n1);
151  liste_noeuds_design.ajouter(n2);
152  liste_noeuds_design.ajouter(n3);
153  liste_noeuds_design.ajouter(n4);
154  liste_tetras_design.ajouter(tet);
155  }
156  if (tet->get_mg_element_maillage()->get_origine()==MAGIC::ORIGINE::IMPOSE)
157  {
158  FEM_NOEUD* n1=tet->get_fem_noeud(0);
159  FEM_NOEUD* n2=tet->get_fem_noeud(1);
160  FEM_NOEUD* n3=tet->get_fem_noeud(2);
161  FEM_NOEUD* n4=tet->get_fem_noeud(3);
162  liste_noeuds_nondesign.ajouter(n1);
163  liste_noeuds_nondesign.ajouter(n2);
164  liste_noeuds_nondesign.ajouter(n3);
165  liste_noeuds_nondesign.ajouter(n4);
166  liste_tetras_nondesign.ajouter(tet);
167  }
168  }
170  for (FEM_NOEUD* no1=liste_noeuds_design.get_premier(itd);no1!=NULL;no1=liste_noeuds_design.get_suivant(itd))
171  for (FEM_NOEUD* no2=liste_noeuds_nondesign.get_premier(itnd);no2!=NULL;no2=liste_noeuds_nondesign.get_suivant(itnd))
172  if (no1==no2) lstasup.ajouter(no2);
173  for (int i=0;i<lstasup.get_nb();i++)
174  liste_noeuds_nondesign.supprimer(lstasup.get(i));
175 
177  for (FEM_NOEUD* no=liste_noeuds_design.get_premier(itd);no!=NULL;no=liste_noeuds_design.get_suivant(itd))
178  {
179  double nume=0.;
180  double deno=0.;
181  for (int i=0;i<no->get_lien_element3()->get_nb();i++)
182  {
183  FEM_ELEMENT3* tet=no->get_lien_element3()->get(i);
185  {
186  double jac[9];
187  double volume=tet->get_jacobien(jac,jac,1.);
188  nume=nume+tet->get_solution()*volume;
189  deno=deno+volume;
190  }
191  }
192  no->change_solution(nume/deno);
193  }
194 
196  for (FEM_ELEMENT3* tet=liste_tetras_design.get_premier(ittd);tet!=NULL;tet=liste_tetras_design.get_suivant(ittd))
197  {
198  if ((tet->get_nb_fem_noeud()==4)&&(tet->get_mg_element_maillage()->get_origine()!=MAGIC::ORIGINE::IMPOSE))
199  tet->change_solution(get_gradient_element(tet));
200  }
201 
203  affiche((char*)"Extrapolation du gradient aux noeuds ");
204  for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
205  no->change_solution(0.);
206 
208  for (FEM_NOEUD* no=liste_noeuds_design.get_premier(itd);no!=NULL;no=liste_noeuds_design.get_suivant(itd))
209  {
210  double vect=0.;
211  double vol=0.;
212  for (int i=0;i<no->get_lien_element3()->get_nb();i++)
213  {
214  FEM_ELEMENT3* tet=no->get_lien_element3()->get(i);
216  {
217  FEM_NOEUD* no1=tet->get_fem_noeud(0);
218  FEM_NOEUD* no2=tet->get_fem_noeud(1);
219  FEM_NOEUD* no3=tet->get_fem_noeud(2);
220  FEM_NOEUD* no4=tet->get_fem_noeud(3);
221  double *xyz1=no1->get_coord();
222  double *xyz2=no2->get_coord();
223  double *xyz3=no3->get_coord();
224  double *xyz4=no4->get_coord();
225  OT_VECTEUR_3D vec1(xyz1,xyz2);
226  OT_VECTEUR_3D vec2(xyz1,xyz3);
227  OT_VECTEUR_3D vec3(xyz1,xyz4);
228  OT_VECTEUR_3D pvec=vec1&vec2 ;
229  double volume=(fabs(vec3*pvec))/6.;
230  vect=vect+volume*tet->get_solution();
231  vol=vol+volume;
232  }
233  }
234  if(vect/vol > 0.001) no->change_solution(vect/vol);
235  if(vect/vol > grdmax) grdmax = vect/vol;
236  if(vect/vol >= 1.e-308) lstnode.ajouter(no);
237  }
238 
239  char message[500];
240  sprintf(message,"gradient maximal = %lf",grdmax);
241  affiche(message);
242 
243 
245  // Calcul du gradient (du gradient) par element de design
246  for (FEM_ELEMENT3* tet=liste_tetras_design.get_premier(ittd);tet!=NULL;tet=liste_tetras_design.get_suivant(ittd))
247  tet->change_solution(0.);
248  for (FEM_ELEMENT3* tet=liste_tetras_design.get_premier(ittd);tet!=NULL;tet=liste_tetras_design.get_suivant(ittd))
249  {
250  if ((tet->get_nb_fem_noeud()==4)&&(tet->get_mg_element_maillage()->get_origine()!=MAGIC::ORIGINE::IMPOSE))
251  tet->change_solution(get_gradient_element(tet));
252  }
253  // Calcul de la variation maximale du gradient aux noeuds
254  for (FEM_NOEUD* no=liste_noeuds_design.get_premier(itd);no!=NULL;no=liste_noeuds_design.get_suivant(itd))
255  {
256  double vect=0.;
257  double vol=0.;
258  for (int i=0;i<no->get_lien_element3()->get_nb();i++)
259  {
260  FEM_ELEMENT3* tet=no->get_lien_element3()->get(i);
262  {
263  FEM_NOEUD* no1=tet->get_fem_noeud(0);
264  FEM_NOEUD* no2=tet->get_fem_noeud(1);
265  FEM_NOEUD* no3=tet->get_fem_noeud(2);
266  FEM_NOEUD* no4=tet->get_fem_noeud(3);
267  double *xyz1=no1->get_coord();
268  double *xyz2=no2->get_coord();
269  double *xyz3=no3->get_coord();
270  double *xyz4=no4->get_coord();
271  OT_VECTEUR_3D vec1(xyz1,xyz2);
272  OT_VECTEUR_3D vec2(xyz1,xyz3);
273  OT_VECTEUR_3D vec3(xyz1,xyz4);
274  OT_VECTEUR_3D pvec=vec1&vec2 ;
275  double volume=(fabs(vec3*pvec))/6.;
276  vect=vect+volume*tet->get_solution();
277  vol=vol+volume;
278  }
279  }
280  if(vect/vol > grdmax_grd) grdmax_grd = vect/vol;
281  }
282  sprintf(message,"gradient maximal du gradient = %lf",grdmax_grd);
283  affiche(message);
284  double seuil = params.get_valeur("seuil_lissage_gradient");
285 
286  // Lissage du gradient a partir de sa variation
288  for (FEM_NOEUD* no=liste_noeuds_design.get_premier(itd);no!=NULL;no=liste_noeuds_design.get_suivant(itd))
289  {
290  double vect=0.;
291  double vol=0.;
292  for (int i=0;i<no->get_lien_element3()->get_nb();i++)
293  {
294  FEM_ELEMENT3* tet=no->get_lien_element3()->get(i);
296  {
297  FEM_NOEUD* no1=tet->get_fem_noeud(0);
298  FEM_NOEUD* no2=tet->get_fem_noeud(1);
299  FEM_NOEUD* no3=tet->get_fem_noeud(2);
300  FEM_NOEUD* no4=tet->get_fem_noeud(3);
301  double *xyz1=no1->get_coord();
302  double *xyz2=no2->get_coord();
303  double *xyz3=no3->get_coord();
304  double *xyz4=no4->get_coord();
305  OT_VECTEUR_3D vec1(xyz1,xyz2);
306  OT_VECTEUR_3D vec2(xyz1,xyz3);
307  OT_VECTEUR_3D vec3(xyz1,xyz4);
308  OT_VECTEUR_3D pvec=vec1&vec2 ;
309  double volume=(fabs(vec3*pvec))/6.;
310  vect=vect+volume*tet->get_solution();
311  vol=vol+volume;
312  }
313  }
314  if(vect/vol > seuil*grdmax_grd)
315  {
318  double som=0.;
319  for (int i=0;i<no->get_lien_element3()->get_nb();i++)
320  {
321  FEM_ELEMENT3* tet=no->get_lien_element3()->get(i);
323  {
324  FEM_NOEUD* no1=tet->get_fem_noeud(0);
325  FEM_NOEUD* no2=tet->get_fem_noeud(1);
326  FEM_NOEUD* no3=tet->get_fem_noeud(2);
327  FEM_NOEUD* no4=tet->get_fem_noeud(3);
328  stnode.ajouter(no1);
329  stnode.ajouter(no2);
330  stnode.ajouter(no3);
331  stnode.ajouter(no4);
332  }
333  }
334  stnode.supprimer(no);
335  int nb=stnode.get_nb();
336  for (FEM_NOEUD* nod=stnode.get_premier(stt);nod!=NULL;nod=stnode.get_suivant(stt))
337  som=som+nod->get_solution();
338  no->change_solution(som/nb);
339  stnode2.ajouter(no);
340 /* for (FEM_NOEUD* nod=stnode.get_premier(stt);nod!=NULL;nod=stnode.get_suivant(stt))
341  stnode.supprimer(nod);*/
342  }
343  }
344  grdmax=1e-308;
345  for (FEM_NOEUD* no=liste_noeuds_design.get_premier(itd);no!=NULL;no=liste_noeuds_design.get_suivant(itd))
346  if(no->get_solution() > grdmax) grdmax = no->get_solution();
347  sprintf(message,"Nombre de noeuds lisses # %d",stnode2.get_nb());
348  affiche(message);
349 
350 
352  FEM_SOLUTION* sol3=new FEM_SOLUTION(femmai,1,nom_solution_gradient,femmai->get_nb_fem_noeud(),"Gradient de densite",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
353  gest->ajouter_fem_solution(sol3);
354  sol3->change_legende(0,"noeuds");
355  int i=0;
356  for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
357  {
358  sol3->ecrire(no->get_solution(),i,0);
359  i++;
360  }
361 }
362 
363 
364 
365 
366 void MGOPT_SIMP_ADAPTATIVE::adapte(char *nomgestd,char *nomgestnd,char *nomsortie,char *nomparam,char *nomparamaster)
367 {
368 affiche((char*)"");
369 affiche((char*)"************************************");
370 affiche((char*)"Optimisation adaptative de topologie");
371 affiche((char*)"************************************");
372 affiche((char*)"");
373 
374 affiche((char*)"");
375 affiche((char*)"");
376 time_t heuredeb = time(NULL);
377 tdebut = *localtime(&heuredeb);
378 if (nomparam!=NULL) lire_params(nomparam);
379 char *p=strchr(nomgestd,'.');
380 strncpy(nometude,nomgestd,p-nomgestd);
381 nometude[p-nomgestd]=0;
382 p=strchr(nomsortie,'.');
383 strncpy(nometudesortie,nomsortie,p-nomsortie);
384 nometudesortie[p-nomsortie]=0;
385 
386 OT_CPU cpu;
387 cpu.ajouter_etape("debut SIMP Adaptative");
388 
389 affiche((char*)"Itération 1 de SIMP");
390 affiche((char*)"Preparation du modèle");
391 gestd=new MG_FILE(nomgestd);
392 gestnd=new MG_FILE(nomgestnd);
393 unsigned long maille=(unsigned long)params.get_valeur("maille");
394 FEM_MAILLAGE* fem;
395 
396 cpu.ajouter_etape("duree preparation modele");
397 
398 if (maille==0) fem=prepare_model(gestd,gestnd);
399 else fem=gestd->get_fem_maillageid(maille);
400 
401 cpu.ajouter_etape("temps de maillage SIMP1");
402 
403 optimisation(1,fem,nomparamaster,1);
404 
405 cpu.ajouter_etape("temps calcul SIMP1");
406 
407  char message2[500];
408  int nbiter=1;
409  int nbitermax=params.get_valeur("iter_adaptative_max");
410  int fin=0;
411  double gdmax=1e-308;
412 
413  do
414  {
416  char nomsortieiter[5000];
417  sprintf(nomsortieiter,"%s_iter%d_gradient.sol",nometudesortie,nbiter);
418  gradient_noeud(fem,gestd,nomsortieiter);
419 
421  LISTE_FEM_NOEUD::iterator it;
422  double tenseur_i[9];
423  double taille_min=1e308;
425  {
426  double *xyz=no->get_coord();
427  carte->evaluer(xyz,tenseur_i); // ancienne carte
428  if (1./sqrt(tenseur_i[0]) <= taille_min) taille_min = 1./sqrt(tenseur_i[0]);
429  }
430 
431  char message[500];
432  sprintf(message,"Enregistrement resultat iteration %d",nbiter);
433  affiche(message);
434  sprintf(nomsortieiter,"%s_iter%d.magic",nometudesortie,nbiter);
435  gestd->enregistrer(nomsortieiter);
436 
438  sprintf(message,"Calcul de la carte de taille");
439  affiche(message);
440  sprintf(nomsortieiter,"%s_iter%dctt.sol",nometudesortie,nbiter);
445  int nbdiv=params.get_valeur("carte_taille_structure_adapt");
446  if (nbdiv>0)
447  {
448  sprintf(message,"Calcul de la carte de taille sur un support structure de %d,%d,%d divisions",nbdiv,nbdiv,nbdiv);
449  affiche(message);
450  nvcarte.structure_support(nbdiv,nbdiv,nbdiv);
451  }
452 
453 
454  sprintf(nomsortieiter,"%s_iter%d",nometudesortie,nbiter);
455  nvcarte.enregistrer(nomsortieiter);
456 
458  delete gestd;
459  delete gestnd;
460  delete carte;
461  carte==NULL;
462  gestd=new MG_FILE(nomgestd);
463  gestnd=new MG_FILE(nomgestnd);
464 
466  sprintf(nomsortieiter,"%s_iter%d.ctt",nometudesortie,nbiter);
467  params.change_valeur("typecarte",3.);
468  params.change_valeur("fichiercarte",nomsortieiter);
469  params.change_valeur("festimation",20.);
470  double seuilmin=params.get_valeur("seuil_convergence_adaptative");
471  double val=std::max(params.get_valeur("coef_critere_convergence")*params.get_valeur("critere_convergence"),seuilmin);
472  params.change_valeur("critere_convergence",val);
473  nbiter++;
474  sprintf(message,"Itération %d de la SIMP",nbiter);
475  affiche(message);
476 
478  affiche((char*)"Preparation du modèle");
479  fem=prepare_model(gestd,gestnd);
480 
481  cpu.ajouter_etape("temps nouvelle carte et maillage");
482 
483  optimisation(nbiter,fem,nomparamaster,nbiter);
484 
485  cpu.ajouter_etape("temps optimisation");
486 
487 
488  affiche((char*)"Enregistrement resultat");
489  sprintf(nomsortieiter,"%s_iter%d.magic",nometudesortie,nbiter);
490  gestd->enregistrer(nomsortieiter);
491 
492 
494  double tenseur_j[9];
495  double taille_min2 = 1.e308;
496  double taille_max = 0.;
498  {
499  double *xyz=no->get_coord();
500  carte->evaluer(xyz,tenseur_j); // nouvelle carte
501  if (1./sqrt(tenseur_j[0]) <= taille_min2) taille_min2 = 1./sqrt(tenseur_j[0]);
502  if (1./sqrt(tenseur_j[0]) > taille_max) taille_max = 1./sqrt(tenseur_j[0]);
503  }
504  sprintf(message,"taille_min (ancienne carte) = %lf ; taille_min2 (nouvelle carte) = %lf",taille_min,taille_min2);
505  affiche(message);
506  //if ((taille_min2/taille_min) >= 0.8) fin=1;
507 
508 
509  cpu.ajouter_etape("temps enregistrement iteration");
510  std::vector<std::string> tab;
511  cpu.get_tabfinal(tab);
512  for (int i=0;i<tab.size();i++)
513  printf("%s\n",(char*)tab[i].c_str());
514  }
515 
516  while ((fin == 0) && (nbiter < nbitermax));
517  if (nbiter==nbitermax) {sprintf(message2," Arrêt de la procedure d'optimisation adaptative apres %d cycles de raffinement",nbiter-1);affiche(message2);}
518  else {sprintf(message2," Convergence de la procedure d'optimisation adaptative après %d cycles de raffinement",nbiter-1);affiche(message2);}
519 
520  int sauvesimple=params.get_valeur("enregistrementsimple");
521  if (sauvesimple==1)
522  {
523  affiche((char*)"Enregistrement resultat simplifie");
524  char nomfichier[5000];
525  sprintf(nomfichier,"%s.opt",nometudesortie);
526  enregistre_simple(nomfichier,fem);
527  }
528 
529  affiche((char*)"Enregistrement finaux resultat sous GMSH");
530  MG_EXPORT exp;
531  char nomfichier[5000];
532  sprintf(nomfichier,"%s_mg",nometudesortie);
533  exp.gmsh(fem->get_mg_maillage(),nomfichier);
534  sprintf(nomfichier,"%s_fem",nometudesortie);
535  exp.gmsh(fem,nomfichier);
536 
537 }
538 
TPL_MAP_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_map_entite.h:69
MG_EXPORT
Definition: mg_export.h:33
MG_GESTIONNAIRE::enregistrer
virtual void enregistrer(std::ostream &o, double version=MAGIC_VERSION_FICHIER_DOUBLE)
Definition: mg_gestionnaire.cpp:1070
MGOPT::lire_params
virtual void lire_params(char *fichier)
Definition: mgopt.cpp:90
TPL_MAP_ENTITE::get_premier
virtual X get_premier(ITERATEUR &it)
Definition: tpl_map_entite.h:112
FEM_SOLUTION
Definition: fem_solution.h:40
FEM_MAILLAGE::get_suivant_element3
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:680
gestionversion.h
MGOPT::nometudesortie
char nometudesortie[500]
Definition: mgopt.h:56
MGOPT::gestnd
class MG_FILE * gestnd
Definition: mgopt.h:58
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
OT_PARAMETRES::get_valeur
double get_valeur(std::string chaine, int num=0)
Definition: ot_parametres.cpp:191
fem_solution.h
mg_gestionnaire.h
FEM_ELEMENT3::get_fem_noeud
virtual class FEM_NOEUD * get_fem_noeud(int num)=0
MGOPT_SIMP_ADAPTATIVE::adapte
void adapte(char *nomgestd, char *nomgestnd, char *nomsortie, char *nomparam, char *nomparamaster)
Definition: mgopt_simp_adaptative.cpp:366
FCT_TAILLE_FEM_SOLUTION_DEFINITION_FONCTION_ISOTROPE::exponentielle
static double exponentielle(double x)
Definition: fct_taille_fem_solution_fonction_isotrope.cpp:32
FCT_TAILLE_FEM_SOLUTION::structure_support
virtual void structure_support(int nnx, int nny, int nnz, bool avecverif=false)
Definition: fct_taille_fem_solution.cpp:396
OT_CPU
Definition: ot_cpu.h:31
FCT_TAILLE_FEM_SOLUTION_FONCTION_ISOTROPE::construit_depuis_scalaire
virtual void construit_depuis_scalaire(FEM_SOLUTION *solbase, int champsbase, double(*f)(double x))
Definition: fct_taille_fem_solution_fonction_isotrope.cpp:64
FEM_SOLUTION::ecrire
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
Definition: fem_solution.cpp:411
fem_maillage.h
OT_PARAMETRES::ajouter
void ajouter(std::string chaine, double valeur, int typep, std::string aide="")
Definition: ot_parametres.cpp:61
ot_cpu.h
mg_file.h
OT_CPU::ajouter_etape
double ajouter_etape(std::string nom)
Definition: ot_cpu.cpp:58
FEM_ELEMENT3
Definition: fem_element3.h:34
FEM_MAILLAGE::get_premier_noeud
FEM_NOEUD * get_premier_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:174
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
MG_GESTIONNAIRE::ajouter_fem_solution
int ajouter_fem_solution(FEM_SOLUTION *mgsol)
Definition: mg_gestionnaire.cpp:902
MGOPT_SIMP
Definition: mgopt_simp.h:30
MGOPT_SIMP_ADAPTATIVE
Definition: mgopt_simp_adaptative.h:32
FEM_MAILLAGE::get_mg_maillage
MG_MAILLAGE * get_mg_maillage(void)
Definition: fem_maillage.cpp:93
FEM_MAILLAGE::get_nb_fem_noeud
unsigned int get_nb_fem_noeud(void)
Definition: fem_maillage.cpp:190
MG_GESTIONNAIRE::get_fem_solution
FEM_SOLUTION * get_fem_solution(unsigned int num)
Definition: mg_gestionnaire.cpp:930
MGOPT_SIMP_ADAPTATIVE::gradient_noeud
void gradient_noeud(FEM_MAILLAGE *femmai, MG_GESTIONNAIRE *gest, char *nom_solution_gradient)
Definition: mgopt_simp_adaptative.cpp:119
MGOPT::tdebut
struct tm tdebut
Definition: mgopt.h:49
FEM_NOEUD::get_coord
virtual double * get_coord(void)
Definition: fem_noeud.cpp:254
FEM_ELEMENT_MAILLAGE::get_solution
virtual double get_solution(int num=0)
Definition: fem_element_maillage.cpp:113
FCT_TAILLE_FEM_SOLUTION_DEFINITION_FONCTION_ISOTROPE::constante
static double constante[100]
Definition: fct_taille_fem_solution_fonction_isotrope.h:38
mgopt_simp.h
mg_export.h
FEM_NOEUD::get_solution
virtual double get_solution(int num=0)
Definition: fem_noeud.cpp:364
OT_CPU::get_tabfinal
void get_tabfinal(std::vector< std::string > &tab)
Definition: ot_cpu.cpp:107
MGOPT::params
OT_PARAMETRES params
Definition: mgopt.h:53
FEM_MAILLAGE
Definition: fem_maillage.h:66
OT_PARAMETRES::DOUBLE
@ DOUBLE
Definition: ot_parametres.h:38
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
MGOPT::affiche
void affiche(char *mess)
Definition: mgopt.cpp:80
MG_EXPORT::gmsh
void gmsh(class MG_MAILLAGE *mai, std::string fichier)
Definition: mg_export.cpp:803
MG_GESTIONNAIRE::get_fem_maillageid
FEM_MAILLAGE * get_fem_maillageid(unsigned long num)
Definition: mg_gestionnaire.cpp:658
fct_taille_fem_solution_fonction_isotrope.h
MAGIC::ORIGINE::IMPOSE
@ IMPOSE
Definition: mg_definition.h:79
FEM_ELEMENT_MAILLAGE::get_mg_element_maillage
virtual class MG_ELEMENT_MAILLAGE * get_mg_element_maillage(void)
Definition: fem_element_maillage.cpp:81
MG_GESTIONNAIRE::get_fem_maillage
FEM_MAILLAGE * get_fem_maillage(unsigned int num)
Definition: mg_gestionnaire.cpp:670
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
mgopt_simp_adaptative.h
MGOPT::prepare_model
virtual class FEM_MAILLAGE * prepare_model(class MG_GESTIONNAIRE *gestd, MG_GESTIONNAIRE *gestnd)
Definition: mgopt.cpp:159
TPL_MAP_ENTITE::ITERATEUR
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
Definition: tpl_map_entite.h:38
MGOPT_SIMP_ADAPTATIVE::MGOPT_SIMP_ADAPTATIVE
MGOPT_SIMP_ADAPTATIVE(bool save)
Definition: mgopt_simp_adaptative.cpp:47
FEM_ELEMENT3::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
FEM_ELEMENT3::get_jacobien
virtual double get_jacobien(double *jac, double *uv, double unite=1.)
Definition: fem_element3.cpp:144
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
tpl_octree.h
MG_FILE
Definition: mg_file.h:31
MGOPT_SIMP_ADAPTATIVE::get_gradient_element
double get_gradient_element(FEM_ELEMENT3 *tet)
Definition: mgopt_simp_adaptative.cpp:67
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
ot_mathematique.h
FEM_NOEUD
Definition: fem_noeud.h:35
FCT_TAILLE_FEM_SOLUTION::enregistrer
virtual void enregistrer(char *nom)
Definition: fct_taille_fem_solution.cpp:337
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
MGOPT::gestd
class MG_FILE * gestd
Definition: mgopt.h:57
MGOPT_SIMP::optimisation
void optimisation(int num_adapt, class FEM_MAILLAGE *fem, char *nomparamaster, int iter=0)
Definition: mgopt_simp.cpp:112
MGOPT::enregistre_simple
virtual void enregistre_simple(char *nomfichier, class FEM_MAILLAGE *fem)
Definition: mgopt.cpp:220
fct_generateur_fichier.h
FEM_MAILLAGE::get_suivant_noeud
FEM_NOEUD * get_suivant_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:182
TPL_LISTE_ENTITE
Definition: tpl_liste_entite.h:32
MG_ELEMENT_MAILLAGE::get_origine
virtual int get_origine(void)
Definition: mg_element_maillage.cpp:91
MAGIC::TYPE_SOLUTION::SCALAIRE
@ SCALAIRE
Definition: mg_definition.h:93
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
MGOPT::nometude
char nometude[500]
Definition: mgopt.h:55
MGOPT_SIMP_ADAPTATIVE::~MGOPT_SIMP_ADAPTATIVE
~MGOPT_SIMP_ADAPTATIVE()
Definition: mgopt_simp_adaptative.cpp:62
MGOPT::carte
class FCT_TAILLE * carte
Definition: mgopt.h:59
FEM_SOLUTION::change_legende
void change_legende(int num, std::string val)
Definition: fem_solution.cpp:457
FCT_TAILLE_FEM_SOLUTION_FONCTION_ISOTROPE
Definition: fct_taille_fem_solution_fonction_isotrope.h:48
FCT_TAILLE::evaluer
virtual void evaluer(double *param, double *resultat)=0
FEM_MAILLAGE::get_premier_element3
FEM_ELEMENT3 * get_premier_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:672
affiche
void affiche(char *message)
Definition: mgopt_simp_adaptative.cpp:40
MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD
@ ENTITE_NOEUD
Definition: mg_definition.h:86
OT_PARAMETRES::change_valeur
void change_valeur(std::string chaine, double val, int num=0)
Definition: ot_parametres.cpp:210