ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 842
Committed: Fri Oct 14 19:18:28 2016 UTC (8 years, 10 months ago) by nana
File size: 66971 byte(s)
Log Message:
Modif commit precedent

File Contents

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