ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months, 1 week ago) by francois
File size: 73334 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

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