48 LISTE_FEM_NOEUD::iterator it_fem_noeud;
55 std::pair<OPT_NOEUD*,FEM_NOEUD*> asso(opt_noeud,fem_noeud);
56 std::pair<unsigned long,std::pair<OPT_NOEUD*,FEM_NOEUD*> > tmp(fem_noeud->get_id(),asso);
62 LISTE_FEM_ELEMENT2::iterator it_fem_ele2;
78 std::pair<OPT_TRIANGLE_QUADRATIQUE*,FEM_TRIANGLE6*> asso(opt_tri,
fem_tri6);
79 std::pair<unsigned long,std::pair<OPT_TRIANGLE_QUADRATIQUE*,FEM_TRIANGLE6*> > tmp(
fem_tri6->get_id(),asso);
109 return ((*it).second).first;
115 return ((*it).second).first;
151 params.
ajouter(
"film",0.,
OT_PARAMETRES::DOUBLE,
" Option de génération d'un fichier magic contenant uniquement les solutions de déplacement servant à la création d'un film");
173 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
176 lstnoeud_deplacer_initiale->
ajouter(opt_noeud);
185 for (
int i=0;i<nb_fem_ele2;i++)
200 lst_noeud_voisin.
ajouter(opt_n2);
201 lst_noeud_voisin.
ajouter(opt_n6);
205 lst_noeud_voisin.
ajouter(opt_n2);
206 lst_noeud_voisin.
ajouter(opt_n4);
210 lst_noeud_voisin.
ajouter(opt_n4);
211 lst_noeud_voisin.
ajouter(opt_n6);
216 lst_noeud_voisin.
ajouter(opt_n1);
217 lst_noeud_voisin.
ajouter(opt_n6);
218 lst_noeud_voisin.
ajouter(opt_n3);
219 lst_noeud_voisin.
ajouter(opt_n4);
224 lst_noeud_voisin.
ajouter(opt_n5);
225 lst_noeud_voisin.
ajouter(opt_n6);
226 lst_noeud_voisin.
ajouter(opt_n3);
227 lst_noeud_voisin.
ajouter(opt_n2);
232 lst_noeud_voisin.
ajouter(opt_n1);
233 lst_noeud_voisin.
ajouter(opt_n5);
234 lst_noeud_voisin.
ajouter(opt_n2);
235 lst_noeud_voisin.
ajouter(opt_n4);
251 OT_VECTEUR_3D pos_opt(opt->get_x(),opt->get_y(),opt->get_z());
252 R=(
sqrt((opt->get_x()-opt_noeud->
get_x())*(opt->get_x()-opt_noeud->
get_x())+(opt->get_y()-opt_noeud->
get_y())*(opt->get_y()-opt_noeud->
get_y())+(opt->get_z()-opt_noeud->
get_z())*(opt->get_z()-opt_noeud->
get_z())));
253 if (R<rayon) lst_noeud_filtre.
ajouter(opt);
263 int id=opt_noeud->
get_id();
266 for (
int i=0;i<nbtri;i++)
326 if ((svm1>=svm2) && (svm1>=svm3))
328 if ((svm2>=svm1) && (svm2>=svm3))
330 if ((svm3>=svm1) && (svm3>=svm2))
340 double somme_ecart_au_carre=0.;
344 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
346 somme_ecart_au_carre=somme_ecart_au_carre+((svm-moyenne)*(svm-moyenne));
349 ecarttype=
sqrt((1./compteur_svm)*somme_ecart_au_carre);
358 int nb_fem_ele2=(opt_noeud->
get_fem_noeud())->get_lien_element2()->get_nb();
359 for (
int i=0;i<nb_fem_ele2;i++)
376 xyz_modif[0]=xyz[0]+d*n[0];
377 xyz_modif[1]=xyz[1]+d*n[1];
378 xyz_modif[2]=xyz[2]+d*n[2];
385 int nb_fem_ele2=(opt_noeud->
get_fem_noeud())->get_lien_element2()->get_nb();
386 for (
int i=0;i<nb_fem_ele2;i++)
404 sol->
ecrire(dx,num-1,0,0);
405 sol->
ecrire(dy,num-1,0,1);
406 sol->
ecrire(dz,num-1,0,2);
412 int nb_noeud=lst_noeud.
get_nb();
417 int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
421 lst_noeud_voisin=opt_noeud->get_liste_noeud_voisin();
427 OT_VECTEUR_3D pos_opt(opt->get_x(),opt->get_y(),opt->get_z());
428 pos_moy=pos_moy+pos_opt;
431 OT_VECTEUR_3D pos_opt_noeud(opt_noeud->get_x(),opt_noeud->get_y(),opt_noeud->get_z());
432 pos_moy=pos_moy+pos_opt_noeud;
433 int nb_voisin=lst_noeud_voisin.
get_nb();
434 pos_moy=pos_moy/(nb_voisin+1);
435 opt_noeud->change_coord_lissee(pos_moy);
440 int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
443 opt_noeud->change_x(pos_lissee[0]);
444 opt_noeud->change_y(pos_lissee[1]);
445 opt_noeud->change_z(pos_lissee[2]);
455 lst_noeud_filtre=opt_noeud->get_liste_noeud_filtre();
456 OT_VECTEUR_3D pos_opt_noeud(opt_noeud->get_x(),opt_noeud->get_y(),opt_noeud->get_z());
462 OT_VECTEUR_3D pos_opt(opt->get_x(),opt->get_y(),opt->get_z());
463 double ps=rayon-(
sqrt((opt->get_x()-opt_noeud->get_x())*(opt->get_x()-opt_noeud->get_x())+(opt->get_y()-opt_noeud->get_y())*(opt->get_y()-opt_noeud->get_y())+(opt->get_z()-opt_noeud->get_z())*(opt->get_z()-opt_noeud->get_z())));
465 double d1=opt->get_norme_orientee_deplacement();
481 lst_noeud_filtre=opt_noeud->get_liste_noeud_filtre();
482 OT_VECTEUR_3D pos_opt_noeud(opt_noeud->get_x(),opt_noeud->get_y(),opt_noeud->get_z());
483 double w=0,ww=0,ww1=0;
488 OT_VECTEUR_3D pos_opt(opt->get_x(),opt->get_y(),opt->get_z());
489 double ps=(
sqrt((opt->get_x()-opt_noeud->get_x())*(opt->get_x()-opt_noeud->get_x())+(opt->get_y()-opt_noeud->get_y())*(opt->get_y()-opt_noeud->get_y())+(opt->get_z()-opt_noeud->get_z())*(opt->get_z()-opt_noeud->get_z())));
491 double wwi=exp(-ps*ps/2./rayon/rayon/9.)/2./M_PI/(rayon/3.);
494 double d1=opt->get_sol_deplacement_virtuel();
505 int nb_noeud=lst_noeud.
get_nb();
510 int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
513 lst_noeud_voisin=opt_noeud->get_liste_noeud_voisin();
514 OT_VECTEUR_3D pos_opt_noeud(opt_noeud->get_x(),opt_noeud->get_y(),opt_noeud->get_z());
523 OT_VECTEUR_3D pos_opt(opt->get_x(),opt->get_y(),opt->get_z());
524 double ps=1/(
sqrt((opt->get_x()-opt_noeud->get_x())*(opt->get_x()-opt_noeud->get_x())+(opt->get_y()-opt_noeud->get_y())*(opt->get_y()-opt_noeud->get_y())+(opt->get_z()-opt_noeud->get_z())*(opt->get_z()-opt_noeud->get_z())));
530 OT_VECTEUR_3D pos_opt(opt->get_x(),opt->get_y(),opt->get_z());
531 double ps3=1/(
sqrt((opt->get_x()-opt_noeud->get_x())*(opt->get_x()-opt_noeud->get_x())+(opt->get_y()-opt_noeud->get_y())*(opt->get_y()-opt_noeud->get_y())+(opt->get_z()-opt_noeud->get_z())*(opt->get_z()-opt_noeud->get_z())));
532 pos_moy2=(ps3/ps1)*(pos_opt-pos_opt_noeud);
533 pos_moy=pos_moy+ pos_moy2;
535 pos_moy3=pos_opt_noeud-0.526*pos_moy;
536 opt_noeud->change_coord_lissee(pos_moy3);
541 int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
544 opt_noeud->change_x(pos_lissee[0]);
545 opt_noeud->change_y(pos_lissee[1]);
546 opt_noeud->change_z(pos_lissee[2]);
552 int nb_noeud=lst_noeud.
get_nb();
557 int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
560 lst_noeud_voisin=opt_noeud->get_liste_noeud_voisin();
561 OT_VECTEUR_3D pos_opt_noeud(opt_noeud->get_x(),opt_noeud->get_y(),opt_noeud->get_z());
569 OT_VECTEUR_3D pos_opt(opt->get_x(),opt->get_y(),opt->get_z());
570 double ps=1/(
sqrt((opt->get_x()-opt_noeud->get_x())*(opt->get_x()-opt_noeud->get_x())+(opt->get_y()-opt_noeud->get_y())*(opt->get_y()-opt_noeud->get_y())+(opt->get_z()-opt_noeud->get_z())*(opt->get_z()-opt_noeud->get_z())));
576 OT_VECTEUR_3D pos_opt(opt->get_x(),opt->get_y(),opt->get_z());
577 double ps3=1/(
sqrt((opt->get_x()-opt_noeud->get_x())*(opt->get_x()-opt_noeud->get_x())+(opt->get_y()-opt_noeud->get_y())*(opt->get_y()-opt_noeud->get_y())+(opt->get_z()-opt_noeud->get_z())*(opt->get_z()-opt_noeud->get_z())));
578 pos_moy2=(ps3/ps1)*(pos_opt-pos_opt_noeud);
579 pos_moy=pos_moy+ pos_moy2;
581 pos_moy3=pos_opt_noeud+0.5*pos_moy;
582 opt_noeud->change_coord_lissee(pos_moy3);
587 int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
590 opt_noeud->change_x(pos_lissee[0]);
591 opt_noeud->change_y(pos_lissee[1]);
592 opt_noeud->change_z(pos_lissee[2]);
598 double xyz1[3],xyz2[3],xyz3[3];
620 if (fabs((L01-L02)>0.001))
623 for (
int i=0;i<1000;i++)
626 double func=L10-(L0*0.5);
628 if (fabs(func)<0.001)
632 double dx=(-3+4*
P)*xyzn1[0]+(4-8*
P)*xyzn2[0]+(-1+4*
P)*xyzn3[0];
633 double dy=(-3+4*
P)*xyzn1[1]+(4-8*
P)*xyzn2[1]+(-1+4*
P)*xyzn3[1];
634 double dz=(-3+4*
P)*xyzn1[2]+(4-8*
P)*xyzn2[2]+(-1+4*
P)*xyzn3[2];
639 double S=
sqrt(dx2+dy2+dz2);
642 xyz1[0]=(1-(3*
P)+(2*(
P*
P)))*xyzn1[0]+4*(
P-(
P*
P))*xyzn2[0]+(-
P+2*(
P*
P))*xyzn3[0];
643 xyz1[1]=(1-(3*
P)+(2*(
P*
P)))*xyzn1[1]+4*(
P-(
P*
P))*xyzn2[1]+(-
P+2*(
P*
P))*xyzn3[1];
644 xyz1[2]=(1-(3*
P)+(2*(
P*
P)))*xyzn1[2]+4*(
P-(
P*
P))*xyzn2[2]+(-
P+2*(
P*
P))*xyzn3[2];
655 if (fabs((L11-L12)>0.001))
658 for (
int i=0;i<1000;i++)
661 double func=L110-(L00*0.5);
663 if (fabs(func)<0.001)
667 double dx=(-3+4*
P)*xyzn5[0]+(4-8*
P)*xyzn4[0]+(-1+4*
P)*xyzn3[0];
668 double dy=(-3+4*
P)*xyzn5[1]+(4-8*
P)*xyzn4[1]+(-1+4*
P)*xyzn3[1];
669 double dz=(-3+4*
P)*xyzn5[2]+(4-8*
P)*xyzn4[2]+(-1+4*
P)*xyzn3[2];
674 double S=
sqrt(dx2+dy2+dz2);
678 xyz2[0]=(1-(3*
P)+(2*(
P*
P)))*xyzn5[0]+4*(
P-(
P*
P))*xyzn4[0]+(-
P+2*(
P*
P))*xyzn3[0];
679 xyz2[1]=(1-(3*
P)+(2*(
P*
P)))*xyzn5[1]+4*(
P-(
P*
P))*xyzn4[1]+(-
P+2*(
P*
P))*xyzn3[1];
680 xyz2[2]=(1-(3*
P)+(2*(
P*
P)))*xyzn5[2]+4*(
P-(
P*
P))*xyzn4[2]+(-
P+2*(
P*
P))*xyzn3[2];
691 if (fabs((L21-L22)>0.001))
694 for (
int i=0;i<1000;i++)
697 double func=L220-(L000*0.5);
699 if (fabs(func)<0.001)
703 double dx=(-3+4*
P)*xyzn5[0]+(4-8*
P)*xyzn6[0]+(-1+4*
P)*xyzn1[0];
704 double dy=(-3+4*
P)*xyzn5[1]+(4-8*
P)*xyzn6[1]+(-1+4*
P)*xyzn1[1];
705 double dz=(-3+4*
P)*xyzn5[2]+(4-8*
P)*xyzn6[2]+(-1+4*
P)*xyzn1[2];
711 double S=
sqrt(dx2+dy2+dz2);
716 xyz3[0]=(1-(3*
P)+(2*(
P*
P)))*xyzn5[0]+4*(
P-(
P*
P))*xyzn6[0]+(-
P+2*(
P*
P))*xyzn1[0];
717 xyz3[1]=(1-(3*
P)+(2*(
P*
P)))*xyzn5[1]+4*(
P-(
P*
P))*xyzn6[1]+(-
P+2*(
P*
P))*xyzn1[1];
718 xyz3[2]=(1-(3*
P)+(2*(
P*
P)))*xyzn5[2]+4*(
P-(
P*
P))*xyzn6[2]+(-
P+2*(
P*
P))*xyzn1[2];
753 std::vector<double> dist;
755 double xyzn1[3],xyzn2[3],xyzn3[3],xyzn4[3],xyzn5[3],xyzn6[3],xyzn[3];
756 double xyzn13[3],xyzn35[3],xyzn51[3];
757 double xyznR[3],xyzP2[3],xyzP3[3],xyzPP2[3], xyzPP3[3];
759 xyzn1[0]=n1->
get_x();
760 xyzn1[1]=n1->
get_y();
761 xyzn1[2]=n1->
get_z();
763 xyzn2[0]=n2->
get_x();
764 xyzn2[1]=n2->
get_y();
765 xyzn2[2]=n2->
get_z();
767 xyzn3[0]=n3->
get_x();
768 xyzn3[1]=n3->
get_y();
769 xyzn3[2]=n3->
get_z();
771 xyzn4[0]=n4->
get_x();
772 xyzn4[1]=n4->
get_y();
773 xyzn4[2]=n4->
get_z();
775 xyzn5[0]=n5->
get_x();
776 xyzn5[1]=n5->
get_y();
777 xyzn5[2]=n5->
get_z();
779 xyzn6[0]=n6->
get_x();
780 xyzn6[1]=n6->
get_y();
781 xyzn6[2]=n6->
get_z();
783 xyzn13[0]=(xyzn1[0]+xyzn3[0])*0.5;
784 xyzn13[1]=(xyzn1[1]+xyzn3[1])*0.5;
785 xyzn13[2]=(xyzn1[2]+xyzn3[2])*0.5;
787 xyzn35[0]=(xyzn5[0]+xyzn3[0])*0.5;
788 xyzn35[1]=(xyzn5[1]+xyzn3[1])*0.5;
789 xyzn35[2]=(xyzn5[2]+xyzn3[2])*0.5;
791 xyzn51[0]=(xyzn5[0]+xyzn1[0])*0.5;
792 xyzn51[1]=(xyzn5[1]+xyzn1[1])*0.5;
793 xyzn51[2]=(xyzn5[2]+xyzn1[2])*0.5;
799 if ((jmin==bez[0]) || (jmin==bez[1]))
803 double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
804 double distor,distor2,distor3;
821 xyzP3[0] =xyzn13[0]+(xyzn2[0]-xyzn13[0])*0.61803;
822 xyzP3[1] =xyzn13[1]+(xyzn2[1]-xyzn13[1])*0.61803;
823 xyzP3[2] =xyzn13[2]+(xyzn2[2]-xyzn13[2])*0.61803;
843 xyzP2[0] =xyzn2[0]-(xyzn2[0]-xyzn13[0])*0.61803;
844 xyzP2[1] =xyzn2[1]-(xyzn2[1]-xyzn13[1])*0.61803;
845 xyzP2[2] =xyzn2[2]-(xyzn2[2]-xyzn13[2])*0.61803;
867 if(f22>f222) f2=f222;
868 if(f33>f333) f3=f333;
879 while (interval0/interval>0.05)
902 xyzP2[0] =xyzn2[0]-(xyzn2[0]-xyzn13[0])*0.61803;
903 xyzP2[1] =xyzn2[1]-(xyzn2[1]-xyzn13[1])*0.61803;
904 xyzP2[2] =xyzn2[2]-(xyzn2[2]-xyzn13[2])*0.61803;
915 if(f02>f002) f2=f002;
951 xyzP3[0] =xyzn13[0]+(xyzn2[0]-xyzn13[0])*0.61803;
952 xyzP3[1] =xyzn13[1]+(xyzn2[1]-xyzn13[1])*0.61803;
953 xyzP3[2] =xyzn13[2]+(xyzn2[2]-xyzn13[2])*0.61803;
964 if(f03>f003) f3=f003;
999 if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1022 double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1023 double distor,distor2,distor3;
1041 xyzP3[0] =xyzn51[0]+(xyzn6[0]-xyzn51[0])*0.61803;
1042 xyzP3[1] =xyzn51[1]+(xyzn6[1]-xyzn51[1])*0.61803;
1043 xyzP3[2] =xyzn51[2]+(xyzn6[2]-xyzn51[2])*0.61803;
1062 xyzP2[0] =xyzn6[0]-(xyzn6[0]-xyzn51[0])*0.61803;
1063 xyzP2[1] =xyzn6[1]-(xyzn6[1]-xyzn51[1])*0.61803;
1064 xyzP2[2] =xyzn6[2]-(xyzn6[2]-xyzn51[2])*0.61803;
1088 if(f222>f22) f2=f22;
1089 if(f22>f222) f2=f222;
1090 if(f33>f333) f3=f333;
1091 if(f333>f33) f3=f33;
1098 while (interval0/interval>0.05)
1102 xyzPP3[0] =xyzP3[0];
1103 xyzPP3[1] =xyzP3[1];
1104 xyzPP3[2] =xyzP3[2];
1122 xyzP2[0] =xyzn6[0]-(xyzn6[0]-xyzn51[0])*0.61803;
1123 xyzP2[1] =xyzn6[1]-(xyzn6[1]-xyzn51[1])*0.61803;
1124 xyzP2[2] =xyzn6[2]-(xyzn6[2]-xyzn51[2])*0.61803;
1134 if(f002>f02) f2=f02;
1135 if(f02>f002) f2=f002;
1151 xyzPP2[0] =xyzP2[0];
1152 xyzPP2[1] =xyzP2[1];
1153 xyzPP2[2] =xyzP2[2];
1169 xyzP3[0] =xyzn51[0]+(xyzn6[0]-xyzn51[0])*0.61803;
1170 xyzP3[1] =xyzn51[1]+(xyzn6[1]-xyzn51[1])*0.61803;
1171 xyzP3[2] =xyzn51[2]+(xyzn6[2]-xyzn51[2])*0.61803;
1181 if(f003>f03) f3=f03;
1182 if(f03>f003) f3=f003;
1215 if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1234 if ((jmin==bez[2] ) || (jmin==bez[3]))
1238 double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1239 double distor,distor2,distor3;
1257 xyzP3[0] =xyzn35[0]+(xyzn4[0]-xyzn35[0])*0.61803;
1258 xyzP3[1] =xyzn35[1]+(xyzn4[1]-xyzn35[1])*0.61803;
1259 xyzP3[2] =xyzn35[2]+(xyzn4[2]-xyzn35[2])*0.61803;
1278 xyzP2[0] =xyzn4[0]-(xyzn4[0]-xyzn35[0])*0.61803;
1279 xyzP2[1] =xyzn4[1]-(xyzn4[1]-xyzn35[1])*0.61803;
1280 xyzP2[2] =xyzn4[2]-(xyzn4[2]-xyzn35[2])*0.61803;
1304 if(f222>f22) f2=f22;
1305 if(f22>f222) f2=f222;
1306 if(f33>f333) f3=f333;
1307 if(f333>f33) f3=f33;
1316 while (interval0/interval>0.05)
1320 xyzPP3[0] =xyzP3[0];
1321 xyzPP3[1] =xyzP3[1];
1322 xyzPP3[2] =xyzP3[2];
1338 xyzP2[0] =xyzn4[0]-(xyzn4[0]-xyzn35[0])*0.61803;
1339 xyzP2[1] =xyzn4[1]-(xyzn4[1]-xyzn35[1])*0.61803;
1340 xyzP2[2] =xyzn4[2]-(xyzn4[2]-xyzn35[2])*0.61803;
1350 if(f002>f02) f2=f02;
1351 if(f02>f002) f2=f002;
1368 xyzPP2[0] =xyzP2[0];
1369 xyzPP2[1] =xyzP2[1];
1370 xyzPP2[2] =xyzP2[2];
1385 xyzP3[0] =xyzn35[0]+(xyzn4[0]-xyzn35[0])*0.61803;
1386 xyzP3[1] =xyzn35[1]+(xyzn4[1]-xyzn35[1])*0.61803;
1387 xyzP3[2] =xyzn35[2]+(xyzn4[2]-xyzn35[2])*0.61803;
1396 if(f003>f03) f3=f03;
1397 if(f03>f003) f3=f003;
1432 if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1455 double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1456 double distor,distor2,distor3;
1474 xyzP3[0] =xyzn13[0]+(xyzn2[0]-xyzn13[0])*0.61803;
1475 xyzP3[1] =xyzn13[1]+(xyzn2[1]-xyzn13[1])*0.61803;
1476 xyzP3[2] =xyzn13[2]+(xyzn2[2]-xyzn13[2])*0.61803;
1494 xyzP2[0] =xyzn2[0]-(xyzn2[0]-xyzn13[0])*0.61803;
1495 xyzP2[1] =xyzn2[1]-(xyzn2[1]-xyzn13[1])*0.61803;
1496 xyzP2[2] =xyzn2[2]-(xyzn2[2]-xyzn13[2])*0.61803;
1516 if(f222>f22) f2=f22;
1517 if(f22>f222) f2=f222;
1518 if(f33>f333) f3=f333;
1519 if(f333>f33) f3=f33;
1529 while (interval0/interval>0.05)
1533 xyzPP3[0] =xyzP3[0];
1534 xyzPP3[1] =xyzP3[1];
1535 xyzPP3[2] =xyzP3[2];
1552 xyzP2[0] =xyzn2[0]-(xyzn2[0]-xyzn13[0])*0.61803;
1553 xyzP2[1] =xyzn2[1]-(xyzn2[1]-xyzn13[1])*0.61803;
1554 xyzP2[2] =xyzn2[2]-(xyzn2[2]-xyzn13[2])*0.61803;
1564 if(f002>f02) f2=f02;
1565 if(f02>f002) f2=f002;
1581 xyzPP2[0] =xyzP2[0];
1582 xyzPP2[1] =xyzP2[1];
1583 xyzPP2[2] =xyzP2[2];
1600 xyzP3[0] =xyzn13[0]+(xyzn2[0]-xyzn13[0])*0.61803;
1601 xyzP3[1] =xyzn13[1]+(xyzn2[1]-xyzn13[1])*0.61803;
1602 xyzP3[2] =xyzn13[2]+(xyzn2[2]-xyzn13[2])*0.61803;
1612 if(f003>f03) f3=f03;
1613 if(f03>f003) f3=f003;
1648 if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1668 if ((jmin==bez[4])|| (jmin==bez[5]))
1672 double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1673 double distor,distor2,distor3;
1690 xyzP3[0] =xyzn51[0]+(xyzn6[0]-xyzn51[0])*0.61803;
1691 xyzP3[1] =xyzn51[1]+(xyzn6[1]-xyzn51[1])*0.61803;
1692 xyzP3[2] =xyzn51[2]+(xyzn6[2]-xyzn51[2])*0.61803;
1711 xyzP2[0] =xyzn6[0]-(xyzn6[0]-xyzn51[0])*0.61803;
1712 xyzP2[1] =xyzn6[1]-(xyzn6[1]-xyzn51[1])*0.61803;
1713 xyzP2[2] =xyzn6[2]-(xyzn6[2]-xyzn51[2])*0.61803;
1736 if(f222>f22) f2=f22;
1737 if(f22>f222) f2=f222;
1738 if(f33>f333) f3=f333;
1739 if(f333>f33) f3=f33;
1747 while (interval0/interval>0.05)
1751 xyzPP3[0] =xyzP3[0];
1752 xyzPP3[1] =xyzP3[1];
1753 xyzPP3[2] =xyzP3[2];
1769 xyzP2[0] =xyzn6[0]-(xyzn6[0]-xyzn51[0])*0.61803;
1770 xyzP2[1] =xyzn6[1]-(xyzn6[1]-xyzn51[1])*0.61803;
1771 xyzP2[2] =xyzn6[2]-(xyzn6[2]-xyzn51[2])*0.61803;
1781 if(f002>f02) f2=f02;
1782 if(f02>f002) f2=f002;
1798 xyzPP2[0] =xyzP2[0];
1799 xyzPP2[1] =xyzP2[1];
1800 xyzPP2[2] =xyzP2[2];
1816 xyzP3[0] =xyzn51[0]+(xyzn6[0]-xyzn51[0])*0.61803;
1817 xyzP3[1] =xyzn51[1]+(xyzn6[1]-xyzn51[1])*0.61803;
1818 xyzP3[2] =xyzn51[2]+(xyzn6[2]-xyzn51[2])*0.61803;
1828 if(f003>f03) f3=f03;
1829 if(f03>f003) f3=f003;
1863 if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1882 if ((jmin==bez[4] ))
1886 double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1887 double distor,distor2,distor3;
1905 xyzP3[0] =xyzn35[0]+(xyzn4[0]-xyzn35[0])*0.61803;
1906 xyzP3[1] =xyzn35[1]+(xyzn4[1]-xyzn35[1])*0.61803;
1907 xyzP3[2] =xyzn35[2]+(xyzn4[2]-xyzn35[2])*0.61803;
1926 xyzP2[0] =xyzn4[0]-(xyzn4[0]-xyzn35[0])*0.61803;
1927 xyzP2[1] =xyzn4[1]-(xyzn4[1]-xyzn35[1])*0.61803;
1928 xyzP2[2] =xyzn4[2]-(xyzn4[2]-xyzn35[2])*0.61803;
1949 if(f222>f22) f2=f22;
1950 if(f22>f222) f2=f222;
1951 if(f33>f333) f3=f333;
1952 if(f333>f33) f3=f33;
1961 while (interval0/interval>0.05)
1965 xyzPP3[0] =xyzP3[0];
1966 xyzPP3[1] =xyzP3[1];
1967 xyzPP3[2] =xyzP3[2];
1985 xyzP2[0] =xyzn4[0]-(xyzn4[0]-xyzn35[0])*0.61803;
1986 xyzP2[1] =xyzn4[1]-(xyzn4[1]-xyzn35[1])*0.61803;
1987 xyzP2[2] =xyzn4[2]-(xyzn4[2]-xyzn35[2])*0.61803;
1996 if(f002>f02) f2=f02;
1997 if(f02>f002) f2=f002;
2014 xyzPP2[0] =xyzP2[0];
2015 xyzPP2[1] =xyzP2[1];
2016 xyzPP2[2] =xyzP2[2];
2033 xyzP3[0] =xyzn35[0]+(xyzn4[0]-xyzn35[0])*0.61803;
2034 xyzP3[1] =xyzn35[1]+(xyzn4[1]-xyzn35[1])*0.61803;
2035 xyzP3[2] =xyzn35[2]+(xyzn4[2]-xyzn35[2])*0.61803;
2045 if(f003>f03) f3=f03;
2046 if(f03>f003) f3=f003;
2082 if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
2111 if (fichierparam!=NULL)
lire_params(fichierparam);
2130 char coderesu[10]=
"11100010";
2139 sprintf(mess,
" c: %.4lf",c);
2141 sprintf(mess,
" l: %.2lf",l);
2143 sprintf(mess,
" iter_max: %d",iter_max);
2145 sprintf(mess,
" iter_vue: %d",iter_vue);
2148 sprintf(mess,
" Paramètres lissage: lissage_Laplacien: %d",lissage_Laplacien);
2150 sprintf(mess,
" lissage_Taubin: %d",lissage_Taubin);
2152 sprintf(mess,
" lissage_fin: %d",lissage_fin);
2155 sprintf(mess,
" Paramètres filtre: filtre: %d",filtre);
2159 sprintf(mess,
" rayon filtre: rayon: %f",rayon);
2162 sprintf(mess,
" Méthode du mouvement normal modifiée %d",MMN_modif);
2165 sprintf(mess,
" Paramètres film: film: %d",film);
2168 char *p=strchr(fichierin,
'.');
2169 strncpy(
etude,fichierin,p-fichierin);
2170 etude[p-fichierin]=0;
2172 char *p2=strchr(fichierout,
'.');
2178 char etudefilm[200];
2179 char fichierfilm[200];
2197 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2199 lstnoeud_deplacer.
ajouter(opt_noeud);
2200 opt_noeud->change_mobile_au_depart(1);
2201 opt_noeud->change_mobile(1);
2203 opt_noeud->change_x_initial(opt_noeud->get_x());
2204 opt_noeud->change_y_initial(opt_noeud->get_y());
2205 opt_noeud->change_z_initial(opt_noeud->get_z());
2209 opt_noeud->change_normale_initiale();
2212 opt_noeud->change_sol_deplacement_virtuel(0.);
2215 opt_noeud->change_norme_orientee_deplacement();
2224 int nb_noeud=lstnoeud_deplacer_initiale.
get_nb();
2225 sprintf(mess,
" Il y a initialement %d noeuds pouvant être déplacés",nb_noeud);
2248 LISTE_FEM_NOEUD::iterator itfem_noeud;
2253 affiche((
char*)
" Génération du fichier .msh de l'itération 0");
2256 char etudeiter[100];
2258 strcat(etudeiter,
"_iter");
2259 strcat(etudeiter,iter);
2267 affiche((
char*)
" Calcul de l'état de contrainte initial");
2272 double svm_min=1.e308;
2276 double ecarttype=0.;
2277 double ecarttype2=0.;
2278 double somme_svm=0.;
2280 int nb_noeud_intervalle_convergence=0;
2283 LISTE_FEM_ELEMENT2::iterator itfem;
2286 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2288 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2290 if (svm<svm_min) svm_min=svm;
2291 if (svm>svm_max) svm_max=svm;
2292 somme_svm=somme_svm+svm;
2298 svm_moy=somme_svm/compteur_svm;
2301 sprintf(mess,
" Les contraintes min, moy et max initiales valent: %.2lf MPa %.2lf MPa %.2lf MPa",svm_min/1e06,svm_moy/1e06,svm_max/1e06);
2303 sprintf(mess,
" L'écart type est de: %.2lf MPa",ecarttype/1e06);
2309 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2311 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2314 int num=opt_noeud->get_num();
2315 sol_S_VM_MAX_I->
ecrire(svm/1e06,num-1,0);
2318 OT_VECTEUR_3D normale_initiale=opt_noeud->get_normale_initiale();
2319 sol_S_VM_MAX_I_VEC->
ecrire(svm/1e06*normale_initiale(0),num-1,0,0);
2320 sol_S_VM_MAX_I_VEC->
ecrire(svm/1e06*normale_initiale(1),num-1,0,1);
2321 sol_S_VM_MAX_I_VEC->
ecrire(svm/1e06*normale_initiale(2),num-1,0,2);
2352 nb_noeud_intervalle_convergence=0;
2356 sprintf(mess,
" Itération %d",iter_methode);
2361 char nomsolution[100];
2362 sprintf(nomsolution,
"optimisation%d.sol",iter_methode);
2363 char nomlegende[100];
2364 sprintf(nomlegende,
"Iteration%d",iter_methode);
2366 if (((iter_vue!=0) && (iter_methode%iter_vue==0)) || (iter_methode==iter_max))
2376 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2379 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2381 if (svm<svm_min) svm_min=svm;
2382 if (svm>svm_max) svm_max=svm;
2383 somme_svm=somme_svm+svm;
2386 svm_moy=somme_svm/compteur_svm;
2387 LISTE_FEM_ELEMENT2::iterator itfem_ele2;
2389 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2391 int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
2393 opt_noeud->change_normale_initiale();
2394 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2396 double d=c*(svm-svm_moy)/svm_moy;
2397 opt_noeud->change_vonmises__precedent(svm);
2400 opt_noeud-> change_sol_deplacement_virtuel(d);
2401 double dv=opt_noeud-> get_sol_deplacement_virtuel();
2408 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2412 filtre1(lstnoeud_deplacer_initiale);
2416 if (lissage_Laplacien !=0)
2418 affiche((
char*)
" lissage Laplacien ");
2419 lissage(lstnoeud_deplacer_initiale);
2424 if ((lissage_Taubin !=0) )
2426 affiche((
char*)
" lissage Taubin ");
2435 affiche((
char*)
" Calcul de l'état de contrainte final après déplacement");
2440 double svm_min=1.e308;
2443 double somme_svm=0.;
2445 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2447 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2449 if (svm<svm_min) svm_min=svm;
2450 if (svm>svm_max) svm_max=svm;
2451 somme_svm=somme_svm+svm;
2457 svm_moy=somme_svm/compteur_svm;
2460 sprintf(mess,
" Les contraintes min, moy et max valent: %.2lf MPa %.2lf MPa %.2lf MPa",svm_min/1e06,svm_moy/1e06,svm_max/1e06);
2462 sprintf(mess,
" L'écart type est de: %.2lf MPa",ecarttype/1e06);
2465 double svm_min3=1.e308;
2468 double somme_svm3=0.;
2469 int compteur_svm3=0;
2470 double svm_min2=1.e308;
2473 double somme_svm2=0.;
2474 int compteur_svm2=0;
2478 affiche((
char*)
" méthode du mouvement normal modifiée 1 ");
2479 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2481 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2483 double svm_pre=opt_noeud->get_vonmises__precedent();
2484 if ((svmt > svm_pre) && (svm_pre>svm_moy))
2486 double d3=opt_noeud-> get_sol_deplacement_virtuel();
2489 opt_noeud-> change_sol_deplacement_virtuel(D);
2491 if ((svmt < svm_pre) && (svm_pre<svm_moy))
2493 double d3=opt_noeud-> get_sol_deplacement_virtuel();
2495 opt_noeud-> change_sol_deplacement_virtuel(D1);
2505 affiche((
char*)
" méthode du mouvement normal modifiée 2 ");
2506 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2508 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2510 double svm_pre=opt_noeud->get_vonmises__precedent();
2511 if ((svmt > svm_pre) && (svm_pre>svm_moy))
2513 double d3=opt_noeud-> get_sol_deplacement_virtuel();
2516 opt_noeud-> change_sol_deplacement_virtuel(D);
2518 if ((svmt < svm_pre) && (svm_pre<svm_moy))
2520 double d3=opt_noeud-> get_sol_deplacement_virtuel();
2522 opt_noeud-> change_sol_deplacement_virtuel(D1);
2530 if ((MMN_modif==1)||(MMN_modif==2))
2532 affiche((
char*)
" Calcul de l'état de contrainte final après déplacement");
2535 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2537 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2539 if (svm2<svm_min2) svm_min2=svm2;
2540 if (svm2>svm_max2) svm_max2=svm2;
2541 somme_svm2=somme_svm2+svm2;
2544 svm_moy2=somme_svm2/compteur_svm2;
2547 sprintf(mess,
" Les contraintes min, moy et max de la méthode modifiée valent: %.2lf MPa %.2lf MPa %.2lf MPa",svm_min2/1e06,svm_moy2/1e06,svm_max2/1e06);
2549 sprintf(mess,
" L'écart type de la méthode modifiée est de: %.2lf MPa",ecarttype2/1e06);
2554 if ((iter_vue!=0) && (iter_methode%iter_vue==0))
2559 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2561 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2563 int num=opt_noeud->get_num();
2564 sol_S_VM_MAX_F->
ecrire(svm/1e06,num-1,0);
2565 if (svm<svm_min) svm_min=svm;
2566 if (svm>svm_max) svm_max=svm;
2567 somme_svm=somme_svm+svm;
2570 OT_VECTEUR_3D normale_initiale=opt_noeud->get_normale_initiale();
2571 sol_S_VM_MAX_F_VEC->
ecrire(svm/1e06*normale_initiale(0),num-1,0,0);
2572 sol_S_VM_MAX_F_VEC->
ecrire(svm/1e06*normale_initiale(1),num-1,0,1);
2573 sol_S_VM_MAX_F_VEC->
ecrire(svm/1e06*normale_initiale(2),num-1,0,2);
2575 svm_moy=somme_svm/compteur_svm;
2576 R=(svm_max-svm_min)/svm_moy;
2581 if (iter_methode%iter_vue==0)
2583 affiche((
char*)
" Génération du fichier .msh de l'itération");
2585 sprintf(iter,
"%d",iter_methode);
2586 char etudeiter[100];
2588 strcat(etudeiter,
"_iter");
2589 strcat(etudeiter,iter);
2593 iter_finale=iter_methode;
2596 }
while(fabs (R)>=l && iter_methode<=iter_max);
2608 affiche((
char*)
" Calcul de l'état de contrainte après lissage final");
2613 double svm_min=1.e308;
2616 double somme_svm=0.;
2618 int nb_noeud_mvt_normal=0;
2619 int nb_noeud_intervalle_convergence=0;
2620 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2622 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2624 if (svm<svm_min) svm_min=svm;
2625 if (svm>svm_max) svm_max=svm;
2626 somme_svm=somme_svm+svm;
2632 svm_moy=somme_svm/compteur_svm;
2633 sprintf(mess,
" Les contraintes min, moy et max après lissage final valent: %.2lf MPa %.2lf MPa %.2lf MPa",svm_min/1e06,svm_moy/1e06,svm_max/1e06);
2640 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2643 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2646 int num=opt_noeud->get_num();
2647 sol_S_VM_MAX_F->
ecrire(svm/1e06,num-1,0);
2650 OT_VECTEUR_3D normale_initiale=opt_noeud->get_normale_initiale();
2651 sol_S_VM_MAX_F_VEC->
ecrire(svm/1e06*normale_initiale(0),num-1,0,0);
2652 sol_S_VM_MAX_F_VEC->
ecrire(svm/1e06*normale_initiale(1),num-1,0,1);
2653 sol_S_VM_MAX_F_VEC->
ecrire(svm/1e06*normale_initiale(2),num-1,0,2);
2659 char nomsolution[100];
2660 sprintf(nomsolution,
"optimisation%d.sol",iter_finale);
2661 char nomlegende[100];
2662 sprintf(nomlegende,
"Iteration%d",iter_finale);
2673 sprintf(mess,
" Génération du fichier .msh final");
2685 double nb_noeud_design=0.;
2689 double svm_min3=1.e308;
2692 double somme_svm3=0.;
2693 int compteur_svm3=0;
2695 for (
OPT_NOEUD* opt_noeud=lstnoeud_deplacer_initiale.
get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud_deplacer_initiale.
get_suivant(itopt_noeud))
2697 FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2699 if (svm<svm_min3) svm_min3=svm;
2700 if (svm>svm_max3) svm_max3=svm;
2701 somme_svm3=somme_svm3+svm;
2703 svm_moy3=somme_svm3/compteur_svm3;
2704 double coef=fabs(svm-svm_moy3)/svm_moy3;
2707 if (svm<0.1*svm_moy3)
2713 pnic=nb_nic/nb_noeud_design*100;
2714 pnnc=nb_nnc/nb_noeud_design*100;
2715 pmax=nb_max/nb_noeud_design*100;
2716 sprintf(mess,
" %.2lf %% des noeuds situés dans la zone de design ont une contrainte comprise dans l'intervalle de convergence",pnic);
2718 sprintf(mess,
" %.2lf %% des noeuds situés dans la zone de design ont une contrainte inférieure à 10 %% de la valeur moyenne",pnnc);
2720 sprintf(mess,
" %.2lf %% des noeuds situés dans la zone de design ont une contrainte superieur à la contrainte maximale",pmax);