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