MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mgopt_mvt_normal_quadratique.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_mvt_normal_quadratique.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:57 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
23 #include "mg_gestionnaire.h"
24 #include "mg_geometrie_outils.h"
25 #include "opt_noeud.h"
27 #include "mg_file.h"
28 #include "mgaster.h"
29 #include <string.h>
30 #include "mg_export.h"
31 #include "mg_import.h"
33 #include "ot_systeme.h"
35 #include "fem_noeud.h"
37 #include <stdio.h>
38 #include <math.h>
40 {
42 }
43 
45 {
46  // Correspondance entre OPT_NOEUD et FEM_NOEUD
47  int i=1;
48  LISTE_FEM_NOEUD::iterator it_fem_noeud;
49  for (FEM_NOEUD* fem_noeud=fem->get_premier_noeud(it_fem_noeud);fem_noeud!=NULL;fem_noeud=fem->get_suivant_noeud(it_fem_noeud))
50  {
51  OPT_NOEUD* opt_noeud=new OPT_NOEUD(fem_noeud);
52  listenoeud.ajouter(opt_noeud);
53  opt_noeud->change_num(i);
54  i++;
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);
57  correspondance_noeud.insert(tmp);
58  }
59 
60  // Correspondance entre OPT_TRIANGLE_QUADRATIQUE et FEM_TRIANGLE6
61  i=1;
62  LISTE_FEM_ELEMENT2::iterator it_fem_ele2;
63  for (FEM_ELEMENT2* fem_ele2=fem->get_premier_element2(it_fem_ele2);fem_ele2!=NULL;fem_ele2=fem->get_suivant_element2(it_fem_ele2))
64  {
66 
67  OPT_NOEUD* opt_noeud1=get_noeud(fem_tri6->get_fem_noeud(0));
68  OPT_NOEUD* opt_noeud2=get_noeud(fem_tri6->get_fem_noeud(1));
69  OPT_NOEUD* opt_noeud3=get_noeud(fem_tri6->get_fem_noeud(2));
70  OPT_NOEUD* opt_noeud4=get_noeud(fem_tri6->get_fem_noeud(3));
71  OPT_NOEUD* opt_noeud5=get_noeud(fem_tri6->get_fem_noeud(4));
72  OPT_NOEUD* opt_noeud6=get_noeud(fem_tri6->get_fem_noeud(5));
73 
74  OPT_TRIANGLE_QUADRATIQUE* opt_tri=new OPT_TRIANGLE_QUADRATIQUE(fem_tri6,opt_noeud1,opt_noeud2,opt_noeud3,opt_noeud4,opt_noeud5,opt_noeud6);
75  listetriangle.ajouter(opt_tri);
76  opt_tri->change_num(i);
77  i++;
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);
80  correspondance_triangle.insert(tmp);
81  }
82 
85 
86  // Pour l'écriture d'un fichier de paramètres par défaut
88 }
89 
91 {
92  params=mdd.params;
93 }
94 
96 {
98  for (OPT_NOEUD* no=listenoeud.get_premier(it);no!=NULL;no=listenoeud.get_suivant(it))
99  delete no;
100 
102  for (OPT_TRIANGLE_QUADRATIQUE* tri=listetriangle.get_premier(ittri);tri!=NULL;tri=listetriangle.get_suivant(ittri))
103  delete tri;
104 }
105 
107 {
108  std::map<unsigned long, std::pair<OPT_NOEUD*,FEM_NOEUD*> >::iterator it=correspondance_noeud.find(fem_noeud->get_id());
109  return ((*it).second).first;
110 }
111 
113 {
114  std::map<unsigned long, std::pair<OPT_TRIANGLE_QUADRATIQUE*,FEM_TRIANGLE6*> >::iterator it=correspondance_triangle.find(fem_tri6->get_id());
115  return ((*it).second).first;
116 }
117 
118 
120 {
121  affiche=fonc;
122  affichageactif=1;
123 }
124 
126 {
127  // Paramètres de la méthode du mouvement normal
128  params.ajouter(" ##### Paramètres de la méthode du mouvement normal #####","",OT_PARAMETRES::STRING,"");
129  params.ajouter("c",0.05,OT_PARAMETRES::DOUBLE," Constante de convergence ");
130  params.ajouter("l",0.1,OT_PARAMETRES::DOUBLE," Limite de convergence");
131  params.ajouter("iter_max",100.,OT_PARAMETRES::DOUBLE," Nombre maximal d'itérations de la méthode du mouvement normal");
132  params.ajouter("iter_vue",10.,OT_PARAMETRES::DOUBLE," Génération d'un fichier gmsh toutes les iter_vue. (0: pas de génération)");
133 
134  // contrôle avec lissage des noeuds
135  params.ajouter(" ##### lissage #####","",OT_PARAMETRES::STRING,"");
136  params.ajouter("lissage_Laplacien",0.,OT_PARAMETRES::DOUBLE," Lissage Laplacien (0: sans lissage, 1: avec lissage)");
137  params.ajouter("lissage_Taubin",0.,OT_PARAMETRES::DOUBLE," Lissage Taubin (0: sans lissage, 1: avec lissage)");
138  params.ajouter("lissage_fin",0.,OT_PARAMETRES::DOUBLE," Lissage des noeuds à la fin de la méthode avec Taubin (0: sans lissage, 1: avec lissage)");
139 
140  // Paramètres du filtre
141  params.ajouter(" ##### Options de filtre #####","",OT_PARAMETRES::STRING,"");
142  params.ajouter("filtre",0.,OT_PARAMETRES::DOUBLE," (0: sans filtre, 1: avec filtre)");
143  params.ajouter("rayon",21.,OT_PARAMETRES::DOUBLE," rayon filtre");
144 
145  // Méthode du mouvement modifiée
146  params.ajouter(" ##### MMN modifiée #####","",OT_PARAMETRES::STRING,"");
147  params.ajouter("MMN_modif",0.,OT_PARAMETRES::DOUBLE," MMN modifiée (0: MMN non modifiée, 1: MMN modifiée 1, 2: MMN modifiée 2)");
148 
149  // Option de génération d'un fichier magic contenant uniquement les solutions de déplacement servant à la création d'un film
150  params.ajouter(" ##### Options de film #####","",OT_PARAMETRES::STRING,"");
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");
152 
153 }
154 
156 {
157  params.enregistrer(fichierparam);
158 }
159 
161 {
162  params.vide();
163  params.lire(fichier);
164 }
165 
167 {
169  for (OPT_NOEUD* opt_noeud=listenoeud.get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=listenoeud.get_suivant(itopt_noeud))
170  {
171  // Création de la liste de noeuds à déplacer (vérification des conditions frontières)
172  double val;
173  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
174  int ndok=(fem_noeud->get_lien_topologie())->get_valeur_ccf((char*)"Nd",val); //(char*) pour régler warning
175  if (ndok!=1)
176  lstnoeud_deplacer_initiale->ajouter(opt_noeud);
177  }
178 }
179 
181 {
182  // Détermination des noeuds voisins
183  TPL_MAP_ENTITE<OPT_NOEUD*> lst_noeud_voisin;
184  int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
185  for (int i=0;i<nb_fem_ele2;i++)
186  {
187  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
188  FEM_TRIANGLE6* fem_tri=(FEM_TRIANGLE6*)fem_noeud->get_lien_element2()->get(i);
189  OPT_TRIANGLE_QUADRATIQUE* opt_tri=get_triangle(fem_tri);
190 
191  OPT_NOEUD* opt_n1=opt_tri->get_noeud1();
192  OPT_NOEUD* opt_n2=opt_tri->get_noeud2();
193  OPT_NOEUD* opt_n3=opt_tri->get_noeud3();
194  OPT_NOEUD* opt_n4=opt_tri->get_noeud4();
195  OPT_NOEUD* opt_n5=opt_tri->get_noeud5();
196  OPT_NOEUD* opt_n6=opt_tri->get_noeud6();
197 
198  if (opt_n1->get_id()==opt_noeud->get_id())
199  {
200  lst_noeud_voisin.ajouter(opt_n2);
201  lst_noeud_voisin.ajouter(opt_n6);
202  }
203  if (opt_n3->get_id()==opt_noeud->get_id())
204  {
205  lst_noeud_voisin.ajouter(opt_n2);
206  lst_noeud_voisin.ajouter(opt_n4);
207  }
208  if (opt_n5->get_id()==opt_noeud->get_id())
209  {
210  lst_noeud_voisin.ajouter(opt_n4);
211  lst_noeud_voisin.ajouter(opt_n6);
212  }
213 
214  if (opt_n2->get_id()==opt_noeud->get_id())
215  {
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);
220  }
221 
222  if (opt_n4->get_id()==opt_noeud->get_id())
223  {
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);
228  }
229 
230  if (opt_n6->get_id()==opt_noeud->get_id())
231  {
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);
236  }
237 
238  }
239  opt_noeud->change_liste_noeud_voisin(lst_noeud_voisin);
240 
241 }
242 
244 {
245  TPL_MAP_ENTITE<OPT_NOEUD*> lst_noeud_filtre;
247  double rayon=(double)params.get_valeur("rayon");
248  double R;
249  for (OPT_NOEUD* opt=lstnoeud.get_premier(itopt_noeud);opt!=NULL;opt=lstnoeud.get_suivant(itopt_noeud))
250  {
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);
254  }
255  opt_noeud->change_liste_noeud_filtre(lst_noeud_filtre);
256 }
257 
259 {
261  double nor[3];
262  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
263  int id=opt_noeud->get_id();
264  int nbtri=fem_noeud->get_lien_element2()->get_nb();
265  OT_VECTEUR_3D somme_n(0.,0.,0.);
266  for (int i=0;i<nbtri;i++)
267  {
268  FEM_TRIANGLE6* fem_tri=(FEM_TRIANGLE6*)(fem_noeud->get_lien_element2()->get(i));
269  OPT_TRIANGLE_QUADRATIQUE* opt_tri=get_triangle(fem_tri);
270 
271  OPT_NOEUD* opt_n1=opt_tri->get_noeud1();
272  OPT_NOEUD* opt_n2=opt_tri->get_noeud2();
273  OPT_NOEUD* opt_n3=opt_tri->get_noeud3();
274  OPT_NOEUD* opt_n4=opt_tri->get_noeud4();
275  OPT_NOEUD* opt_n5=opt_tri->get_noeud5();
276  OPT_NOEUD* opt_n6=opt_tri->get_noeud6();
277 
278  if (opt_n1->get_id()==opt_noeud->get_id())
279  {
280  ou.get_normale(fem_tri,0,0,nor);
281  }
282  if (opt_n2->get_id()==opt_noeud->get_id())
283  {
284  ou.get_normale(fem_tri,0.5,0,nor);
285  }
286  if (opt_n3->get_id()==opt_noeud->get_id())
287  {
288  ou.get_normale(fem_tri,1,0,nor);
289  }
290  if (opt_n4->get_id()==opt_noeud->get_id())
291  {
292  ou.get_normale(fem_tri,0.5,0.5,nor);
293  }
294  if (opt_n5->get_id()==opt_noeud->get_id())
295  {
296  ou.get_normale(fem_tri,0,1,nor);
297  }
298  if (opt_n6->get_id()==opt_noeud->get_id())
299  {
300  ou.get_normale(fem_tri,0,0.5,nor);
301  }
302  OT_VECTEUR_3D NN1(nor);
303  somme_n=somme_n+NN1;
304  }
305 
306  OT_VECTEUR_3D n=somme_n/nbtri;
307  n.norme();
308  FEM_TRIANGLE6* fem_tri=(FEM_TRIANGLE6*)(fem_noeud->get_lien_element2()->get(0));
309  MG_TRIANGLE* mg_tri=(MG_TRIANGLE*)fem_tri->get_mg_element_maillage();
310  MG_FACE* face=(MG_FACE*)(mg_tri->get_lien_topologie());
311  int orientation=face->get_mg_coface(0)->get_orientation();
312  n=orientation*n;
313  opt_noeud->change_normale(n);
314 }
315 
316 double MGOPT_MVT_NORMAL_QUADRATIQUE::get_sigma_vm_max(MG_GESTIONNAIRE* gest, FEM_NOEUD* fem_noeud, int num_sol_inf, int num_sol_moy, int num_sol_sup)
317 {
318  // Contrainte de Von Mises maximale entre les 3 plans de calcul (inférieur, moyen, supérieur)
319  OPT_NOEUD* opt_noeud=get_noeud(fem_noeud);
320  int num=opt_noeud->get_num();
321  double svm1=gest->get_fem_solution(0)->lire(num-1,0);
322  double svm2=gest->get_fem_solution(1)->lire(num-1,0);
323  double svm3=gest->get_fem_solution(2)->lire(num-1,0);
324  double svm_max=0.;
325 
326  if ((svm1>=svm2) && (svm1>=svm3)) // Contrainte de Von Mises maximale entre les trois plans
327  svm_max=svm1;
328  if ((svm2>=svm1) && (svm2>=svm3))
329  svm_max=svm2;
330  if ((svm3>=svm1) && (svm3>=svm2))
331  svm_max=svm3;
332  return svm_max;
333 
334 }
335 
337 {
339  int compteur_svm=0;
340  double somme_ecart_au_carre=0.;
341  double ecarttype=0.;
342  for (OPT_NOEUD* opt_noeud=lstnoeud.get_premier(itopt_noeud);opt_noeud!=NULL;opt_noeud=lstnoeud.get_suivant(itopt_noeud))
343  {
344  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
345  double svm=get_sigma_vm_max(gest,fem_noeud,0,1,2);
346  somme_ecart_au_carre=somme_ecart_au_carre+((svm-moyenne)*(svm-moyenne));
347  compteur_svm++;
348  }
349  ecarttype=sqrt((1./compteur_svm)*somme_ecart_au_carre);
350  return ecarttype;
351 }
352 
354 {
355  // Solution de déplacement virtuel d'un opt_noeud
356  opt_noeud->change_sol_deplacement_virtuel(d);
357 
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++)
360  {
361  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
362  FEM_TRIANGLE6* fem_tri=(FEM_TRIANGLE6*)fem_noeud->get_lien_element2()->get(i);
363  OPT_TRIANGLE_QUADRATIQUE* opt_tri=get_triangle(fem_tri);
364  }
365 }
366 
368 {
369  // Déplacement réel d'un opt_noeud
370  double val;
371  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
372  OT_VECTEUR_3D n=opt_noeud->get_normale_initiale();
373  double *xyz=opt_noeud->get_coord();
374  double xyz_modif[3];
375 
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];
379 
380  opt_noeud->change_x(xyz_modif[0]);
381  opt_noeud->change_y(xyz_modif[1]);
382  opt_noeud->change_z(xyz_modif[2]);
383 
384  opt_noeud->change_norme_orientee_deplacement();
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++)
387  {
388  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
389  FEM_TRIANGLE6* fem_tri=(FEM_TRIANGLE6*)fem_noeud->get_lien_element2()->get(i);
390  OPT_TRIANGLE_QUADRATIQUE* opt_tri=get_triangle(fem_tri);
391  }
392 }
393 
395 {
396  // Écriture de la solution de déplacement du fem_noeud
397  OPT_NOEUD* opt_noeud=get_noeud(fem_noeud);
398  int num=opt_noeud->get_num();
399 
400  double dx=opt_noeud->get_x()-opt_noeud->get_x_initial();
401  double dy=opt_noeud->get_y()-opt_noeud->get_y_initial();
402  double dz=opt_noeud->get_z()-opt_noeud->get_z_initial();
403 
404  sol->ecrire(dx,num-1,0,0);
405  sol->ecrire(dy,num-1,0,1);
406  sol->ecrire(dz,num-1,0,2);
407 }
408 
410 {
411 
412  int nb_noeud=lst_noeud.get_nb();
415  for (OPT_NOEUD* opt_noeud=lst_noeud.get_premier(it2);opt_noeud!=NULL;opt_noeud=lst_noeud.get_suivant(it2))
416  {
417  int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
418 
419  // Détermination des noeuds voisins
420  TPL_MAP_ENTITE<OPT_NOEUD*> lst_noeud_voisin;
421  lst_noeud_voisin=opt_noeud->get_liste_noeud_voisin();
422 
423  // Calcul de la position moyenne des noeuds voisins
424  OT_VECTEUR_3D pos_moy;
425  for (OPT_NOEUD* opt=lst_noeud_voisin.get_premier(it3);opt!=NULL;opt=lst_noeud_voisin.get_suivant(it3))
426  {
427  OT_VECTEUR_3D pos_opt(opt->get_x(),opt->get_y(),opt->get_z());
428  pos_moy=pos_moy+pos_opt;
429  }
430  // Avec prise en compte de la position du noeud
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);
436  }
438  for (OPT_NOEUD* opt_noeud=lst_noeud.get_premier(it4);opt_noeud!=NULL;opt_noeud=lst_noeud.get_suivant(it4))
439  {
440  int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
441 
442  OT_VECTEUR_3D pos_lissee(opt_noeud->get_coord_lissee());
443  opt_noeud->change_x(pos_lissee[0]);
444  opt_noeud->change_y(pos_lissee[1]);
445  opt_noeud->change_z(pos_lissee[2]);
446  }
447 }
449 {
452  for (OPT_NOEUD* opt_noeud=lst_noeud.get_premier(it2);opt_noeud!=NULL;opt_noeud=lst_noeud.get_suivant(it2))
453  {
454  TPL_MAP_ENTITE<OPT_NOEUD*> lst_noeud_filtre;
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());
457  double ps1=0;
458  double w=0;
459  double rayon=(double)params.get_valeur("rayon");
460  for (OPT_NOEUD* opt=lst_noeud_filtre.get_premier(it3);opt!=NULL;opt=lst_noeud_filtre.get_suivant(it3))
461  {
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())));
464  ps1=ps1+ps;
465  double d1=opt->get_norme_orientee_deplacement();
466  double wi=ps*d1;
467  w=w+wi;
468  }
469  double d=w/ps1;
470  deplace_opt_noeud(opt_noeud,d);
471  }
472 }
473 
475 {
478  for (OPT_NOEUD* opt_noeud=lst_noeud.get_premier(it2);opt_noeud!=NULL;opt_noeud=lst_noeud.get_suivant(it2))
479  {
480  TPL_MAP_ENTITE<OPT_NOEUD*> lst_noeud_filtre;
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;
484  double rayon=(double)params.get_valeur("rayon");
485 
486  for (OPT_NOEUD* opt=lst_noeud_filtre.get_premier(it3);opt!=NULL;opt=lst_noeud_filtre.get_suivant(it3))
487  {
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())));
490 
491  double wwi=exp(-ps*ps/2./rayon/rayon/9.)/2./M_PI/(rayon/3.);
492  //double wwi=exp(-ps*ps/2./ra/ra/9.)/2./M_PI/(ra/3.);
493  w=w+wwi;
494  double d1=opt->get_sol_deplacement_virtuel();
495  double w3=wwi*d1;
496  ww1=ww1+w3;
497  }
498  double d=ww1/w;
499  deplace_opt_noeud(opt_noeud,d);
500  }
501 }
502 
504 {
505  int nb_noeud=lst_noeud.get_nb();
508  for (OPT_NOEUD* opt_noeud=lst_noeud.get_premier(it2);opt_noeud!=NULL;opt_noeud=lst_noeud.get_suivant(it2))
509  {
510  int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
511 
512  TPL_MAP_ENTITE<OPT_NOEUD*> lst_noeud_voisin;
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());
515 
516  OT_VECTEUR_3D pos_moy;
517  OT_VECTEUR_3D pos_moy2;
518  OT_VECTEUR_3D pos_moy3;
519  double ps1=0;
520 
521  for (OPT_NOEUD* opt=lst_noeud_voisin.get_premier(it3);opt!=NULL;opt=lst_noeud_voisin.get_suivant(it3))
522  {
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())));
525  ps1=ps1+ps;
526  }
527 
528  for (OPT_NOEUD* opt=lst_noeud_voisin.get_premier(it3);opt!=NULL;opt=lst_noeud_voisin.get_suivant(it3))
529  {
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;
534  }
535  pos_moy3=pos_opt_noeud-0.526*pos_moy;
536  opt_noeud->change_coord_lissee(pos_moy3);
537  }
539  for (OPT_NOEUD* opt_noeud=lst_noeud.get_premier(it4);opt_noeud!=NULL;opt_noeud=lst_noeud.get_suivant(it4))
540  {
541  int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
542 
543  OT_VECTEUR_3D pos_lissee(opt_noeud->get_coord_lissee());
544  opt_noeud->change_x(pos_lissee[0]);
545  opt_noeud->change_y(pos_lissee[1]);
546  opt_noeud->change_z(pos_lissee[2]);
547  }
548 }
549 
551 {
552  int nb_noeud=lst_noeud.get_nb();
555  for (OPT_NOEUD* opt_noeud=lst_noeud.get_premier(it2);opt_noeud!=NULL;opt_noeud=lst_noeud.get_suivant(it2))
556  {
557  int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
558 
559  TPL_MAP_ENTITE<OPT_NOEUD*> lst_noeud_voisin;
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());
562 
563  OT_VECTEUR_3D pos_moy;
564  OT_VECTEUR_3D pos_moy2;
565  OT_VECTEUR_3D pos_moy3;
566  double ps1=0;
567  for (OPT_NOEUD* opt=lst_noeud_voisin.get_premier(it3);opt!=NULL;opt=lst_noeud_voisin.get_suivant(it3))
568  {
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())));
571  ps1=ps1+ps;
572  }
573 
574  for (OPT_NOEUD* opt=lst_noeud_voisin.get_premier(it3);opt!=NULL;opt=lst_noeud_voisin.get_suivant(it3))
575  {
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;
580  }
581  pos_moy3=pos_opt_noeud+0.5*pos_moy;
582  opt_noeud->change_coord_lissee(pos_moy3);
583  }
585  for (OPT_NOEUD* opt_noeud=lst_noeud.get_premier(it4);opt_noeud!=NULL;opt_noeud=lst_noeud.get_suivant(it4))
586  {
587  int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
588 
589  OT_VECTEUR_3D pos_lissee(opt_noeud->get_coord_lissee());
590  opt_noeud->change_x(pos_lissee[0]);
591  opt_noeud->change_y(pos_lissee[1]);
592  opt_noeud->change_z(pos_lissee[2]);
593  }
594 }
595 
597 {
598  double xyz1[3],xyz2[3],xyz3[3];
600  for (OPT_TRIANGLE_QUADRATIQUE* opt_tri=lst_triangle.get_premier(itopt_tri);opt_tri!=NULL;opt_tri=lst_triangle.get_suivant(itopt_tri))
601  {
602  OPT_NOEUD* opt_n1=opt_tri->get_noeud1();
603  OPT_NOEUD* opt_n2=opt_tri->get_noeud2();
604  OPT_NOEUD* opt_n3=opt_tri->get_noeud3();
605  OPT_NOEUD* opt_n4=opt_tri->get_noeud4();
606  OPT_NOEUD* opt_n5=opt_tri->get_noeud5();
607  OPT_NOEUD* opt_n6=opt_tri->get_noeud6();
608 
609  double* xyzn1=opt_n1->get_coord();
610  double* xyzn2=opt_n2->get_coord();
611  double* xyzn3=opt_n3->get_coord();
612  double* xyzn4=opt_n4->get_coord();
613  double* xyzn5=opt_n5->get_coord();
614  double* xyzn6=opt_n6->get_coord();
616  double L01= ou.get_distance_curviligne(0,0.5,xyzn1,xyzn2,xyzn3);
617  double L0= ou.get_distance_curviligne(0,1,xyzn1,xyzn2,xyzn3);
618  double L02= ou.get_distance_curviligne(0.5,1,xyzn1,xyzn2,xyzn3);
619 
620  if (fabs((L01-L02)>0.001))
621  {
622  double P=0.5;
623  for (int i=0;i<1000;i++)
624  {
625  double L10= ou.get_distance_curviligne(0,P,xyzn1,xyzn2,xyzn3);
626  double func=L10-(L0*0.5);
627 
628  if (fabs(func)<0.001)
629  {
630  break ;
631  }
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];
635 
636  double dx2=dx*dx;
637  double dy2=dy*dy;
638  double dz2=dz*dz;
639  double S=sqrt(dx2+dy2+dz2);
640  P-=func/S;
641  }
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];
645 
646  opt_n2->change_x(xyz1[0]);
647  opt_n2->change_y(xyz1[1]);
648  opt_n2->change_z(xyz1[2]);
649  }
650 
651  double L00= ou.get_distance_curviligne(0,1,xyzn3,xyzn4,xyzn5);
652  double L11= ou.get_distance_curviligne(0,0.5,xyzn3,xyzn4,xyzn5);
653  double L12= ou.get_distance_curviligne(0.5,1,xyzn3,xyzn4,xyzn5);
654 
655  if (fabs((L11-L12)>0.001))
656  {
657  double P=0.5;
658  for (int i=0;i<1000;i++)
659  {
660  double L110= ou.get_distance_curviligne(0,P,xyzn3,xyzn4,xyzn5);
661  double func=L110-(L00*0.5);
662 
663  if (fabs(func)<0.001)
664  {
665  break ;
666  }
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];
670 
671  double dx2=dx*dx;
672  double dy2=dy*dy;
673  double dz2=dz*dz;
674  double S=sqrt(dx2+dy2+dz2);
675 
676  P-=func/S;
677  }
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];
681 
682  opt_n4->change_x(xyz2[0]);
683  opt_n4->change_y(xyz2[1]);
684  opt_n4->change_z(xyz2[2]);
685  }
686 
687  double L000= ou.get_distance_curviligne(0,1,xyzn5,xyzn6,xyzn1);
688  double L21= ou.get_distance_curviligne(0,0.5,xyzn5,xyzn6,xyzn1);
689  double L22= ou.get_distance_curviligne(0.5,1,xyzn5,xyzn6,xyzn1);
690 
691  if (fabs((L21-L22)>0.001))
692  {
693  double P=0.5;
694  for (int i=0;i<1000;i++)
695  {
696  double L220= ou.get_distance_curviligne(0,P,xyzn5,xyzn6,xyzn1);
697  double func=L220-(L000*0.5);
698 
699  if (fabs(func)<0.001)
700  {
701  break ;
702  }
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];
706 
707  double dx2=dx*dx;
708  double dy2=dy*dy;
709  double dz2=dz*dz;
710 
711  double S=sqrt(dx2+dy2+dz2);
712 
713  P-=func/S;
714  }
715 
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];
719 
720  opt_n6->change_x(xyz3[0]);
721  opt_n6->change_y(xyz3[1]);
722  opt_n6->change_z(xyz3[2]);
723 
724  }
725  }
726 
727 }
729 {
730  char mess[3000];
732  for (OPT_TRIANGLE_QUADRATIQUE* opt_tri=listetriangle.get_premier(itopt_tri);opt_tri!=NULL;opt_tri=listetriangle.get_suivant(itopt_tri))
733  {
734  FEM_TRIANGLE6* fem_ele2=opt_tri->get_fem_tri();
736  int idi=fem_ele2->get_numero();
737  double i=0;
738  double dis=ou.get_distorsion2(fem_ele2);
739  if (dis<0.93)
740  {
741  double bez[6];
742  ou.get_Bezier_coeff(fem_ele2,bez);
743  double val;
744  double jmin=ou.get_jmin(fem_ele2);
745 
746  FEM_NOEUD* n1=fem_ele2->get_fem_noeud(0);
747  FEM_NOEUD* n2=fem_ele2->get_fem_noeud(1);
748  FEM_NOEUD* n3=fem_ele2->get_fem_noeud(2);
749  FEM_NOEUD* n4=fem_ele2->get_fem_noeud(3);
750  FEM_NOEUD* n5=fem_ele2->get_fem_noeud(4);
751  FEM_NOEUD* n6=fem_ele2->get_fem_noeud(5);
752 
753  std::vector<double> dist;
754 
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];
758 
759  xyzn1[0]=n1->get_x();
760  xyzn1[1]=n1->get_y();
761  xyzn1[2]=n1->get_z();
762 
763  xyzn2[0]=n2->get_x();
764  xyzn2[1]=n2->get_y();
765  xyzn2[2]=n2->get_z();
766 
767  xyzn3[0]=n3->get_x();
768  xyzn3[1]=n3->get_y();
769  xyzn3[2]=n3->get_z();
770 
771  xyzn4[0]=n4->get_x();
772  xyzn4[1]=n4->get_y();
773  xyzn4[2]=n4->get_z();
774 
775  xyzn5[0]=n5->get_x();
776  xyzn5[1]=n5->get_y();
777  xyzn5[2]=n5->get_z();
778 
779  xyzn6[0]=n6->get_x();
780  xyzn6[1]=n6->get_y();
781  xyzn6[2]=n6->get_z();
782 
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;
786 
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;
790 
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;
794 
795  int nb=n2->get_lien_element2()->get_nb();
796  int nb3=n6->get_lien_element2()->get_nb();
797  int nb2=n4->get_lien_element2()->get_nb();
798 
799  if ((jmin==bez[0]) || (jmin==bez[1]))
800  {
801  FEM_ELEMENT2* fem_tri;
802  FEM_ELEMENT2* fem_ele22;
803  double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
804  double distor,distor2,distor3;
805  double interval=ou.get_dist_n4(fem_ele2);
806  if (nb>1)
807  {
808  fem_tri=n2->get_lien_element2()->get(1);
809  fem_ele22=n2->get_lien_element2()->get(0);
810  distor=ou.get_distorsion2(fem_ele22);
811  distor2=ou.get_distorsion2(fem_tri);
812  }
813  if (nb==1)
814  {
815  distor3=ou.get_distorsion2(fem_ele2);
816  }
817  xyznR[0]=xyzn2[0];
818  xyznR[1]=xyzn2[1];
819  xyznR[2]=xyzn2[2];
820 
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;
824 
825  n2->change_x(xyzP3[0]);
826  n2->change_y(xyzP3[1]);
827  n2->change_z(xyzP3[2]);
828 
829  if (nb>1)
830  {
831  f33=ou.get_distorsion2(fem_ele22);
832  f333=ou.get_distorsion2(fem_tri);
833  }
834  if (nb==1)
835  {
836  f30=ou.get_distorsion2(fem_ele2);
837  }
838 
839  n2->change_x(xyznR[0]);
840  n2->change_y(xyznR[1]);
841  n2->change_z(xyznR[2]);
842 
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;
846 
847  n2->change_x(xyzP2[0]);
848  n2->change_y(xyzP2[1]);
849  n2->change_z(xyzP2[2]);
850 
851  if (nb>1)
852  {
853  f22=ou.get_distorsion2(fem_ele22);
854  f222=ou.get_distorsion2(fem_tri);
855  }
856  if (nb==1)
857  {
858  f20=ou.get_distorsion2(fem_ele2);
859  }
860  n2->change_x(xyznR[0]);
861  n2->change_y(xyznR[1]);
862  n2->change_z(xyznR[2]);
863 
864  if (nb>1)
865  {
866  if(f222>f22) f2=f22;
867  if(f22>f222) f2=f222;
868  if(f33>f333) f3=f333;
869  if(f333>f33) f3=f33;
870  }
871  if (nb==1)
872  {
873  f2=f20;
874  f3=f30;
875  }
876  double interval0;
877  interval0=interval;
878 
879  while (interval0/interval>0.05)
880  {
881  if(f2>=f3)
882  {
883  xyzPP3[0] =xyzP3[0];
884  xyzPP3[1] =xyzP3[1];
885  xyzPP3[2] =xyzP3[2];
886 
887  n2->change_x(xyzP3[0]);
888  n2->change_y(xyzP3[1]);
889  n2->change_z(xyzP3[2]);
890 
891  xyzn2[0]=xyzP3[0];
892  xyzn2[1]=xyzP3[1];
893  xyzn2[2]=xyzP3[2];
894 
895  interval0=ou.get_dist_n2(fem_ele2);
896  f3=f2;
897 
898  xyzP3[0] =xyzP2[0];
899  xyzP3[1] =xyzP2[1];
900  xyzP3[2] =xyzP2[2];
901 
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;
905 
906  n2->change_x(xyzP2[0]);
907  n2->change_y(xyzP2[1]);
908  n2->change_z(xyzP2[2]);
909 
910  if(nb>1)
911  {
912  f02=ou.get_distorsion2(fem_ele22);
913  f002=ou.get_distorsion2(fem_tri);
914  if(f002>f02) f2=f02;
915  if(f02>f002) f2=f002;
916  }
917  if (nb==1)
918  {
919  f2=ou.get_distorsion2(fem_ele2);
920  }
921  n2->change_x(xyzPP3[0]);
922  n2->change_y(xyzPP3[1]);
923  n2->change_z(xyzPP3[2]);
924 
925  xyzn2[0]=xyzPP3[0];
926  xyzn2[1]=xyzPP3[1];
927  xyzn2[2]=xyzPP3[2];
928  }
929 
930  if(f3>f2)
931  {
932  xyzPP2[0] =xyzP2[0];
933  xyzPP2[1] =xyzP2[1];
934  xyzPP2[2] =xyzP2[2];
935 
936  n2->change_x(xyzP2[0]);
937  n2->change_y(xyzP2[1]);
938  n2->change_z(xyzP2[2]);
939 
940  xyzn2[0]=xyzP2[0];
941  xyzn2[1]=xyzP2[1];
942  xyzn2[2]=xyzP2[2];
943 
944  interval0=ou.get_dist_n2(fem_ele2);
945  f2=f3;
946 
947  xyzP2[0] =xyzP3[0];
948  xyzP2[1] =xyzP3[1];
949  xyzP2[2] =xyzP3[2];
950 
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;
954 
955  n2->change_x(xyzP3[0]);
956  n2->change_y(xyzP3[1]);
957  n2->change_z(xyzP3[2]);
958 
959  if (nb>1)
960  {
961  f03=ou.get_distorsion2(fem_ele22);
962  f003=ou.get_distorsion2(fem_tri);
963  if(f003>f03) f3=f03;
964  if(f03>f003) f3=f003;
965  }
966 
967  if (nb==1)
968  {
969  f3=ou.get_distorsion2(fem_ele2);
970  }
971  n2->change_x(xyzPP2[0]);
972  n2->change_y(xyzPP2[1]);
973  n2->change_z(xyzPP2[2]);
974 
975  xyzn2[0]=xyzPP2[0];
976  xyzn2[1]=xyzPP2[1];
977  xyzn2[2]=xyzPP2[2];
978  }
979  }
980 
981  if(f2>f3)
982  {
983  n2->change_x(xyzP2[0]);
984  n2->change_y(xyzP2[1]);
985  n2->change_z(xyzP2[2]);
986  f2=ou.get_distorsion2(fem_ele2);
987  }
988  if(f3>f2)
989  {
990  n2->change_x(xyzP3[0]);
991  n2->change_y(xyzP3[1]);
992  n2->change_z(xyzP3[2]);
993  f3=ou.get_distorsion2(fem_ele2);
994  }
995  if (nb>1)
996  {
997  double ff3=ou.get_distorsion2(fem_ele22);
998  double ff4=ou.get_distorsion2(fem_tri);
999  if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1000  {
1001  n2->change_x(xyznR[0]);
1002  n2->change_y(xyznR[1]);
1003  n2->change_z(xyznR[2]);
1004  }
1005  }
1006  if (nb==1)
1007  {
1008  double ff3=ou.get_distorsion2(fem_ele2);
1009  if (ff3 < distor3 )
1010  {
1011  n2->change_x(xyznR[0]);
1012  n2->change_y(xyznR[1]);
1013  n2->change_z(xyznR[2]);
1014  }
1015  }
1016  }
1017 
1018  if (jmin==bez[0] )
1019  {
1020  FEM_ELEMENT2* fem_tri;
1021  FEM_ELEMENT2* fem_ele22;
1022  double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1023  double distor,distor2,distor3;
1024  double interval=ou.get_dist_n6(fem_ele2);
1025  if (nb3>1)
1026  {
1027  fem_tri=n6->get_lien_element2()->get(1);
1028  fem_ele22=n6->get_lien_element2()->get(0);
1029 
1030  distor=ou.get_distorsion2(fem_ele22);
1031  distor2=ou.get_distorsion2(fem_tri);
1032  }
1033  if (nb3==1)
1034  {
1035  distor3=ou.get_distorsion2(fem_ele2);
1036  }
1037  xyznR[0]=xyzn6[0];
1038  xyznR[1]=xyzn6[1];
1039  xyznR[2]=xyzn6[2];
1040 
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;
1044 
1045  n6->change_x(xyzP3[0]);
1046  n6->change_y(xyzP3[1]);
1047  n6->change_z(xyzP3[2]);
1048 
1049  if (nb3>1)
1050  {
1051  f33=ou.get_distorsion2(fem_ele22);
1052  f333=ou.get_distorsion2(fem_tri);
1053  }
1054  if (nb3==1)
1055  {
1056  f30=ou.get_distorsion2(fem_ele2);
1057  }
1058  n6->change_x(xyznR[0]);
1059  n6->change_y(xyznR[1]);
1060  n6->change_z(xyznR[2]);
1061 
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;
1065 
1066  n6->change_x(xyzP2[0]);
1067  n6->change_y(xyzP2[1]);
1068  n6->change_z(xyzP2[2]);
1069 
1070  if (nb3>1)
1071  {
1072  f22=ou.get_distorsion2(fem_ele22);
1073  f222=ou.get_distorsion2(fem_tri);
1074  }
1075  if (nb3==1)
1076  {
1077  f20=ou.get_distorsion2(fem_ele2);
1078  }
1079  n6->change_x(xyznR[0]);
1080  n6->change_y(xyznR[1]);
1081  n6->change_z(xyznR[2]);
1082 
1083  double interval0;
1084  interval0=interval;
1085 
1086  if (nb3>1)
1087  {
1088  if(f222>f22) f2=f22;
1089  if(f22>f222) f2=f222;
1090  if(f33>f333) f3=f333;
1091  if(f333>f33) f3=f33;
1092  }
1093  if (nb3==1)
1094  {
1095  f2=f20;
1096  f3=f30;
1097  }
1098  while (interval0/interval>0.05)
1099  {
1100  if(f2>=f3)
1101  {
1102  xyzPP3[0] =xyzP3[0];
1103  xyzPP3[1] =xyzP3[1];
1104  xyzPP3[2] =xyzP3[2];
1105 
1106  n6->change_x(xyzP3[0]);
1107  n6->change_y(xyzP3[1]);
1108  n6->change_z(xyzP3[2]);
1109 
1110  xyzn6[0]=xyzP3[0];
1111  xyzn6[1]=xyzP3[1];
1112  xyzn6[2]=xyzP3[2];
1113 
1114  interval0=ou.get_dist_n6(fem_ele2);
1115 
1116  f3=f2;
1117 
1118  xyzP3[0] =xyzP2[0];
1119  xyzP3[1] =xyzP2[1];
1120  xyzP3[2] =xyzP2[2];
1121 
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;
1125 
1126  n6->change_x(xyzP2[0]);
1127  n6->change_y(xyzP2[1]);
1128  n6->change_z(xyzP2[2]);
1129 
1130  if (nb3>1)
1131  {
1132  f02=ou.get_distorsion2(fem_ele22);
1133  f002=ou.get_distorsion2(fem_tri);
1134  if(f002>f02) f2=f02;
1135  if(f02>f002) f2=f002;
1136  }
1137  if (nb3==1)
1138  {
1139  f2=ou.get_distorsion2(fem_ele2);
1140  }
1141  n6->change_x(xyzPP3[0]);
1142  n6->change_y(xyzPP3[1]);
1143  n6->change_z(xyzPP3[2]);
1144 
1145  xyzn6[0]=xyzPP3[0];
1146  xyzn6[1]=xyzPP3[1];
1147  xyzn6[2]=xyzPP3[2];
1148  }
1149  if(f3>f2)
1150  {
1151  xyzPP2[0] =xyzP2[0];
1152  xyzPP2[1] =xyzP2[1];
1153  xyzPP2[2] =xyzP2[2];
1154 
1155  n6->change_x(xyzP2[0]);
1156  n6->change_y(xyzP2[1]);
1157  n6->change_z(xyzP2[2]);
1158 
1159  xyzn6[0]=xyzP2[0];
1160  xyzn6[1]=xyzP2[1];
1161  xyzn6[2]=xyzP2[2];
1162  f2=f3;
1163  interval0=ou.get_dist_n6(fem_ele2);
1164 
1165  xyzP2[0] =xyzP3[0];
1166  xyzP2[1] =xyzP3[1];
1167  xyzP2[2] =xyzP3[2];
1168 
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;
1172 
1173  n6->change_x(xyzP3[0]);
1174  n6->change_y(xyzP3[1]);
1175  n6->change_z(xyzP3[2]);
1176 
1177  if (nb3>1)
1178  {
1179  f03=ou.get_distorsion2(fem_ele22);
1180  f003=ou.get_distorsion2(fem_tri);
1181  if(f003>f03) f3=f03;
1182  if(f03>f003) f3=f003;
1183  }
1184  if (nb3==1)
1185  {
1186  f3=ou.get_distorsion2(fem_ele2);
1187  }
1188  n6->change_x(xyzPP2[0]);
1189  n6->change_y(xyzPP2[1]);
1190  n6->change_z(xyzPP2[2]);
1191 
1192  xyzn6[0]=xyzPP2[0];
1193  xyzn6[1]=xyzPP2[1];
1194  xyzn6[2]=xyzPP2[2];
1195  }
1196  }
1197  if(f2>f3)
1198  {
1199  n6->change_x(xyzP2[0]);
1200  n6->change_y(xyzP2[1]);
1201  n6->change_z(xyzP2[2]);
1202  f2=ou.get_distorsion2(fem_ele2);
1203  }
1204  if(f3>f2)
1205  {
1206  n6->change_x(xyzP3[0]);
1207  n6->change_y(xyzP3[1]);
1208  n6->change_z(xyzP3[2]);
1209  f3=ou.get_distorsion2(fem_ele2);
1210  }
1211  if (nb3>1)
1212  {
1213  double ff3=ou.get_distorsion2(fem_ele22);
1214  double ff4=ou.get_distorsion2(fem_tri);
1215  if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1216  {
1217  n6->change_x(xyznR[0]);
1218  n6->change_y(xyznR[1]);
1219  n6->change_z(xyznR[2]);
1220  }
1221  }
1222  if (nb3==1)
1223  {
1224  double ff3=ou.get_distorsion2(fem_ele2);
1225  if (ff3 < distor3 )
1226  {
1227  n6->change_x(xyznR[0]);
1228  n6->change_y(xyznR[1]);
1229  n6->change_z(xyznR[2]);
1230  }
1231  }
1232  }
1233 
1234  if ((jmin==bez[2] ) || (jmin==bez[3]))
1235  {
1236  FEM_ELEMENT2* fem_tri;
1237  FEM_ELEMENT2* fem_ele22;
1238  double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1239  double distor,distor2,distor3;
1240  double interval=ou.get_dist_n4(fem_ele2);
1241  if (nb2>1)
1242  {
1243  fem_tri=n4->get_lien_element2()->get(1);
1244  fem_ele22=n4->get_lien_element2()->get(0);
1245 
1246  distor=ou.get_distorsion2(fem_ele22);
1247  distor2=ou.get_distorsion2(fem_tri);
1248  }
1249  if (nb2==1)
1250  {
1251  distor3=ou.get_distorsion2(fem_ele2);
1252  }
1253  xyznR[0]=xyzn4[0];
1254  xyznR[1]=xyzn4[1];
1255  xyznR[2]=xyzn4[2];
1256 
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;
1260 
1261  n4->change_x(xyzP3[0]);
1262  n4->change_y(xyzP3[1]);
1263  n4->change_z(xyzP3[2]);
1264 
1265  if (nb2>1)
1266  {
1267  f33=ou.get_distorsion2(fem_ele22);
1268  f333=ou.get_distorsion2(fem_tri);
1269  }
1270  if (nb2==1)
1271  {
1272  f30=ou.get_distorsion2(fem_ele2);
1273  }
1274  n4->change_x(xyznR[0]);
1275  n4->change_y(xyznR[1]);
1276  n4->change_z(xyznR[2]);
1277 
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;
1281 
1282  n4->change_x(xyzP2[0]);
1283  n4->change_y(xyzP2[1]);
1284  n4->change_z(xyzP2[2]);
1285 
1286  if (nb2>1)
1287  {
1288  FEM_ELEMENT2* fem_tri=n4->get_lien_element2()->get(1);
1289  FEM_ELEMENT2* fem_ele22=n4->get_lien_element2()->get(0);
1290 
1291  f22=ou.get_distorsion2(fem_ele22);
1292  f222=ou.get_distorsion2(fem_tri);
1293  }
1294  if (nb2==1)
1295  {
1296  f20=ou.get_distorsion2(fem_ele2);
1297  }
1298  n4->change_x(xyznR[0]);
1299  n4->change_y(xyznR[1]);
1300  n4->change_z(xyznR[2]);
1301 
1302  if (nb2>1)
1303  {
1304  if(f222>f22) f2=f22;
1305  if(f22>f222) f2=f222;
1306  if(f33>f333) f3=f333;
1307  if(f333>f33) f3=f33;
1308  }
1309  if (nb2==1)
1310  {
1311  f2=f20;
1312  f3=f30;
1313  }
1314  double interval0;
1315  interval0=interval;
1316  while (interval0/interval>0.05)
1317  {
1318  if(f2>=f3)
1319  {
1320  xyzPP3[0] =xyzP3[0];
1321  xyzPP3[1] =xyzP3[1];
1322  xyzPP3[2] =xyzP3[2];
1323 
1324  n4->change_x(xyzP3[0]);
1325  n4->change_y(xyzP3[1]);
1326  n4->change_z(xyzP3[2]);
1327 
1328  xyzn4[0]=xyzP3[0];
1329  xyzn4[1]=xyzP3[1];
1330  xyzn4[2]=xyzP3[2];
1331  interval0=ou.get_dist_n4(fem_ele2);
1332 
1333  f3=f2;
1334  xyzP3[0] =xyzP2[0];
1335  xyzP3[1] =xyzP2[1];
1336  xyzP3[2] =xyzP2[2];
1337 
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;
1341 
1342  n4->change_x(xyzP2[0]);
1343  n4->change_y(xyzP2[1]);
1344  n4->change_z(xyzP2[2]);
1345 
1346  if (nb2>1)
1347  {
1348  f02=ou.get_distorsion2(fem_ele22);
1349  f002=ou.get_distorsion2(fem_tri);
1350  if(f002>f02) f2=f02;
1351  if(f02>f002) f2=f002;
1352  }
1353  if (nb2==1)
1354  {
1355  f2=ou.get_distorsion2(fem_ele2);
1356  }
1357 
1358  n4->change_x(xyzPP3[0]);
1359  n4->change_y(xyzPP3[1]);
1360  n4->change_z(xyzPP3[2]);
1361 
1362  xyzn4[0]=xyzPP3[0];
1363  xyzn4[1]=xyzPP3[1];
1364  xyzn4[2]=xyzPP3[2];
1365  }
1366  if(f3>f2)
1367  {
1368  xyzPP2[0] =xyzP2[0];
1369  xyzPP2[1] =xyzP2[1];
1370  xyzPP2[2] =xyzP2[2];
1371 
1372  n4->change_x(xyzP2[0]);
1373  n4->change_y(xyzP2[1]);
1374  n4->change_z(xyzP2[2]);
1375 
1376  xyzn4[0]=xyzP2[0];
1377  xyzn4[1]=xyzP2[1];
1378  xyzn4[2]=xyzP2[2];
1379  interval0=ou.get_dist_n4(fem_ele2);
1380  f2=f3;
1381  xyzP2[0] =xyzP3[0];
1382  xyzP2[1] =xyzP3[1];
1383  xyzP2[2] =xyzP3[2];
1384 
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;
1388 
1389  n4->change_x(xyzP3[0]);
1390  n4->change_y(xyzP3[1]);
1391  n4->change_z(xyzP3[2]);
1392  if (nb2>1)
1393  {
1394  f03=ou.get_distorsion2(fem_ele22);
1395  f003=ou.get_distorsion2(fem_tri);
1396  if(f003>f03) f3=f03;
1397  if(f03>f003) f3=f003;
1398  }
1399  if (nb2==1)
1400  {
1401  f3=ou.get_distorsion2(fem_ele2);
1402  }
1403  n4->change_x(xyzPP2[0]);
1404  n4->change_y(xyzPP2[1]);
1405  n4->change_z(xyzPP2[2]);
1406 
1407  xyzn4[0]=xyzPP2[0];
1408  xyzn4[1]=xyzPP2[1];
1409  xyzn4[2]=xyzPP2[2];
1410  }
1411  }
1412 
1413  if(f2>f3)
1414  {
1415  n4->change_x(xyzP2[0]);
1416  n4->change_y(xyzP2[1]);
1417  n4->change_z(xyzP2[2]);
1418  f2=ou.get_distorsion2(fem_ele2);
1419  }
1420  if(f3>f2)
1421  {
1422  n4->change_x(xyzP3[0]);
1423  n4->change_y(xyzP3[1]);
1424  n4->change_z(xyzP3[2]);
1425  f3=ou.get_distorsion2(fem_ele2);
1426  }
1427  if (nb2>1)
1428  {
1429  double ff3=ou.get_distorsion2(fem_ele22);
1430  double ff4=ou.get_distorsion2(fem_tri);
1431 
1432  if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1433  {
1434  n4->change_x(xyznR[0]);
1435  n4->change_y(xyznR[1]);
1436  n4->change_z(xyznR[2]);
1437  }
1438  }
1439  if (nb2==1)
1440  {
1441  double ff3=ou.get_distorsion2(fem_ele2);
1442  if (ff3 < distor3 )
1443  {
1444  n4->change_x(xyznR[0]);
1445  n4->change_y(xyznR[1]);
1446  n4->change_z(xyznR[2]);
1447  }
1448  }
1449  }
1450 
1451  if (jmin==bez[2] )
1452  {
1453  FEM_ELEMENT2* fem_tri;
1454  FEM_ELEMENT2* fem_ele22;
1455  double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1456  double distor,distor2,distor3;
1457  double interval=ou.get_dist_n2(fem_ele2);
1458  if (nb>1)
1459  {
1460  fem_tri=n2->get_lien_element2()->get(1);
1461  fem_ele22=n2->get_lien_element2()->get(0);
1462 
1463  distor=ou.get_distorsion2(fem_ele22);
1464  distor2=ou.get_distorsion2(fem_tri);
1465  }
1466  if (nb==1)
1467  {
1468  distor3=ou.get_distorsion2(fem_ele2);
1469  }
1470  xyznR[0]=xyzn2[0];
1471  xyznR[1]=xyzn2[1];
1472  xyznR[2]=xyzn2[2];
1473 
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;
1477 
1478  n2->change_x(xyzP3[0]);
1479  n2->change_y(xyzP3[1]);
1480  n2->change_z(xyzP3[2]);
1481  if (nb>1)
1482  {
1483  f33=ou.get_distorsion2(fem_ele22);
1484  f333=ou.get_distorsion2(fem_tri);
1485  }
1486  if (nb==1)
1487  {
1488  f30=ou.get_distorsion2(fem_ele2);
1489  }
1490  n2->change_x(xyznR[0]);
1491  n2->change_y(xyznR[1]);
1492  n2->change_z(xyznR[2]);
1493 
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;
1497 
1498  n2->change_x(xyzP2[0]);
1499  n2->change_y(xyzP2[1]);
1500  n2->change_z(xyzP2[2]);
1501 
1502  if (nb>1)
1503  {
1504  f22=ou.get_distorsion2(fem_ele22);
1505  f222=ou.get_distorsion2(fem_tri);
1506  }
1507  if (nb==1)
1508  {
1509  f20=ou.get_distorsion2(fem_ele2);
1510  }
1511  n2->change_x(xyznR[0]);
1512  n2->change_y(xyznR[1]);
1513  n2->change_z(xyznR[2]);
1514  if (nb>1)
1515  {
1516  if(f222>f22) f2=f22;
1517  if(f22>f222) f2=f222;
1518  if(f33>f333) f3=f333;
1519  if(f333>f33) f3=f33;
1520  }
1521  if (nb==1)
1522  {
1523  f2=f20;
1524  f3=f30;
1525  }
1526  double interval0;
1527  interval0=interval;
1528 
1529  while (interval0/interval>0.05)
1530  {
1531  if(f2>=f3)
1532  {
1533  xyzPP3[0] =xyzP3[0];
1534  xyzPP3[1] =xyzP3[1];
1535  xyzPP3[2] =xyzP3[2];
1536 
1537  n2->change_x(xyzP3[0]);
1538  n2->change_y(xyzP3[1]);
1539  n2->change_z(xyzP3[2]);
1540 
1541  xyzn2[0]=xyzP3[0];
1542  xyzn2[1]=xyzP3[1];
1543  xyzn2[2]=xyzP3[2];
1544  interval0=ou.get_dist_n2(fem_ele2);
1545 
1546  f3=f2;
1547 
1548  xyzP3[0] =xyzP2[0];
1549  xyzP3[1] =xyzP2[1];
1550  xyzP3[2] =xyzP2[2];
1551 
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;
1555 
1556  n2->change_x(xyzP2[0]);
1557  n2->change_y(xyzP2[1]);
1558  n2->change_z(xyzP2[2]);
1559 
1560  if (nb>1)
1561  {
1562  f02=ou.get_distorsion2(fem_ele22);
1563  f002=ou.get_distorsion2(fem_tri);
1564  if(f002>f02) f2=f02;
1565  if(f02>f002) f2=f002;
1566  }
1567  if (nb==1)
1568  {
1569  f2=ou.get_distorsion2(fem_ele2);
1570  }
1571  n2->change_x(xyzPP3[0]);
1572  n2->change_y(xyzPP3[1]);
1573  n2->change_z(xyzPP3[2]);
1574 
1575  xyzn2[0]=xyzPP3[0];
1576  xyzn2[1]=xyzPP3[1];
1577  xyzn2[2]=xyzPP3[2];
1578  }
1579  if(f3>f2)
1580  {
1581  xyzPP2[0] =xyzP2[0];
1582  xyzPP2[1] =xyzP2[1];
1583  xyzPP2[2] =xyzP2[2];
1584 
1585  n2->change_x(xyzP2[0]);
1586  n2->change_y(xyzP2[1]);
1587  n2->change_z(xyzP2[2]);
1588 
1589  xyzn2[0]=xyzP2[0];
1590  xyzn2[1]=xyzP2[1];
1591  xyzn2[2]=xyzP2[2];
1592 
1593  interval0=ou.get_dist_n2(fem_ele2);
1594  f2=f3;
1595 
1596  xyzP2[0] =xyzP3[0];
1597  xyzP2[1] =xyzP3[1];
1598  xyzP2[2] =xyzP3[2];
1599 
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;
1603 
1604  n2->change_x(xyzP3[0]);
1605  n2->change_y(xyzP3[1]);
1606  n2->change_z(xyzP3[2]);
1607 
1608  if (nb>1)
1609  {
1610  f03=ou.get_distorsion2(fem_ele22);
1611  f003=ou.get_distorsion2(fem_tri);
1612  if(f003>f03) f3=f03;
1613  if(f03>f003) f3=f003;
1614  }
1615  if (nb==1)
1616  {
1617  f3=ou.get_distorsion2(fem_ele2);
1618  }
1619  n2->change_x(xyzPP2[0]);
1620  n2->change_y(xyzPP2[1]);
1621  n2->change_z(xyzPP2[2]);
1622 
1623  xyzn2[0]=xyzPP2[0];
1624  xyzn2[1]=xyzPP2[1];
1625  xyzn2[2]=xyzPP2[2];
1626 
1627  }
1628  }
1629 
1630  if(f2>f3)
1631  {
1632  n2->change_x(xyzP2[0]);
1633  n2->change_y(xyzP2[1]);
1634  n2->change_z(xyzP2[2]);
1635  f2=ou.get_distorsion2(fem_ele2);
1636  }
1637  if(f3>f2)
1638  {
1639  n2->change_x(xyzP3[0]);
1640  n2->change_y(xyzP3[1]);
1641  n2->change_z(xyzP3[2]);
1642  f3=ou.get_distorsion2(fem_ele2);
1643  }
1644  if (nb>1)
1645  {
1646  double ff3=ou.get_distorsion2(fem_ele22);
1647  double ff4=ou.get_distorsion2(fem_tri);
1648  if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1649  {
1650  n2->change_x(xyznR[0]);
1651  n2->change_y(xyznR[1]);
1652  n2->change_z(xyznR[2]);
1653  }
1654  }
1655  if (nb==1)
1656  {
1657  double ff3=ou.get_distorsion2(fem_ele2);
1658  if (ff3 < distor3 )
1659  {
1660  n2->change_x(xyznR[0]);
1661  n2->change_y(xyznR[1]);
1662  n2->change_z(xyznR[2]);
1663  }
1664  }
1665 
1666  }
1667 
1668  if ((jmin==bez[4])|| (jmin==bez[5]))
1669  {
1670  FEM_ELEMENT2* fem_tri;
1671  FEM_ELEMENT2* fem_ele22;
1672  double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1673  double distor,distor2,distor3;
1674  double interval=ou.get_dist_n6(fem_ele2);
1675  if (nb3>1)
1676  {
1677  fem_tri=n6->get_lien_element2()->get(1);
1678  fem_ele22=n6->get_lien_element2()->get(0);
1679  distor=ou.get_distorsion2(fem_ele22);
1680  distor2=ou.get_distorsion2(fem_tri);
1681  }
1682  if (nb3==1)
1683  {
1684  distor3=ou.get_distorsion2(fem_ele2);
1685  }
1686  xyznR[0]=xyzn6[0];
1687  xyznR[1]=xyzn6[1];
1688  xyznR[2]=xyzn6[2];
1689 
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;
1693 
1694  n6->change_x(xyzP3[0]);
1695  n6->change_y(xyzP3[1]);
1696  n6->change_z(xyzP3[2]);
1697 
1698  if (nb3>1)
1699  {
1700  f33=ou.get_distorsion2(fem_ele22);
1701  f333=ou.get_distorsion2(fem_tri);
1702  }
1703  if (nb3==1)
1704  {
1705  f30=ou.get_distorsion2(fem_ele2);
1706  }
1707  n6->change_x(xyznR[0]);
1708  n6->change_y(xyznR[1]);
1709  n6->change_z(xyznR[2]);
1710 
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;
1714 
1715  n6->change_x(xyzP2[0]);
1716  n6->change_y(xyzP2[1]);
1717  n6->change_z(xyzP2[2]);
1718 
1719  if (nb3>1)
1720  {
1721  f22=ou.get_distorsion2(fem_ele22);
1722  f222=ou.get_distorsion2(fem_tri);
1723  }
1724  if (nb3==1)
1725  {
1726  f20=ou.get_distorsion2(fem_ele2);
1727  }
1728  n6->change_x(xyznR[0]);
1729  n6->change_y(xyznR[1]);
1730  n6->change_z(xyznR[2]);
1731 
1732  double interval0;
1733  interval0=interval;
1734  if (nb3>1)
1735  {
1736  if(f222>f22) f2=f22;
1737  if(f22>f222) f2=f222;
1738  if(f33>f333) f3=f333;
1739  if(f333>f33) f3=f33;
1740  }
1741  if (nb3==1)
1742  {
1743  f2=f20;
1744  f3=f30;
1745  }
1746 
1747  while (interval0/interval>0.05)
1748  {
1749  if(f2>=f3)
1750  {
1751  xyzPP3[0] =xyzP3[0];
1752  xyzPP3[1] =xyzP3[1];
1753  xyzPP3[2] =xyzP3[2];
1754 
1755  n6->change_x(xyzP3[0]);
1756  n6->change_y(xyzP3[1]);
1757  n6->change_z(xyzP3[2]);
1758 
1759  xyzn6[0]=xyzP3[0];
1760  xyzn6[1]=xyzP3[1];
1761  xyzn6[2]=xyzP3[2];
1762  interval0=ou.get_dist_n6(fem_ele2);
1763  f3=f2;
1764 
1765  xyzP3[0] =xyzP2[0];
1766  xyzP3[1] =xyzP2[1];
1767  xyzP3[2] =xyzP2[2];
1768 
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;
1772 
1773  n6->change_x(xyzP2[0]);
1774  n6->change_y(xyzP2[1]);
1775  n6->change_z(xyzP2[2]);
1776 
1777  if (nb3>1)
1778  {
1779  f02=ou.get_distorsion2(fem_ele22);
1780  f002=ou.get_distorsion2(fem_tri);
1781  if(f002>f02) f2=f02;
1782  if(f02>f002) f2=f002;
1783  }
1784  if (nb3==1)
1785  {
1786  f2=ou.get_distorsion2(fem_ele2);
1787  }
1788  n6->change_x(xyzPP3[0]);
1789  n6->change_y(xyzPP3[1]);
1790  n6->change_z(xyzPP3[2]);
1791 
1792  xyzn6[0]=xyzPP3[0];
1793  xyzn6[1]=xyzPP3[1];
1794  xyzn6[2]=xyzPP3[2];
1795  }
1796  if(f3>f2)
1797  {
1798  xyzPP2[0] =xyzP2[0];
1799  xyzPP2[1] =xyzP2[1];
1800  xyzPP2[2] =xyzP2[2];
1801 
1802  n6->change_x(xyzP2[0]);
1803  n6->change_y(xyzP2[1]);
1804  n6->change_z(xyzP2[2]);
1805 
1806  xyzn6[0]=xyzP2[0];
1807  xyzn6[1]=xyzP2[1];
1808  xyzn6[2]=xyzP2[2];
1809  f2=f3;
1810  interval0=ou.get_dist_n6(fem_ele2);
1811 
1812  xyzP2[0] =xyzP3[0];
1813  xyzP2[1] =xyzP3[1];
1814  xyzP2[2] =xyzP3[2];
1815 
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;
1819 
1820  n6->change_x(xyzP3[0]);
1821  n6->change_y(xyzP3[1]);
1822  n6->change_z(xyzP3[2]);
1823 
1824  if (nb3>1)
1825  {
1826  f03=ou.get_distorsion2(fem_ele22);
1827  f003=ou.get_distorsion2(fem_tri);
1828  if(f003>f03) f3=f03;
1829  if(f03>f003) f3=f003;
1830  }
1831  if (nb3==1)
1832  {
1833  f3=ou.get_distorsion2(fem_ele2);
1834  }
1835 
1836  n6->change_x(xyzPP2[0]);
1837  n6->change_y(xyzPP2[1]);
1838  n6->change_z(xyzPP2[2]);
1839 
1840  xyzn6[0]=xyzPP2[0];
1841  xyzn6[1]=xyzPP2[1];
1842  xyzn6[2]=xyzPP2[2];
1843  }
1844  }
1845  if(f2>f3)
1846  {
1847  n6->change_x(xyzP2[0]);
1848  n6->change_y(xyzP2[1]);
1849  n6->change_z(xyzP2[2]);
1850  f2=ou.get_distorsion2(fem_ele2);
1851  }
1852  if(f3>f2)
1853  {
1854  n6->change_x(xyzP3[0]);
1855  n6->change_y(xyzP3[1]);
1856  n6->change_z(xyzP3[2]);
1857  f3=ou.get_distorsion2(fem_ele2);
1858  }
1859  if (nb3>1)
1860  {
1861  double ff3=ou.get_distorsion2(fem_ele22);
1862  double ff4=ou.get_distorsion2(fem_tri);
1863  if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
1864  {
1865  n6->change_x(xyznR[0]);
1866  n6->change_y(xyznR[1]);
1867  n6->change_z(xyznR[2]);
1868  }
1869  }
1870  if (nb3==1)
1871  {
1872  double ff3=ou.get_distorsion2(fem_ele2);
1873  if (ff3 < distor3 )
1874  {
1875  n6->change_x(xyznR[0]);
1876  n6->change_y(xyznR[1]);
1877  n6->change_z(xyznR[2]);
1878  }
1879  }
1880 
1881  }
1882  if ((jmin==bez[4] ))
1883  {
1884  FEM_ELEMENT2* fem_tri;
1885  FEM_ELEMENT2* fem_ele22;
1886  double f2,f3,f22,f33,f222,f333,f03,f02,f002,f003,f30,f20;
1887  double distor,distor2,distor3;
1888  double interval=ou.get_dist_n4(fem_ele2);
1889  if (nb2>1)
1890  {
1891  fem_tri=n4->get_lien_element2()->get(1);
1892  fem_ele22=n4->get_lien_element2()->get(0);
1893 
1894  distor=ou.get_distorsion2(fem_ele22);
1895  distor2=ou.get_distorsion2(fem_tri);
1896  }
1897  if (nb2==1)
1898  {
1899  distor3=ou.get_distorsion2(fem_ele2);
1900  }
1901  xyznR[0]=xyzn4[0];
1902  xyznR[1]=xyzn4[1];
1903  xyznR[2]=xyzn4[2];
1904 
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;
1908 
1909  n4->change_x(xyzP3[0]);
1910  n4->change_y(xyzP3[1]);
1911  n4->change_z(xyzP3[2]);
1912 
1913  if (nb2>1)
1914  {
1915  f33=ou.get_distorsion2(fem_ele22);
1916  f333=ou.get_distorsion2(fem_tri);
1917  }
1918  if (nb2==1)
1919  {
1920  f30=ou.get_distorsion2(fem_ele2);
1921  }
1922  n4->change_x(xyznR[0]);
1923  n4->change_y(xyznR[1]);
1924  n4->change_z(xyznR[2]);
1925 
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;
1929 
1930  n4->change_x(xyzP2[0]);
1931  n4->change_y(xyzP2[1]);
1932  n4->change_z(xyzP2[2]);
1933 
1934  if (nb2>1)
1935  {
1936  f22=ou.get_distorsion2(fem_ele22);
1937  f222=ou.get_distorsion2(fem_tri);
1938  }
1939  if (nb2==1)
1940  {
1941  f20=ou.get_distorsion2(fem_ele2);
1942  }
1943  n4->change_x(xyznR[0]);
1944  n4->change_y(xyznR[1]);
1945  n4->change_z(xyznR[2]);
1946 
1947  if (nb2>1)
1948  {
1949  if(f222>f22) f2=f22;
1950  if(f22>f222) f2=f222;
1951  if(f33>f333) f3=f333;
1952  if(f333>f33) f3=f33;
1953  }
1954  if (nb2==1)
1955  {
1956  f2=f20;
1957  f3=f30;
1958  }
1959  double interval0;
1960  interval0=interval;
1961  while (interval0/interval>0.05)
1962  {
1963  if(f2>=f3)
1964  {
1965  xyzPP3[0] =xyzP3[0];
1966  xyzPP3[1] =xyzP3[1];
1967  xyzPP3[2] =xyzP3[2];
1968 
1969  n4->change_x(xyzP3[0]);
1970  n4->change_y(xyzP3[1]);
1971  n4->change_z(xyzP3[2]);
1972 
1973  xyzn4[0]=xyzP3[0];
1974  xyzn4[1]=xyzP3[1];
1975  xyzn4[2]=xyzP3[2];
1976 
1977  interval0=ou.get_dist_n4(fem_ele2);
1978 
1979  f3=f2;
1980 
1981  xyzP3[0] =xyzP2[0];
1982  xyzP3[1] =xyzP2[1];
1983  xyzP3[2] =xyzP2[2];
1984 
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;
1988 
1989  n4->change_x(xyzP2[0]);
1990  n4->change_y(xyzP2[1]);
1991  n4->change_z(xyzP2[2]);
1992  if (nb2>1)
1993  {
1994  f02=ou.get_distorsion2(fem_ele22);
1995  f002=ou.get_distorsion2(fem_tri);
1996  if(f002>f02) f2=f02;
1997  if(f02>f002) f2=f002;
1998  }
1999  if (nb2==1)
2000  {
2001  f2=ou.get_distorsion2(fem_ele2);
2002  }
2003 
2004  n4->change_x(xyzPP3[0]);
2005  n4->change_y(xyzPP3[1]);
2006  n4->change_z(xyzPP3[2]);
2007 
2008  xyzn4[0]=xyzPP3[0];
2009  xyzn4[1]=xyzPP3[1];
2010  xyzn4[2]=xyzPP3[2];
2011  }
2012  if(f3>f2)
2013  {
2014  xyzPP2[0] =xyzP2[0];
2015  xyzPP2[1] =xyzP2[1];
2016  xyzPP2[2] =xyzP2[2];
2017 
2018  n4->change_x(xyzP2[0]);
2019  n4->change_y(xyzP2[1]);
2020  n4->change_z(xyzP2[2]);
2021 
2022  xyzn4[0]=xyzP2[0];
2023  xyzn4[1]=xyzP2[1];
2024  xyzn4[2]=xyzP2[2];
2025 
2026  interval0=ou.get_dist_n4(fem_ele2);
2027 
2028  f2=f3;
2029  xyzP2[0] =xyzP3[0];
2030  xyzP2[1] =xyzP3[1];
2031  xyzP2[2] =xyzP3[2];
2032 
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;
2036 
2037  n4->change_x(xyzP3[0]);
2038  n4->change_y(xyzP3[1]);
2039  n4->change_z(xyzP3[2]);
2040 
2041  if (nb2>1)
2042  {
2043  f03=ou.get_distorsion2(fem_ele22);
2044  f003=ou.get_distorsion2(fem_tri);
2045  if(f003>f03) f3=f03;
2046  if(f03>f003) f3=f003;
2047  }
2048  if (nb2==1)
2049  {
2050  f3=ou.get_distorsion2(fem_ele2);
2051  }
2052  n4->change_x(xyzPP2[0]);
2053  n4->change_y(xyzPP2[1]);
2054  n4->change_z(xyzPP2[2]);
2055 
2056  xyzn4[0]=xyzPP2[0];
2057  xyzn4[1]=xyzPP2[1];
2058  xyzn4[2]=xyzPP2[2];
2059 
2060  }
2061  }
2062 
2063  if(f2>f3)
2064  {
2065  n4->change_x(xyzP2[0]);
2066  n4->change_y(xyzP2[1]);
2067  n4->change_z(xyzP2[2]);
2068  f2=ou.get_distorsion2(fem_ele2);
2069  }
2070  if(f3>f2)
2071  {
2072  n4->change_x(xyzP3[0]);
2073  n4->change_y(xyzP3[1]);
2074  n4->change_z(xyzP3[2]);
2075  f3=ou.get_distorsion2(fem_ele2);
2076  }
2077  if (nb2>1)
2078  {
2079  double ff3=ou.get_distorsion2(fem_ele22);
2080  double ff4=ou.get_distorsion2(fem_tri);
2081 
2082  if ((ff3 < distor && ff3 < distor2)||(ff4 < distor && ff4 < distor2) )
2083  {
2084  n4->change_x(xyznR[0]);
2085  n4->change_y(xyznR[1]);
2086  n4->change_z(xyznR[2]);
2087  }
2088  }
2089  if (nb2==1)
2090  {
2091  double ff3=ou.get_distorsion2(fem_ele2);
2092  if (ff3 < distor3 )
2093  {
2094  n4->change_x(xyznR[0]);
2095  n4->change_y(xyznR[1]);
2096  n4->change_z(xyznR[2]);
2097  }
2098  }
2099 
2100  }
2101 
2102  }
2103  }
2104 
2105 }
2106 
2107 void MGOPT_MVT_NORMAL_QUADRATIQUE::optimisation(char* fichierin, char* fichierout, char* fichierparam, char* fichierparamaster)
2108 {
2109  // ########## Lecture du fichier de paramètres ##########
2110 
2111  if (fichierparam!=NULL) lire_params(fichierparam);
2112 
2113  // Paramètres de la méthode du mouvement normal
2114  double c=(double)params.get_valeur("c"); // Constante de convergence
2115  double l=(double)params.get_valeur("l"); // Limite de convergence
2116  int iter_max=(int)params.get_valeur("iter_max"); // Nb maximal d'itérations de la méthode du mouvement normal
2117  int iter_vue=(int)params.get_valeur("iter_vue"); // Génération d'un fihcier gmsh toutes les iter_vue. 0 Pas de generation
2118 
2119  // lissage des noeuds
2120  int lissage_Laplacien=(int)params.get_valeur("lissage_Laplacien"); // Lissage Laplacien (0: sans lissage, 1: avec lissage)
2121  int lissage_Taubin=(int)params.get_valeur("lissage_Taubin"); // Lissage Taubin (0: sans lissage, 1: avec lissage)
2122  int lissage_fin=(int)params.get_valeur("lissage_fin"); // Lissage des noeuds à la fin de la méthode avec lissage Taubin (0: sans lissage, 1: avec lissage)
2123  // filtre
2124  int filtre=(int)params.get_valeur("filtre"); // filtre (0: sans filtre, 1: avec filtre)
2125  double rayon=(double)params.get_valeur("rayon"); // rayon du filtre
2126  // MMN modifiée
2127  int MMN_modif=(int)params.get_valeur("MMN_modif");
2128  //Option de génération d'un fichier magic contenant uniquement les solutions de déplacement servant à la création d'un film
2129  int film=(int)params.get_valeur("film");
2130  char coderesu[10]="11100010"; // Contraintes équivalentes de Von Mises sur les 3 plans de calcul (inf, moy et sup)
2131 
2132 
2133  // ########## Affichage des paramètres à l'utilisateur ##########
2134 
2135  //affiche((char*)" Fichier d'entrée:");
2136  //affiche((char*)fichier);
2137  char mess[3000];
2138 
2139  sprintf(mess," c: %.4lf",c);
2140  affiche(mess);
2141  sprintf(mess," l: %.2lf",l);
2142  affiche(mess);
2143  sprintf(mess," iter_max: %d",iter_max);
2144  affiche(mess);
2145  sprintf(mess," iter_vue: %d",iter_vue);
2146  affiche(mess);
2147 
2148  sprintf(mess," Paramètres lissage: lissage_Laplacien: %d",lissage_Laplacien);
2149  affiche(mess);
2150  sprintf(mess," lissage_Taubin: %d",lissage_Taubin);
2151  affiche(mess);
2152  sprintf(mess," lissage_fin: %d",lissage_fin);
2153  affiche(mess);
2154 
2155  sprintf(mess," Paramètres filtre: filtre: %d",filtre);
2156  affiche(mess);
2157  if (filtre==1)
2158  {
2159  sprintf(mess," rayon filtre: rayon: %f",rayon);
2160  affiche(mess);
2161  }
2162  sprintf(mess," Méthode du mouvement normal modifiée %d",MMN_modif);
2163  affiche(mess);
2164 
2165  sprintf(mess," Paramètres film: film: %d",film);
2166  affiche(mess);
2167 
2168  char *p=strchr(fichierin,'.'); //Enlever
2169  strncpy(etude,fichierin,p-fichierin);
2170  etude[p-fichierin]=0;
2171 
2172  char *p2=strchr(fichierout,'.'); //Enlever
2173  strncpy(etudesortie,fichierout,p2-fichierout);
2174  etudesortie[p2-fichierout]=0;
2175 
2176  // ########## Option de génération d'un fichier magic servant à la création d'un film ##########
2177 
2178  char etudefilm[200];
2179  char fichierfilm[200];
2180  MG_GESTIONNAIRE *gest_film;
2181  if (film==1)
2182  {
2183  strcpy(etudefilm,etudesortie);
2184  //strcat(etudefilm,"_film");
2185  //strcpy(fichierfilm,etudefilm);
2186  //strcat(fichierfilm,".magic");
2187  gest_film=fem_visu->get_mg_maillage()->get_gestionnaire();
2188  }
2189 
2190  // ########## Initialisation de la méthode ##########
2191 
2192  TPL_MAP_ENTITE<OPT_NOEUD*> lstnoeud_deplacer_initiale; // Liste non altérée pour vérifier la convergence de la méthode
2193  get_liste_noeud_deplacer_initiale(listenoeud,&lstnoeud_deplacer_initiale);
2194 
2195  TPL_MAP_ENTITE<OPT_NOEUD*> lstnoeud_deplacer;
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))
2198  {
2199  lstnoeud_deplacer.ajouter(opt_noeud);
2200  opt_noeud->change_mobile_au_depart(1);
2201  opt_noeud->change_mobile(1);
2202  // Mise en mémoire de la position initiale des opt_noeud
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());
2206 
2207  // Calcul des normales initiales
2208  calcul_normale_opt_noeud(opt_noeud);
2209  opt_noeud->change_normale_initiale();
2210 
2211  // Initialisation du déplacement virtuel des noeuds
2212  opt_noeud->change_sol_deplacement_virtuel(0.);
2213 
2214  // Initialisation du déplacement réel des noeuds
2215  opt_noeud->change_norme_orientee_deplacement();
2216 
2217  // Détermination des noeuds voisins du noeud
2218  change_liste_noeud_voisin(opt_noeud);
2219  if (filtre!=0) change_liste_noeud_filtre(opt_noeud,lstnoeud_deplacer_initiale);
2220  }
2221 
2222  // ########## Affichage ##########
2223 
2224  int nb_noeud=lstnoeud_deplacer_initiale.get_nb(); //Enlever
2225  sprintf(mess," Il y a initialement %d noeuds pouvant être déplacés",nb_noeud);
2226  affiche(mess);
2227 
2228  // ########## Définition des solutions de visualisation ##########
2229 
2230  // Valeurs maximales de la contrainte de Von Mises entre les 3 plans de calcul pour les géométries initiales et finales
2231  FEM_SOLUTION *sol_S_VM_MAX_I=new FEM_SOLUTION(fem_visu,1,(char*)"contrainte_vm_max_i.sol",1,"S_VM_MAX",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
2232  sol_S_VM_MAX_I->change_legende(0,"I");
2233  FEM_SOLUTION *sol_S_VM_MAX_F=new FEM_SOLUTION(fem_visu,1,(char*)"contrainte_vm_max_f.sol",1,"S_VM_MAX",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
2234  sol_S_VM_MAX_F->change_legende(0,"F");
2235 
2236  // Contraintes de Von Mises maximales initiales et finales sous forme de normales à la triangulation
2237  FEM_SOLUTION* sol_S_VM_MAX_I_VEC=new FEM_SOLUTION(fem_visu,1,(char*)"contrainte_vm_max_i_vec.sol",1,"S_VM_MAXVEC",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::VECTEUR);
2238  sol_S_VM_MAX_I_VEC->change_legende(0,"I");
2239  FEM_SOLUTION* sol_S_VM_MAX_F_VEC=new FEM_SOLUTION(fem_visu,1,(char*)"contrainte_vm_max_f_vec.sol",1,"S_VM_MAXVEC",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::VECTEUR); // À revoir
2240  sol_S_VM_MAX_F_VEC->change_legende(0,"F");
2241 
2242  // Forme initiale de la pièce
2243  FEM_SOLUTION* sol_forme_initiale=new FEM_SOLUTION(fem_visu,1,(char*)"optimisation0.sol",1,"Iteration0",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::VECTEUR);
2244  sol_forme_initiale->change_legende(0,"U");
2245 
2246  // ########## MAJ solution "sol_forme_initiale" ##########
2247 
2248  LISTE_FEM_NOEUD::iterator itfem_noeud;
2249  for (FEM_NOEUD* fem_noeud=fem->get_premier_noeud(itfem_noeud);fem_noeud!=NULL;fem_noeud=fem->get_suivant_noeud(itfem_noeud))
2250  {
2251  ecriture_fem_solution_deplacement(sol_forme_initiale,fem_noeud);
2252  }
2253  affiche((char*)" Génération du fichier .msh de l'itération 0");
2254  char iter[100];
2255  sprintf(iter,"0");
2256  char etudeiter[100];
2257  strcpy(etudeiter,etudesortie);
2258  strcat(etudeiter,"_iter");
2259  strcat(etudeiter,iter);
2260  MG_EXPORT exp1;
2261  exp1.gmsh(fem_visu,etudeiter);
2262  // ########## Détermination de l'état de contrainte initial ##########
2263 
2265  MGASTER mgaster;
2266  //mgaster.active_affichage(affiche);
2267  affiche((char*)" Calcul de l'état de contrainte initial");
2268  int codesortie=mgaster.calcule(fichierparamaster,fem,etude,MAGIC::CALCUL_ASTER::ELASTIQUE,coderesu,false); // Exportation vers Code_aster et calcul
2269 
2270  // ########## MAJ des contraintes min, moy et max sur la zone de design ##########
2271 
2272  double svm_min=1.e308;
2273  double svm_moy=0.;
2274  double svm_moy2=0.;
2275  double svm_max=0.;
2276  double ecarttype=0.;
2277  double ecarttype2=0.;
2278  double somme_svm=0.;
2279  int compteur_svm=0;
2280  int nb_noeud_intervalle_convergence=0;
2281 
2283  LISTE_FEM_ELEMENT2::iterator itfem;
2284  FEM_ELEMENT2* fem_ele2=fem->get_premier_element2(itfem);
2285 
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))
2287  {
2288  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2289  double svm=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2290  if (svm<svm_min) svm_min=svm;
2291  if (svm>svm_max) svm_max=svm;
2292  somme_svm=somme_svm+svm;
2293  compteur_svm++;
2294  }
2295  // ########## Affichage des contraintes de Von Mises min, moy et max initiales ##########
2296 
2297  double max=svm_max;
2298  svm_moy=somme_svm/compteur_svm;
2299  ecarttype=get_ecart_type_sigma_vm(gest_visu,lstnoeud_deplacer_initiale,svm_moy);
2300 
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);
2302  affiche(mess);
2303  sprintf(mess," L'écart type est de: %.2lf MPa",ecarttype/1e06);
2304  affiche(mess);
2305 
2306 
2307  // ########## MAJ solutions "sol_S_VM_MAX_I" et "SOL_SVM_MAX_I_VEC" ##########
2308 
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))
2310  {
2311  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2312  double svm=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2313 
2314  int num=opt_noeud->get_num();
2315  sol_S_VM_MAX_I->ecrire(svm/1e06,num-1,0);
2316 
2317  // Affichage des contraintes de Von Mises maximales initiales sous forme de normales à la triangulation
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);
2322  }
2323  // ########## Ajout des solutions au gestionnaire ##########
2324 
2325  // Après le calcul par Code_Aster pour que la première solution soit celle contenant les contraintes de Von Mises
2326  gest_visu->ajouter_fem_solution(sol_S_VM_MAX_I);
2327  gest_visu->ajouter_fem_solution(sol_S_VM_MAX_F);
2328  gest_visu->ajouter_fem_solution(sol_S_VM_MAX_I_VEC);
2329  gest_visu->ajouter_fem_solution(sol_S_VM_MAX_F_VEC);
2330 
2331 
2332  gest_visu->ajouter_fem_solution(sol_forme_initiale);
2333 
2334  if (film==1)
2335  gest_film->ajouter_fem_solution(sol_forme_initiale);
2336 
2337 
2338 
2339  int convergence=1;
2340  int iter_methode=1;
2341  int iter_finale=0;
2342  int fin=0;
2343  double R;
2344  do
2345  {
2346  // Contraintes de Von Mises min, max et moy
2347  svm_min=1.e308;
2348  svm_max=0.;
2349  svm_moy=0.;
2350  somme_svm=0.;
2351  compteur_svm=0;
2352  nb_noeud_intervalle_convergence=0;
2353 
2354  //sprintf(mess,"");
2355  //affiche(mess);
2356  sprintf(mess," Itération %d",iter_methode);
2357  affiche(mess);
2358 
2359  // ########## Génération d'une solution pour visualiser le déplacement des noeuds à toutes les iter_vue ##########
2360 
2361  char nomsolution[100];
2362  sprintf(nomsolution,"optimisation%d.sol",iter_methode);
2363  char nomlegende[100];
2364  sprintf(nomlegende,"Iteration%d",iter_methode);
2365  FEM_SOLUTION* sol_visu_depl;
2366  if (((iter_vue!=0) && (iter_methode%iter_vue==0)) || (iter_methode==iter_max))
2367  {
2368  sol_visu_depl=new FEM_SOLUTION(fem_visu,1,nomsolution,1,nomlegende,MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::VECTEUR);
2369  sol_visu_depl->change_legende(0,"U");
2370  gest_visu->ajouter_fem_solution(sol_visu_depl);
2371 
2372  if (film==1)
2373  gest_film->ajouter_fem_solution(sol_visu_depl);
2374  }
2375 
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))
2377  {
2378 
2379  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2380  double svm=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2381  if (svm<svm_min) svm_min=svm;
2382  if (svm>svm_max) svm_max=svm;
2383  somme_svm=somme_svm+svm;
2384  compteur_svm++;
2385  }
2386  svm_moy=somme_svm/compteur_svm;
2387  LISTE_FEM_ELEMENT2::iterator itfem_ele2;
2388 
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))
2390  {
2391  int nb_fem_ele2=(opt_noeud->get_fem_noeud())->get_lien_element2()->get_nb();
2392  calcul_normale_opt_noeud(opt_noeud);
2393  opt_noeud->change_normale_initiale();
2394  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2395  double svm=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2396  double d=c*(svm-svm_moy)/svm_moy;
2397  opt_noeud->change_vonmises__precedent(svm);
2398  if ((filtre==0) ) deplace_opt_noeud(opt_noeud,d);
2399  // opt_noeud->change_sol_deplacement(d);
2400  opt_noeud-> change_sol_deplacement_virtuel(d);
2401  double dv=opt_noeud-> get_sol_deplacement_virtuel();
2402  }
2405 
2406  if (filtre!=0)
2407  {
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))
2409  {
2410  change_liste_noeud_filtre(opt_noeud,lstnoeud_deplacer_initiale);
2411  }
2412  filtre1(lstnoeud_deplacer_initiale);
2415  }
2416  if (lissage_Laplacien !=0)
2417  {
2418  affiche((char*)" lissage Laplacien ");
2419  lissage(lstnoeud_deplacer_initiale);
2422  }
2423  //###
2424  if ((lissage_Taubin !=0) )
2425  {
2426  affiche((char*)" lissage Taubin ");
2427  lissage_taubin_lambda(lstnoeud_deplacer_initiale);
2428  lissage_taubin_nu(lstnoeud_deplacer_initiale);
2431  }
2432 
2433  // ########## Calcul par Code_Aster ##########
2434 
2435  affiche((char*)" Calcul de l'état de contrainte final après déplacement");
2436  int codesortie=mgaster.calcule(fichierparamaster,fem,etude,MAGIC::CALCUL_ASTER::ELASTIQUE,coderesu,false); // Exportation vers Code_aster et calcul
2437 
2438  // ########## MAJ des contraintes sur la zone de design ##########
2439 
2440  double svm_min=1.e308;
2441  double svm_moy=0.;
2442  double svm_max=0.;
2443  double somme_svm=0.;
2444  int compteur_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))
2446  {
2447  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2448  double svm=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2449  if (svm<svm_min) svm_min=svm;
2450  if (svm>svm_max) svm_max=svm;
2451  somme_svm=somme_svm+svm;
2452  compteur_svm++;
2453  }
2454 
2455  // ########## Affichage des contraintes de Von Mises min, moy et max pour cette itération ##########
2456 
2457  svm_moy=somme_svm/compteur_svm;
2458  ecarttype=get_ecart_type_sigma_vm(gest_visu,lstnoeud_deplacer_initiale,svm_moy);
2459 
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);
2461  affiche(mess);
2462  sprintf(mess," L'écart type est de: %.2lf MPa",ecarttype/1e06);
2463  affiche(mess);
2464 
2465  double svm_min3=1.e308;
2466  double svm_moy3=0.;
2467  double svm_max3=0.;
2468  double somme_svm3=0.;
2469  int compteur_svm3=0;
2470  double svm_min2=1.e308;
2471  double svm_moy2=0.;
2472  double svm_max2=0.;
2473  double somme_svm2=0.;
2474  int compteur_svm2=0;
2475 
2476  if (MMN_modif==1)
2477  {
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))
2480  {
2481  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2482  double svmt=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2483  double svm_pre=opt_noeud->get_vonmises__precedent();
2484  if ((svmt > svm_pre) && (svm_pre>svm_moy))
2485  {
2486  double d3=opt_noeud-> get_sol_deplacement_virtuel();
2487  double D=-d3;
2488  deplace_opt_noeud(opt_noeud,D);
2489  opt_noeud-> change_sol_deplacement_virtuel(D);
2490  }
2491  if ((svmt < svm_pre) && (svm_pre<svm_moy))
2492  {
2493  double d3=opt_noeud-> get_sol_deplacement_virtuel();
2494  double D1=-d3;
2495  opt_noeud-> change_sol_deplacement_virtuel(D1);
2496  deplace_opt_noeud(opt_noeud,D1);
2497  }
2498  }
2501  }
2502 
2503  if (MMN_modif==2)
2504  {
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))
2507  {
2508  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2509  double svmt=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2510  double svm_pre=opt_noeud->get_vonmises__precedent();
2511  if ((svmt > svm_pre) && (svm_pre>svm_moy))
2512  {
2513  double d3=opt_noeud-> get_sol_deplacement_virtuel();
2514  double D=-2*d3;
2515  deplace_opt_noeud(opt_noeud,D);
2516  opt_noeud-> change_sol_deplacement_virtuel(D);
2517  }
2518  if ((svmt < svm_pre) && (svm_pre<svm_moy))
2519  {
2520  double d3=opt_noeud-> get_sol_deplacement_virtuel();
2521  double D1=-2*d3;
2522  opt_noeud-> change_sol_deplacement_virtuel(D1);
2523  deplace_opt_noeud(opt_noeud,D1);
2524  }
2525  }
2528  }
2529 
2530  if ((MMN_modif==1)||(MMN_modif==2))
2531  {
2532  affiche((char*)" Calcul de l'état de contrainte final après déplacement");
2533  codesortie=mgaster.calcule(fichierparamaster,fem,etude,MAGIC::CALCUL_ASTER::ELASTIQUE,coderesu,false);// Exportation vers Code_aster et calcul
2534 
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))
2536  {
2537  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2538  double svm2=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2539  if (svm2<svm_min2) svm_min2=svm2;
2540  if (svm2>svm_max2) svm_max2=svm2;
2541  somme_svm2=somme_svm2+svm2;
2542  compteur_svm2++;
2543  }
2544  svm_moy2=somme_svm2/compteur_svm2;
2545  ecarttype2=get_ecart_type_sigma_vm(gest_visu,lstnoeud_deplacer_initiale,svm_moy2);
2546 
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);
2548  affiche(mess);
2549  sprintf(mess," L'écart type de la méthode modifiée est de: %.2lf MPa",ecarttype2/1e06);
2550  affiche(mess);
2551  }
2552  // ########## MAJ solution "sol_visu_depl" ##########
2553 
2554  if ((iter_vue!=0) && (iter_methode%iter_vue==0)) //|| (iter_methode==iter_max))
2555  for (FEM_NOEUD* fem_noeud=fem->get_premier_noeud(itfem_noeud);fem_noeud!=NULL;fem_noeud=fem->get_suivant_noeud(itfem_noeud))
2556  ecriture_fem_solution_deplacement(sol_visu_depl,fem_noeud);
2557  //*/
2558 
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))
2560  {
2561  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2562  double svm=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
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;
2568  compteur_svm++;
2569  // Affichage des contraintes de Von Mises maximales finales sous forme de normales à la triangulation
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);
2574  }
2575  svm_moy=somme_svm/compteur_svm;
2576  R=(svm_max-svm_min)/svm_moy;
2577  // R=fabs ((svm_max-svm_min)/(svm_max+svm_min));
2578 
2579  // ########## Enregistrement GMSH pour l'itération (pour avoir un aperçu avant la fin du calcul) ##########
2580  if (iter_vue!=0)
2581  if (iter_methode%iter_vue==0)
2582  {
2583  affiche((char*)" Génération du fichier .msh de l'itération");
2584  char iter[100];
2585  sprintf(iter,"%d",iter_methode);
2586  char etudeiter[100];
2587  strcpy(etudeiter,etudesortie);
2588  strcat(etudeiter,"_iter");
2589  strcat(etudeiter,iter);
2590  //exp.gmsh(fem_visu,etudeiter);
2591  exp1.gmsh(fem,etudeiter);
2592  }
2593  iter_finale=iter_methode; // Sauvegarde du numéro de la dernière itération
2594  iter_methode++;
2595 
2596  }while(fabs (R)>=l && iter_methode<=iter_max);
2597 
2598 
2599  // ########## lissage des noeuds à la fin de la méthode avec lissage Taubin ##########
2600 
2601  if (lissage_fin==1)
2602  {
2603  lissage_taubin_lambda(lstnoeud_deplacer_initiale);
2604  lissage_taubin_nu(lstnoeud_deplacer_initiale);
2605 
2606  // ########## Calcul par Code_Aster ##########
2607 
2608  affiche((char*)" Calcul de l'état de contrainte après lissage final");
2609  int codesortie=mgaster.calcule(fichierparamaster,fem,etude,MAGIC::CALCUL_ASTER::ELASTIQUE,coderesu,false); // Exportation vers Code_aster et calcul
2610 
2611  // ########## MAJ des contraintes sur la zone de design ##########
2612 
2613  double svm_min=1.e308;
2614  double svm_moy=0.;
2615  double svm_max=0.;
2616  double somme_svm=0.;
2617  int compteur_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))
2621  {
2622  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2623  double svm=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2624  if (svm<svm_min) svm_min=svm;
2625  if (svm>svm_max) svm_max=svm;
2626  somme_svm=somme_svm+svm;
2627  compteur_svm++;
2628  }
2629 
2630  // ########## Affichage des contraintes de Von Mises min, moy et max après lissage ##########
2631 
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);
2634  affiche(mess);
2635 
2636  // ########## MAJ solutions "sol_S_VM_MAX_F" et "sol_S_VM_MAX_F_VEC" ##########
2637 
2638  //LISTE_FEM_NOEUD::iterator itfem_noeud;
2639  //for (FEM_NOEUD* fem_noeud=fem->get_premier_noeud(itfem_noeud);fem_noeud!=NULL;fem_noeud=fem->get_suivant_noeud(itfem_noeud))
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))
2641  {
2642 
2643  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2644  double svm=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2645 
2646  int num=opt_noeud->get_num();
2647  sol_S_VM_MAX_F->ecrire(svm/1e06,num-1,0);
2648 
2649  // Affichage des contraintes de Von Mises maximales finales sous forme de normales à la triangulation
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);
2654  }
2655  }
2656 
2657  // ########## Génération d'une solution pour visualiser le déplacement final des noeuds ##########
2658 
2659  char nomsolution[100];
2660  sprintf(nomsolution,"optimisation%d.sol",iter_finale);
2661  char nomlegende[100];
2662  sprintf(nomlegende,"Iteration%d",iter_finale);
2664  sol_visu_depl->change_legende(0,"U");
2665  gest_visu->ajouter_fem_solution(sol_visu_depl);
2666  if (film==1)
2667  gest_film->ajouter_fem_solution(sol_visu_depl);
2668 
2669  // ########## MAJ solution de déplacement ##########
2670  for (FEM_NOEUD* fem_noeud=fem->get_premier_noeud(itfem_noeud);fem_noeud!=NULL;fem_noeud=fem->get_suivant_noeud(itfem_noeud))
2671  ecriture_fem_solution_deplacement(sol_visu_depl,fem_noeud);
2672 
2673  sprintf(mess," Génération du fichier .msh final");
2674  affiche(mess);
2675  exp1.gmsh(fem_visu,etudesortie);
2676  if (film==1)
2677  {
2678  exp1.gmsh(fem_visu,etudefilm);
2679  gest_film->enregistrer(fichierfilm);
2680  }
2681  double svm_s=0.;
2682  double nb_nic=0;
2683  double nb_nnc=0.;
2684  double nb_max=0.;
2685  double nb_noeud_design=0.;
2686  double pnnc=0.;
2687  double pnic=0.;
2688  double pmax=0.;
2689  double svm_min3=1.e308;
2690  double svm_moy3=0.;
2691  double svm_max3=0.;
2692  double somme_svm3=0.;
2693  int compteur_svm3=0;
2694 
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))
2696  {
2697  FEM_NOEUD* fem_noeud=opt_noeud->get_fem_noeud();
2698  double svm=get_sigma_vm_max(gest_visu,fem_noeud,0,1,2);
2699  if (svm<svm_min3) svm_min3=svm;
2700  if (svm>svm_max3) svm_max3=svm;
2701  somme_svm3=somme_svm3+svm;
2702  compteur_svm3++;
2703  svm_moy3=somme_svm3/compteur_svm3;
2704  double coef=fabs(svm-svm_moy3)/svm_moy3;
2705  if (coef<=l)
2706  nb_nic++;
2707  if (svm<0.1*svm_moy3)
2708  nb_nnc++;
2709  nb_noeud_design++;
2710  if (max<svm)
2711  nb_max++;
2712  }
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);
2717  affiche(mess);
2718  sprintf(mess," %.2lf %% des noeuds situés dans la zone de design ont une contrainte inférieure à 10 %% de la valeur moyenne",pnnc);
2719  affiche(mess);
2720  sprintf(mess," %.2lf %% des noeuds situés dans la zone de design ont une contrainte superieur à la contrainte maximale",pmax);
2721  affiche(mess);
2722 }
OPT_NOEUD::get_z_initial
virtual double get_z_initial(void)
Definition: opt_noeud.cpp:288
OPT_NOEUD::get_y
virtual double get_y(void)
Definition: opt_noeud.cpp:268
MGOPT_MVT_NORMAL_QUADRATIQUE::params
OT_PARAMETRES params
Definition: mgopt_mvt_normal_quadratique.h:94
MGOPT_MVT_NORMAL_QUADRATIQUE::optimisation_maillage_quadratique
virtual void optimisation_maillage_quadratique(TPL_MAP_ENTITE< OPT_TRIANGLE_QUADRATIQUE * > lst_triangle)
Definition: mgopt_mvt_normal_quadratique.cpp:728
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
TPL_MAP_ENTITE::get_premier
virtual X get_premier(ITERATEUR &it)
Definition: tpl_map_entite.h:112
MGOPT_MVT_NORMAL_QUADRATIQUE::change_liste_noeud_filtre
virtual void change_liste_noeud_filtre(OPT_NOEUD *opt_noeud, TPL_MAP_ENTITE< OPT_NOEUD * > lstnoeud)
Definition: mgopt_mvt_normal_quadratique.cpp:243
MGOPT_MVT_NORMAL_QUADRATIQUE::listenoeud
TPL_MAP_ENTITE< class OPT_NOEUD * > listenoeud
Definition: mgopt_mvt_normal_quadratique.h:61
MGASTER::calcule
virtual int calcule(char *nomfichierparam, class FEM_MAILLAGE *fem, char *nometude, int typeetude, char *code=NULL, bool avecenreg=true)
Definition: mgaster.cpp:62
opt_noeud.h
FEM_SOLUTION
Definition: fem_solution.h:40
FEM_NOEUD::change_y
virtual void change_y(double yy)
Definition: fem_noeud.cpp:272
OPT_NOEUD::get_id
virtual unsigned long get_id(void)
Definition: opt_noeud.cpp:258
OPT_NOEUD::get_x_initial
virtual double get_x_initial(void)
Definition: opt_noeud.cpp:278
FEM_MAILLAGE_QUADRATIQUE_OUTILS::get_distance_curviligne
double get_distance_curviligne(double a, double b, double *xyz1, double *xyz, double *xyz2)
Definition: fem_maillage_quadratique_outils.cpp:46
MGOPT_MVT_NORMAL_QUADRATIQUE::filtre2
virtual void filtre2(TPL_MAP_ENTITE< OPT_NOEUD * > lst_noeud)
Definition: mgopt_mvt_normal_quadratique.cpp:448
tpl_fonctions_generiques.h
MGOPT_MVT_NORMAL_QUADRATIQUE::get_triangle
class OPT_TRIANGLE_QUADRATIQUE * get_triangle(class FEM_TRIANGLE6 *fem_tri6)
Definition: mgopt_mvt_normal_quadratique.cpp:112
OPT_NOEUD::get_x
virtual double get_x(void)
Definition: opt_noeud.cpp:263
fct_generateur_calibrage.h
OPT_NOEUD::get_y_initial
virtual double get_y_initial(void)
Definition: opt_noeud.cpp:283
fem_maillage_quadratique_outils.h
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
MGOPT_MVT_NORMAL_QUADRATIQUE
Definition: mgopt_mvt_normal_quadratique.h:38
OT_PARAMETRES::get_valeur
double get_valeur(std::string chaine, int num=0)
Definition: ot_parametres.cpp:191
mg_gestionnaire.h
OPT_NOEUD::get_fem_noeud
virtual FEM_NOEUD * get_fem_noeud(void)
Definition: opt_noeud.cpp:63
MGOPT_MVT_NORMAL_QUADRATIQUE::change_deplacement_virtuel_opt_noeud
virtual void change_deplacement_virtuel_opt_noeud(OPT_NOEUD *opt_noeud, double d)
Definition: mgopt_mvt_normal_quadratique.cpp:353
OPT_TRIANGLE_QUADRATIQUE::get_noeud3
virtual class OPT_NOEUD * get_noeud3(void)
Definition: opt_triangle_quadratique.cpp:59
FEM_MAILLAGE_QUADRATIQUE_OUTILS::get_dist_n6
double get_dist_n6(class FEM_ELEMENT2 *tri)
Definition: fem_maillage_quadratique_outils.cpp:691
MGOPT_MVT_NORMAL_QUADRATIQUE::correspondance_triangle
std::map< unsigned long, std::pair< class OPT_TRIANGLE_QUADRATIQUE *, class FEM_TRIANGLE6 * > > correspondance_triangle
Definition: mgopt_mvt_normal_quadratique.h:84
MAGIC::TYPE_SOLUTION::VECTEUR
@ VECTEUR
Definition: mg_definition.h:93
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
OPT_NOEUD::change_num
virtual void change_num(int val)
Definition: opt_noeud.cpp:73
OPT_NOEUD::get_coord
virtual double * get_coord(void)
Definition: opt_noeud.cpp:293
FEM_SOLUTION::ecrire
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
Definition: fem_solution.cpp:411
MGOPT_MVT_NORMAL_QUADRATIQUE::lissage_taubin_lambda
virtual void lissage_taubin_lambda(TPL_MAP_ENTITE< OPT_NOEUD * > lst_noeud)
Definition: mgopt_mvt_normal_quadratique.cpp:550
MGOPT_MVT_NORMAL_QUADRATIQUE::optimisation
virtual void optimisation(char *fichierin, char *fichierout, char *fichierparam, char *fichierparamaster)
Definition: mgopt_mvt_normal_quadratique.cpp:2107
fem_noeud.h
OT_PARAMETRES::STRING
@ STRING
Definition: ot_parametres.h:38
OPT_TRIANGLE_QUADRATIQUE::get_noeud6
virtual class OPT_NOEUD * get_noeud6(void)
Definition: opt_triangle_quadratique.cpp:73
OT_PARAMETRES::ajouter
void ajouter(std::string chaine, double valeur, int typep, std::string aide="")
Definition: ot_parametres.cpp:61
FEM_ELEMENT_MAILLAGE::get_lien_topologie
virtual class MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: fem_element_maillage.cpp:89
OPT_NOEUD::change_liste_noeud_voisin
virtual void change_liste_noeud_voisin(TPL_MAP_ENTITE< class OPT_NOEUD * > lst)
Definition: opt_noeud.cpp:233
mg_file.h
FEM_NOEUD::change_x
virtual void change_x(double xx)
Definition: fem_noeud.cpp:265
OPT_NOEUD
Definition: opt_noeud.h:31
FEM_MAILLAGE::get_premier_noeud
FEM_NOEUD * get_premier_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:174
OPT_NOEUD::change_x
virtual void change_x(double xx)
Definition: opt_noeud.cpp:344
FEM_MAILLAGE::get_mg_geometrie
MG_GEOMETRIE * get_mg_geometrie(void)
Definition: fem_maillage.cpp:88
MG_COFACE::get_orientation
virtual int get_orientation(void)
Definition: mg_coface.cpp:69
MG_TRIANGLE
Definition: mg_triangle.h:38
OPT_TRIANGLE_QUADRATIQUE::change_num
virtual void change_num(int val)
Definition: opt_triangle_quadratique.cpp:83
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_MVT_NORMAL_QUADRATIQUE::fem_tri6
std::ostream fem_tri6()
MGOPT_MVT_NORMAL_QUADRATIQUE::orientation
int orientation
Definition: mgopt_mvt_normal_quadratique.h:90
FEM_NOEUD::change_z
virtual void change_z(double zz)
Definition: fem_noeud.cpp:278
FEM_ELEMENT_MAILLAGE::get_numero
virtual int get_numero(void)
Definition: fem_element_maillage.cpp:101
FEM_ELEMENT2
Definition: fem_element2.h:34
FEM_MAILLAGE::get_mg_maillage
MG_MAILLAGE * get_mg_maillage(void)
Definition: fem_maillage.cpp:93
FEM_MAILLAGE_QUADRATIQUE_OUTILS::get_normale
void get_normale(class FEM_ELEMENT2 *tri2, double u, double v, double *n)
Definition: fem_maillage_quadratique_outils.cpp:530
MG_GESTIONNAIRE::get_fem_solution
FEM_SOLUTION * get_fem_solution(unsigned int num)
Definition: mg_gestionnaire.cpp:930
FEM_MAILLAGE::get_premier_element2
FEM_ELEMENT2 * get_premier_element2(LISTE_FEM_ELEMENT2::iterator &it)
Definition: fem_maillage.cpp:561
MGOPT_MVT_NORMAL_QUADRATIQUE::init_parametre
virtual void init_parametre(void)
Definition: mgopt_mvt_normal_quadratique.cpp:125
MGASTER
Definition: mgaster.h:29
FEM_NOEUD::get_y
virtual double get_y(double coef=0.)
Definition: fem_noeud.cpp:210
FEM_MAILLAGE_QUADRATIQUE_OUTILS::get_jmin
double get_jmin(class FEM_ELEMENT2 *tri)
Definition: fem_maillage_quadratique_outils.cpp:459
MGOPT_MVT_NORMAL_QUADRATIQUE::recentrage
virtual void recentrage(TPL_MAP_ENTITE< OPT_TRIANGLE_QUADRATIQUE * > lst_triangle)
Definition: mgopt_mvt_normal_quadratique.cpp:596
mgaster.h
FEM_NOEUD::get_lien_element2
TPL_LISTE_ENTITE< class FEM_ELEMENT2 * > * get_lien_element2(void)
Definition: fem_noeud.cpp:406
MGOPT_MVT_NORMAL_QUADRATIQUE::lire_params
virtual void lire_params(char *fichier)
Definition: mgopt_mvt_normal_quadratique.cpp:160
MGOPT_MVT_NORMAL_QUADRATIQUE::lissage_taubin_nu
virtual void lissage_taubin_nu(TPL_MAP_ENTITE< OPT_NOEUD * > lst_noeud)
Definition: mgopt_mvt_normal_quadratique.cpp:503
OPT_TRIANGLE_QUADRATIQUE
Definition: opt_triangle_quadratique.h:35
mg_export.h
MGOPT_MVT_NORMAL_QUADRATIQUE::geo
class MG_GEOMETRIE * geo
Definition: mgopt_mvt_normal_quadratique.h:89
FEM_MAILLAGE
Definition: fem_maillage.h:66
OT_PARAMETRES::DOUBLE
@ DOUBLE
Definition: ot_parametres.h:38
MG_FACE::get_mg_coface
virtual MG_COFACE * get_mg_coface(int num)
Definition: mg_face.cpp:104
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
MG_EXPORT::gmsh
void gmsh(class MG_MAILLAGE *mai, std::string fichier)
Definition: mg_export.cpp:803
FEM_MAILLAGE_QUADRATIQUE_OUTILS::get_dist_n2
double get_dist_n2(class FEM_ELEMENT2 *tri)
Definition: fem_maillage_quadratique_outils.cpp:632
opt_triangle_quadratique.h
MGOPT_MVT_NORMAL_QUADRATIQUE::lissage
virtual void lissage(TPL_MAP_ENTITE< OPT_NOEUD * > lst_noeud)
Definition: mgopt_mvt_normal_quadratique.cpp:409
FEM_ELEMENT_MAILLAGE::get_mg_element_maillage
virtual class MG_ELEMENT_MAILLAGE * get_mg_element_maillage(void)
Definition: fem_element_maillage.cpp:81
OPT_NOEUD::get_normale_initiale
virtual OT_VECTEUR_3D get_normale_initiale(void)
Definition: opt_noeud.cpp:334
MGOPT_MVT_NORMAL_QUADRATIQUE::ecrire_fichier_params
virtual void ecrire_fichier_params(char *fichierparam)
Definition: mgopt_mvt_normal_quadratique.cpp:155
TPL_MAP_ENTITE::ITERATEUR
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
Definition: tpl_map_entite.h:38
MGOPT_MVT_NORMAL_QUADRATIQUE::etude
char etude[5000]
Definition: mgopt_mvt_normal_quadratique.h:95
MGOPT_MVT_NORMAL_QUADRATIQUE::deplace_opt_noeud
virtual void deplace_opt_noeud(OPT_NOEUD *opt_noeud, double d)
Definition: mgopt_mvt_normal_quadratique.cpp:367
MGOPT_MVT_NORMAL_QUADRATIQUE::get_noeud
class OPT_NOEUD * get_noeud(class FEM_NOEUD *fem_noeud)
Definition: mgopt_mvt_normal_quadratique.cpp:106
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
MGOPT_MVT_NORMAL_QUADRATIQUE::affiche
void(* affiche)(char *mess)
Definition: mgopt_mvt_normal_quadratique.h:92
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
OPT_TRIANGLE_QUADRATIQUE::get_noeud4
virtual class OPT_NOEUD * get_noeud4(void)
Definition: opt_triangle_quadratique.cpp:63
FEM_MAILLAGE::get_suivant_element2
FEM_ELEMENT2 * get_suivant_element2(LISTE_FEM_ELEMENT2::iterator &it)
Definition: fem_maillage.cpp:569
MGOPT_MVT_NORMAL_QUADRATIQUE::listetriangle
TPL_MAP_ENTITE< class OPT_TRIANGLE_QUADRATIQUE * > listetriangle
Definition: mgopt_mvt_normal_quadratique.h:82
FEM_SOLUTION::lire
double lire(int i, int j, int coord=0, int num_no=0)
Definition: fem_solution.cpp:398
OPT_NOEUD::change_liste_noeud_filtre
virtual void change_liste_noeud_filtre(TPL_MAP_ENTITE< class OPT_NOEUD * > lst)
Definition: opt_noeud.cpp:238
FEM_MAILLAGE_QUADRATIQUE_OUTILS
Definition: fem_maillage_quadratique_outils.h:36
MG_GEOMETRIE::get_mg_face
MG_FACE * get_mg_face(unsigned int num)
Definition: mg_geometrie.cpp:1251
OPT_TRIANGLE_QUADRATIQUE::get_noeud1
virtual class OPT_NOEUD * get_noeud1(void)
Definition: opt_triangle_quadratique.cpp:49
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
mg_import.h
FEM_NOEUD::get_x
virtual double get_x(double coef=0.)
Definition: fem_noeud.cpp:205
MGOPT_MVT_NORMAL_QUADRATIQUE::correspondance_noeud
std::map< unsigned long, std::pair< class OPT_NOEUD *, class FEM_NOEUD * > > correspondance_noeud
Definition: mgopt_mvt_normal_quadratique.h:63
FEM_NOEUD
Definition: fem_noeud.h:35
OT_PARAMETRES::enregistrer
void enregistrer(char *nom)
Definition: ot_parametres.cpp:132
OPT_NOEUD::change_norme_orientee_deplacement
virtual void change_norme_orientee_deplacement(void)
Definition: opt_noeud.cpp:303
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
MGOPT_MVT_NORMAL_QUADRATIQUE::affichageactif
int affichageactif
Definition: mgopt_mvt_normal_quadratique.h:93
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
MGOPT_MVT_NORMAL_QUADRATIQUE::active_affichage
virtual void active_affichage(void(*fonc)(char *))
Definition: mgopt_mvt_normal_quadratique.cpp:119
MGOPT_MVT_NORMAL_QUADRATIQUE::fem
class FEM_MAILLAGE * fem
Definition: mgopt_mvt_normal_quadratique.h:87
MAGIC::CALCUL_ASTER::ELASTIQUE
@ ELASTIQUE
Definition: mg_definition.h:134
MGOPT_MVT_NORMAL_QUADRATIQUE::fem_visu
class FEM_MAILLAGE * fem_visu
Definition: mgopt_mvt_normal_quadratique.h:88
MGOPT_MVT_NORMAL_QUADRATIQUE::etudesortie
char etudesortie[5000]
Definition: mgopt_mvt_normal_quadratique.h:96
FEM_MAILLAGE_QUADRATIQUE_OUTILS::get_Bezier_coeff
void get_Bezier_coeff(class FEM_ELEMENT2 *tri, double *bez)
Definition: fem_maillage_quadratique_outils.cpp:249
FEM_NOEUD::get_z
virtual double get_z(double coef=0.)
Definition: fem_noeud.cpp:215
OPT_NOEUD::change_z
virtual void change_z(double zz)
Definition: opt_noeud.cpp:354
OPT_NOEUD::change_y
virtual void change_y(double yy)
Definition: opt_noeud.cpp:349
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
OT_PARAMETRES::vide
void vide(void)
Definition: ot_parametres.cpp:317
ot_systeme.h
MG_MAILLAGE::get_gestionnaire
MG_GESTIONNAIRE * get_gestionnaire(void)
Definition: mg_maillage.cpp:2658
FEM_MAILLAGE_QUADRATIQUE_OUTILS::get_distorsion2
double get_distorsion2(class FEM_ELEMENT2 *tri)
Definition: fem_maillage_quadratique_outils.cpp:408
MG_ELEMENT_MAILLAGE::get_lien_topologie
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: mg_element_maillage.cpp:51
MGOPT_MVT_NORMAL_QUADRATIQUE::~MGOPT_MVT_NORMAL_QUADRATIQUE
~MGOPT_MVT_NORMAL_QUADRATIQUE()
Definition: mgopt_mvt_normal_quadratique.cpp:95
OPT_TRIANGLE_QUADRATIQUE::get_noeud2
virtual class OPT_NOEUD * get_noeud2(void)
Definition: opt_triangle_quadratique.cpp:54
mg_geometrie_outils.h
MGOPT_MVT_NORMAL_QUADRATIQUE::ecriture_fem_solution_deplacement
virtual void ecriture_fem_solution_deplacement(FEM_SOLUTION *sol, FEM_NOEUD *fem_noeud)
Definition: mgopt_mvt_normal_quadratique.cpp:394
OPT_NOEUD::get_num
virtual int get_num(void)
Definition: opt_noeud.cpp:68
MGOPT_MVT_NORMAL_QUADRATIQUE::get_ecart_type_sigma_vm
virtual double get_ecart_type_sigma_vm(MG_GESTIONNAIRE *gest, TPL_MAP_ENTITE< OPT_NOEUD * > lstnoeud, double moyenne)
Definition: mgopt_mvt_normal_quadratique.cpp:336
FEM_TRIANGLE6
Definition: fem_triangle6.h:33
OT_PARAMETRES::lire
int lire(char *nom)
Definition: ot_parametres.cpp:144
OPT_NOEUD::get_z
virtual double get_z(void)
Definition: opt_noeud.cpp:273
FEM_MAILLAGE::get_suivant_noeud
FEM_NOEUD * get_suivant_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:182
OPT_NOEUD::change_sol_deplacement_virtuel
virtual void change_sol_deplacement_virtuel(double deplacement)
Definition: opt_noeud.cpp:182
OPT_NOEUD::change_normale
virtual void change_normale(OT_VECTEUR_3D vec)
Definition: opt_noeud.cpp:315
FEM_MAILLAGE_QUADRATIQUE_OUTILS::get_dist_n4
double get_dist_n4(class FEM_ELEMENT2 *tri)
Definition: fem_maillage_quadratique_outils.cpp:662
MG_FACE
Definition: mg_face.h:34
MAGIC::TYPE_SOLUTION::SCALAIRE
@ SCALAIRE
Definition: mg_definition.h:93
MGOPT_MVT_NORMAL_QUADRATIQUE::change_liste_noeud_voisin
virtual void change_liste_noeud_voisin(OPT_NOEUD *opt_noeud)
Definition: mgopt_mvt_normal_quadratique.cpp:180
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
MG_GEOMETRIE::gest
MG_GESTIONNAIRE * gest
Definition: mg_geometrie.h:349
MGOPT_MVT_NORMAL_QUADRATIQUE::filtre1
virtual void filtre1(TPL_MAP_ENTITE< OPT_NOEUD * > lst_noeud)
Definition: mgopt_mvt_normal_quadratique.cpp:474
MGOPT_MVT_NORMAL_QUADRATIQUE::MGOPT_MVT_NORMAL_QUADRATIQUE
MGOPT_MVT_NORMAL_QUADRATIQUE()
Definition: mgopt_mvt_normal_quadratique.cpp:39
FEM_SOLUTION::change_legende
void change_legende(int num, std::string val)
Definition: fem_solution.cpp:457
MGOPT_MVT_NORMAL_QUADRATIQUE::get_liste_noeud_deplacer_initiale
virtual void get_liste_noeud_deplacer_initiale(TPL_MAP_ENTITE< OPT_NOEUD * > listenoeud, TPL_MAP_ENTITE< OPT_NOEUD * > *lstnoeud_deplacer_initiale)
Definition: mgopt_mvt_normal_quadratique.cpp:166
P
#define P(i, j)
MGOPT_MVT_NORMAL_QUADRATIQUE::get_sigma_vm_max
virtual double get_sigma_vm_max(MG_GESTIONNAIRE *gest, FEM_NOEUD *fem_noeud, int num_sol_inf, int num_sol_moy, int num_sol_sup)
Definition: mgopt_mvt_normal_quadratique.cpp:316
FEM_TRIANGLE6::get_fem_noeud
virtual FEM_NOEUD * get_fem_noeud(int num)
Definition: fem_triangle6.cpp:212
MGOPT_MVT_NORMAL_QUADRATIQUE::calcul_normale_opt_noeud
virtual void calcul_normale_opt_noeud(OPT_NOEUD *noeud)
Definition: mgopt_mvt_normal_quadratique.cpp:258
MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD
@ ENTITE_NOEUD
Definition: mg_definition.h:86
mgopt_mvt_normal_quadratique.h
OPT_TRIANGLE_QUADRATIQUE::get_noeud5
virtual class OPT_NOEUD * get_noeud5(void)
Definition: opt_triangle_quadratique.cpp:68