ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/reconstruction/src/rec_squelette.cpp
Revision: 846
Committed: Wed Oct 26 18:58:03 2016 UTC (8 years, 10 months ago) by nana
File size: 68932 byte(s)
Log Message:
Modif squelettisation

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