ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 816
Committed: Fri Aug 12 16:10:01 2016 UTC (8 years, 9 months ago) by nana
File size: 65268 byte(s)
Log Message:
Mise a jour du .cpp squelette

File Contents

# User Rev Content
1 nana 812 #include <iostream>
2     #include <fstream>
3     #include "gestionversion.h"
4     #include "fem_maillage_outils.h"
5     #include "occ_import.h"
6     #include "mg_maillage_outils.h"
7     #include "tpl_octree.h"
8     #include "mg_poutre_element.h"
9     #include "mg_arete_element.h"
10     #include "mg_element_maillage.h"
11     #include "mg_face_element.h"
12     #include "mg_volume_element.h"
13     #include "mg_sommet_noeud.h"
14     #include "mg_primitive_cylindre.h"
15     #include "rec_squelette.h"
16     #include <string.h>
17     #include <fstream>
18     #include <ot_chaine.h>
19     #include <../../fichier/src/mg_file.h>
20     #include <unistd.h>
21     //#ifdef __WIN32__
22    
23     /*
24     void affiche(char* message)
25     {
26     #ifdef WINDOWS_VERSION
27     Form1->Memo1->Lines->Add(message);
28     #else
29     std::cout << message << std::endl;
30     #endif
31     }
32     */
33    
34     REC_SQUELETTE::REC_SQUELETTE()
35     {
36    
37     }
38    
39    
40     REC_SQUELETTE::~REC_SQUELETTE()
41     {
42    
43     }
44    
45     void REC_SQUELETTE::construire_squelette(char* nomgestopt, char* nomgestlisse, char* nomgestsqout, char* nompoints, char* nomcorres, double coef_dg, int nummai)
46     {
47     char message[500];
48     coef_dg=1.;
49     MG_FILE gestopt(nomgestopt);
50     MG_MAILLAGE* mg_mai=gestopt.get_mg_maillage(0);
51     FEM_MAILLAGE* fem=gestopt.get_fem_maillage(0);
52     FEM_SOLUTION* sol=gestopt.get_fem_solution(0);
53     sol->active_solution(0);
54     double unite = mg_mai->get_mg_geometrie()->get_valeur_unite();
55     cout << "unite = " << unite << endl;
56    
57     /// Preparation du modele pour la squelettisation
58     LISTE_MG_TETRA::iterator it_tetra;
59     TPL_MAP_ENTITE<MG_TETRA*> lsttet;
60     TPL_MAP_ENTITE<MG_TETRA*>::ITERATEUR it_lsttet;
61     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
62     if ((mgtet->get_origine()==MAGIC::ORIGINE::IMPOSE))
63     {
64     lsttet.ajouter(mgtet);
65     mgtet->get_noeud1()->change_origine(MAGIC::ORIGINE::IMPOSE);
66     mgtet->get_noeud2()->change_origine(MAGIC::ORIGINE::IMPOSE);
67     mgtet->get_noeud3()->change_origine(MAGIC::ORIGINE::IMPOSE);
68     mgtet->get_noeud4()->change_origine(MAGIC::ORIGINE::IMPOSE);
69     mgtet->get_triangle1()->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);
70     mgtet->get_triangle1()->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);
71     mgtet->get_triangle1()->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);
72     mgtet->get_triangle2()->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);
73     mgtet->get_triangle2()->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);
74     mgtet->get_triangle2()->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);
75     mgtet->get_triangle3()->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);
76     mgtet->get_triangle3()->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);
77     mgtet->get_triangle3()->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);
78     mgtet->get_triangle4()->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);
79     mgtet->get_triangle4()->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);
80     mgtet->get_triangle4()->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);
81     mgtet->get_triangle1()->change_origine(MAGIC::ORIGINE::IMPOSE);
82     mgtet->get_triangle2()->change_origine(MAGIC::ORIGINE::IMPOSE);
83     mgtet->get_triangle3()->change_origine(MAGIC::ORIGINE::IMPOSE);
84     mgtet->get_triangle4()->change_origine(MAGIC::ORIGINE::IMPOSE);
85     }
86     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri2;
87     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it_lsttri2;
88     TPL_MAP_ENTITE<MG_TETRA*> lsttet2;
89     TPL_MAP_ENTITE<MG_TETRA*>::ITERATEUR it_lsttet2;
90     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
91     if ((mgtet->get_origine()==MAGIC::ORIGINE::OPTIMISE))
92     {
93     lsttet2.ajouter(mgtet);
94     if (mgtet->get_triangle1()->get_origine() == MAGIC::ORIGINE::IMPOSE) lsttri2.ajouter(mgtet->get_triangle1());
95     if (mgtet->get_triangle2()->get_origine() == MAGIC::ORIGINE::IMPOSE) lsttri2.ajouter(mgtet->get_triangle2());
96     if (mgtet->get_triangle3()->get_origine() == MAGIC::ORIGINE::IMPOSE) lsttri2.ajouter(mgtet->get_triangle3());
97     if (mgtet->get_triangle4()->get_origine() == MAGIC::ORIGINE::IMPOSE) lsttri2.ajouter(mgtet->get_triangle4());
98     }
99    
100    
101     // Detection du nombre d'interfaces pour la connexion avec le non_design apres squelettisation
102     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri3;
103     TPL_MAP_ENTITE<MG_NOEUD*> lstno1;
104     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno1;
105     for(MG_TRIANGLE* mgtri=lsttri2.get_premier(it_lsttri2);mgtri;mgtri=lsttri2.get_suivant(it_lsttri2))
106     lsttri3.ajouter(mgtri);
107     std::vector<TPL_MAP_ENTITE<MG_TRIANGLE*> > vecteur_connexion;
108    
109     for(MG_TRIANGLE* mgtri=lsttri2.get_premier(it_lsttri2);mgtri;mgtri=lsttri2.get_suivant(it_lsttri2))
110     {
111     TPL_MAP_ENTITE<MG_TRIANGLE*> liste_voisins;
112     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it_lstvsn;
113     if ((lsttri3.existe(mgtri) == 1) && (lsttri3.get_nb() != 0))
114     {
115     lstno1.ajouter(mgtri->get_noeud1());
116     lstno1.ajouter(mgtri->get_noeud2());
117     lstno1.ajouter(mgtri->get_noeud3());
118     liste_voisins.ajouter(mgtri);
119     lsttri3.supprimer(mgtri);
120    
121     do
122     {
123     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri4;
124     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it_lsttri4;
125     for(MG_NOEUD* mgno=lstno1.get_premier(it_lstno1);mgno;mgno=lstno1.get_suivant(it_lstno1))
126     {
127     double nb_voisins = mgno->get_lien_triangle()->get_nb();
128     for (int j = 0;j<nb_voisins;j++)
129     {
130     MG_TRIANGLE* mgtri_i = mgno->get_lien_triangle()->get(j);
131     if (lsttri3.existe(mgtri_i) == 1) {lsttri4.ajouter(mgtri_i);liste_voisins.ajouter(mgtri_i);}
132     }
133     }
134     TPL_MAP_ENTITE<MG_NOEUD*> lstno2;
135     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno2;
136     for(MG_TRIANGLE* mgtri2=lsttri4.get_premier(it_lsttri4);mgtri2;mgtri2=lsttri4.get_suivant(it_lsttri4))
137     if (lsttri3.existe(mgtri2) == 1)
138     {
139     if (lstno1.existe(mgtri2->get_noeud1()) == 0) lstno2.ajouter(mgtri2->get_noeud1());
140     if (lstno1.existe(mgtri2->get_noeud2()) == 0) lstno2.ajouter(mgtri2->get_noeud2());
141     if (lstno1.existe(mgtri2->get_noeud3()) == 0) lstno2.ajouter(mgtri2->get_noeud3());
142     lsttri3.supprimer(mgtri2);
143     }
144     for(MG_NOEUD* mgno=lstno1.get_premier(it_lstno1);mgno;mgno=lstno1.get_suivant(it_lstno1))
145     lstno1.supprimer(mgno);
146     for(MG_NOEUD* mgno2=lstno2.get_premier(it_lstno2);mgno2;mgno2=lstno2.get_suivant(it_lstno2))
147     lstno1.ajouter(mgno2);
148     }
149     while (lstno1.get_nb() != 0);
150     vecteur_connexion.push_back(liste_voisins);
151     }
152     }
153    
154     int cpt=1;
155     LISTE_MG_TRIANGLE::iterator it_triangle;
156     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri;
157     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it_lsttri;
158     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_triangle);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_triangle))
159     if (mgtri->get_origine() == MAGIC::ORIGINE::IMPOSE) {lsttri.ajouter(mgtri);mgtri->change_nouveau_numero(cpt);cpt++;}
160     cpt=1;
161     TPL_MAP_ENTITE<MG_SEGMENT*> lstseg;
162     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR it_lstseg;
163     LISTE_MG_SEGMENT::iterator it_segment;
164     for (MG_SEGMENT* mgseg=mg_mai->get_premier_segment(it_segment);mgseg!=NULL;mgseg=mg_mai->get_suivant_segment(it_segment))
165     if (mgseg->get_origine() == MAGIC::ORIGINE::IMPOSE) {lstseg.ajouter(mgseg);mgseg->change_nouveau_numero(cpt);cpt++;}
166     cpt=1;
167     LISTE_MG_NOEUD::iterator it_noeud;
168     TPL_MAP_ENTITE<MG_NOEUD*> lstnod;
169     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstnod;
170     TPL_MAP_ENTITE<MG_NOEUD*> lstnod2;
171     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstnod2;
172     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
173     if (mgnoeud->get_origine() != MAGIC::ORIGINE::IMPOSE) mgnoeud->change_nouveau_numero(0);
174     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
175     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE) {lstnod.ajouter(mgnoeud);lstnod2.ajouter(mgnoeud);mgnoeud->change_nouveau_numero(cpt);cpt++;}
176    
177    
178    
179    
180    
181    
182    
183     //**************************************************************************************** Debut squelettisation ************************************************************************************
184     //***************************************************************************************************************************************************************************************************
185     // Creation du squelette courbe (squelette1) a partir des resultats de Matlab
186     MG_FILE gestlisse(nomgestlisse);
187     MG_MAILLAGE* mg_mai2=gestlisse.get_mg_maillage(0);
188    
189    
190     MG_GESTIONNAIRE gest3;
191     MG_GEOMETRIE* geo=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL",unite);
192     gest3.ajouter_mg_geometrie(geo);
193     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
194     geo->ajouter_mg_poutre(poutre);
195     MG_VOLUME* vol=new MG_VOLUME_ELEMENT();
196     geo->ajouter_mg_volume(vol);
197     MG_MAILLAGE* mg_mai3 = new MG_MAILLAGE(geo);
198     gest3.ajouter_mg_maillage(mg_mai3);
199    
200    
201     FILE *points = fopen (nompoints,"rt");
202     LISTE_MG_NOEUD::iterator it_no;
203     TPL_MAP_ENTITE<MG_NOEUD*> lstnodes;
204     TPL_MAP_ENTITE<MG_NOEUD*> lstnodes2;
205     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inod;
206     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inod2;
207    
208     int num = 1;
209     if (points==NULL) cout << "erreur fichier de points" <<endl;
210     while(!feof(points))
211     {
212     char chaine[500];
213     char* fpt=fgets(chaine,500,points);
214     if(fpt!=NULL)
215     {
216     double x,y,z;
217     sscanf(chaine, "%lf %lf %lf " ,&x,&y,&z);
218 nana 816 if (x/x == 1)
219 nana 812 {
220     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
221     node->change_nouveau_numero(num);
222     mg_mai3->ajouter_mg_noeud(node);
223     lstnodes.ajouter(node);
224     lstnodes2.ajouter(node);
225     }
226     num++;
227     }
228     }
229     fclose(points);
230    
231    
232     // Etablissement des correspondances a partir du fichier .txt obtenu de MATLAB et creation du squelette
233     FILE *corres = fopen (nomcorres,"rt");
234     num = 1;
235     do
236     {
237     char chaine[500];
238     char* fcrs=fgets(chaine,500,corres);
239     if(fcrs!=NULL)
240     {
241     int pt1,pt2,pt3,pt4,pt5;
242     sscanf(chaine, "%d %d %d %d %d ",&pt1,&pt2,&pt3,&pt4,&pt5);
243     MG_NOEUD* noo = NULL;
244     MG_NOEUD* no1 = NULL;
245     MG_NOEUD* no2 = NULL;
246     MG_NOEUD* no3 = NULL;
247     MG_NOEUD* no4 = NULL;
248     MG_NOEUD* no5 = NULL;
249     for(MG_NOEUD* mgno=lstnodes.get_premier(inod);mgno;mgno=lstnodes.get_suivant(inod))
250     {
251     if ((num != 0) && (mgno->get_nouveau_numero() == num)) noo = mgno;
252     if ((pt1 != 0) && (mgno->get_nouveau_numero() == pt1)) no1 = mgno;
253     if ((pt2 != 0) && (mgno->get_nouveau_numero() == pt2)) no2 = mgno;
254     if ((pt3 != 0) && (mgno->get_nouveau_numero() == pt3)) no3 = mgno;
255     if ((pt4 != 0) && (mgno->get_nouveau_numero() == pt4)) no4 = mgno;
256     if ((pt5 != 0) && (mgno->get_nouveau_numero() == pt5)) no5 = mgno;
257     }
258    
259     if ((no1 != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no1,MAGIC::ORIGINE::SQUELETTE);
260     if ((no2 != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no2,MAGIC::ORIGINE::SQUELETTE);
261     if ((no3 != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no3,MAGIC::ORIGINE::SQUELETTE);
262     if ((no4 != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no4,MAGIC::ORIGINE::SQUELETTE);
263     if ((no5 != NULL)) MG_SEGMENT* seg=mg_mai3->ajouter_mg_segment(poutre,noo,no5,MAGIC::ORIGINE::SQUELETTE);
264     num++;
265     }
266     }
267     while (!feof(corres));
268     fclose(corres);
269    
270    
271     // Detection des noeuds d'extremite et d'intersection
272     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_extremite;
273     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoext;
274     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_intersection;
275     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inointer;
276     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_extremite_intersection;
277     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoextinter;
278    
279     for(MG_NOEUD* mgno=lstnodes.get_premier(inod);mgno;mgno=lstnodes.get_suivant(inod))
280     {
281     if (mgno->get_lien_segment()->get_nb() == 1)
282     {
283     noeuds_extremite.ajouter(mgno);
284     noeuds_extremite_intersection.ajouter(mgno);
285     }
286     if (mgno->get_lien_segment()->get_nb() >= 3)
287     {
288     noeuds_intersection.ajouter(mgno);
289     noeuds_extremite_intersection.ajouter(mgno);
290     }
291     }
292    
293     // Calcul de la section de chaque poutre
294     LISTE_MG_NOEUD::iterator it_node;
295     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
296     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_noeud);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_noeud))
297     {
298     if(noeud_i->get_x() < xmin) xmin=noeud_i->get_x();
299     if(noeud_i->get_y() < ymin) ymin=noeud_i->get_y();
300     if(noeud_i->get_z() < zmin) zmin=noeud_i->get_z();
301     if(noeud_i->get_x() > xmax) xmax=noeud_i->get_x();
302     if(noeud_i->get_y() > ymax) ymax=noeud_i->get_y();
303     if(noeud_i->get_z() > zmax) zmax=noeud_i->get_z();
304     }
305    
306     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_modele_lisse;
307     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR ino_modele_lisse;
308     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
309     noeuds_modele_lisse.ajouter(mgnoeud);
310    
311     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octree;
312     octree.initialiser(&noeuds_modele_lisse,1,xmin,ymin,zmin,xmax,ymax,zmax);
313     for(MG_NOEUD* mgnoeud=noeuds_modele_lisse.get_premier(ino_modele_lisse);mgnoeud;mgnoeud=noeuds_modele_lisse.get_suivant(ino_modele_lisse))
314     octree.inserer(mgnoeud);
315    
316    
317     // D est la constante dans l'equation du plan Ax + By + Cz + D = 0, avec X = normale = (A,B,C) = Axe du segment
318     // On va projeter sur chaque segment tous les noeuds se situant entre les 2 plans passant par les 2 noeuds dudit segment
319     TPL_MAP_ENTITE<MG_NOEUD*> lstprochedejautilise;
320     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR ino_prochedejautilise;
321     LISTE_MG_SEGMENT::iterator it_seg;
322     for (MG_SEGMENT* mgseg=mg_mai3->get_premier_segment(it_seg);mgseg!=NULL;mgseg=mg_mai3->get_suivant_segment(it_seg))
323     {
324     double lmin = 1.e308;
325     double lmin2 = 1.e308;
326     MG_NOEUD* mgnode = mgseg->get_noeud1();
327     MG_NOEUD* mgnode2 = mgseg->get_noeud2();
328     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
329     {
330     double *coo1 = mgnode->get_coord();
331     double *coo2 = mgnoeud->get_coord();
332     double *coo3 = mgnode2->get_coord();
333     double dist = sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
334     double dist2 = sqrt((coo3[0]-coo2[0])*(coo3[0]-coo2[0])+(coo3[1]-coo2[1])*(coo3[1]-coo2[1])+(coo3[2]-coo2[2])*(coo3[2]-coo2[2]));
335     if (dist < lmin) lmin = dist;
336     if (dist2 < lmin2) lmin2 = dist2;
337     }
338     OT_VECTEUR_3D normale1(mgnode->get_coord(),mgnode2->get_coord());
339     OT_VECTEUR_3D normale2(mgnode2->get_coord(),mgnode->get_coord());
340     double D1 = -(normale1.get_x()*mgnode->get_x() + normale1.get_y()*mgnode->get_y() + normale1.get_z()*mgnode->get_z());
341     double D2 = -(normale2.get_x()*mgnode2->get_x() + normale2.get_y()*mgnode2->get_y() + normale2.get_z()*mgnode2->get_z());
342    
343     double coef = 1.2;
344     TPL_MAP_ENTITE<MG_NOEUD*> lstproche;
345     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR ino_proche;
346     double rayon = coef*lmin;
347     octree.rechercher(mgnode->get_x(),mgnode->get_y(),mgnode->get_z(),rayon,lstproche);
348    
349     double longueur = normale1.get_longueur();
350     int nbre = longueur/rayon;
351     if (nbre <= 1) nbre=2;
352     lmin = 1.e308;
353     for (int k=1;k<nbre;k++)
354     {
355     double x = mgnode->get_x()+k*(mgnode2->get_x()-mgnode->get_x())/nbre;
356     double y = mgnode->get_y()+k*(mgnode2->get_y()-mgnode->get_y())/nbre;
357     double z = mgnode->get_z()+k*(mgnode2->get_z()-mgnode->get_z())/nbre;
358     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
359     {
360     double *coo2 = mgnoeud->get_coord();
361     double dist_i = sqrt((x-coo2[0])*(x-coo2[0])+(y-coo2[1])*(y-coo2[1])+(z-coo2[2])*(z-coo2[2]));
362     if (dist_i < lmin) lmin = dist_i;
363     }
364     double rayon_i = coef*lmin;
365     octree.rechercher(x,y,z,rayon_i,lstproche);
366     }
367    
368     double rayon2 = coef*lmin2;
369     octree.rechercher(mgnode2->get_x(),mgnode2->get_y(),mgnode2->get_z(),rayon2,lstproche);
370    
371     // Suppression des noeuds qui ne sont pas entre les 2 plans (dont les signes de position par rapport aux plans sont identiques)
372     if (lstproche.get_nb() != 0)
373     for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
374     {
375     double P1 = normale1.get_x()*mgnoeud->get_x() + normale1.get_y()*mgnoeud->get_y() + normale1.get_z()*mgnoeud->get_z() + D1;
376     double P2 = normale2.get_x()*mgnoeud->get_x() + normale2.get_y()*mgnoeud->get_y() + normale2.get_z()*mgnoeud->get_z() + D2;
377     if ((P1*P2/(fabs(P1)*fabs(P2))) > 0) lstproche.supprimer(mgnoeud);
378     if ((mgnoeud->get_lien_segment()->get_nb() < 3) && (lstprochedejautilise.existe(mgnoeud) == 1)) lstproche.supprimer(mgnoeud);
379     }
380     for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
381     lstprochedejautilise.ajouter(mgnoeud);
382    
383     // Projection sur le segment des noeuds retenus et moyennage pour obtenir a section locale
384     MG_NOEUD* node = NULL;
385     double val = 0.;
386     double somme = 0;
387     if (lstproche.get_nb() != 0)
388     {
389     for(MG_NOEUD* mgnoeud=lstproche.get_premier(ino_proche);mgnoeud;mgnoeud=lstproche.get_suivant(ino_proche))
390     {
391     if (mgnode != NULL) node = mgnode;
392     else if (mgnode2 != NULL) node = mgnode2;
393     OT_VECTEUR_3D vec1 = normale1;
394     OT_VECTEUR_3D vec2(node->get_coord(),mgnoeud->get_coord());
395     vec1.norme();
396     vec2.norme();
397     double produit_scalaire = vec1*vec2;
398     if (produit_scalaire > 1.) produit_scalaire = 1.;
399     if (produit_scalaire < -1.) produit_scalaire = -1.;
400     double *coo1=node->get_coord();
401     double *coo2=mgnoeud->get_coord();
402     double hypo=sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
403     somme = somme + hypo*sqrt(1-(produit_scalaire*produit_scalaire));
404     }
405     val = somme/lstproche.get_nb();
406     }
407     mgseg->change_solution(unite*val);
408     }
409    
410     double r_min = 1.e308;
411     double r_max = 1.e-308;
412     for (int i=0;i<vecteur_connexion.size();i++)
413     {
414     //cout << "nbtri_connexion = " << vecteur_connexion[i].get_nb() << endl;
415     TPL_MAP_ENTITE<MG_TRIANGLE*> tri_connexion = vecteur_connexion[i];
416     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR trico;
417     TPL_MAP_ENTITE<MG_NOEUD*> lstno3;
418     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno3;
419     MG_NOEUD* noeud_arrive = NULL; // noeud du squelette
420     for(MG_TRIANGLE* mgtri=tri_connexion.get_premier(trico);mgtri;mgtri=tri_connexion.get_suivant(trico))
421     {
422     lstno3.ajouter(mgtri->get_noeud1());
423     lstno3.ajouter(mgtri->get_noeud2());
424     lstno3.ajouter(mgtri->get_noeud3());
425     }
426     for(MG_NOEUD* mgno=lstno3.get_premier(it_lstno3);mgno;mgno=lstno3.get_suivant(it_lstno3))
427     {
428     double lmin = 1.e308;
429     for (MG_NOEUD* mgno2=mg_mai3->get_premier_noeud(it_no);mgno2!=NULL;mgno2=mg_mai3->get_suivant_noeud(it_no))
430     if (mgno2->get_origine() == MAGIC::ORIGINE::SQUELETTE)
431     {
432     double *coo1=mgno->get_coord();
433     double *coo2=mgno2->get_coord();
434     double longueur=sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
435     if (longueur < lmin)
436     {
437     lmin = longueur;
438     noeud_arrive = mgno2;
439     }
440     }
441     }
442     TPL_MAP_ENTITE<MG_NOEUD*> lstno4;
443     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno4;
444     if ((noeud_arrive != NULL))
445     for (int i=0;i<noeud_arrive->get_lien_segment()->get_nb();i++)
446     {
447     MG_SEGMENT *segment = noeud_arrive->get_lien_segment()->get(i);
448     lstno4.ajouter(segment->get_noeud1());
449     lstno4.ajouter(segment->get_noeud2());
450     }
451     int compteur = 0;
452     for(MG_NOEUD* mgno=lstno4.get_premier(it_lstno4);mgno;mgno=lstno4.get_suivant(it_lstno4))
453     if (noeuds_extremite.existe(mgno) == 1) compteur++;
454     if (compteur == 0)
455     {
456     noeuds_extremite.ajouter(noeud_arrive);
457     noeuds_extremite_intersection.ajouter(noeud_arrive);
458     }
459     }
460    
461     // Connexion au non_design
462     TPL_MAP_ENTITE<MG_NOEUD*> lstexistedeja;
463     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstnoxdj;
464     for(MG_NOEUD* mgno=noeuds_extremite.get_premier(inoext);mgno;mgno=noeuds_extremite.get_suivant(inoext))
465     {
466     double lmin = 1.e308;
467     MG_NOEUD* noeud_elu = NULL;
468     MG_NOEUD* noeud_temp = NULL;
469     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
470     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
471     {
472     double *coo1=mgno->get_coord();
473     double *coo2=mgnoeud->get_coord();
474     double dist=sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
475     if (dist < lmin)
476     {
477     lmin = dist;
478     noeud_temp = mgnoeud;
479     noeud_temp->change_nouveau_numero(mgnoeud->get_nouveau_numero());
480     }
481     }
482     lstnod2.supprimer(noeud_temp);
483     lstexistedeja.ajouter(noeud_temp);
484     double x = noeud_temp->get_x();
485     double y = noeud_temp->get_y();
486     double z = noeud_temp->get_z();
487     MG_SOMMET_NOEUD* sommet=new MG_SOMMET_NOEUD(NULL);
488     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
489     mg_mai3->ajouter_mg_noeud(node);
490     node->change_nouveau_numero(noeud_temp->get_nouveau_numero());
491     noeud_elu = node;
492    
493     if ((noeud_elu != NULL))
494     {
495     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
496     geo->ajouter_mg_poutre(poutre);
497     MG_SEGMENT* mgseg=mg_mai3->ajouter_mg_segment(poutre,mgno,noeud_elu,MAGIC::ORIGINE::SQUELETTE);
498     poutre->ajouter_element(mgseg);
499     mgseg->change_nouveau_numero(0);
500     mgseg->change_solution(0.);
501     }
502     }
503    
504     // Creation du non_design et ajout dans le maillage (mg_mai3) du squelette1
505     for(MG_NOEUD* mgnoeud=lstnod2.get_premier(it_lstnod2);mgnoeud;mgnoeud=lstnod2.get_suivant(it_lstnod2))
506     if (mgnoeud->get_nouveau_numero() != 0)
507     {
508     double x = mgnoeud->get_x();
509     double y = mgnoeud->get_y();
510     double z = mgnoeud->get_z();
511     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
512     mg_mai3->ajouter_mg_noeud(node);
513     node->change_nouveau_numero(mgnoeud->get_nouveau_numero());
514     }
515    
516     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
517     if (mgtet->get_origine()==MAGIC::ORIGINE::IMPOSE)
518     {
519     MG_NOEUD* noeud1 = mgtet->get_noeud1();
520     MG_NOEUD* noeud2 = mgtet->get_noeud2();
521     MG_NOEUD* noeud3 = mgtet->get_noeud3();
522     MG_NOEUD* noeud4 = mgtet->get_noeud4();
523     MG_NOEUD* no1 = NULL;
524     MG_NOEUD* no2 = NULL;
525     MG_NOEUD* no3 = NULL;
526     MG_NOEUD* no4 = NULL;
527     for (MG_NOEUD* mgnoeud=mg_mai3->get_premier_noeud(it_no);mgnoeud!=NULL;mgnoeud=mg_mai3->get_suivant_noeud(it_no))
528     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
529     {
530     if (noeud1->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no1 = mgnoeud;
531     if (noeud2->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no2 = mgnoeud;
532     if (noeud3->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no3 = mgnoeud;
533     if (noeud4->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) no4 = mgnoeud;
534     }
535     MG_TETRA* tet = mg_mai3->ajouter_mg_tetra(vol,no1,no2,no3,no4,MAGIC::ORIGINE::IMPOSE);
536     }
537    
538     /*
539     // Visualiser la position du squelette
540     for (MG_NOEUD* mgnoeud=mg_mai2->get_premier_noeud(it_node);mgnoeud!=NULL;mgnoeud=mg_mai2->get_suivant_noeud(it_node))
541     {
542     double x = mgnoeud->get_x();
543     double y = mgnoeud->get_y();
544     double z = mgnoeud->get_z();
545     MG_SOMMET_NOEUD* sommet=new MG_SOMMET_NOEUD(NULL);
546     geo->ajouter_mg_sommet(sommet);
547     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::MAILLEUR_AUTO);
548     mg_mai3->ajouter_mg_noeud(node);
549     sommet->change_mg_noeud(node);
550     }
551     for (MG_NOEUD* mgnoeud=mg_mai3->get_premier_noeud(it_no);mgnoeud!=NULL;mgnoeud=mg_mai3->get_suivant_noeud(it_no))
552     if (mgnoeud->get_origine() == MAGIC::ORIGINE::MAILLEUR_AUTO) MG_SEGMENT* seg = mg_mai3->ajouter_mg_segment(poutre,mgnoeud,mgnoeud,MAGIC::ORIGINE::MAILLEUR_AUTO);
553    
554    
555     // Solution des sections pour visualisation dans gmsh
556     MG_SOLUTION* mgsquel=new MG_SOLUTION(mg_mai3,1,(char*)"Carte_sections.sol",mg_mai3->get_nb_mg_segment(),"Taille",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1,MAGIC::TYPE_SOLUTION::SCALAIRE);
557     gest3.ajouter_mg_solution(mgsquel);
558     mgsquel->change_legende(0,"des_sections");
559     int i = 0;
560     for (MG_SEGMENT* mgseg=mg_mai3->get_premier_segment(it_seg);mgseg!=NULL;mgseg=mg_mai3->get_suivant_segment(it_seg))
561     {
562     mgsquel->ecrire(mgseg->get_solution(),i,0);
563     i++;
564     }
565     */
566    
567    
568     cout << "Enregistrement squelette 1 " << endl;
569     // Enregistrement du squelette1 dans le gestionnaire3
570     char nomsortie[500];
571     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,1);
572     gest3.enregistrer(nomsortie);
573    
574    
575    
576    
577    
578    
579    
580     // **************************************************************************************************************************************************************************************************
581     /// Transformation du squelette1 uniquement (i.e.sans tenir compte de la connexion avec le non_design) en poutres droites (squelette2) et enregistrement dans un nouveau gestionnaire gest4
582     // **************************************************************************************************************************************************************************************************
583    
584     MG_GESTIONNAIRE gest4;
585     MG_GEOMETRIE* geo2=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL",unite);
586     gest4.ajouter_mg_geometrie(geo2);
587     MG_VOLUME* vol2=new MG_VOLUME_ELEMENT();
588     geo2->ajouter_mg_volume(vol2);
589     MG_MAILLAGE* mg_mai4 = new MG_MAILLAGE(geo2);
590     gest4.ajouter_mg_maillage(mg_mai4);
591    
592    
593     // Mise a 100 de tous les segments du squelette
594     for (MG_SEGMENT* mgseg=mg_mai3->get_premier_segment(it_seg);mgseg!=NULL;mgseg=mg_mai3->get_suivant_segment(it_seg))
595     if (mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE) mgseg->change_nouveau_numero(100);
596    
597     // Creation des noeuds d'intersection et d'extremite dans le nouveau maillage mg_mai4
598     for(MG_NOEUD* mgno=noeuds_extremite_intersection.get_premier(inoextinter);mgno;mgno=noeuds_extremite_intersection.get_suivant(inoextinter))
599     {
600     MG_NOEUD* node = mg_mai4->ajouter_mg_noeud(NULL,mgno->get_x(),mgno->get_y(),mgno->get_z(),MAGIC::ORIGINE::SQUELETTE);
601     node->change_nouveau_numero(mgno->get_nouveau_numero());
602     }
603    
604     // Creation des poutres droites dans le nouveau maillage mg_mai4
605     double cara = 0.;
606     LISTE_MG_NOEUD::iterator it_noeu;
607     LISTE_MG_SEGMENT::iterator itseg;
608    
609     // Connexion squelette-non_design
610     for (MG_NOEUD* mgno=mg_mai3->get_premier_noeud(it_no);mgno!=NULL;mgno=mg_mai3->get_suivant_noeud(it_no))
611     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
612     {
613     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
614     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
615     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
616     {
617     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
618     if (seg_i->get_nouveau_numero() != 0)
619     {
620     MG_NOEUD* no1 = seg_i->get_noeud1();
621     MG_NOEUD* no2 = seg_i->get_noeud2();
622     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
623     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
624     }
625     seg_i->change_nouveau_numero(0);
626     }
627     lstno_temp.supprimer(mgno);
628    
629     if (lstno_temp.get_nb() > 0)
630     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
631     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
632     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
633     {
634     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
635     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
636     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
637     {
638     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
639     MG_NOEUD* no1 = seg_i->get_noeud1();
640     MG_NOEUD* no2 = seg_i->get_noeud2();
641     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
642     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
643     }
644     lstno_temp1.supprimer(mgno2);
645    
646     for (MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
647     for (MG_NOEUD* mgnoeud3=mg_mai4->get_premier_noeud(it_noeu);mgnoeud3!=NULL;mgnoeud3=mg_mai4->get_suivant_noeud(it_noeu))
648     if ((mgno3->get_x() == mgnoeud3->get_x()) && (mgno3->get_y() == mgnoeud3->get_y()) && (mgno3->get_z() == mgnoeud3->get_z()))
649     {
650     MG_NOEUD* node1 = NULL;
651     MG_NOEUD* node2 = NULL;
652    
653     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
654     {
655     if (mgno->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node1 = mgnoeud;
656     if (mgno3->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node2 = mgnoeud;
657     }
658    
659     OT_VECTEUR_3D vec(node1->get_coord(),node2->get_coord());
660     if (vec.get_longueur() != 0.)
661     {
662     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
663     geo2->ajouter_mg_poutre(mg_poutre);
664     MG_SEGMENT* seg=mg_mai4->ajouter_mg_segment(mg_poutre,node1,node2,MAGIC::ORIGINE::SQUELETTE);
665     mg_poutre->ajouter_element(seg);
666     seg->change_solution(mgno3->get_solution());
667     }
668     }
669     }
670     }
671    
672     // Connexion directe squelette-squelette (1 segment)
673     for(MG_NOEUD* mgno=noeuds_extremite_intersection.get_premier(inoextinter);mgno;mgno=noeuds_extremite_intersection.get_suivant(inoextinter))
674     {
675     MG_NOEUD* noeud_arrive = NULL;
676     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_seg;
677     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoseg;
678     TPL_MAP_ENTITE<MG_SEGMENT*> carac_poutre1;
679     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR isgcarpou1;
680     TPL_MAP_ENTITE<MG_SEGMENT*> carac_poutre2;
681     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR isgcarpou2;
682     int nbseg = mgno->get_lien_segment()->get_nb();
683     for (int i=0;i<nbseg;i++)
684     {
685     MG_SEGMENT* mgseg = mgno->get_lien_segment()->get(i);
686     if (mgseg->get_nouveau_numero() == 100)
687     {
688     noeuds_seg.ajouter(mgseg->get_noeud1());
689     noeuds_seg.ajouter(mgseg->get_noeud2());
690     carac_poutre1.ajouter(mgseg);
691     mgseg->change_nouveau_numero(0);
692     }
693     }
694     for(MG_NOEUD* mgno3=noeuds_seg.get_premier(inoseg);mgno3;mgno3=noeuds_seg.get_suivant(inoseg))
695     {
696     int compteur = 0;
697     if ((noeuds_extremite_intersection.existe(mgno3) == 1))
698     {
699     MG_NOEUD* node1 = NULL;
700     MG_NOEUD* node2 = NULL;
701     for(MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
702     for(MG_SEGMENT* mgsg=carac_poutre1.get_premier(isgcarpou1);mgsg;mgsg=carac_poutre1.get_suivant(isgcarpou1))
703     {
704     if (mgno->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node1 = mgnoeud;
705     if (mgno3->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node2 = mgnoeud;
706     }
707     OT_VECTEUR_3D vec(node1->get_coord(),node2->get_coord());
708     if (vec.get_longueur() != 0.)
709     {
710     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
711     geo2->ajouter_mg_poutre(poutre);
712     MG_SEGMENT* seg=mg_mai4->ajouter_mg_segment(poutre,node1,node2,MAGIC::ORIGINE::SQUELETTE);
713     poutre->ajouter_element(seg);
714     for(MG_SEGMENT* mgsg=carac_poutre1.get_premier(isgcarpou1);mgsg;mgsg=carac_poutre1.get_suivant(isgcarpou1))
715     if (vec.get_longueur() == mgsg->get_longueur())
716     seg->change_solution(mgsg->get_solution());
717     }
718     }
719     // Connexion indirecte squelette-squelette (+ieurs segments)
720     else
721     {
722     if (mgno3->get_origine() == MAGIC::ORIGINE::SQUELETTE)
723     do
724     {
725     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_seg2;
726     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoseg2;
727     int nbseg2 = mgno3->get_lien_segment()->get_nb();
728     for (int i=0;i<nbseg2;i++)
729     {
730     MG_SEGMENT* mgseg = mgno3->get_lien_segment()->get(i);
731     if (mgseg->get_nouveau_numero() == 100)
732     {
733     noeuds_seg2.ajouter(mgseg->get_noeud1());
734     noeuds_seg2.ajouter(mgseg->get_noeud2());
735     mgseg->change_nouveau_numero(0);
736     carac_poutre2.ajouter(mgseg);
737     }
738     noeuds_seg2.supprimer(mgno3);
739     }
740     if (noeuds_seg2.get_nb() > 0)
741     {
742     for(MG_NOEUD* mgno4=noeuds_seg2.get_premier(inoseg2);mgno4;mgno4=noeuds_seg2.get_suivant(inoseg2))
743     {
744     if (noeuds_extremite_intersection.existe(mgno4) == 1) {noeud_arrive = mgno4; compteur = 1;}
745     else mgno3 = mgno4;
746     }
747     }
748     //if (noeuds_seg2.get_nb() == 0) compteur = 2;
749     }
750     while (compteur == 0);
751    
752    
753     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
754     {
755     MG_NOEUD* no1 = mgsg->get_noeud1();
756     for (int i=0;i<no1->get_lien_segment()->get_nb();i++)
757     if (noeuds_extremite_intersection.existe(no1) != 1)
758     carac_poutre2.ajouter(no1->get_lien_segment()->get(i));
759     MG_NOEUD* no2 = mgsg->get_noeud2();
760     for (int i=0;i<no2->get_lien_segment()->get_nb();i++)
761     if (noeuds_extremite_intersection.existe(no2) != 1)
762     carac_poutre2.ajouter(no2->get_lien_segment()->get(i));
763     }
764    
765     /*
766     // Calcul de la section avec la moyenne coefficiee par la longueur du segment
767     double solution = 0.;
768     double longueur = 0;
769     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
770     if ((mgsg->get_solution() > 1.e-6))
771     {
772     solution = solution + mgsg->get_longueur()*mgsg->get_solution();
773     longueur = longueur + mgsg->get_longueur();
774     }
775     cara=solution/longueur;
776     */
777    
778     double solution = 0.;
779     double nbre = 0;
780     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
781     if ((mgsg->get_solution() > 1.e-6))
782     {
783     solution = solution + mgsg->get_solution();
784     nbre++;
785     }
786     cara=solution/nbre;
787    
788     for(MG_SEGMENT* mgsg=carac_poutre2.get_premier(isgcarpou2);mgsg;mgsg=carac_poutre2.get_suivant(isgcarpou2))
789     carac_poutre2.supprimer(mgsg);
790    
791     if ((compteur == 1))
792     {
793     MG_NOEUD* node1 = NULL;
794     MG_NOEUD* node2 = NULL;
795     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
796     {
797     if (mgno->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node1 = mgnoeud;
798     if (noeud_arrive->get_nouveau_numero() == mgnoeud->get_nouveau_numero()) node2 = mgnoeud;
799     }
800    
801     OT_VECTEUR_3D vec(node1->get_coord(),node2->get_coord());
802     if (vec.get_longueur() != 0.)
803     {
804     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
805     geo2->ajouter_mg_poutre(poutre);
806     MG_SEGMENT* seg=mg_mai4->ajouter_mg_segment(poutre,node1,node2,MAGIC::ORIGINE::SQUELETTE);
807     poutre->ajouter_element(seg);
808     seg->change_solution(cara);
809     }
810     }
811     }
812     }
813     }
814    
815     // Creation des noeuds du non_design dans le nouveau maillage mg_mai4
816     for(MG_NOEUD* mgnoeud=lstnod.get_premier(it_lstnod);mgnoeud;mgnoeud=lstnod.get_suivant(it_lstnod))
817     if (mgnoeud->get_nouveau_numero() != 0)
818     {
819     double x = mgnoeud->get_x();
820     double y = mgnoeud->get_y();
821     double z = mgnoeud->get_z();
822     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
823     node->change_nouveau_numero(mgnoeud->get_id());
824     mg_mai4->ajouter_mg_noeud(node);
825     }
826    
827     // Connexion squelette-non_design
828     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_extremite2;
829     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inoext2;
830     for(MG_NOEUD* mgno=noeuds_extremite.get_premier(inoext);mgno;mgno=noeuds_extremite.get_suivant(inoext))
831     for (MG_NOEUD* mgno2=mg_mai4->get_premier_noeud(it_noeu);mgno2!=NULL;mgno2=mg_mai4->get_suivant_noeud(it_noeu))
832     if (mgno->get_nouveau_numero() == mgno2->get_nouveau_numero()) {noeuds_extremite2.ajouter(mgno2);mgno2->change_solution(mgno->get_solution());}
833    
834     for(MG_NOEUD* mgno=noeuds_extremite2.get_premier(inoext2);mgno;mgno=noeuds_extremite2.get_suivant(inoext2))
835     {
836     double lmin = 1.e308;
837     MG_NOEUD* noeud_elu2 = NULL;
838     for (MG_NOEUD* mgno2=mg_mai4->get_premier_noeud(it_noeu);mgno2!=NULL;mgno2=mg_mai4->get_suivant_noeud(it_noeu))
839     if (mgno2->get_origine() == MAGIC::ORIGINE::IMPOSE)
840     {
841     double *coo1=mgno->get_coord();
842     double *coo2=mgno2->get_coord();
843     double section=sqrt((coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
844     if (section < lmin)
845     {
846     lmin = section;
847     noeud_elu2 = mgno2;
848     }
849     }
850     if ((noeud_elu2 != NULL))
851     {
852     MG_POUTRE_ELEMENT* poutre=new MG_POUTRE_ELEMENT();
853     geo2->ajouter_mg_poutre(poutre);
854    
855     MG_SEGMENT* seg=new MG_SEGMENT(poutre,mgno,noeud_elu2,MAGIC::ORIGINE::SQUELETTE);
856     mg_mai4->ajouter_mg_segment(seg);
857     poutre->ajouter_element(seg);
858     seg->change_solution(mgno->get_solution());
859     }
860     }
861    
862     // Creation du reste des elements du non_design dans le nouveau maillage mg_mai4
863     for(MG_SEGMENT* mgsegment=lstseg.get_premier(it_lstseg);mgsegment;mgsegment=lstseg.get_suivant(it_lstseg))
864     if (mgsegment->get_nouveau_numero() != 0)
865     {
866     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
867     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
868     MG_NOEUD* no1 = NULL;
869     MG_NOEUD* no2 = NULL;
870     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
871     {
872     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
873     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
874     }
875     MG_SEGMENT* seg = mg_mai4->ajouter_mg_segment(NULL,no1,no2,MAGIC::ORIGINE::IMPOSE);
876     }
877     for(MG_TRIANGLE* mgtri=lsttri.get_premier(it_lsttri);mgtri;mgtri=lsttri.get_suivant(it_lsttri))
878     if (mgtri->get_nouveau_numero() != 0)
879     {
880     MG_NOEUD* noeud1 = mgtri->get_noeud1();
881     MG_NOEUD* noeud2 = mgtri->get_noeud2();
882     MG_NOEUD* noeud3 = mgtri->get_noeud3();
883     MG_NOEUD* no1 = NULL;
884     MG_NOEUD* no2 = NULL;
885     MG_NOEUD* no3 = NULL;
886     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
887     {
888     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
889     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
890     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
891     }
892     MG_TRIANGLE* tri = mg_mai4->ajouter_mg_triangle(NULL,no1,no2,no3,MAGIC::ORIGINE::IMPOSE);
893     }
894     for(MG_TETRA* mgtet=lsttet.get_premier(it_lsttet);mgtet;mgtet=lsttet.get_suivant(it_lsttet))
895     {
896     MG_NOEUD* noeud1 = mgtet->get_noeud1();
897     MG_NOEUD* noeud2 = mgtet->get_noeud2();
898     MG_NOEUD* noeud3 = mgtet->get_noeud3();
899     MG_NOEUD* noeud4 = mgtet->get_noeud4();
900     MG_NOEUD* no1 = NULL;
901     MG_NOEUD* no2 = NULL;
902     MG_NOEUD* no3 = NULL;
903     MG_NOEUD* no4 = NULL;
904     for (MG_NOEUD* mgnoeud=mg_mai4->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai4->get_suivant_noeud(it_noeu))
905     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
906     {
907     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
908     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
909     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
910     if (mgnoeud->get_nouveau_numero() == noeud4->get_id()) no4 = mgnoeud;
911     }
912     MG_TETRA* tet = mg_mai4->ajouter_mg_tetra(vol2,no1,no2,no3,no4,MAGIC::ORIGINE::IMPOSE);
913     }
914    
915     FEM_MAILLAGE *fem2=new FEM_MAILLAGE(geo2,mg_mai4,1);
916     gest4.ajouter_fem_maillage(fem2);
917     fem2->construire();
918    
919     /*
920     // Solution des sections pour visualisation dans gmsh
921     MG_SOLUTION* mgsquel2=new MG_SOLUTION(mg_mai4,1,(char*)"Carte_sections2.sol",mg_mai4->get_nb_mg_segment(),"Taille",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1,MAGIC::TYPE_SOLUTION::SCALAIRE);
922     gest4.ajouter_mg_solution(mgsquel2);
923     mgsquel2->change_legende(0,"des_sections2");
924     int l = 0;
925     for (MG_SEGMENT* mgseg=mg_mai4->get_premier_segment(itseg);mgseg!=NULL;mgseg=mg_mai4->get_suivant_segment(itseg))
926     {
927     mgsquel2->ecrire(mgseg->get_solution(),l,0);
928     l++;
929     }
930     */
931    
932    
933     cout << "Enregistrement squelette 2 " << endl;
934     // Enregistrement du squelette2 dans le gestionnaire4
935     nomsortie[500];
936     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,2);
937     gest4.enregistrer(nomsortie);
938    
939    
940    
941    
942    
943    
944    
945     // **************************************************************************************************************************************************************************************************
946     /// Transformation du squelette2 (i.e. en tenant compte de la connexion avec le non_design) en poutres droites (squelette3) et enregistrement dans un nouveau gestionnaire gest5
947     // **************************************************************************************************************************************************************************************************
948    
949     MG_GESTIONNAIRE gest5;
950     MG_GEOMETRIE* geo3=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL",unite);
951     gest5.ajouter_mg_geometrie(geo3);
952     MG_VOLUME* vol3=new MG_VOLUME_ELEMENT();
953     geo3->ajouter_mg_volume(vol3);
954     MG_MAILLAGE* mg_mai5 = new MG_MAILLAGE(geo3);
955     gest5.ajouter_mg_maillage(mg_mai5);
956     double seuil = 0.6;
957    
958     double longueur = 0.; cpt = 0;
959     for (MG_SEGMENT* mgseg=mg_mai->get_premier_segment(it_segment);mgseg!=NULL;mgseg=mg_mai->get_suivant_segment(it_segment))
960     if (mgseg->get_origine() == MAGIC::ORIGINE::IMPOSE) {longueur = longueur + mgseg->get_longueur(); cpt++;}
961     double dg = longueur/cpt;
962    
963     // Creation du non_design dans le nouveau maillage mg_mai5 et application des conditions aux limites
964     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_sommet();i++)
965     {
966     MG_SOMMET* sommet=mg_mai->get_mg_geometrie()->get_mg_sommet(i);
967     if ((sommet->get_nb_ccf() > 0))
968     {
969     MG_SOMMET_NOEUD* mg_sommet= new MG_SOMMET_NOEUD(NULL);
970     geo3->ajouter_mg_sommet(mg_sommet);
971    
972     for(int j=0;j<sommet->get_lien_maillage()->get_nb();j++)
973     {
974     MG_NOEUD* mgnoeud=(MG_NOEUD*) sommet->get_lien_maillage()->get(j);
975     double x = mgnoeud->get_x();
976     double y = mgnoeud->get_y();
977     double z = mgnoeud->get_z();
978     if ((mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE))
979     {
980     MG_NOEUD* node = new MG_NOEUD(mg_sommet,x,y,z,MAGIC::ORIGINE::IMPOSE);
981     mg_mai5->ajouter_mg_noeud(node);
982     mg_sommet->change_mg_noeud(node);
983     node->change_nouveau_numero(mgnoeud->get_id());
984     mgnoeud->change_nouveau_numero(0);
985    
986     for(int k=0;k<sommet->get_nb_ccf();k++)
987     {
988     char type[2];
989     std::string formulation;
990     sommet->get_type_ccf(k,type);
991     formulation = sommet->get_formulation_ccf(k);
992     if(formulation == "N")
993     {
994     double val=sommet->get_valeur_ccf(k);
995     mg_sommet->ajouter_ccf(type,val);
996     }
997     if(formulation == "I")
998     {
999     unsigned long id=sommet->get_id_ccf(k);
1000     mg_sommet->ajouter_ccf(type,id);
1001     }
1002     if(formulation == "F")
1003     {
1004     std::vector<std::string> listvariable;
1005     std::string formule;
1006     formule = sommet->get_formule_ccf(k);
1007     for(int l=0;sommet->get_formule_nb_variable(k);l++)
1008     listvariable.push_back(sommet->get_formule_variable(k,l));
1009     mg_sommet->ajouter_ccf(type,formule,listvariable);
1010     }
1011     }
1012     }
1013     }
1014     }
1015     }
1016    
1017     // Creation des noeuds du non_design
1018     for(MG_NOEUD* mgnoeud=lstnod.get_premier(it_lstnod);mgnoeud;mgnoeud=lstnod.get_suivant(it_lstnod))
1019     if ((mgnoeud->get_nouveau_numero() != 0))
1020     {
1021     double x = mgnoeud->get_x();
1022     double y = mgnoeud->get_y();
1023     double z = mgnoeud->get_z();
1024     MG_NOEUD* node = new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::IMPOSE);
1025     node->change_nouveau_numero(mgnoeud->get_id());
1026     mg_mai5->ajouter_mg_noeud(node);
1027     }
1028    
1029     TPL_MAP_ENTITE<MG_NOEUD*> noeuds_intersection2;
1030     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR inointer2;
1031     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1032     if (mgno->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1033     {
1034     int comp = 0;
1035     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1036     {
1037     MG_SEGMENT* mgseg = mgno->get_lien_segment()->get(i);
1038     if (mgseg->get_noeud1()->get_origine() == MAGIC::ORIGINE::IMPOSE) comp++;
1039     if (mgseg->get_noeud2()->get_origine() == MAGIC::ORIGINE::IMPOSE) comp++;
1040     }
1041     if (comp == 0)
1042     noeuds_intersection2.ajouter(mgno);
1043     }
1044    
1045     // Creation des noeuds dans le nouveau maillage mg_mai5
1046     for (MG_NOEUD* mgno=noeuds_intersection2.get_premier(inointer2);mgno;mgno=noeuds_intersection2.get_suivant(inointer2))
1047     {
1048     MG_NOEUD* node = mg_mai5->ajouter_mg_noeud(NULL,mgno->get_x(),mgno->get_y(),mgno->get_z(),mgno->get_origine());
1049     node->change_nouveau_numero(mgno->get_nouveau_numero());
1050     node->change_solution(mgno->get_solution());
1051     }
1052    
1053     // Creation des poutres jonction(sur le squelette)-extremite(sur le non_design) dans le nouveau maillage mg_mai5
1054     for (MG_SEGMENT* mgseg=mg_mai4->get_premier_segment(itseg);mgseg!=NULL;mgseg=mg_mai4->get_suivant_segment(itseg))
1055     if ((mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE)) mgseg->change_nouveau_numero(100);
1056    
1057     // Creation des poutres noeuds squelette-squelette et maillage
1058     LISTE_MG_NOEUD::iterator itnoeu;
1059     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1060     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1061     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1062     if ((mgnoeud->get_origine() == MAGIC::ORIGINE::SQUELETTE))
1063     {
1064     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1065     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1066     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1067     {
1068     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1069     if (seg_i->get_nouveau_numero() != 0)
1070     {
1071     MG_NOEUD* no1 = seg_i->get_noeud1();
1072     MG_NOEUD* no2 = seg_i->get_noeud2();
1073     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1074     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1075     }
1076     seg_i->change_nouveau_numero(0);
1077     }
1078     lstno_temp.supprimer(mgno);
1079    
1080     for(MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1081     for (MG_NOEUD* mgnoeud2=mg_mai5->get_premier_noeud(itnoeu);mgnoeud2!=NULL;mgnoeud2=mg_mai5->get_suivant_noeud(itnoeu))
1082     if (((mgno2->get_x() == mgnoeud2->get_x()) && (mgno2->get_y() == mgnoeud2->get_y()) && (mgno2->get_z() == mgnoeud2->get_z())))
1083     {
1084     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1085     geo3->ajouter_mg_poutre(mg_poutre);
1086    
1087    
1088     //Maillage des poutres
1089     MG_NOEUD* node = NULL;
1090     MG_NOEUD* node2 = NULL;
1091     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud2->get_coord());
1092     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1093     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1094     int nbre = vec1.get_longueur()/longueur_reelle;
1095    
1096     if (nbre <= 1) nbre=2;
1097     for (int k=1;k<nbre;k++)
1098     {
1099     if (k == 1)
1100     {
1101     double x = mgnoeud->get_x()+k*(mgnoeud2->get_x()-mgnoeud->get_x())/nbre;
1102     double y = mgnoeud->get_y()+k*(mgnoeud2->get_y()-mgnoeud->get_y())/nbre;
1103     double z = mgnoeud->get_z()+k*(mgnoeud2->get_z()-mgnoeud->get_z())/nbre;
1104     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1105     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1106     mg_poutre->ajouter_element(seg);
1107     seg->change_solution(mgno2->get_solution());
1108     node = node2;
1109     }
1110     if (k > 1)
1111     {
1112     double x = mgnoeud->get_x()+k*(mgnoeud2->get_x()-mgnoeud->get_x())/nbre;
1113     double y = mgnoeud->get_y()+k*(mgnoeud2->get_y()-mgnoeud->get_y())/nbre;
1114     double z = mgnoeud->get_z()+k*(mgnoeud2->get_z()-mgnoeud->get_z())/nbre;
1115     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1116     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1117     mg_poutre->ajouter_element(seg);
1118     seg->change_solution(mgno2->get_solution());
1119     node = node2;
1120     }
1121     }
1122     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud2,MAGIC::ORIGINE::SQUELETTE);
1123     mg_poutre->ajouter_element(seg);
1124     seg->change_solution(mgno2->get_solution());
1125    
1126     /*
1127     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,mgnoeud2,MAGIC::ORIGINE::SQUELETTE);
1128     mg_poutre->ajouter_element(seg);
1129     seg->change_solution(mgno2->get_solution());
1130     */
1131    
1132     mg_poutre->ajouter_ccf((char*)"Em",210e9);
1133     mg_poutre->ajouter_ccf((char*)"nu",0.3);
1134     mg_poutre->ajouter_ccf((char*)"Rr",seuil*seg->get_solution());
1135     mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1136     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1137     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1138     }
1139     }
1140    
1141     // Creation des poutres noeuds squelette-non_design et maillage
1142     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1143     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
1144     {
1145     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1146     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1147     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1148     {
1149     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1150     if (seg_i->get_nouveau_numero() != 0)
1151     {
1152     MG_NOEUD* no1 = seg_i->get_noeud1();
1153     MG_NOEUD* no2 = seg_i->get_noeud2();
1154     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1155     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1156     }
1157     seg_i->change_nouveau_numero(0);
1158     }
1159     lstno_temp.supprimer(mgno);
1160    
1161     if (lstno_temp.get_nb() > 0)
1162     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1163     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1164     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1165     {
1166     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
1167     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
1168     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
1169     {
1170     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
1171     MG_NOEUD* no1 = seg_i->get_noeud1();
1172     MG_NOEUD* no2 = seg_i->get_noeud2();
1173     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1174     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1175     }
1176     lstno_temp1.supprimer(mgno2);
1177    
1178     for (MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
1179     for (MG_NOEUD* mgnoeud3=mg_mai5->get_premier_noeud(itnoeu);mgnoeud3!=NULL;mgnoeud3=mg_mai5->get_suivant_noeud(itnoeu))
1180     if ((mgno3->get_x() == mgnoeud3->get_x()) && (mgno3->get_y() == mgnoeud3->get_y()) && (mgno3->get_z() == mgnoeud3->get_z()))
1181     {
1182     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1183     geo3->ajouter_mg_poutre(mg_poutre);
1184    
1185    
1186     //Maillage des poutres
1187     MG_NOEUD* node = NULL;
1188     MG_NOEUD* node2 = NULL;
1189     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud3->get_coord());
1190     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1191     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1192     int nbre = vec1.get_longueur()/longueur_reelle;
1193    
1194     if (nbre <= 1) nbre=2;
1195     for (int k=1;k<nbre;k++)
1196     {
1197     if (k == 1)
1198     {
1199     double x = mgnoeud->get_x()+k*(mgnoeud3->get_x()-mgnoeud->get_x())/nbre;
1200     double y = mgnoeud->get_y()+k*(mgnoeud3->get_y()-mgnoeud->get_y())/nbre;
1201     double z = mgnoeud->get_z()+k*(mgnoeud3->get_z()-mgnoeud->get_z())/nbre;
1202     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1203     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1204     mg_poutre->ajouter_element(seg);
1205     seg->change_solution(mgno3->get_solution());
1206     node = node2;
1207     }
1208     if (k > 1)
1209     {
1210     double x = mgnoeud->get_x()+k*(mgnoeud3->get_x()-mgnoeud->get_x())/nbre;
1211     double y = mgnoeud->get_y()+k*(mgnoeud3->get_y()-mgnoeud->get_y())/nbre;
1212     double z = mgnoeud->get_z()+k*(mgnoeud3->get_z()-mgnoeud->get_z())/nbre;
1213     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1214     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1215     mg_poutre->ajouter_element(seg);
1216     seg->change_solution(mgno3->get_solution());
1217     node = node2;
1218     }
1219     }
1220     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud3,MAGIC::ORIGINE::SQUELETTE);
1221     mg_poutre->ajouter_element(seg);
1222     seg->change_solution(mgno3->get_solution());
1223    
1224     mg_poutre->ajouter_ccf((char*)"Em",210e9);
1225     mg_poutre->ajouter_ccf((char*)"nu",0.3);
1226     mg_poutre->ajouter_ccf((char*)"Rr",seuil*seg->get_solution());
1227     mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1228     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1229     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1230     }
1231     }
1232     }
1233    
1234     // Creation des poutres noeuds non_design-non_design et maillage
1235     for (MG_NOEUD* mgno=mg_mai4->get_premier_noeud(it_noeu);mgno!=NULL;mgno=mg_mai4->get_suivant_noeud(it_noeu))
1236     if ((mgno->get_origine() == MAGIC::ORIGINE::IMPOSE))
1237     {
1238     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp;
1239     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp;
1240     for (int i=0;i<mgno->get_lien_segment()->get_nb();i++)
1241     {
1242     MG_SEGMENT* seg_i = mgno->get_lien_segment()->get(i);
1243     if (seg_i->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1244     {
1245     MG_NOEUD* no1 = seg_i->get_noeud1();
1246     MG_NOEUD* no2 = seg_i->get_noeud2();
1247     if (no1->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1248     if (no2->get_origine() == MAGIC::ORIGINE::SQUELETTE) {lstno_temp.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1249     }
1250     }
1251     lstno_temp.supprimer(mgno);
1252    
1253     if (lstno_temp.get_nb() > 0)
1254     for (MG_NOEUD* mgno2=lstno_temp.get_premier(it_lstno_temp);mgno2;mgno2=lstno_temp.get_suivant(it_lstno_temp))
1255     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1256     if ((mgno->get_x() == mgnoeud->get_x()) && (mgno->get_y() == mgnoeud->get_y()) && (mgno->get_z() == mgnoeud->get_z()))
1257     {
1258     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp1;
1259     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp1;
1260     for (int i=0;i<mgno2->get_lien_segment()->get_nb();i++)
1261     {
1262     MG_SEGMENT* seg_i = mgno2->get_lien_segment()->get(i);
1263     if (seg_i->get_nouveau_numero() != 0)
1264     {
1265     MG_NOEUD* no1 = seg_i->get_noeud1();
1266     MG_NOEUD* no2 = seg_i->get_noeud2();
1267     if ((no1->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no1); no1->change_solution(seg_i->get_solution());}
1268     if ((no2->get_origine() == MAGIC::ORIGINE::SQUELETTE)) {lstno_temp1.ajouter(no2); no2->change_solution(seg_i->get_solution());}
1269     }
1270     seg_i->change_nouveau_numero(0);
1271     }
1272     lstno_temp1.supprimer(mgno2);
1273    
1274     if (lstno_temp1.get_nb() > 0)
1275     for(MG_NOEUD* mgno3=lstno_temp1.get_premier(it_lstno_temp1);mgno3;mgno3=lstno_temp1.get_suivant(it_lstno_temp1))
1276     {
1277     TPL_MAP_ENTITE<MG_NOEUD*> lstno_temp2;
1278     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it_lstno_temp2;
1279     for (int i=0;i<mgno3->get_lien_segment()->get_nb();i++)
1280     {
1281     MG_SEGMENT* seg_j = mgno3->get_lien_segment()->get(i);
1282     MG_NOEUD* no1 = seg_j->get_noeud1();
1283     MG_NOEUD* no2 = seg_j->get_noeud2();
1284     if (no1->get_origine() == MAGIC::ORIGINE::IMPOSE) lstno_temp2.ajouter(no1);
1285     if (no2->get_origine() == MAGIC::ORIGINE::IMPOSE) lstno_temp2.ajouter(no2);
1286     }
1287     lstno_temp2.supprimer(mgno3);
1288    
1289     if (lstno_temp2.get_nb() > 0)
1290     for (MG_NOEUD* mgno4=lstno_temp2.get_premier(it_lstno_temp2);mgno4;mgno4=lstno_temp2.get_suivant(it_lstno_temp2))
1291     for (MG_NOEUD* mgnoeud4=mg_mai5->get_premier_noeud(itnoeu);mgnoeud4!=NULL;mgnoeud4=mg_mai5->get_suivant_noeud(itnoeu))
1292     if ((mgno4->get_x() == mgnoeud4->get_x()) && (mgno4->get_y() == mgnoeud4->get_y()) && (mgno4->get_z() == mgnoeud4->get_z()))
1293     {
1294     MG_POUTRE_ELEMENT* mg_poutre=new MG_POUTRE_ELEMENT();
1295     geo3->ajouter_mg_poutre(mg_poutre);
1296    
1297    
1298     // Maillage
1299     MG_NOEUD* node = NULL;
1300     MG_NOEUD* node2 = NULL;
1301     OT_VECTEUR_3D vec1(mgnoeud->get_coord(),mgnoeud4->get_coord());
1302     int nbre_temp = vec1.get_longueur()/(coef_dg*dg);
1303     double longueur_reelle = vec1.get_longueur()/nbre_temp;
1304     int nbre = vec1.get_longueur()/longueur_reelle;
1305    
1306     if (nbre <= 1) nbre=2;
1307     for (int k=1;k<nbre;k++)
1308     {
1309     if (k == 1)
1310     {
1311     double x = mgnoeud->get_x()+k*(mgnoeud4->get_x()-mgnoeud->get_x())/nbre;
1312     double y = mgnoeud->get_y()+k*(mgnoeud4->get_y()-mgnoeud->get_y())/nbre;
1313     double z = mgnoeud->get_z()+k*(mgnoeud4->get_z()-mgnoeud->get_z())/nbre;
1314     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1315     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,mgnoeud,node2,MAGIC::ORIGINE::SQUELETTE);
1316     mg_poutre->ajouter_element(seg);
1317     seg->change_solution(mgno3->get_solution());
1318     node = node2;
1319     }
1320     if (k > 1)
1321     {
1322     double x = mgnoeud->get_x()+k*(mgnoeud4->get_x()-mgnoeud->get_x())/nbre;
1323     double y = mgnoeud->get_y()+k*(mgnoeud4->get_y()-mgnoeud->get_y())/nbre;
1324     double z = mgnoeud->get_z()+k*(mgnoeud4->get_z()-mgnoeud->get_z())/nbre;
1325     node2 = mg_mai5->ajouter_mg_noeud(NULL,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1326     MG_SEGMENT* seg=mg_mai5->ajouter_mg_segment(mg_poutre,node,node2,MAGIC::ORIGINE::SQUELETTE);
1327     mg_poutre->ajouter_element(seg);
1328     seg->change_solution(mgno3->get_solution());
1329     node = node2;
1330     }
1331     }
1332     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_poutre,node2,mgnoeud4,MAGIC::ORIGINE::SQUELETTE);
1333     mg_poutre->ajouter_element(seg);
1334     seg->change_solution(mgno3->get_solution());
1335    
1336     mg_poutre->ajouter_ccf((char*)"Em",210e9);
1337     mg_poutre->ajouter_ccf((char*)"nu",0.3);
1338     mg_poutre->ajouter_ccf((char*)"Rr",seuil*seg->get_solution());
1339     mg_poutre->ajouter_ccf((char*)"Cx",1.05);
1340     mg_poutre->ajouter_ccf((char*)"Cy",1.05);
1341     mg_poutre->ajouter_ccf((char*)"Cz",1.05);
1342     }
1343     }
1344     }
1345     }
1346    
1347     // Creation du non_design avec les ccf
1348     TPL_MAP_ENTITE<MG_SEGMENT*> lstseg2;
1349     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR it_lstseg2;
1350     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_arete();i++)
1351     {
1352     MG_ARETE* arete=mg_mai->get_mg_geometrie()->get_mg_arete(i);
1353     if (arete->get_nb_ccf() > 0)
1354     {
1355     MG_ARETE_ELEMENT* mg_arete=new MG_ARETE_ELEMENT();
1356     geo3->ajouter_mg_arete(mg_arete);
1357    
1358     for(int j=0;j<arete->get_lien_maillage()->get_nb();j++)
1359     {
1360     MG_SEGMENT* mgsegment=(MG_SEGMENT*) arete->get_lien_maillage()->get(j);
1361     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
1362     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
1363     MG_NOEUD* no1 = NULL;
1364     MG_NOEUD* no2 = NULL;
1365    
1366     if ((mgsegment->get_origine() == MAGIC::ORIGINE::IMPOSE))
1367     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(it_noeu))
1368     {
1369     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1370     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1371     lstseg2.ajouter(mgsegment);
1372     }
1373     if ((no1 != NULL) && (no2 != NULL) && (no2 != NULL))
1374     {
1375     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(mg_arete,no1,no2,MAGIC::ORIGINE::IMPOSE);
1376     mg_arete->ajouter_element(seg);
1377     seg->change_nouveau_numero(mgsegment->get_id());
1378     }
1379    
1380     for(int k=0;k<arete->get_nb_ccf();k++)
1381     {
1382     std::string formulation;
1383     char type[2];
1384     arete->get_type_ccf(k,type);
1385     formulation = arete->get_formulation_ccf(k);
1386     if (formulation == "N")
1387     {
1388     double val=arete->get_valeur_ccf(k);
1389     mg_arete->ajouter_ccf(type,val);
1390     }
1391     if (formulation == "I")
1392     {
1393     unsigned long id=arete->get_id_ccf(k);
1394     mg_arete->ajouter_ccf(type,id);
1395     }
1396     if (formulation == "F")
1397     {
1398     std::vector<std::string> listvariable;
1399     std::string formule;
1400     formule = arete->get_formule_ccf(k);
1401     for (int l=0;arete->get_formule_nb_variable(k);l++)
1402     listvariable.push_back(arete->get_formule_variable(k,l));
1403     mg_arete->ajouter_ccf(type,formule,listvariable);
1404     }
1405     }
1406     }
1407     }
1408     }
1409     for(MG_SEGMENT* mgsegment=lstseg.get_premier(it_lstseg);mgsegment;mgsegment=lstseg.get_suivant(it_lstseg))
1410     if (lstseg2.existe(mgsegment) != 1)
1411     {
1412     MG_NOEUD* noeud1 = mgsegment->get_noeud1();
1413     MG_NOEUD* noeud2 = mgsegment->get_noeud2();
1414     MG_NOEUD* no1 = NULL;
1415     MG_NOEUD* no2 = NULL;
1416     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(it_noeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(it_noeu))
1417     {
1418     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1419     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1420     }
1421     MG_SEGMENT* seg = mg_mai5->ajouter_mg_segment(NULL,no1,no2,MAGIC::ORIGINE::IMPOSE);
1422     }
1423    
1424     for (int i=0;i<mg_mai->get_mg_geometrie()->get_nb_mg_face();i++)
1425     {
1426     MG_FACE* face=mg_mai->get_mg_geometrie()->get_mg_face(i);
1427     if ((face->get_nb_ccf() > 0))
1428     {
1429     MG_FACE_ELEMENT* mg_face=new MG_FACE_ELEMENT();
1430     geo3->ajouter_mg_face(mg_face);
1431    
1432     for(int j=0;j<face->get_lien_maillage()->get_nb();j++)
1433     {
1434     MG_TRIANGLE* mgtri=(MG_TRIANGLE*) face->get_lien_maillage()->get(j);
1435     MG_NOEUD* noeud1 = mgtri->get_noeud1();
1436     MG_NOEUD* noeud2 = mgtri->get_noeud2();
1437     MG_NOEUD* noeud3 = mgtri->get_noeud3();
1438     MG_NOEUD* no1 = NULL;
1439     MG_NOEUD* no2 = NULL;
1440     MG_NOEUD* no3 = NULL;
1441    
1442     if ((mgtri->get_origine() == MAGIC::ORIGINE::IMPOSE))
1443     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1444     {
1445     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1446     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1447     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1448     }
1449     if ((no1 != NULL) && (no2 != NULL) && (no2 != NULL))
1450     {
1451     MG_TRIANGLE* tri = mg_mai5->ajouter_mg_triangle(mg_face,no1,no2,no3,MAGIC::ORIGINE::IMPOSE);
1452     mg_face->ajouter_element(tri);
1453     tri->change_nouveau_numero(mgtri->get_id());
1454     mgtri->change_nouveau_numero(0);
1455     }
1456    
1457     for(int k=0;k<face->get_nb_ccf();k++)
1458     {
1459     std::string formulation;
1460     char type[2];
1461     face->get_type_ccf(k,type);
1462     formulation = face->get_formulation_ccf(k);
1463     if (formulation == "N")
1464     {
1465     double val=face->get_valeur_ccf(k);
1466     mg_face->ajouter_ccf(type,val);
1467     }
1468     if (formulation == "I")
1469     {
1470     unsigned long id=face->get_id_ccf(k);
1471     mg_face->ajouter_ccf(type,id);
1472     }
1473     if (formulation == "F")
1474     {
1475     std::vector<std::string> listvariable;
1476     std::string formule;
1477     formule = face->get_formule_ccf(k);
1478     for (int l=0;face->get_formule_nb_variable(k);l++)
1479     listvariable.push_back(face->get_formule_variable(k,l));
1480     mg_face->ajouter_ccf(type,formule,listvariable);
1481     }
1482     }
1483     }
1484     }
1485     }
1486     for(MG_TRIANGLE* mgtri=lsttri.get_premier(it_lsttri);mgtri;mgtri=lsttri.get_suivant(it_lsttri))
1487     if (mgtri->get_nouveau_numero() != 0)
1488     {
1489     MG_NOEUD* noeud1 = mgtri->get_noeud1();
1490     MG_NOEUD* noeud2 = mgtri->get_noeud2();
1491     MG_NOEUD* noeud3 = mgtri->get_noeud3();
1492     MG_NOEUD* no1 = NULL;
1493     MG_NOEUD* no2 = NULL;
1494     MG_NOEUD* no3 = NULL;
1495     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1496     {
1497     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1498     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1499     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1500     }
1501     MG_TRIANGLE* tri = mg_mai5->ajouter_mg_triangle(NULL,no1,no2,no3,MAGIC::ORIGINE::IMPOSE);
1502     }
1503     for(MG_TETRA* mgtet=lsttet.get_premier(it_lsttet);mgtet;mgtet=lsttet.get_suivant(it_lsttet))
1504     {
1505     MG_NOEUD* noeud1 = mgtet->get_noeud1();
1506     MG_NOEUD* noeud2 = mgtet->get_noeud2();
1507     MG_NOEUD* noeud3 = mgtet->get_noeud3();
1508     MG_NOEUD* noeud4 = mgtet->get_noeud4();
1509     MG_NOEUD* no1 = NULL;
1510     MG_NOEUD* no2 = NULL;
1511     MG_NOEUD* no3 = NULL;
1512     MG_NOEUD* no4 = NULL;
1513     for (MG_NOEUD* mgnoeud=mg_mai5->get_premier_noeud(itnoeu);mgnoeud!=NULL;mgnoeud=mg_mai5->get_suivant_noeud(itnoeu))
1514     if (mgnoeud->get_origine() == MAGIC::ORIGINE::IMPOSE)
1515     {
1516     if (mgnoeud->get_nouveau_numero() == noeud1->get_id()) no1 = mgnoeud;
1517     if (mgnoeud->get_nouveau_numero() == noeud2->get_id()) no2 = mgnoeud;
1518     if (mgnoeud->get_nouveau_numero() == noeud3->get_id()) no3 = mgnoeud;
1519     if (mgnoeud->get_nouveau_numero() == noeud4->get_id()) no4 = mgnoeud;
1520     }
1521     MG_TETRA* tet = mg_mai5->ajouter_mg_tetra(vol3,no1,no2,no3,no4,MAGIC::ORIGINE::IMPOSE);
1522     }
1523    
1524     FEM_MAILLAGE *fem3=new FEM_MAILLAGE(geo3,mg_mai5,1);
1525     gest5.ajouter_fem_maillage(fem3);
1526     fem3->construire();
1527     vol3->ajouter_ccf((char*)"Em",210e9);
1528     vol3->ajouter_ccf((char*)"nu",0.3);
1529    
1530     /*
1531     // Solution des sections pour visualisation dans gmsh
1532     MG_SOLUTION* mgsquel3=new MG_SOLUTION(mg_mai5,1,(char*)"Carte_sections3.sol",mg_mai5->get_nb_mg_segment(),"Taille",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT1,MAGIC::TYPE_SOLUTION::SCALAIRE);
1533     gest5.ajouter_mg_solution(mgsquel3);
1534     mgsquel3->change_legende(0,"des_sections3");
1535     int t = 0;
1536     LISTE_MG_SEGMENT::iterator it_mgseg;
1537     for (MG_SEGMENT* mgseg=mg_mai5->get_premier_segment(it_mgseg);mgseg!=NULL;mgseg=mg_mai5->get_suivant_segment(it_mgseg))
1538     {
1539     mgsquel3->ecrire(seuil*mgseg->get_solution(),t,0);
1540     t++;
1541     }
1542     */
1543    
1544     // Enregistrement du squelette3 dans le gestionnaire3
1545     nomsortie[500];
1546     sprintf(nomsortie,"%s_squelette%d.magic",nomgestsqout,3);
1547     gest5.enregistrer(nomsortie);
1548     cout << "Enregistrement squelette 3 " << endl;
1549    
1550    
1551     double volume_reconstruit = 0.;
1552     LISTE_MG_SEGMENT::iterator it_mgeg;
1553     for (MG_SEGMENT* mgseg=mg_mai5->get_premier_segment(it_mgeg);mgseg!=NULL;mgseg=mg_mai5->get_suivant_segment(it_mgeg))
1554     if (mgseg->get_origine() == MAGIC::ORIGINE::SQUELETTE)
1555     volume_reconstruit = volume_reconstruit + M_PI*seuil*mgseg->get_solution()*seuil*mgseg->get_solution()*unite*mgseg->get_longueur();
1556     cout << "volume de design reconstruit = " << volume_reconstruit << endl;
1557    
1558    
1559     }