53 std::vector<SIMP_TETRA*>
voisin;
61 return sqrt(dx*dx+dy*dy+dz*dz);
77 params.
ajouter(
"rminc",0.,
OT_PARAMETRES::DOUBLE,
"0. Valeur de la carte de taille (si pas de maillage le parametre fichiercarte permet d'utiliser une carte de taille) sinon valeur de rmin pour le lissage de la compliance");
78 params.
ajouter(
"rmind",0.,
OT_PARAMETRES::DOUBLE,
"0. Valeur de la carte de taille (si pas de maillage le parametre fichiercarte permet d'utiliser une carte de taille) sinon valeur de rmin pour le lissage de la densite");
86 params.
ajouter(
"type_lissage",1.,
OT_PARAMETRES::DOUBLE,
"0. Pas de lissage 1. Lissage de la compliance 2. Lissage de la densité 3. Lissage de la compliance et de la densite");
115 affiche((
char*)
" Initialisation");
116 std::vector<SIMP_TETRA*> lsttet;
120 if (((rminc<1e-16)||(rmind<1e-16)) && (
carte==NULL))
122 affiche((
char*)
" Lecture de la carte de taille");
125 if ((typecarte==0) || (typecarte==1))
128 carte->
lire((
char *)fichiercarte.c_str());
133 double volume_design=0;
134 double volume_non_design=0;
136 LISTE_FEM_ELEMENT3::iterator it;
147 int nbnoeud=tet->get_nb_fem_noeud();
148 for (
int i=0;i<nbnoeud;i++)
150 tet2->
centre[0]=tet2->
centre[0]+tet->get_fem_noeud(i)->get_x()*unite;
151 tet2->
centre[1]=tet2->
centre[1]+tet->get_fem_noeud(i)->get_y()*unite;
152 tet2->
centre[2]=tet2->
centre[2]+tet->get_fem_noeud(i)->get_z()*unite;
157 double jac[9],uv[3]={1./4.,1./4.,1./4.};
158 tet2->
volume=1./6.*tet->get_jacobien(jac,uv,unite);
179 volume_design=volume_design+tet2->
volume;
185 volume_non_design=volume_non_design+tet2->
volume;
187 lsttet.insert(lsttet.end(),tet2);
189 volume_tot=volume_design+volume_non_design;
191 affiche((
char*)
" Recherche de voisins");
192 int nbsimptet=lsttet.size();
195 for (
int i=0;i<nbsimptet;i++)
198 if (tet->
design==0)
continue;
204 for (
int i=0;i<nbsimptet;i++)
207 if (tet->
design==0)
continue;
217 std::vector<double> Ctotiter;
222 if (num_adapt==0) sprintf(message,
" Iteration \033[1;32m%d\033[1;33m",nbiteration);
223 else sprintf(message,
" Iteration \033[1;32m%d.%d\033[1;33m",num_adapt,nbiteration);
225 std::vector<FEM_ELEMENT3*> *lstniveau=
new std::vector<FEM_ELEMENT3*>[niveaumax+1];
227 for (
int i=0;i<nbsimptet;i++)
239 char messagever[255];
240 sprintf(messagever,
" Calcul aster \033[1;32m%.1lf\033[1;33m",version);
247 sprintf(message,
" Code de sortie aster : %d",code);
250 affiche((
char*)
" Analyse resultat");
253 for (
int i=0;i<nbsimptet;i++)
259 Ctotiter.insert(Ctotiter.end(),Ctot);
260 sprintf(message,
" Compliance \033[1;31m%le\033[1;33m",Ctot);
264 int nb=Ctotiter.size();
265 double c1=Ctotiter[nb-2];
266 double c2=Ctotiter[nb-1];
267 double ecart=fabs((c2-c1)/c1)*100.;
269 sprintf(message,
" Ecart \033[1;31m%lf%%\033[1;33m",ecart);
277 int type_lissage_compliance=(int)
params.
get_valeur(
"type_lissage_compliance");
278 for (
int i=0;i<nbsimptet;i++)
281 if ((type_lissage==0) || (type_lissage==2))
283 if ((type_lissage==1) || (type_lissage==3))
289 if (type_lissage_compliance==1)
292 hisensi=hisensi/std::max(volumemoyen*0.00001,tet->
volume);
294 int nbvoisin=tet->
voisin.size();
295 for (
int j = 0 ; j<nbvoisin ; j++)
302 if (type_lissage_compliance==0)
307 if (type_lissage_compliance==1)
327 double critere_densite = 0.0;
329 int compteurlagrange=0;
330 while (oklagrange==0)
333 double lmid = 0.5*(l2+l1);
334 critere_densite = 0.0;
335 for (
int i=0;i<nbsimptet;i++)
342 double x2 = tet->
densite*pow(beta,eta);
343 double x3 = std::min(x1,x2);
345 double x5 = std::min(x3,x4);
347 double x7 = std::max(x5,x6);
357 if (critere_densite -
f*volume_design > 0.)
361 if (100.*fabs(critere_densite-
f*volume_design )/(
f*volume_design)<convergence_lagrange) oklagrange=1;
362 if (compteurlagrange>500) oklagrange=2;
364 if (oklagrange==1) sprintf(message,
" Convergence multiplicateur lagrange \033[1;31m%le%%\033[1;33m",100.*(critere_densite-
f*volume_design )/(
f*volume_design));
365 if (oklagrange==2) sprintf(message,
" Divergence multiplicateur lagrange \033[1;31m%le %le\033[1;33m",l1,l2);
369 for (
int i=0;i<nbsimptet;i++)
372 if ((type_lissage==2) || (type_lissage==3))
374 if (((lissage_densite==1)&&(ok==1)) || (lissage_densite==0))
382 int nbvoisin=tet->
voisin2.size();
383 for (
int j = 0 ; j<nbvoisin ; j++)
403 if (nbiteration%itervue==0)
405 affiche((
char*)
" Sauvegarde résultat iteration");
406 sprintf(message,
"%s_densite_iter%d.soltmp",
nometudesortie,nbiteration);
412 sprintf(message2,
"Iteration%%%d",step);
416 sprintf(message,
"Densite");
418 for (
int i=0;i<nbsimptet;i++)
428 affiche((
char*)
" Sauvegarde GMSH résultats iterations");
430 char nomfichier[2000];
432 exp.
gmsh(fem,nomfichier);
435 affiche((
char*)
" Ecriture des donnees finales");
439 FILE *out=fopen(message,
"wt");
440 time_t heurefin=time(NULL);
441 struct tm tfin = *localtime(&heurefin);
442 fprintf(out,
"*****************************************************\n");
443 fprintf(out,
" Optimisateur de topologie\n");
444 fprintf(out,
" ERICCA - UQTR\n");
445 fprintf(out,
"*****************************************************\n");
446 fprintf(out,
" Etude : %s\n",
nometude);
447 fprintf(out,
" Date : %02u-%02u-%04u\n",
tdebut.tm_mday,
tdebut.tm_mon+1, 1900 +
tdebut.tm_year);
448 fprintf(out,
" Heure debut : %02u:%02u:%02u\n",
tdebut.tm_hour,
tdebut.tm_min,
tdebut.tm_sec);
449 fprintf(out,
" Heure fin : %02u:%02u:%02u\n", tfin.tm_hour, tfin.tm_min, tfin.tm_sec);
450 fprintf(out,
" Parametres : \n");
452 for (
int i=0;i<nbparam;i++)
457 fprintf(out,
"*****************************************************\n");
458 fprintf(out,
" Compliance après chaque itération\n");
459 fprintf(out,
"*****************************************************\n");
460 for (
int i=0;i<Ctotiter.size();i++)
461 fprintf(out,
"%le\n",Ctotiter[i]);
462 fprintf(out,
"*****************************************************\n");
463 fprintf(out,
" Variation de la compliance après chaque itération\n");
464 fprintf(out,
"*****************************************************\n");
465 for (
int i=1;i<Ctotiter.size();i++)
466 fprintf(out,
"%lf%%\n",(Ctotiter[i]-Ctotiter[i-1])*100./Ctotiter[i-1]);
470 double critv1[10]={0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
471 double critv2[10]={0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
472 for (
int i=0;i<nbsimptet;i++)
483 for (
int j=1;j<10;j++)
487 critv2[j]=critv2[j]+tet->
volume;
491 fprintf(out,
"*****************************************************\n");
492 fprintf(out,
" Résultat\n");
493 fprintf(out,
"*****************************************************\n");
494 fprintf(out,
"Volume du design : %le \n",volume_design);
495 fprintf(out,
"Objectif du volume de design : %le \n",volume_design*
f);
496 fprintf(out,
"Volume de design obtenu : %le \n",crit1);
497 fprintf(out,
"Volume de design obtenu avec le seuil: %le \n",crit2);
498 fprintf(out,
"Volume reel de design obtenu avec le seuil: %le \n\n",crit3);
499 fprintf(out,
" : Volume : Volume reel : Objectif\n");
500 fprintf(out,
" : %le : %le : %le\n",volume_design,volume_design,volume_design);
501 for (
int j=1;j<10;j++)
502 fprintf(out,
"Volume de design obtenu avec le seuil de %.1f : %le : %le : %le \n",j*0.1,critv1[j],critv2[j],volume_design*
f);
503 fprintf(out,
"*************************************************************\n");
505 LISTE_FEM_NOEUD::iterator itnoeud;
518 else sprintf(message,
"%s_densite_iter%d.sol",
nometudesortie,iter);
520 for (
int i=nbsolution;i>0;i--)
525 char message[500],extension[500];
526 sprintf(message,
"%s",nom.c_str());
527 char *p=strrchr(message,
'.');
528 strncpy(extension,p,strlen(message)+message-p);
529 if (strcmp(extension,
".soltmp")==0)
538 for (
int i=0;i<nbsimptet;i++)
567 int nb=lsttet.size();
568 for (
int i=0;i<nb;i++)
delete lsttet[i];
574 if (type==0) wi=pow(distref-dist,k);
575 if (type==1) wi=pow(distref-dist,k)*volume;
576 if (type==2) wi=exp(-dist*dist/2./distref/distref/9.)/2./M_PI/(distref/3.);
577 if (type==3) wi=volume*exp(-dist*dist/2./distref/distref/9.)/2./M_PI/(distref/3.);
586 affiche((
char*)
"*************************");
587 affiche((
char*)
"Optimisation de topologie");
588 affiche((
char*)
"*************************");
591 affiche((
char*)
"Changement du seuil dans les resultats");
597 LISTE_FEM_ELEMENT3::iterator it;
601 if (tet->get_solution()>seuil)
607 affiche((
char*)
"Enregistrement");
609 affiche((
char*)
"Enregistrement sous GMSH");
610 char *p=strchr(nomgestd,
'.');
611 strncpy(
nometude,nomgestd,p-nomgestd);
614 char nomfichier[5000];
615 sprintf(nomfichier,
"%s_mg",
nometude);
617 sprintf(nomfichier,
"%s_fem",
nometude);
618 exp.
gmsh(fem,nomfichier);
626 sprintf(message,
"%s.resu",
nometude);
627 FILE* in=fopen(message,
"rt");
631 char*
res=fgets(message,750,in);
643 int numlu=sscanf(message,
"%s %s %s %s %s %s %s %s %s %s",mot1,mot2,mot3,mot4,mot5,mot6,mot7,mot8,mot9,mot10);
647 if (strcmp(mot2,
"TOTAL_JOB")==0)
650 sscanf(mot8,
"%lf",&val);
652 sscanf(mot10,
"%lf",&val);
658 if (strcmp(mot1,
"CHAMP")==0)
659 if (strcmp(mot2,
"PAR")==0)
660 if (strcmp(mot3,
"ELEMENT")==0)
661 if (strcmp(mot4,
"CONSTANT")==0)
662 if (strcmp(mot5,
"SUR")==0)
663 if (strcmp(mot6,
"ELEMENT")==0)
664 if (strcmp(mot7,
"DE")==0)
665 if (strcmp(mot8,
"NOM")==0)
666 if (strcmp(mot9,
"SYMBOLIQUE")==0)
667 if (strcmp(mot10,
"ENERGIE")==0)
675 char*
res=fgets(message,750,in);
678 int numlu=sscanf(message,
"%s %s",mot1,mot2);
680 if ((numlu==2) && (strcmp(mot2,
"TOTALE")==0))
682 char *p=strchr(mot1,
'M')+1;
684 if (passe==0) {passe=1;decalage=num;}
685 char*
res=fgets(message,750,in);
687 sscanf(message,
"%lf",&val);
688 lsttet[num-decalage]->energie=val;
691 if (nbelement == lsttet.size()) {fin2=1;fin=0;}
707 int correspondance[4];
725 std::vector<SIMP_TETRA*>& lstvoisin=tet->
voisin;
730 for (
int j=0;j<4;j++)
732 int num=correspondance[j];
735 for (
int k=0;k<nbtetra;k++)
743 if (dist<tet->distance_ref)
745 if (dist<tet->distance_ref2)
750 if (compteur>=lstvoisin.size()) ok=1;
753 tetcour=lstvoisin[compteur];
766 int correspondance[4];
781 std::vector<SIMP_TETRA*>& lstvoisin=tet->
voisin;
788 for (
int ok=0;ok<std::max(nb_couches,nb_couches2);ok++)
790 for (
int iliste=debut;iliste<fin;iliste++)
793 if (nb_couches>nb_couches2 ) tetcour=tet->
voisin[iliste];
else tetcour=tet->
voisin2[iliste];
794 for (
int j=0;j<4;j++)
796 int num=correspondance[j];
799 for (
int k=0;k<nbtetra;k++)
806 if (ok<nb_couches) tet->
voisin.insert(tet->
voisin.end(),stet);
813 if (nb_couches>nb_couches2 ) fin=tet->
voisin.size();
else fin=tet->
voisin2.size();