ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_maillage.cpp
Revision: 195
Committed: Thu Jul 16 22:05:49 2009 UTC (15 years, 10 months ago) by francois
Original Path: magic/lib/geometrie/geometrie/src/mg_maillage.cpp
File size: 57282 byte(s)
Log Message:
Ajout de groupe de topologie pour appliquer des algos sur une partie du fichier magic seulement
Ajout de methode qui permette de connaitre la topologie sous jacente a une topologie donnee
Gestion des maillages FEM qui ne sont attaches a une geometrie

File Contents

# User Rev Content
1 francois 35 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4 francois 195 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6 francois 35 //------------------------------------------------------------
7 francois 195 // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11 francois 35 // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mg_maillage.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20 francois 195 // Version du 02/03/2006 � 11H22
21 francois 35 //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <fstream>
27     #include <iostream>
28    
29    
30     #include "mg_maillage.h"
31     #include "mg_gestionnaire.h"
32     #include "mt_gestionnaire.h"
33     #include "mt_propriete.h"
34     #include "mt_materiau.h"
35     #include "tpl_map_entite.h"
36     //#include "message.h"
37    
38    
39    
40 francois 195 int MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=0;
41 francois 35
42    
43     MG_MAILLAGE::MG_MAILLAGE(MG_GEOMETRIE* geo):MG_IDENTIFICATEUR(),mg_geometrie(geo)
44     {
45     }
46    
47     MG_MAILLAGE::MG_MAILLAGE(unsigned long num,MG_GEOMETRIE* geo):MG_IDENTIFICATEUR(num),mg_geometrie(geo)
48     {
49     }
50    
51     MG_MAILLAGE* MG_MAILLAGE::dupliquer(MG_GESTIONNAIRE* gest)
52     {
53     MG_MAILLAGE* mgmai=new MG_MAILLAGE(this->get_mg_geometrie());
54     gest->ajouter_mg_maillage(mgmai);
55     long decalage=mgmai->get_id()-this->get_id();
56     LISTE_ENTITE::const_iterator i;
57     // D'abord les noeuds (les segments en dependent)
58     LISTE_MG_NOEUD::iterator itNo;
59     for (MG_NOEUD * noeud = get_premier_noeud(itNo); noeud; noeud=get_suivant_noeud(itNo))
60     noeud->dupliquer(mgmai,decalage);
61     // Ensuite les segments (les triangles en dependent)
62     LISTE_MG_SEGMENT::iterator itSeg;
63     for (MG_SEGMENT * segment = get_premier_segment(itSeg); segment; segment=get_suivant_segment(itSeg))
64     segment->dupliquer(mgmai,decalage);
65     // Ensuite les triangles (les tetra en dependent)
66     LISTE_MG_TRIANGLE::iterator itTri;
67     for (MG_TRIANGLE * triangle = get_premier_triangle(itTri); triangle; triangle=get_suivant_triangle(itTri))
68     triangle->dupliquer(mgmai,decalage);
69     // Pour finir les tetra
70     LISTE_MG_TETRA::iterator itTetra;
71     for (MG_TETRA * tetra = get_premier_tetra(itTetra); tetra; tetra=get_suivant_tetra(itTetra))
72     tetra->dupliquer(mgmai,decalage);
73 francois 195 /* bug quand l'identificateur d'un triangle pr�c�de celui de ses segments
74 francois 35 for (i=lst_entite.begin();i!=lst_entite.end();i++)
75     {
76     MG_ELEMENT_MAILLAGE& ele=(MG_ELEMENT_MAILLAGE&)(*(*i));
77     ele.dupliquer(mgmai,decalage);
78     }*/
79     int nb_segment = get_nb_mg_segment();
80     int nb_triangle = get_nb_mg_triangle();
81     int nb_tetra = get_nb_mg_tetra();
82    
83     for (MG_TRIANGLE * triangle = get_premier_triangle(itTri); triangle; triangle=get_suivant_triangle(itTri))
84     {
85     MG_TRIANGLE * triangle2 = mgmai->get_mg_triangleid(triangle->get_id()+decalage);
86    
87     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra = triangle->get_lien_tetra();
88     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra2 = triangle2->get_lien_tetra();
89     for (int it_tetra = 0; it_tetra != lst_lien_tetra->get_nb(); it_tetra++)
90     {
91     MG_TETRA * t = lst_lien_tetra->get(it_tetra);
92     MG_TETRA * t2 = mgmai->get_mg_tetraid( t->get_id() + decalage );
93    
94     lst_lien_tetra2->ajouter ( t2 );
95     }
96     }
97    
98     for (MG_SEGMENT * segment = get_premier_segment(itSeg); segment; segment=get_suivant_segment(itSeg))
99     {
100     MG_SEGMENT * segment2 = mgmai->get_mg_segmentid(segment->get_id()+decalage);
101    
102     TPL_LISTE_ENTITE<MG_TRIANGLE*> * lst_lien_triangle = segment->get_lien_triangle();
103     TPL_LISTE_ENTITE<MG_TRIANGLE*> * lst_lien_triangle2 = segment2->get_lien_triangle();
104     for (int it_triang = 0; it_triang != lst_lien_triangle->get_nb(); it_triang++)
105     {
106     MG_TRIANGLE * t = lst_lien_triangle->get(it_triang);
107     MG_TRIANGLE * t2 = mgmai->get_mg_triangleid( t->get_id() + decalage );
108    
109     lst_lien_triangle2->ajouter ( t2 );
110     }
111     }
112    
113     for (MG_NOEUD * n = get_premier_noeud(itNo); n; n=get_suivant_noeud(itNo))
114     {
115     MG_NOEUD * n2 = mgmai->get_mg_noeudid(n->get_id()+decalage);
116    
117     if (nb_segment != 0)
118     {
119     TPL_LISTE_ENTITE<MG_SEGMENT*> * lst_lien_segment = n->get_lien_segment();
120     TPL_LISTE_ENTITE<MG_SEGMENT*> * lst_lien_segment2 = n2->get_lien_segment();
121     for (int it_seg = 0; it_seg != lst_lien_segment->get_nb(); it_seg++)
122     {
123     MG_SEGMENT * seg = lst_lien_segment->get(it_seg);
124     MG_SEGMENT * seg2 = mgmai->get_mg_segmentid( seg->get_id() + decalage );
125    
126     lst_lien_segment2->ajouter ( seg2 );
127     }
128    
129     TPL_LISTE_ENTITE< MG_SEGMENT*> * lst_lien_petit_segment = n->get_lien_petit_segment();
130     TPL_LISTE_ENTITE< MG_SEGMENT*> * lst_lien_petit_segment2 = n2->get_lien_petit_segment();
131     for (int it_seg = 0; it_seg != lst_lien_petit_segment->get_nb(); it_seg++)
132     {
133     MG_SEGMENT * seg = lst_lien_petit_segment->get(it_seg);
134     MG_SEGMENT * seg2 = mgmai->get_mg_segmentid( seg->get_id() + decalage );
135    
136     lst_lien_petit_segment2->ajouter ( seg2 );
137     }
138     }
139    
140     if (nb_triangle != 0)
141     {
142     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_triangle = n->get_lien_triangle();
143     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_triangle2 = n2->get_lien_triangle();
144     for (int it_triang = 0; it_triang != lst_lien_triangle->get_nb(); it_triang++)
145     {
146     MG_TRIANGLE * t = lst_lien_triangle->get(it_triang);
147     MG_TRIANGLE * t2 = mgmai->get_mg_triangleid( t->get_id() + decalage );
148    
149     lst_lien_triangle2->ajouter ( t2 );
150     }
151    
152     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_petit_triangle = n->get_lien_petit_triangle();
153     TPL_LISTE_ENTITE< MG_TRIANGLE*> * lst_lien_petit_triangle2 = n2->get_lien_petit_triangle();
154     for (int it_triang = 0; it_triang != lst_lien_petit_triangle->get_nb(); it_triang++)
155     {
156     MG_TRIANGLE * t = lst_lien_petit_triangle->get(it_triang);
157     MG_TRIANGLE * t2 = mgmai->get_mg_triangleid( t->get_id() + decalage );
158    
159     lst_lien_petit_triangle2->ajouter ( t2 );
160     }
161     }
162    
163     if (nb_tetra != 0)
164     {
165     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra = n->get_lien_tetra();
166     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_tetra2 = n2->get_lien_tetra();
167     for (int it_tetra = 0; it_tetra != lst_lien_tetra->get_nb(); it_tetra++)
168     {
169     MG_TETRA * t = lst_lien_tetra->get(it_tetra);
170     MG_TETRA * t2 = mgmai->get_mg_tetraid( t->get_id() + decalage );
171    
172     lst_lien_tetra2->ajouter ( t2 );
173     }
174    
175     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_petit_tetra = n->get_lien_petit_tetra();
176     TPL_LISTE_ENTITE< MG_TETRA*> * lst_lien_petit_tetra2 = n2->get_lien_petit_tetra();
177     for (int it_tetra = 0; it_tetra != lst_lien_petit_tetra->get_nb(); it_tetra++)
178     {
179     MG_TETRA * t = lst_lien_petit_tetra->get(it_tetra);
180     MG_TETRA * t2 = mgmai->get_mg_tetraid( t->get_id() + decalage );
181    
182     lst_lien_petit_tetra2->ajouter ( t2 );
183     }
184     }
185    
186     }
187    
188     return mgmai;
189     }
190    
191    
192     MG_MAILLAGE::~MG_MAILLAGE()
193     {
194     supprimer_tout_mg_tetra();
195     supprimer_tout_mg_triangle();
196     supprimer_tout_mg_segment();
197     supprimer_tout_mg_noeud();
198     }
199    
200     MG_GEOMETRIE* MG_MAILLAGE::get_mg_geometrie(void)
201     {
202     return mg_geometrie;
203     }
204    
205    
206     void MG_MAILLAGE::change_gestionnaire(MG_GESTIONNAIRE* mggest)
207     {
208     gest=mggest;
209     }
210    
211     // ENTITE MG_NOEUD
212     MG_NOEUD* MG_MAILLAGE::ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE* topo,double xx,double yy,double zz,int origine,unsigned long num)
213     {
214     MG_NOEUD* mgnoeud;
215     if (num==0) mgnoeud=new MG_NOEUD(topo,xx,yy,zz,origine); else mgnoeud=new MG_NOEUD(num,topo,xx,yy,zz,origine);
216     int resultat = ajouter_mg_noeud(mgnoeud);
217     if (resultat==FAIL)
218     {
219     delete mgnoeud;
220     return NULL;
221     }
222     return mgnoeud;
223     }
224    
225     int MG_MAILLAGE::ajouter_mg_noeud(MG_NOEUD *mgnoeud)
226     {
227     gest->recherche_bonid(*mgnoeud);
228     MG_IDENTIFICATEUR *id=mgnoeud;
229     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
230     if (!p.second)
231     {
232     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
233     return FAIL;
234     }
235    
236     std::pair<const unsigned long,MG_NOEUD*> tmp(mgnoeud->get_id(),mgnoeud);
237     lst_mg_noeud.insert(tmp);
238     return OK;
239     }
240    
241    
242     MG_NOEUD* MG_MAILLAGE::get_mg_noeudid(unsigned long num)
243     {
244     LISTE_MG_NOEUD::iterator i=lst_mg_noeud.find(num);
245     if (i==lst_mg_noeud.end())
246     {
247     // afficheur << INEXISTE << enderr;
248     return NULL;
249     }
250     return ((*i).second);
251     }
252    
253    
254    
255     MG_NOEUD* MG_MAILLAGE::get_mg_noeud(unsigned int num)
256     {
257     if (!(num<lst_mg_noeud.size()))
258     {
259     // afficheur << INEXISTE << enderr;
260     return NULL;
261     }
262     LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();
263     for (unsigned long j=0;j<num;j++) i++;
264     return ((*i).second);
265     }
266    
267    
268    
269     unsigned int MG_MAILLAGE::get_nb_mg_noeud(void)
270     {
271     return lst_mg_noeud.size();
272     }
273    
274    
275     int MG_MAILLAGE::supprimer_mg_noeudid(unsigned long num)
276     {
277     MG_NOEUD* mgnoeud=get_mg_noeudid(num);
278     if (mgnoeud==NULL)
279     {
280     // afficheur << INEXISTE2 << enderr;
281     return FAIL;
282     }
283     if (mgnoeud->get_lien_segment()->get_nb())
284     {
285     // afficheur << ERRNOEUDSEGMENT << mgnoeud->get_id() << enderr;
286     return FAIL;
287     }
288     if (mgnoeud->get_lien_triangle()->get_nb())
289     {
290     // afficheur << ERRNOEUDTRIANGLE << mgnoeud->get_id() << enderr;
291     return FAIL;
292     }
293     MG_IDENTIFICATEUR* id=mgnoeud;
294     LISTE_ENTITE::iterator i=lst_entite.find(id);
295     lst_entite.erase(i);
296     LISTE_MG_NOEUD::iterator j=lst_mg_noeud.find(num);
297     lst_mg_noeud.erase(j);
298     delete mgnoeud;
299     return OK;
300     }
301    
302    
303     int MG_MAILLAGE::supprimer_mg_noeud(unsigned int num)
304     {
305     MG_NOEUD* mgnoeud=get_mg_noeud(num);
306     if (mgnoeud==NULL)
307     {
308     // afficheur << INEXISTE2 << enderr;
309     return FAIL;
310     }
311     if (mgnoeud->get_lien_segment()->get_nb())
312     {
313     // afficheur << ERRNOEUDSEGMENT << mgnoeud->get_id() << enderr;
314     return FAIL;
315     }
316     if (mgnoeud->get_lien_triangle()->get_nb())
317     {
318     // afficheur << ERRNOEUDTRIANGLE << mgnoeud->get_id() << enderr;
319     return FAIL;
320     }
321     MG_IDENTIFICATEUR* id=mgnoeud;
322     LISTE_ENTITE::iterator i=lst_entite.find(id);
323     lst_entite.erase(i);
324     LISTE_MG_NOEUD::iterator j=lst_mg_noeud.begin();
325     for (unsigned int k=0;k<num;k++) j++;
326     lst_mg_noeud.erase(j);
327     delete mgnoeud;
328     return OK;
329     }
330    
331    
332     void MG_MAILLAGE::supprimer_tout_mg_noeud(void)
333     {
334     while (get_nb_mg_noeud()!=0)
335     {
336     LISTE_MG_NOEUD::iterator j=lst_mg_noeud.begin();
337     MG_NOEUD* mgnoeud=(*j).second;
338     MG_IDENTIFICATEUR* id=mgnoeud;
339     LISTE_ENTITE::iterator i=lst_entite.find(id);
340     lst_entite.erase(i);
341     lst_mg_noeud.erase(j);
342     delete mgnoeud;
343     }
344     }
345    
346    
347     MG_NOEUD* MG_MAILLAGE::get_premier_noeud(LISTE_MG_NOEUD::iterator & it)
348     {
349     it = lst_mg_noeud.begin();
350     if (it == lst_mg_noeud.end())
351     return NULL;
352     return it->second;
353     }
354    
355     MG_NOEUD* MG_MAILLAGE::get_suivant_noeud(LISTE_MG_NOEUD::iterator & it)
356     {
357     it++;
358     if (it == lst_mg_noeud.end())
359     return NULL;
360     return it->second;
361     }
362    
363    
364     // ENTITE MG_SEGMENT
365     MG_SEGMENT* MG_MAILLAGE::ajouter_mg_segment(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,int origine,double longue,unsigned long num)
366     {
367     MG_SEGMENT* mgsegment;
368     if (num==0) mgsegment=new MG_SEGMENT(topo,mgnoeud1,mgnoeud2,origine,longue); else mgsegment=new MG_SEGMENT(num,topo,mgnoeud1,mgnoeud2,origine,longue);
369     int resultat=ajouter_mg_segment(mgsegment);
370     if (resultat==FAIL)
371     {
372     delete mgsegment;
373     return NULL;
374     }
375     return mgsegment;
376     }
377    
378     int MG_MAILLAGE::ajouter_mg_segment(MG_SEGMENT *mgsegment)
379     {
380     gest->recherche_bonid(*mgsegment);
381     MG_IDENTIFICATEUR *id=mgsegment;
382     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
383     if (!p.second)
384     {
385     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
386     return FAIL;
387     }
388    
389     std::pair<const unsigned long,MG_SEGMENT*> tmp(mgsegment->get_id(),mgsegment);
390     lst_mg_segment.insert(tmp);
391     return OK;
392     }
393    
394    
395     MG_SEGMENT* MG_MAILLAGE::get_mg_segmentid(unsigned long num)
396     {
397     LISTE_MG_SEGMENT::iterator i=lst_mg_segment.find(num);
398     if (i==lst_mg_segment.end())
399     {
400     // afficheur << INEXISTE << enderr;
401     return NULL;
402     }
403     return ((*i).second);
404     }
405    
406     MG_SEGMENT* MG_MAILLAGE::get_mg_segment(unsigned long noeud1id,unsigned long noeud2id)
407     {
408     unsigned long id=std::min(noeud1id,noeud2id);
409     MG_NOEUD* noeud=get_mg_noeudid(id);
410     int nb_segment=noeud->get_lien_petit_segment()->get_nb();
411     for (int i=0;i<nb_segment;i++)
412     {
413     MG_SEGMENT* mgsegment=noeud->get_lien_petit_segment()->get(i);
414     if ( (mgsegment->get_noeud1()->get_id()==noeud1id) && (mgsegment->get_noeud2()->get_id()==noeud2id) ) return mgsegment;
415     if ( (mgsegment->get_noeud2()->get_id()==noeud1id) && (mgsegment->get_noeud1()->get_id()==noeud2id) ) return mgsegment;
416     }
417     return NULL;
418     }
419    
420     MG_SEGMENT* MG_MAILLAGE::get_mg_segment(unsigned int num)
421     {
422     if (!(num<lst_mg_segment.size()))
423     {
424     // afficheur << INEXISTE << enderr;
425     return NULL;
426     }
427     LISTE_MG_SEGMENT::iterator i=lst_mg_segment.begin();
428     //for (unsigned long j=0;j<num;j++) i++;
429     std::advance(i,num);
430     return ((*i).second);
431     }
432    
433     MG_SEGMENT* MG_MAILLAGE::get_premier_segment(LISTE_MG_SEGMENT::iterator & it)
434     {
435     it = lst_mg_segment.begin();
436     if (it == lst_mg_segment.end())
437     return NULL;
438     return it->second;
439     }
440    
441     MG_SEGMENT* MG_MAILLAGE::get_suivant_segment(LISTE_MG_SEGMENT::iterator & it)
442     {
443     it++;
444     if (it == lst_mg_segment.end())
445     return NULL;
446     return it->second;
447     }
448    
449     unsigned int MG_MAILLAGE::get_nb_mg_segment(void)
450     {
451     return lst_mg_segment.size();
452     }
453    
454    
455     int MG_MAILLAGE::supprimer_mg_segmentid(unsigned long num)
456     {
457     MG_SEGMENT* mgsegment=get_mg_segmentid(num);
458     if (mgsegment==NULL)
459     {
460     // afficheur << INEXISTE2 << enderr;
461     return FAIL;
462     }
463     MG_IDENTIFICATEUR* id=mgsegment;
464     LISTE_ENTITE::iterator i=lst_entite.find(id);
465     lst_entite.erase(i);
466     LISTE_MG_SEGMENT::iterator j=lst_mg_segment.find(num);
467     lst_mg_segment.erase(j);
468     MG_NOEUD* noeud1=mgsegment->get_noeud1();
469     MG_NOEUD* noeud2=mgsegment->get_noeud2();
470     delete mgsegment;
471     if ((noeud1->get_nb_reference()==0) && (noeud1->get_lien_topologie()->get_dimension()>0)) supprimer_mg_noeudid(noeud1->get_id());
472     if ((noeud2->get_nb_reference()==0) && (noeud2->get_lien_topologie()->get_dimension()>0)) supprimer_mg_noeudid(noeud2->get_id());
473     return OK;
474     }
475    
476    
477     int MG_MAILLAGE::supprimer_mg_segment(unsigned int num)
478     {
479     MG_SEGMENT* mgsegment=get_mg_segment(num);
480     if (mgsegment==NULL)
481     {
482     // afficheur << INEXISTE2 << enderr;
483     return FAIL;
484     }
485     MG_IDENTIFICATEUR* id=mgsegment;
486     LISTE_ENTITE::iterator i=lst_entite.find(id);
487     lst_entite.erase(i);
488     LISTE_MG_SEGMENT::iterator j=lst_mg_segment.begin();
489     for (unsigned int k=0;k<num;k++) j++;
490     lst_mg_segment.erase(j);
491     MG_NOEUD* noeud1=mgsegment->get_noeud1();
492     MG_NOEUD* noeud2=mgsegment->get_noeud2();
493     delete mgsegment;
494     if ((noeud1->get_nb_reference()==0) && (noeud1->get_lien_topologie()->get_dimension()>0)) supprimer_mg_noeudid(noeud1->get_id());
495     if ((noeud2->get_nb_reference()==0) && (noeud2->get_lien_topologie()->get_dimension()>0)) supprimer_mg_noeudid(noeud2->get_id());
496     return OK;
497     }
498    
499    
500     void MG_MAILLAGE::supprimer_tout_mg_segment(void)
501     {
502     while (get_nb_mg_segment()!=0)
503     {
504     LISTE_MG_SEGMENT::iterator j=lst_mg_segment.begin();
505     MG_SEGMENT* mgsegment=(*j).second;
506     MG_IDENTIFICATEUR* id=mgsegment;
507     LISTE_ENTITE::iterator i=lst_entite.find(id);
508     lst_entite.erase(i);
509     lst_mg_segment.erase(j);
510     delete mgsegment;
511     }
512    
513     }
514    
515     // ENTITE MG_TRIANGLE
516    
517     MG_TRIANGLE* MG_MAILLAGE::ajouter_mg_triangle(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,int origine,unsigned long num)
518     {
519     MG_SEGMENT* mgsegment1=get_mg_segment(mgnoeud1->get_id(),mgnoeud2->get_id());
520     MG_SEGMENT* mgsegment2=get_mg_segment(mgnoeud2->get_id(),mgnoeud3->get_id());
521     MG_SEGMENT* mgsegment3=get_mg_segment(mgnoeud3->get_id(),mgnoeud1->get_id());
522     if (mgsegment1==NULL) mgsegment1=ajouter_mg_segment(topo,mgnoeud1,mgnoeud2,origine);
523     if (mgsegment2==NULL) mgsegment2=ajouter_mg_segment(topo,mgnoeud2,mgnoeud3,origine);
524     if (mgsegment3==NULL) mgsegment3=ajouter_mg_segment(topo,mgnoeud3,mgnoeud1,origine);
525     MG_TRIANGLE* mgtriangle;
526     if (num==0) mgtriangle=new MG_TRIANGLE(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,origine);
527     else mgtriangle=new MG_TRIANGLE(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,origine);
528     int resultat=ajouter_mg_triangle(mgtriangle);
529     if (resultat==FAIL)
530     {
531     delete mgtriangle;
532     return NULL;
533     }
534     return mgtriangle;
535     }
536    
537    
538     int MG_MAILLAGE::ajouter_mg_triangle(MG_TRIANGLE *mgtriangle)
539     {
540     gest->recherche_bonid(*mgtriangle);
541     MG_IDENTIFICATEUR *id=mgtriangle;
542     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
543     if (!p.second)
544     {
545     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
546     return FAIL;
547     }
548    
549     std::pair<const unsigned long,MG_TRIANGLE*> tmp(mgtriangle->get_id(),mgtriangle);
550     lst_mg_triangle.insert(tmp);
551     return OK;
552     }
553    
554    
555     MG_TRIANGLE* MG_MAILLAGE::get_mg_triangleid(unsigned long num)
556     {
557     LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.find(num);
558     if (i==lst_mg_triangle.end())
559     {
560     // afficheur << INEXISTE << enderr;
561     return NULL;
562     }
563     return ((*i).second);
564     }
565    
566    
567    
568     MG_TRIANGLE* MG_MAILLAGE::get_mg_triangle(unsigned int num)
569     {
570     if (!(num<lst_mg_triangle.size()))
571     {
572     // afficheur << INEXISTE << enderr;
573     return NULL;
574     }
575     LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.begin();
576     for (unsigned long j=0;j<num;j++) i++;
577     return ((*i).second);
578     }
579    
580     MG_TRIANGLE* MG_MAILLAGE::get_mg_triangle(unsigned long noeud1id,unsigned long noeud2id,unsigned long noeud3id)
581     {
582     unsigned long id=std::min(noeud1id,noeud2id);
583     id=std::min(id,noeud3id);
584     MG_NOEUD* noeud=get_mg_noeudid(id);
585     int nb_triangle=noeud->get_lien_petit_triangle()->get_nb();
586     for (int i=0;i<nb_triangle;i++)
587     {
588     MG_TRIANGLE* mgtriangle=noeud->get_lien_petit_triangle()->get(i);
589     if ( (mgtriangle->get_noeud1()->get_id()==noeud1id) && (mgtriangle->get_noeud2()->get_id()==noeud2id) && (mgtriangle->get_noeud3()->get_id()==noeud3id) ) return mgtriangle;
590     if ( (mgtriangle->get_noeud1()->get_id()==noeud1id) && (mgtriangle->get_noeud2()->get_id()==noeud3id) && (mgtriangle->get_noeud3()->get_id()==noeud2id) ) return mgtriangle;
591     if ( (mgtriangle->get_noeud1()->get_id()==noeud2id) && (mgtriangle->get_noeud2()->get_id()==noeud1id) && (mgtriangle->get_noeud3()->get_id()==noeud3id) ) return mgtriangle;
592     if ( (mgtriangle->get_noeud1()->get_id()==noeud2id) && (mgtriangle->get_noeud2()->get_id()==noeud3id) && (mgtriangle->get_noeud3()->get_id()==noeud1id) ) return mgtriangle;
593     if ( (mgtriangle->get_noeud1()->get_id()==noeud3id) && (mgtriangle->get_noeud2()->get_id()==noeud1id) && (mgtriangle->get_noeud3()->get_id()==noeud2id) ) return mgtriangle;
594     if ( (mgtriangle->get_noeud1()->get_id()==noeud3id) && (mgtriangle->get_noeud2()->get_id()==noeud2id) && (mgtriangle->get_noeud3()->get_id()==noeud1id) ) return mgtriangle;
595     }
596     return NULL;
597     }
598    
599     unsigned int MG_MAILLAGE::get_nb_mg_triangle(void)
600     {
601     return lst_mg_triangle.size();
602     }
603    
604    
605     int MG_MAILLAGE::supprimer_mg_triangleid(unsigned long num)
606     {
607     MG_TRIANGLE* mgtriangle=get_mg_triangleid(num);
608     if (mgtriangle==NULL)
609     {
610     // afficheur << INEXISTE2 << enderr;
611     return FAIL;
612     }
613     MG_IDENTIFICATEUR* id=mgtriangle;
614     LISTE_ENTITE::iterator i=lst_entite.find(id);
615     lst_entite.erase(i);
616     LISTE_MG_TRIANGLE::iterator j=lst_mg_triangle.find(num);
617     lst_mg_triangle.erase(j);
618     MG_SEGMENT* segment1=mgtriangle->get_segment1();
619     MG_SEGMENT* segment2=mgtriangle->get_segment2();
620     MG_SEGMENT* segment3=mgtriangle->get_segment3();
621     delete mgtriangle;
622     if ((segment1->get_nb_reference()==0) && (segment1->get_lien_topologie()->get_dimension()>1)) supprimer_mg_segmentid(segment1->get_id());
623     if ((segment2->get_nb_reference()==0) && (segment2->get_lien_topologie()->get_dimension()>1)) supprimer_mg_segmentid(segment2->get_id());
624     if ((segment3->get_nb_reference()==0) && (segment3->get_lien_topologie()->get_dimension()>1)) supprimer_mg_segmentid(segment3->get_id());
625     return OK;
626     }
627    
628    
629     int MG_MAILLAGE::supprimer_mg_triangle(unsigned int num)
630     {
631     MG_TRIANGLE* mgtriangle=get_mg_triangle(num);
632     if (mgtriangle==NULL)
633     {
634     // afficheur << INEXISTE2 << enderr;
635     return FAIL;
636     }
637     MG_IDENTIFICATEUR* id=mgtriangle;
638     LISTE_ENTITE::iterator i=lst_entite.find(id);
639     lst_entite.erase(i);
640     LISTE_MG_TRIANGLE::iterator j=lst_mg_triangle.begin();
641     for (unsigned int k=0;k<num;k++) j++;
642     lst_mg_triangle.erase(j);
643     MG_SEGMENT* segment1=mgtriangle->get_segment1();
644     MG_SEGMENT* segment2=mgtriangle->get_segment2();
645     MG_SEGMENT* segment3=mgtriangle->get_segment3();
646     delete mgtriangle;
647     if ((segment1->get_nb_reference()==0) && (segment1->get_lien_topologie()->get_dimension()>1)) supprimer_mg_segmentid(segment1->get_id());
648     if ((segment2->get_nb_reference()==0) && (segment2->get_lien_topologie()->get_dimension()>1)) supprimer_mg_segmentid(segment2->get_id());
649     if ((segment3->get_nb_reference()==0) && (segment3->get_lien_topologie()->get_dimension()>1)) supprimer_mg_segmentid(segment3->get_id());
650    
651    
652     return OK;
653     }
654    
655    
656     void MG_MAILLAGE::supprimer_tout_mg_triangle(void)
657     {
658     while (get_nb_mg_triangle()!=0)
659     {
660     LISTE_MG_TRIANGLE::iterator j=lst_mg_triangle.begin();
661     MG_TRIANGLE* mgtriangle=(*j).second;
662     MG_IDENTIFICATEUR* id=mgtriangle;
663     LISTE_ENTITE::iterator i=lst_entite.find(id);
664     lst_entite.erase(i);
665     lst_mg_triangle.erase(j);
666     delete mgtriangle;
667     }
668     }
669    
670    
671     MG_TRIANGLE* MG_MAILLAGE::get_premier_triangle(LISTE_MG_TRIANGLE::iterator & it)
672     {
673     it = lst_mg_triangle.begin();
674     if (it == lst_mg_triangle.end())
675     return NULL;
676     return it->second;
677     }
678    
679     MG_TRIANGLE* MG_MAILLAGE::get_suivant_triangle(LISTE_MG_TRIANGLE::iterator & it)
680     {
681     it++;
682     if (it == lst_mg_triangle.end())
683     return NULL;
684     return it->second;
685     }
686    
687     // ENTITE MG_TETRA
688    
689     MG_TETRA* MG_MAILLAGE::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)
690     {
691     MG_TRIANGLE* mgtriangle1=get_mg_triangle(mgnoeud1->get_id(),mgnoeud3->get_id(),mgnoeud2->get_id());
692     MG_TRIANGLE* mgtriangle2=get_mg_triangle(mgnoeud1->get_id(),mgnoeud2->get_id(),mgnoeud4->get_id());
693     MG_TRIANGLE* mgtriangle3=get_mg_triangle(mgnoeud2->get_id(),mgnoeud3->get_id(),mgnoeud4->get_id());
694     MG_TRIANGLE* mgtriangle4=get_mg_triangle(mgnoeud1->get_id(),mgnoeud4->get_id(),mgnoeud3->get_id());
695     if (mgtriangle1==NULL) mgtriangle1=ajouter_mg_triangle(topo,mgnoeud1,mgnoeud3,mgnoeud2,origine);
696     if (mgtriangle2==NULL) mgtriangle2=ajouter_mg_triangle(topo,mgnoeud1,mgnoeud2,mgnoeud4,origine);
697     if (mgtriangle3==NULL) mgtriangle3=ajouter_mg_triangle(topo,mgnoeud2,mgnoeud3,mgnoeud4,origine);
698     if (mgtriangle4==NULL) mgtriangle4=ajouter_mg_triangle(topo,mgnoeud1,mgnoeud4,mgnoeud3,origine);
699     MG_TETRA* mgtetra;
700     if (num==0) mgtetra=new MG_TETRA(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgtriangle1,mgtriangle2,mgtriangle3,mgtriangle4,origine);
701     else mgtetra=new MG_TETRA(num,topo,mgnoeud1,mgnoeud2,mgnoeud3,mgnoeud4,mgtriangle1,mgtriangle2,mgtriangle3,mgtriangle4,origine);
702     int resultat=ajouter_mg_tetra(mgtetra);
703     if (resultat==FAIL)
704     {
705     delete mgtetra;
706     return NULL;
707     }
708     return mgtetra;
709     }
710    
711    
712     int MG_MAILLAGE::ajouter_mg_tetra(MG_TETRA *mgtetra)
713     {
714     gest->recherche_bonid(*mgtetra);
715     MG_IDENTIFICATEUR *id=mgtetra;
716     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
717     if (!p.second)
718     {
719     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
720     return FAIL;
721     }
722    
723     std::pair<const unsigned long,MG_TETRA*> tmp(mgtetra->get_id(),mgtetra);
724     lst_mg_tetra.insert(tmp);
725     return OK;
726     }
727    
728    
729     MG_TETRA* MG_MAILLAGE::get_mg_tetraid(unsigned long num)
730     {
731     LISTE_MG_TETRA::iterator i=lst_mg_tetra.find(num);
732     if (i==lst_mg_tetra.end())
733     {
734     // afficheur << INEXISTE << enderr;
735     return NULL;
736     }
737     return ((*i).second);
738     }
739    
740    
741    
742     MG_TETRA* MG_MAILLAGE::get_mg_tetra(unsigned int num)
743     {
744     if (!(num<lst_mg_tetra.size()))
745     {
746     // afficheur << INEXISTE << enderr;
747     return NULL;
748     }
749     LISTE_MG_TETRA::iterator i=lst_mg_tetra.begin();
750     for (unsigned long j=0;j<num;j++) i++;
751     return ((*i).second);
752     }
753    
754     MG_TETRA* MG_MAILLAGE::get_mg_tetra(unsigned long noeud1id,unsigned long noeud2id,unsigned long noeud3id,unsigned long noeud4id)
755     {
756     unsigned long id=std::min(noeud1id,noeud2id);
757     id=std::min(id,noeud3id);
758     id=std::min(id,noeud4id);
759     MG_NOEUD* noeud=get_mg_noeudid(id);
760     int nb_tetra=noeud->get_lien_petit_tetra()->get_nb();
761     for (int i=0;i<nb_tetra;i++)
762     {
763     MG_TETRA* mgtetra=noeud->get_lien_petit_tetra()->get(i);
764     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
765     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
766     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
767     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
768     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
769     if ( (mgtetra->get_noeud1()->get_id()==noeud1id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
770     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
771     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
772     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
773     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
774     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
775     if ( (mgtetra->get_noeud1()->get_id()==noeud2id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
776     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
777     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
778     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud4id) ) return mgtetra;
779     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud4id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
780     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
781     if ( (mgtetra->get_noeud1()->get_id()==noeud3id) && (mgtetra->get_noeud2()->get_id()==noeud4id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
782     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
783     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud1id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
784     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud3id) ) return mgtetra;
785     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud2id) && (mgtetra->get_noeud3()->get_id()==noeud3id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
786     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud1id) && (mgtetra->get_noeud4()->get_id()==noeud2id) ) return mgtetra;
787     if ( (mgtetra->get_noeud1()->get_id()==noeud4id) && (mgtetra->get_noeud2()->get_id()==noeud3id) && (mgtetra->get_noeud3()->get_id()==noeud2id) && (mgtetra->get_noeud4()->get_id()==noeud1id) ) return mgtetra;
788     }
789     return NULL;
790     }
791    
792     unsigned int MG_MAILLAGE::get_nb_mg_tetra(void)
793     {
794     return lst_mg_tetra.size();
795     }
796    
797    
798     int MG_MAILLAGE::supprimer_mg_tetraid(unsigned long num)
799     {
800     MG_TETRA* mgtetra=get_mg_tetraid(num);
801     if (mgtetra==NULL)
802     {
803     // afficheur << INEXISTE2 << enderr;
804     return FAIL;
805     }
806     MG_IDENTIFICATEUR* id=mgtetra;
807     LISTE_ENTITE::iterator i=lst_entite.find(id);
808     lst_entite.erase(i);
809     LISTE_MG_TETRA::iterator j=lst_mg_tetra.find(num);
810     lst_mg_tetra.erase(j);
811     MG_TRIANGLE* triangle1=mgtetra->get_triangle1();
812     MG_TRIANGLE* triangle2=mgtetra->get_triangle2();
813     MG_TRIANGLE* triangle3=mgtetra->get_triangle3();
814     MG_TRIANGLE* triangle4=mgtetra->get_triangle4();
815     delete mgtetra;
816     if ((triangle1->get_nb_reference()==0) && (triangle1->get_lien_topologie()->get_dimension()>2)) supprimer_mg_triangleid(triangle1->get_id());
817     if ((triangle2->get_nb_reference()==0) && (triangle2->get_lien_topologie()->get_dimension()>2)) supprimer_mg_triangleid(triangle2->get_id());
818     if ((triangle3->get_nb_reference()==0) && (triangle3->get_lien_topologie()->get_dimension()>2)) supprimer_mg_triangleid(triangle3->get_id());
819     if ((triangle4->get_nb_reference()==0) && (triangle4->get_lien_topologie()->get_dimension()>2)) supprimer_mg_triangleid(triangle4->get_id());
820     return OK;
821     }
822    
823    
824     int MG_MAILLAGE::supprimer_mg_tetra(unsigned int num)
825     {
826     MG_TETRA* mgtetra=get_mg_tetra(num);
827     if (mgtetra==NULL)
828     {
829     // afficheur << INEXISTE2 << enderr;
830     return FAIL;
831     }
832     MG_IDENTIFICATEUR* id=mgtetra;
833     LISTE_ENTITE::iterator i=lst_entite.find(id);
834     lst_entite.erase(i);
835     LISTE_MG_TETRA::iterator j=lst_mg_tetra.begin();
836     for (unsigned int k=0;k<num;k++) j++;
837     lst_mg_tetra.erase(j);
838     MG_TRIANGLE* triangle1=mgtetra->get_triangle1();
839     MG_TRIANGLE* triangle2=mgtetra->get_triangle2();
840     MG_TRIANGLE* triangle3=mgtetra->get_triangle3();
841     MG_TRIANGLE* triangle4=mgtetra->get_triangle4();
842     delete mgtetra;
843     if ((triangle1->get_nb_reference()==0) && (triangle1->get_lien_topologie()->get_dimension()>2)) supprimer_mg_triangleid(triangle1->get_id());
844     if ((triangle2->get_nb_reference()==0) && (triangle2->get_lien_topologie()->get_dimension()>2)) supprimer_mg_triangleid(triangle2->get_id());
845     if ((triangle3->get_nb_reference()==0) && (triangle3->get_lien_topologie()->get_dimension()>2)) supprimer_mg_triangleid(triangle3->get_id());
846     if ((triangle4->get_nb_reference()==0) && (triangle4->get_lien_topologie()->get_dimension()>2)) supprimer_mg_triangleid(triangle4->get_id());
847     return OK;
848     }
849    
850    
851     void MG_MAILLAGE::supprimer_tout_mg_tetra(void)
852     {
853     while (get_nb_mg_tetra()!=0)
854     {
855     LISTE_MG_TETRA::iterator j=lst_mg_tetra.begin();
856     MG_TETRA* mgtetra=(*j).second;
857     MG_IDENTIFICATEUR* id=mgtetra;
858     LISTE_ENTITE::iterator i=lst_entite.find(id);
859     lst_entite.erase(i);
860     lst_mg_tetra.erase(j);
861     delete mgtetra;
862     }
863     }
864    
865    
866     MG_TETRA* MG_MAILLAGE::get_premier_tetra(LISTE_MG_TETRA::iterator & it)
867     {
868     it = lst_mg_tetra.begin();
869     if (it == lst_mg_tetra.end())
870     return NULL;
871     return it->second;
872     }
873    
874     MG_TETRA* MG_MAILLAGE::get_suivant_tetra(LISTE_MG_TETRA::iterator & it)
875     {
876     it++;
877     if (it == lst_mg_tetra.end())
878     return NULL;
879     return it->second;
880     }
881    
882    
883    
884    
885     bool MG_MAILLAGE::contient ( MG_IDENTIFICATEUR * id )
886     {
887     return ( lst_entite.find ( id ) != lst_entite.end() );
888     }
889    
890     void MG_MAILLAGE::enregistrer(std::ostream& o)
891     {
892 francois 195 if (mg_geometrie==NULL)
893     {
894     if (get_nb_mg_tetra()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=3;
895     else if (get_nb_mg_triangle()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=2;
896     else if (get_nb_mg_segment()!=0) MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=1;
897     else MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO=0;
898     }
899 francois 35 if (mg_geometrie==NULL) o << "%" << get_id() << "=MAILLAGE(NULL);" << std::endl;
900     else o << "%" << get_id() << "=MAILLAGE($" << mg_geometrie->get_id() <<");" << std::endl;
901     LISTE_ENTITE::const_iterator i;
902     for (i=lst_entite.begin();i!=lst_entite.end();i++)
903     {
904     MG_IDENTIFICATEUR* entite = *i;
905     entite->enregistrer(o);
906     }
907     }
908    
909     void MG_MAILLAGE::enregistrer_sous_mesh_1D(std::ostream& o)
910     {
911    
912     int nb_noeud=0;
913     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
914     {
915     MG_NOEUD* noeud=((*i).second);
916     if (noeud->get_lien_topologie()->get_dimension()<2) nb_noeud++;
917     }
918    
919     int nb_seg=0;
920     for (LISTE_MG_SEGMENT::iterator i=lst_mg_segment.begin();i!=lst_mg_segment.end();i++)
921     {
922     MG_SEGMENT* seg=((*i).second);
923     if (seg->get_lien_topologie()->get_dimension()<2) nb_seg++;
924     }
925    
926     o << nb_noeud << " " << nb_seg << std::endl;
927     int ii=0;
928     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
929     {
930     MG_NOEUD* noeud=((*i).second);
931     if (noeud->get_lien_topologie()->get_dimension()<2)
932     {
933     o << (ii+1) << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << " " ;
934     if (noeud->get_lien_topologie()->get_dimension()==0) o << "vertex ";
935     if (noeud->get_lien_topologie()->get_dimension()==1) o << "edge ";
936     o << noeud->get_lien_topologie()->get_id() << " " << noeud->get_id() << std::endl;
937     noeud->change_nouveau_numero(ii+1);
938     ii++;
939     }
940     }
941    
942     for (LISTE_MG_SEGMENT::iterator i=lst_mg_segment.begin();i!=lst_mg_segment.end();i++)
943     {
944     MG_SEGMENT* seg=((*i).second);
945     if (seg->get_lien_topologie()->get_dimension()<2)
946     {
947     o << "2 " << seg->get_noeud1()->get_nouveau_numero() << " " << seg->get_noeud2()->get_nouveau_numero() << " " ;
948     if (seg->get_lien_topologie()->get_dimension()==0) o << "vertex ";
949     if (seg->get_lien_topologie()->get_dimension()==1) o << "edge ";
950     o << seg->get_lien_topologie()->get_id() << std::endl;
951     }
952     }
953    
954     }
955    
956     void MG_MAILLAGE::enregistrer_sous_mesh_2D
957     (std::ostream& o)
958     {
959     int nb_noeud=0;
960     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
961     {
962     MG_NOEUD* noeud=((*i).second);
963     if (noeud->get_lien_topologie()->get_dimension()<3) nb_noeud++;
964     }
965    
966     int nb_tri=0;
967     for (LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.begin();i!=lst_mg_triangle.end();i++)
968     {
969     MG_TRIANGLE* triangle=((*i).second);
970     if (triangle->get_lien_topologie()->get_dimension()<3) nb_tri++;
971     }
972    
973     o << nb_noeud << " " << nb_tri << std::endl;
974     int ii=0;
975     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
976     {
977     MG_NOEUD* noeud=((*i).second);
978     if (noeud->get_lien_topologie()->get_dimension()<3)
979     {
980     o << (ii+1) << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << " " ;
981     if (noeud->get_lien_topologie()->get_dimension()==0) o << "vertex ";
982     if (noeud->get_lien_topologie()->get_dimension()==1) o << "edge ";
983     if (noeud->get_lien_topologie()->get_dimension()==2) o << "face ";
984     o << noeud->get_lien_topologie()->get_id() << std::endl;
985     noeud->change_nouveau_numero(ii+1);
986     ii++;
987     }
988     }
989    
990     int compteur=0;
991     for (LISTE_MG_TRIANGLE::iterator i=lst_mg_triangle.begin();i!=lst_mg_triangle.end();i++)
992     {
993     MG_TRIANGLE* triangle=((*i).second);
994     if (triangle->get_lien_topologie()->get_dimension()<3)
995     {
996     o << "3 " << triangle->get_noeud1()->get_nouveau_numero() << " " << triangle->get_noeud2()->get_nouveau_numero() << " " << triangle->get_noeud3()->get_nouveau_numero() << " " ;
997     if (triangle->get_lien_topologie()->get_dimension()==0) o << "vertex ";
998     if (triangle->get_lien_topologie()->get_dimension()==1) o << "edge ";
999     if (triangle->get_lien_topologie()->get_dimension()==2) o << "face ";
1000     if (triangle->get_lien_topologie()->get_dimension()==3) o << "body ";
1001     o << triangle->get_lien_topologie()->get_id() << std::endl;
1002     compteur++;
1003     }
1004     }
1005    
1006     }
1007    
1008     void MG_MAILLAGE::enregistrer_sous_mesh_3D(std::ostream& o)
1009     {
1010     o << get_nb_mg_noeud() << " " << get_nb_mg_tetra() << std::endl;
1011     int ii=0;
1012     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
1013     {
1014     MG_NOEUD* noeud=((*i).second);
1015     o << (ii+1) << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << " " ;
1016     if (noeud->get_lien_topologie()->get_dimension()==0) o << "vertex ";
1017     if (noeud->get_lien_topologie()->get_dimension()==1) o << "edge ";
1018     if (noeud->get_lien_topologie()->get_dimension()==2) o << "face ";
1019     if (noeud->get_lien_topologie()->get_dimension()==3) o << "body ";
1020     o << noeud->get_lien_topologie()->get_id() << std::endl;
1021     noeud->change_nouveau_numero(ii+1);
1022     ii++;
1023     }
1024    
1025    
1026     for (LISTE_MG_TETRA::iterator i=lst_mg_tetra.begin();i!=lst_mg_tetra.end();i++)
1027     {
1028     MG_TETRA* tetra=((*i).second);
1029     o << "4 " << tetra->get_noeud1()->get_nouveau_numero() << " " << tetra->get_noeud2()->get_nouveau_numero() << " " << tetra->get_noeud3()->get_nouveau_numero() << " " << tetra->get_noeud4()->get_nouveau_numero() << " " ;
1030     if (tetra->get_lien_topologie()->get_dimension()==0) o << "vertex ";
1031     if (tetra->get_lien_topologie()->get_dimension()==1) o << "edge ";
1032     if (tetra->get_lien_topologie()->get_dimension()==2) o << "face ";
1033     if (tetra->get_lien_topologie()->get_dimension()==3) o << "body ";
1034     o << tetra->get_lien_topologie()->get_id() << std::endl;
1035     }
1036    
1037     }
1038    
1039     void MG_MAILLAGE::exporter_mesh(std::string& nomfic)
1040     {
1041     char chaine[500];
1042     sprintf(chaine,"%s_1D.mai",nomfic.c_str());
1043     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
1044     of1.precision(16);
1045     of1.setf(std::ios::showpoint);
1046     enregistrer_sous_mesh_1D(of1);
1047     sprintf(chaine,"%s_2D.mai",nomfic.c_str());
1048     std::ofstream of2(chaine,std::ios::out|std::ios::trunc);
1049     of2.precision(16);
1050     of2.setf(std::ios::showpoint);
1051     enregistrer_sous_mesh_2D(of2);
1052     sprintf(chaine,"%s_3D.mai",nomfic.c_str());
1053     std::ofstream of3(chaine,std::ios::out|std::ios::trunc);
1054     of3.precision(16);
1055     of3.setf(std::ios::showpoint);
1056     enregistrer_sous_mesh_3D(of3);
1057     }
1058    
1059     /*
1060     void MG_MAILLAGE::exporter_cosmos(std::string& nomfic)
1061     {
1062     char chaine[500];
1063     sprintf(chaine,"%s.ses",nomfic.c_str());
1064     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
1065     of1.precision(16);
1066     of1.setf(std::ios::showpoint);
1067     of1 << "TITLE, " << chaine << " : Fichier de maillage MAGiC" << std::endl;
1068     of1 << "EGROUP,1,TETRA4,0,0,0,0,0,0,0,0;" << std::endl;
1069     int nb_volume=mg_geometrie->get_nb_mg_volume();
1070     for (int i=0;i<nb_volume;i++)
1071     {
1072     MG_VOLUME *mgvol=mg_geometrie->get_mg_volume(i);
1073     if (mgvol->get_num_materiau()>=0)
1074     {
1075     MT_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1076     MT_MATERIAU* mat=mtgest.get_materiau(mgvol->get_num_materiau());
1077     MT_PROPRIETE* prop=mat->get_propriete("EX");
1078     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", EX, " << prop->get_valeur(2) << ";" << std::endl;
1079     prop=mat->get_propriete("NUXY");
1080     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", NUXY, " << prop->get_valeur(2) << ";" << std::endl;
1081     prop=mat->get_propriete("GXY");
1082     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", GXY, " << prop->get_valeur(2) << ";" << std::endl;
1083     prop=mat->get_propriete("DENS");
1084     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", DENS, " << prop->get_valeur(2) << ";" << std::endl;
1085     prop=mat->get_propriete("SIGXT");
1086     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGXT, " << prop->get_valeur(2) << ";" << std::endl;
1087     prop=mat->get_propriete("SIGYLD");
1088     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGYLD, " << prop->get_valeur(2) << ";" << std::endl;
1089     prop=mat->get_propriete("ALPX");
1090     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", ALPX, " << prop->get_valeur(2) << ";" << std::endl;
1091     prop=mat->get_propriete("KX");
1092     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", KX, " << prop->get_valeur(2) << ";" << std::endl;
1093     prop=mat->get_propriete("C");
1094     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", C, " << prop->get_valeur(2) << ";" << std::endl;
1095     }
1096     }
1097     of1 << "ACTSET,CS,0;" << std::endl;
1098     of1 << "ACTSET,EG,1;" << std::endl;
1099     int ii=0;
1100     double valeurunite=mg_geometrie->get_valeur_unite();
1101     for (LISTE_MG_NOEUD::iterator i=lst_mg_noeud.begin();i!=lst_mg_noeud.end();i++)
1102     {
1103     MG_NOEUD* noeud=((*i).second);
1104     of1 << "ND, " << (ii+1) << ", " << noeud->get_x()*valeurunite << ", " << noeud->get_y()*valeurunite << ", " << noeud->get_z()*valeurunite << ";" << std::endl;
1105     char nom[3];
1106     int nb=noeud->get_lien_topologie()->get_nb_ccf();
1107     for (int k=0;k<nb;k++)
1108     {
1109     noeud->get_lien_topologie()->get_type_ccf(k,nom);
1110     if (strcmp(nom,"Da")==0) of1 << "DND , " << ii+1 << ", AL, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1111     if (strcmp(nom,"Dx")==0) of1 << "DND , " << ii+1 << ", UX, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1112     if (strcmp(nom,"Dy")==0) of1 << "DND , " << ii+1 << ", UY, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1113     if (strcmp(nom,"Dz")==0) of1 << "DND , " << ii+1 << ", UZ, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1114     if (strcmp(nom,"Fx")==0) of1 << "FND , " << ii+1 << ", FX, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1115     if (strcmp(nom,"Fy")==0) of1 << "FND , " << ii+1 << ", FY, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1116     if (strcmp(nom,"Fz")==0) of1 << "FND , " << ii+1 << ", FZ, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << ii+1 << ", 1;" << std::endl;
1117     }
1118     ii++;
1119     noeud->change_nouveau_numero(ii);
1120     }
1121     ii=0;
1122     int nummat=-10;
1123     for (LISTE_MG_TETRA::iterator i=lst_mg_tetra.begin();i!=lst_mg_tetra.end();i++)
1124     {
1125     MG_TETRA* tetra=((*i).second);
1126     MG_VOLUME* vol=(MG_VOLUME*)tetra->get_lien_topologie();
1127     int nummatac=vol->get_num_materiau();
1128     if (nummatac!=nummat)
1129     {
1130     nummat=nummatac;
1131     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1132     }
1133     of1 << "EL, " << ii+1 << ", VL, 1, 4, " << tetra->get_noeud1()->get_nouveau_numero() << ", " << tetra->get_noeud2()->get_nouveau_numero() << ", " << tetra->get_noeud3()->get_nouveau_numero() << ", " << tetra->get_noeud4()->get_nouveau_numero() << ", " ;
1134     ii++;
1135     if (tetra->get_triangle1()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
1136     if (tetra->get_triangle2()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
1137     if (tetra->get_triangle3()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
1138     if (tetra->get_triangle4()->get_lien_topologie()->get_dimension()!=3) of1 << "1;" << std::endl ; else of1 << "0;" << std::endl;
1139     char nom[3];
1140     int nb=tetra->get_triangle1()->get_lien_topologie()->get_nb_ccf();
1141     for (int k=0;k<nb;k++)
1142     {
1143     tetra->get_triangle1()->get_lien_topologie()->get_type_ccf(k,nom);
1144     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 1;" << std::endl;
1145     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 2;" << std::endl;
1146     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 3;" << std::endl;
1147     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 4;" << std::endl;
1148     }
1149     nb=tetra->get_triangle2()->get_lien_topologie()->get_nb_ccf();
1150     for (int k=0;k<nb;k++)
1151     {
1152     tetra->get_triangle2()->get_lien_topologie()->get_type_ccf(k,nom);
1153     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 1;" << std::endl;
1154     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 2;" << std::endl;
1155     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 3;" << std::endl;
1156     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 4;" << std::endl;
1157     }
1158     nb=tetra->get_triangle3()->get_lien_topologie()->get_nb_ccf();
1159     for (int k=0;k<nb;k++)
1160     {
1161     tetra->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1162     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 1;" << std::endl;
1163     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 2;" << std::endl;
1164     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 3;" << std::endl;
1165     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 4;" << std::endl;
1166     }
1167     nb=tetra->get_triangle4()->get_lien_topologie()->get_nb_ccf();
1168     for (int k=0;k<nb;k++)
1169     {
1170     tetra->get_triangle4()->get_lien_topologie()->get_type_ccf(k,nom);
1171     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 1;" << std::endl;
1172     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 2;" << std::endl;
1173     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 3;" << std::endl;
1174     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tetra->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 4;" << std::endl;
1175     }
1176     }
1177     }
1178    
1179     */
1180    
1181    
1182    
1183     void MG_MAILLAGE::exporter_giref(std::string& nomfic)
1184     {
1185     char chaine[500];
1186     sprintf(chaine,"%s.mail",nomfic.c_str());
1187     FILE *in=fopen(chaine,"wt");
1188     int lieu=0;
1189    
1190     fprintf(in,"8 Maillage\n");
1191     fprintf(in,"11 Version 1.0\n");
1192     fprintf(in,"%lu\n\n",get_id());
1193     int nb=get_nb_mg_noeud();
1194     fprintf(in,"%d\n",nb);
1195    
1196     LISTE_MG_NOEUD::iterator ind;
1197     MG_NOEUD* noeud=get_premier_noeud(ind);
1198     int i=0;
1199     while (noeud)
1200     {
1201     noeud->change_nouveau_numero(i++);
1202     MG_ELEMENT_TOPOLOGIQUE* topo=noeud->get_lien_topologie();
1203     if (topo->get_nouveau_numero()==-1)
1204     {
1205     topo->change_nouveau_numero(lieu);
1206     lieu++;
1207     }
1208     fprintf(in,"%.16e %.16e %.16e 0 %d \n",noeud->get_x(),noeud->get_y(),noeud->get_z(),topo->get_nouveau_numero());
1209     noeud=get_suivant_noeud(ind);
1210     }
1211    
1212    
1213     nb=get_nb_mg_segment();
1214     fprintf(in,"\n%d\n",nb);
1215    
1216     LISTE_MG_SEGMENT::iterator iseg;
1217     MG_SEGMENT* seg=get_premier_segment(iseg);
1218     i=0;
1219    
1220     while(seg)
1221     {
1222    
1223     seg->change_nouveau_numero(i);
1224     MG_ELEMENT_TOPOLOGIQUE* topo=seg->get_lien_topologie();
1225     if (topo->get_nouveau_numero()==-1)
1226     {
1227     topo->change_nouveau_numero(lieu);
1228     lieu++;
1229     }
1230     fprintf(in,"%d %d 0 %d \n",seg->get_noeud1()->get_nouveau_numero(),seg->get_noeud2()->get_nouveau_numero(),topo->get_nouveau_numero());
1231     seg = get_suivant_segment(iseg);
1232     }
1233     nb=get_nb_mg_triangle();
1234     fprintf(in,"\n%d\n",nb);
1235     for (int i=0;i<nb;i++)
1236     {
1237     MG_TRIANGLE* tri=get_mg_triangle(i);
1238     tri->change_nouveau_numero(i);
1239     MG_ELEMENT_TOPOLOGIQUE* topo=tri->get_lien_topologie();
1240     if (topo->get_nouveau_numero()==-1)
1241     {
1242     topo->change_nouveau_numero(lieu);
1243     lieu++;
1244     }
1245     fprintf(in,"3 %d %d %d 0 %d \n",tri->get_segment3()->get_nouveau_numero(),tri->get_segment2()->get_nouveau_numero(),tri->get_segment1()->get_nouveau_numero(),topo->get_nouveau_numero());
1246     }
1247     nb=get_nb_mg_tetra();
1248     fprintf(in,"\n0\n\n0\n\n0\n\n%d\n",nb);
1249     for (int i=0;i<nb;i++)
1250     {
1251     MG_TETRA* tet=get_mg_tetra(i);
1252     tet->change_nouveau_numero(i);
1253     MG_ELEMENT_TOPOLOGIQUE* topo=tet->get_lien_topologie();
1254     if (topo->get_nouveau_numero()==-1)
1255     {
1256     topo->change_nouveau_numero(lieu);
1257     lieu++;
1258     }
1259     TPL_MAP_ENTITE<MG_SEGMENT*> lst_segment;
1260     lst_segment.ajouter(tet->get_triangle1()->get_segment1());
1261     lst_segment.ajouter(tet->get_triangle1()->get_segment2());
1262     lst_segment.ajouter(tet->get_triangle1()->get_segment3());
1263     lst_segment.ajouter(tet->get_triangle2()->get_segment1());
1264     lst_segment.ajouter(tet->get_triangle2()->get_segment2());
1265     lst_segment.ajouter(tet->get_triangle2()->get_segment3());
1266     lst_segment.ajouter(tet->get_triangle3()->get_segment1());
1267     lst_segment.ajouter(tet->get_triangle3()->get_segment2());
1268     lst_segment.ajouter(tet->get_triangle3()->get_segment3());
1269     lst_segment.ajouter(tet->get_triangle4()->get_segment1());
1270     lst_segment.ajouter(tet->get_triangle4()->get_segment2());
1271     lst_segment.ajouter(tet->get_triangle4()->get_segment3());
1272     int tab[6];
1273     for (int j=0;j<6;j++)
1274     {
1275     MG_SEGMENT* seg=lst_segment.get(j);
1276     if ((seg->get_noeud1()==tet->get_noeud1()) && (seg->get_noeud2()==tet->get_noeud2())) tab[0]=j;
1277     else if ((seg->get_noeud1()==tet->get_noeud2()) && (seg->get_noeud2()==tet->get_noeud1())) tab[0]=j;
1278     else if ((seg->get_noeud1()==tet->get_noeud1()) && (seg->get_noeud2()==tet->get_noeud3())) tab[1]=j;
1279     else if ((seg->get_noeud1()==tet->get_noeud3()) && (seg->get_noeud2()==tet->get_noeud1())) tab[1]=j;
1280     else if ((seg->get_noeud1()==tet->get_noeud1()) && (seg->get_noeud2()==tet->get_noeud4())) tab[2]=j;
1281     else if ((seg->get_noeud1()==tet->get_noeud4()) && (seg->get_noeud2()==tet->get_noeud1())) tab[2]=j;
1282     else if ((seg->get_noeud1()==tet->get_noeud2()) && (seg->get_noeud2()==tet->get_noeud3())) tab[3]=j;
1283     else if ((seg->get_noeud1()==tet->get_noeud3()) && (seg->get_noeud2()==tet->get_noeud2())) tab[3]=j;
1284     else if ((seg->get_noeud1()==tet->get_noeud2()) && (seg->get_noeud2()==tet->get_noeud4())) tab[4]=j;
1285     else if ((seg->get_noeud1()==tet->get_noeud4()) && (seg->get_noeud2()==tet->get_noeud2())) tab[4]=j;
1286     else if ((seg->get_noeud1()==tet->get_noeud3()) && (seg->get_noeud2()==tet->get_noeud4())) tab[5]=j;
1287     else if ((seg->get_noeud1()==tet->get_noeud4()) && (seg->get_noeud2()==tet->get_noeud3())) tab[5]=j;
1288     }
1289     fprintf(in,"%d %d %d %d %d %d %d %d %d %d %d %d %d %d 0 %d \n",tet->get_noeud1()->get_nouveau_numero(),tet->get_noeud2()->get_nouveau_numero(),tet->get_noeud3()->get_nouveau_numero(),tet->get_noeud4()->get_nouveau_numero(),lst_segment.get(tab[0])->get_nouveau_numero(),lst_segment.get(tab[1])->get_nouveau_numero(),lst_segment.get(tab[2])->get_nouveau_numero(),lst_segment.get(tab[3])->get_nouveau_numero(),lst_segment.get(tab[4])->get_nouveau_numero(),lst_segment.get(tab[5])->get_nouveau_numero(),tet->get_triangle1()->get_nouveau_numero(),tet->get_triangle2()->get_nouveau_numero(),tet->get_triangle3()->get_nouveau_numero(),tet->get_triangle4()->get_nouveau_numero(),topo->get_nouveau_numero());
1290     }
1291    
1292     fprintf(in,"\n0\n\n0\n\n8 Maillage\n",nb);
1293     fclose(in);
1294     }
1295    
1296    
1297     std::ostream& operator << (std::ostream& o,MG_MAILLAGE& maillage)
1298     {
1299     maillage.enregistrer(o);
1300     return o;
1301     }
1302    
1303    
1304     MG_SOLUTION* MG_MAILLAGE::calculer_carte_taille_reelle(char* nomfichier)
1305     {
1306     int nb_noeud=get_nb_mg_noeud();
1307 francois 195 std::string nomsol="Carte de taille reelle";
1308 francois 35 MG_SOLUTION* mgsol=new MG_SOLUTION(this,1,nomfichier,nb_noeud,nomsol);
1309     mgsol->change_legende(0,"F(x,y,z)");
1310     for (int j=0;j<nb_noeud;j++)
1311     {
1312     MG_NOEUD* noeud=get_mg_noeud(j);
1313     int nb_segment=noeud->get_lien_segment()->get_nb();
1314     double ec=0.;int nbr=0;
1315     for (int k=0;k<nb_segment;k++)
1316     {
1317     MG_SEGMENT* seg=noeud->get_lien_segment()->get(k);
1318     MG_SEGMENT* segtmp=get_mg_segmentid(seg->get_id());
1319     if (segtmp!=NULL)
1320     {
1321     nbr++;
1322     ec=ec+seg->get_longueur();
1323     }
1324     }
1325     ec=ec/nbr;
1326     mgsol->ecrire(j,0,ec);
1327     }
1328     return mgsol;
1329     }
1330    
1331    
1332     MG_GESTIONNAIRE* MG_MAILLAGE::get_gestionnaire(void)
1333     {
1334     return gest;
1335     }
1336