ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 883
Committed: Thu Apr 20 13:38:18 2017 UTC (8 years ago) by francois
File size: 72231 byte(s)
Log Message:
Creation d'un mailleur FEM pour pouvoir avoir des stratégies paramétrées de maillage. L'ancienne méthode construit disparait et est remplacée par l'utilisation d'un MAILLEUR_FEM.
Stratégie de quadratisation mise en place : déplacer les noeuds pour s'assurer que les tetras quadratiques présentent une distortion au dessu d'une borne inférieure. Mais ces noeuds quittent la géométrie.

Les paramètres dans ~/.magic.

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