ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 169
Committed: Fri Feb 13 23:04:14 2009 UTC (16 years, 3 months ago) by francois
Original Path: magic/lib/geometrie/geometrie/src/fem_maillage.cpp
File size: 56155 byte(s)
Log Message:
Resolution de bug avec la version de gcc 4.3.2 --> mise la norme de c++

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�e et Vincent FRANCOIS
5     // D�artement de G�ie M�anique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�artement
8     // de g�ie m�anique de l'Universit�du Qu�ec �
9     // Trois Rivi�es
10     // Les librairies ne peuvent �re utilis�s sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mg_maillage.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 �11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <fstream>
27     #include <iostream>
28 francois 169 #include <string.h>
29 5
30    
31     #include "fem_maillage.h"
32     #include "fem_graph_noeud.h"
33     #include "mg_gestionnaire.h"
34     #include "mt_gestionnaire.h"
35     #include "mt_propriete.h"
36     #include "mt_materiau.h"
37     #include "ot_decalage_parametre.h"
38     #include "tpl_map_entite.h"
39     #include "tpl_liste_entite.h"
40     //#include "message.h"
41    
42    
43    
44     FEM_MAILLAGE::FEM_MAILLAGE(MG_GEOMETRIE* geo,MG_MAILLAGE* mai,int deg):MG_IDENTIFICATEUR(),mg_geometrie(geo),maillage(mai),degre(deg)
45     {
46     }
47    
48     FEM_MAILLAGE::FEM_MAILLAGE(unsigned long num,MG_GEOMETRIE* geo,MG_MAILLAGE* mai,int deg):MG_IDENTIFICATEUR(num),mg_geometrie(geo),maillage(mai),degre(deg)
49     {
50     }
51    
52     FEM_MAILLAGE::~FEM_MAILLAGE()
53     {
54     supprimer_tout_fem_tetra();
55     supprimer_tout_fem_triangle();
56     supprimer_tout_fem_segment();
57     supprimer_tout_fem_noeud();
58     }
59    
60     FEM_MAILLAGE* FEM_MAILLAGE::dupliquer(MG_GESTIONNAIRE* gest)
61     {
62     FEM_MAILLAGE* mai=new FEM_MAILLAGE(mg_geometrie,maillage,degre);
63     gest->ajouter_fem_maillage(mai);
64     long decalage=mai->get_id()-this->get_id();
65     LISTE_ENTITE::const_iterator i;
66     for (i=lst_entite.begin();i!=lst_entite.end();i++)
67     {
68     FEM_ELEMENT_MAILLAGE& ele=(FEM_ELEMENT_MAILLAGE&)(*(*i));
69     ele.dupliquer(mai,decalage);
70     }
71     return mai;
72     }
73    
74     MG_GEOMETRIE* FEM_MAILLAGE::get_mg_geometrie(void)
75     {
76     return mg_geometrie;
77     }
78    
79     MG_MAILLAGE* FEM_MAILLAGE::get_mg_maillage(void)
80     {
81     return maillage;
82     }
83    
84     int FEM_MAILLAGE::get_degre(void)
85     {
86     return degre;
87     }
88    
89     bool FEM_MAILLAGE::contient ( MG_IDENTIFICATEUR * id )
90     {
91     return ( lst_entite.find ( id ) != lst_entite.end() );
92     }
93    
94     void FEM_MAILLAGE::change_gestionnaire(MG_GESTIONNAIRE* mggest)
95     {
96     gest=mggest;
97     }
98    
99     // ENTITE FEM_NOEUD
100     FEM_NOEUD* FEM_MAILLAGE::ajouter_fem_noeud(MG_NOEUD* mgnoeud,unsigned long num)
101     {
102     FEM_NOEUD* femnoeud;
103     if (num==0) femnoeud=new FEM_NOEUD(mgnoeud); else femnoeud=new FEM_NOEUD(num,mgnoeud);
104     int resultat = ajouter_fem_noeud(femnoeud);
105     if (resultat==FAIL)
106     {
107     delete femnoeud;
108     return NULL;
109     }
110     return femnoeud;
111     }
112    
113     int FEM_MAILLAGE::ajouter_fem_noeud(FEM_NOEUD *femnoeud)
114     {
115     gest->recherche_bonid(*femnoeud);
116     MG_IDENTIFICATEUR *id=femnoeud;
117     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
118     if (!p.second)
119     {
120     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
121     return FAIL;
122     }
123    
124     std::pair<const unsigned long,FEM_NOEUD*> tmp(femnoeud->get_id(),femnoeud);
125     lst_fem_noeud.insert(tmp);
126     return OK;
127     }
128    
129    
130     FEM_NOEUD* FEM_MAILLAGE::get_fem_noeudid(unsigned long num)
131     {
132     LISTE_FEM_NOEUD::iterator i=lst_fem_noeud.find(num);
133     if (i==lst_fem_noeud.end())
134     {
135     // afficheur << INEXISTE << enderr;
136     return NULL;
137     }
138     return ((*i).second);
139     }
140    
141    
142    
143     FEM_NOEUD* FEM_MAILLAGE::get_fem_noeud(unsigned int num)
144     {
145     if (!(num<lst_fem_noeud.size()))
146     {
147     // afficheur << INEXISTE << enderr;
148     return NULL;
149     }
150     LISTE_FEM_NOEUD::iterator i = lst_fem_noeud.begin();
151     std::advance(i, num);
152    
153     return ((*i).second);
154     }
155    
156     FEM_NOEUD* FEM_MAILLAGE::get_premier_noeud(LISTE_FEM_NOEUD::iterator & it)
157     {
158     it = lst_fem_noeud.begin();
159     if (it == lst_fem_noeud.end())
160     return NULL;
161     return it->second ;
162     }
163    
164     FEM_NOEUD* FEM_MAILLAGE::get_suivant_noeud(LISTE_FEM_NOEUD::iterator & it)
165     {
166     it++;
167     if(it==lst_fem_noeud.end())
168     return NULL;
169     return it->second;
170     }
171    
172     unsigned int FEM_MAILLAGE::get_nb_fem_noeud(void)
173     {
174     return lst_fem_noeud.size();
175     }
176    
177    
178     int FEM_MAILLAGE::supprimer_fem_noeudid(unsigned long num)
179     {
180     FEM_NOEUD* femnoeud=get_fem_noeudid(num);
181     if (femnoeud==NULL)
182     {
183     // afficheur << INEXISTE2 << enderr;
184     return FAIL;
185     }
186     MG_IDENTIFICATEUR* id=femnoeud;
187     LISTE_ENTITE::iterator i=lst_entite.find(id);
188     lst_entite.erase(i);
189     LISTE_FEM_NOEUD::iterator j=lst_fem_noeud.find(num);
190     lst_fem_noeud.erase(j);
191     delete femnoeud;
192     return OK;
193     }
194    
195    
196     int FEM_MAILLAGE::supprimer_fem_noeud(unsigned int num)
197     {
198     FEM_NOEUD* femnoeud=get_fem_noeud(num);
199     if (femnoeud==NULL)
200     {
201     // afficheur << INEXISTE2 << enderr;
202     return FAIL;
203     }
204     MG_IDENTIFICATEUR* id=femnoeud;
205     LISTE_ENTITE::iterator i=lst_entite.find(id);
206     lst_entite.erase(i);
207     LISTE_FEM_NOEUD::iterator j=lst_fem_noeud.begin();
208     for (unsigned int k=0;k<num;k++) j++;
209     lst_fem_noeud.erase(j);
210     delete femnoeud;
211     return OK;
212     }
213    
214    
215     void FEM_MAILLAGE::supprimer_tout_fem_noeud(void)
216     {
217     while (get_nb_fem_noeud()!=0)
218     {
219     LISTE_FEM_NOEUD::iterator j=lst_fem_noeud.begin();
220     FEM_NOEUD* femnoeud=(*j).second;
221     MG_IDENTIFICATEUR* id=femnoeud;
222     LISTE_ENTITE::iterator i=lst_entite.find(id);
223     lst_entite.erase(i);
224     lst_fem_noeud.erase(j);
225     delete femnoeud;
226     }
227     }
228    
229    
230     // ENTITE FEM_SEGMENT
231    
232    
233     int FEM_MAILLAGE::ajouter_fem_segment(FEM_SEGMENT *femsegment)
234     {
235     gest->recherche_bonid(*femsegment);
236     MG_IDENTIFICATEUR *id=femsegment;
237     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
238     if (!p.second)
239     {
240     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
241     return FAIL;
242     }
243    
244     std::pair<const unsigned long,FEM_SEGMENT*> tmp(femsegment->get_id(),femsegment);
245     lst_fem_segment.insert(tmp);
246     return OK;
247     }
248    
249     FEM_SEGMENT* FEM_MAILLAGE::get_fem_segmentid(unsigned long num)
250     {
251     LISTE_FEM_SEGMENT::iterator i=lst_fem_segment.find(num);
252     if (i==lst_fem_segment.end())
253     {
254     // afficheur << INEXISTE << enderr;
255     return NULL;
256     }
257     return ((*i).second);
258     }
259    
260     unsigned int FEM_MAILLAGE::get_nb_fem_segment(void)
261     {
262     return lst_fem_segment.size();
263     }
264    
265    
266    
267     FEM_SEGMENT* FEM_MAILLAGE::get_fem_segment(unsigned int num)
268     {
269     if (!(num<lst_fem_segment.size()))
270     {
271     // afficheur << INEXISTE << enderr;
272     return NULL;
273     }
274     LISTE_FEM_SEGMENT::iterator i=lst_fem_segment.begin();
275     for (unsigned long j=0;j<num;j++) i++;
276     return ((*i).second);
277     }
278    
279    
280    
281     int FEM_MAILLAGE::supprimer_fem_segmentid(unsigned long num)
282     {
283     FEM_SEGMENT* femsegment=get_fem_segmentid(num);
284     if (femsegment==NULL)
285     {
286     // afficheur << INEXISTE2 << enderr;
287     return FAIL;
288     }
289     MG_IDENTIFICATEUR* id=femsegment;
290     LISTE_ENTITE::iterator i=lst_entite.find(id);
291     lst_entite.erase(i);
292     LISTE_FEM_SEGMENT::iterator j=lst_fem_segment.find(num);
293     lst_fem_segment.erase(j);
294     delete femsegment;
295     return OK;
296     }
297    
298     int FEM_MAILLAGE::supprimer_fem_segment(unsigned int num)
299     {
300     FEM_SEGMENT* femsegment=get_fem_segment(num);
301     if (femsegment==NULL)
302     {
303     // afficheur << INEXISTE2 << enderr;
304     return FAIL;
305     }
306     MG_IDENTIFICATEUR* id=femsegment;
307     LISTE_ENTITE::iterator i=lst_entite.find(id);
308     lst_entite.erase(i);
309     LISTE_FEM_SEGMENT::iterator j=lst_fem_segment.find(num);
310     lst_fem_segment.erase(j);
311     delete femsegment;
312     return OK;
313     }
314    
315     void FEM_MAILLAGE::supprimer_tout_fem_segment(void)
316     {
317     while (get_nb_fem_segment()!=0)
318     {
319     LISTE_FEM_SEGMENT::iterator j=lst_fem_segment.begin();
320     FEM_SEGMENT* femsegment=(*j).second;
321     MG_IDENTIFICATEUR* id=femsegment;
322     LISTE_ENTITE::iterator i=lst_entite.find(id);
323     lst_entite.erase(i);
324     lst_fem_segment.erase(j);
325     delete femsegment;
326     }
327     }
328    
329    
330     FEM_SEGMENT* FEM_MAILLAGE::get_premier_segment(LISTE_FEM_SEGMENT::iterator & it)
331     {
332     it = lst_fem_segment.begin();
333     if (it == lst_fem_segment.end())
334     return NULL;
335     return it->second ;
336     }
337    
338     FEM_SEGMENT* FEM_MAILLAGE::get_suivant_segment(LISTE_FEM_SEGMENT::iterator & it)
339     {
340     it++;
341     if(it==lst_fem_segment.end())
342     return NULL;
343     return it->second;
344     }
345    
346    
347    
348     // ENTITE FEM_TRIANGLE
349    
350    
351     int FEM_MAILLAGE::ajouter_fem_triangle(FEM_TRIANGLE *femtriangle)
352     {
353     gest->recherche_bonid(*femtriangle);
354     MG_IDENTIFICATEUR *id=femtriangle;
355     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
356     if (!p.second)
357     {
358     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
359     return FAIL;
360     }
361    
362     std::pair<const unsigned long,FEM_TRIANGLE*> tmp(femtriangle->get_id(),femtriangle);
363     lst_fem_triangle.insert(tmp);
364     return OK;
365     }
366    
367     FEM_TRIANGLE* FEM_MAILLAGE::get_fem_triangleid(unsigned long num)
368     {
369     LISTE_FEM_TRIANGLE::iterator i=lst_fem_triangle.find(num);
370     if (i==lst_fem_triangle.end())
371     {
372     // afficheur << INEXISTE << enderr;
373     return NULL;
374     }
375     return ((*i).second);
376     }
377    
378     unsigned int FEM_MAILLAGE::get_nb_fem_triangle(void)
379     {
380     return lst_fem_triangle.size();
381     }
382    
383    
384    
385     FEM_TRIANGLE* FEM_MAILLAGE::get_fem_triangle(unsigned int num)
386     {
387     if (!(num<lst_fem_triangle.size()))
388     {
389     // afficheur << INEXISTE << enderr;
390     return NULL;
391     }
392     LISTE_FEM_TRIANGLE::iterator i=lst_fem_triangle.begin();
393     for (unsigned long j=0;j<num;j++) i++;
394     return ((*i).second);
395     }
396    
397    
398    
399     int FEM_MAILLAGE::supprimer_fem_triangleid(unsigned long num)
400     {
401     FEM_TRIANGLE* femtriangle=get_fem_triangleid(num);
402     if (femtriangle==NULL)
403     {
404     // afficheur << INEXISTE2 << enderr;
405     return FAIL;
406     }
407     MG_IDENTIFICATEUR* id=femtriangle;
408     LISTE_ENTITE::iterator i=lst_entite.find(id);
409     lst_entite.erase(i);
410     LISTE_FEM_TRIANGLE::iterator j=lst_fem_triangle.find(num);
411     lst_fem_triangle.erase(j);
412     delete femtriangle;
413     return OK;
414     }
415    
416     int FEM_MAILLAGE::supprimer_fem_triangle(unsigned int num)
417     {
418     FEM_TRIANGLE* femtriangle=get_fem_triangle(num);
419     if (femtriangle==NULL)
420     {
421     // afficheur << INEXISTE2 << enderr;
422     return FAIL;
423     }
424     MG_IDENTIFICATEUR* id=femtriangle;
425     LISTE_ENTITE::iterator i=lst_entite.find(id);
426     lst_entite.erase(i);
427     LISTE_FEM_TRIANGLE::iterator j=lst_fem_triangle.find(num);
428     lst_fem_triangle.erase(j);
429     delete femtriangle;
430     return OK;
431     }
432    
433     void FEM_MAILLAGE::supprimer_tout_fem_triangle(void)
434     {
435     while (get_nb_fem_triangle()!=0)
436     {
437     LISTE_FEM_TRIANGLE::iterator j=lst_fem_triangle.begin();
438     FEM_TRIANGLE* femtriangle=(*j).second;
439     MG_IDENTIFICATEUR* id=femtriangle;
440     LISTE_ENTITE::iterator i=lst_entite.find(id);
441     lst_entite.erase(i);
442     lst_fem_triangle.erase(j);
443     delete femtriangle;
444     }
445     }
446    
447    
448     FEM_TRIANGLE* FEM_MAILLAGE::get_premier_triangle(LISTE_FEM_TRIANGLE::iterator & it)
449     {
450     it = lst_fem_triangle.begin();
451     if (it == lst_fem_triangle.end())
452     return NULL;
453     return it->second ;
454     }
455    
456     FEM_TRIANGLE* FEM_MAILLAGE::get_suivant_triangle(LISTE_FEM_TRIANGLE::iterator & it)
457     {
458     it++;
459     if(it==lst_fem_triangle.end())
460     return NULL;
461     return it->second;
462     }
463    
464    
465     // ENTITE FEM_TETRA
466    
467    
468     int FEM_MAILLAGE::ajouter_fem_tetra(FEM_TETRA *femtetra)
469     {
470     gest->recherche_bonid(*femtetra);
471     MG_IDENTIFICATEUR *id=femtetra;
472     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
473     if (!p.second)
474     {
475     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
476     return FAIL;
477     }
478    
479     std::pair<const unsigned long,FEM_TETRA*> tmp(femtetra->get_id(),femtetra);
480     lst_fem_tetra.insert(tmp);
481     return OK;
482     }
483    
484     FEM_TETRA* FEM_MAILLAGE::get_fem_tetraid(unsigned long num)
485     {
486     LISTE_FEM_TETRA::iterator i=lst_fem_tetra.find(num);
487     if (i==lst_fem_tetra.end())
488     {
489     // afficheur << INEXISTE << enderr;
490     return NULL;
491     }
492     return ((*i).second);
493     }
494    
495     unsigned int FEM_MAILLAGE::get_nb_fem_tetra(void)
496     {
497     return lst_fem_tetra.size();
498     }
499    
500    
501    
502     FEM_TETRA* FEM_MAILLAGE::get_fem_tetra(unsigned int num)
503     {
504     if (!(num<lst_fem_tetra.size()))
505     {
506     // afficheur << INEXISTE << enderr;
507     return NULL;
508     }
509     LISTE_FEM_TETRA::iterator i=lst_fem_tetra.begin();
510     for (unsigned long j=0;j<num;j++) i++;
511     return ((*i).second);
512     }
513    
514    
515    
516     int FEM_MAILLAGE::supprimer_fem_tetraid(unsigned long num)
517     {
518     FEM_TETRA* femtetra=get_fem_tetraid(num);
519     if (femtetra==NULL)
520     {
521     // afficheur << INEXISTE2 << enderr;
522     return FAIL;
523     }
524     MG_IDENTIFICATEUR* id=femtetra;
525     LISTE_ENTITE::iterator i=lst_entite.find(id);
526     lst_entite.erase(i);
527     LISTE_FEM_TETRA::iterator j=lst_fem_tetra.find(num);
528     lst_fem_tetra.erase(j);
529     delete femtetra;
530     return OK;
531     }
532    
533     int FEM_MAILLAGE::supprimer_fem_tetra(unsigned int num)
534     {
535     FEM_TETRA* femtetra=get_fem_tetra(num);
536     if (femtetra==NULL)
537     {
538     // afficheur << INEXISTE2 << enderr;
539     return FAIL;
540     }
541     MG_IDENTIFICATEUR* id=femtetra;
542     LISTE_ENTITE::iterator i=lst_entite.find(id);
543     lst_entite.erase(i);
544     LISTE_FEM_TETRA::iterator j=lst_fem_tetra.find(num);
545     lst_fem_tetra.erase(j);
546     delete femtetra;
547     return OK;
548     }
549    
550     void FEM_MAILLAGE::supprimer_tout_fem_tetra(void)
551     {
552     while (get_nb_fem_tetra()!=0)
553     {
554     LISTE_FEM_TETRA::iterator j=lst_fem_tetra.begin();
555     FEM_TETRA* femtetra=(*j).second;
556     MG_IDENTIFICATEUR* id=femtetra;
557     LISTE_ENTITE::iterator i=lst_entite.find(id);
558     lst_entite.erase(i);
559     lst_fem_tetra.erase(j);
560     delete femtetra;
561     }
562     }
563    
564    
565     FEM_TETRA* FEM_MAILLAGE::get_premier_tetra(LISTE_FEM_TETRA::iterator & it)
566     {
567     it = lst_fem_tetra.begin();
568     if (it == lst_fem_tetra.end())
569     return NULL;
570     return it->second ;
571     }
572    
573 francois 35 FEM_TETRA* FEM_MAILLAGE::get_suivant_tetra(LISTE_FEM_TETRA::iterator & it)
574 5 {
575     it++;
576     if(it==lst_fem_tetra.end())
577     return NULL;
578     return it->second;
579     }
580    
581    
582    
583    
584    
585    
586     void FEM_MAILLAGE::construire(int num)
587     {
588     if (degre==1) construire_lineraire();
589     if (degre==2) construire_quadratique();
590     if (num>0) optimise_numerotation();
591     if (num>1) echange_numerotation();
592    
593     }
594    
595    
596    
597    
598     void FEM_MAILLAGE::construire_lineraire(void)
599     {
600     LISTE_MG_NOEUD::iterator it_noeud;
601     MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_noeud);
602     unsigned int i=0;
603     while(mgnoeud)
604     {
605     mgnoeud->change_nouveau_numero(i);
606     FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud);
607     femnoeud->change_numero(i+1);
608     i++;
609     ajouter_fem_noeud(femnoeud);
610     mgnoeud=maillage->get_suivant_noeud(it_noeud);
611     }
612    
613    
614     LISTE_MG_SEGMENT::iterator it_seg;
615     MG_SEGMENT * mgseg = maillage->get_premier_segment(it_seg);
616     while(mgseg)
617     {
618     if (mgseg->get_lien_topologie()->get_dimension()==1)
619     {
620     FEM_NOEUD *tabnoeud[2];
621     tabnoeud[0]=get_fem_noeud(mgseg->get_noeud1()->get_nouveau_numero());
622     tabnoeud[1]=get_fem_noeud(mgseg->get_noeud2()->get_nouveau_numero());
623     FEM_SEGMENT2* seg=new FEM_SEGMENT2(mgseg,tabnoeud);
624     ajouter_fem_segment(seg);
625     }
626     mgseg=maillage->get_suivant_segment(it_seg);
627     }
628    
629    
630     LISTE_MG_TRIANGLE::iterator it_tri;
631     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
632     while(mgtri)
633     {
634     if (mgtri->get_lien_topologie()->get_dimension()==2)
635     {
636     FEM_NOEUD *tabnoeud[3];
637     tabnoeud[0]=get_fem_noeud(mgtri->get_noeud1()->get_nouveau_numero());
638     tabnoeud[1]=get_fem_noeud(mgtri->get_noeud2()->get_nouveau_numero());
639     tabnoeud[2]=get_fem_noeud(mgtri->get_noeud3()->get_nouveau_numero());
640     FEM_TRIANGLE3* tri=new FEM_TRIANGLE3(mgtri,tabnoeud);
641     ajouter_fem_triangle(tri);
642     }
643     mgtri=maillage->get_suivant_triangle(it_tri);
644     }
645    
646    
647     LISTE_MG_TETRA::iterator it_tetra;
648     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
649     while (mgtetra)
650     {
651     FEM_NOEUD *tabnoeud[4];
652     tabnoeud[0]=get_fem_noeud(mgtetra->get_noeud1()->get_nouveau_numero());
653     tabnoeud[1]=get_fem_noeud(mgtetra->get_noeud2()->get_nouveau_numero());
654     tabnoeud[2]=get_fem_noeud(mgtetra->get_noeud3()->get_nouveau_numero());
655     tabnoeud[3]=get_fem_noeud(mgtetra->get_noeud4()->get_nouveau_numero());
656     FEM_TETRA4* tet=new FEM_TETRA4(mgtetra,tabnoeud);
657     ajouter_fem_tetra(tet);
658     mgtetra=maillage->get_suivant_tetra(it_tetra);
659     }
660     }
661    
662    
663    
664     void FEM_MAILLAGE::construire_quadratique(void)
665     {
666     LISTE_MG_NOEUD::iterator it_nd;
667     MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_nd);
668     unsigned int i=0;
669     while(mgnoeud)
670     {
671     mgnoeud->change_nouveau_numero(i);
672     FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud);
673     femnoeud->change_numero(i+1);
674     i++ ;
675     ajouter_fem_noeud(femnoeud);
676     mgnoeud=maillage->get_suivant_noeud(it_nd);
677     }
678    
679    
680    
681     LISTE_MG_SEGMENT::iterator it_seg;
682     MG_SEGMENT* mgseg=maillage->get_premier_segment(it_seg);
683     int nbmgnoeud = maillage->get_nb_mg_noeud();
684     i=0;
685     while(mgseg)
686     {
687     mgseg->change_nouveau_numero(i++);
688     MG_NOEUD *noeud1=mgseg->get_noeud1();
689     MG_NOEUD *noeud2=mgseg->get_noeud2();
690     double *xyz1=noeud1->get_coord();
691     double *xyz2=noeud2->get_coord();
692     FEM_NOEUD* femnoeud;
693     if (mgseg->get_lien_topologie()->get_dimension()==1)
694     {
695     MG_ARETE* arete=(MG_ARETE*)(mgseg->get_lien_topologie());
696     double t1,t2;
697     arete->inverser(t1,xyz1);
698     arete->inverser(t2,xyz2);
699     if (arete->get_courbe()->est_periodique())
700     if (t1>t2) t2=t2+arete->get_courbe()->get_periode();
701     double t=0.5*(t1+t2);
702     double xyz[2];
703     arete->evaluer(t,xyz);
704     femnoeud= new FEM_NOEUD(mgseg,xyz[0],xyz[1],xyz[2]);
705     }
706     if (mgseg->get_lien_topologie()->get_dimension()==2)
707     {
708     MG_FACE* face=(MG_FACE*)(mgseg->get_lien_topologie());
709     double uv1[2],uv2[2];
710     OT_DECALAGE_PARAMETRE decalage(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
711     face->inverser(uv1,xyz1);
712     face->inverser(uv2,xyz2);
713     double du=decalage.calcul_decalage_parametre_u(uv1[0]);
714     double dv=decalage.calcul_decalage_parametre_v(uv1[1]);
715     double u1=decalage.decalage_parametre_u(uv1[0],du);
716     double v1=decalage.decalage_parametre_v(uv1[1],dv);
717     double u2=decalage.decalage_parametre_u(uv2[0],du);
718     double v2=decalage.decalage_parametre_v(uv2[1],dv);
719     double ui=0.5*(u1+u2);
720     double vi=0.5*(v1+v2);
721     double uii=decalage.decalage_parametre_u(ui,-du);
722     double vii=decalage.decalage_parametre_v(vi,-dv);
723     double uv[2],xyz[3];
724     uv[0]=uii;
725     uv[1]=vii;
726     face->evaluer(uv,xyz);
727     femnoeud= new FEM_NOEUD(mgseg,xyz[0],xyz[1],xyz[2]);
728     }
729     if (mgseg->get_lien_topologie()->get_dimension()==3)
730     {
731     double x=0.5*(xyz1[0]+xyz2[0]);
732     double y=0.5*(xyz1[1]+xyz2[1]);
733     double z=0.5*(xyz1[2]+xyz2[2]);
734     femnoeud= new FEM_NOEUD(mgseg,x,y,z);
735     }
736     femnoeud->change_numero(i+nbmgnoeud+1);
737     ajouter_fem_noeud(femnoeud);
738     mgseg=maillage->get_suivant_segment(it_seg);
739     }
740    
741     mgseg=maillage->get_premier_segment(it_seg);
742     while(mgseg)
743     {
744     if (mgseg->get_lien_topologie()->get_dimension()==1)
745     {
746     FEM_NOEUD *tabnoeud[3];
747     tabnoeud[0]=get_fem_noeud(mgseg->get_noeud1()->get_nouveau_numero());
748     tabnoeud[1]=get_fem_noeud(mgseg->get_nouveau_numero()+nbmgnoeud);
749     tabnoeud[2]=get_fem_noeud(mgseg->get_noeud2()->get_nouveau_numero());
750     FEM_SEGMENT3* seg=new FEM_SEGMENT3(mgseg,tabnoeud);
751     ajouter_fem_segment(seg);
752     }
753     mgseg=maillage->get_suivant_segment(it_seg);
754     }
755    
756    
757     LISTE_MG_TRIANGLE::iterator it_tri;
758     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
759    
760     while(mgtri)
761     {
762     if (mgtri->get_lien_topologie()->get_dimension()==2)
763     {
764     FEM_NOEUD *tabnoeud[6];
765     tabnoeud[0]=get_fem_noeud(mgtri->get_noeud1()->get_nouveau_numero());
766     tabnoeud[1]=get_fem_noeud(mgtri->get_segment1()->get_nouveau_numero()+nbmgnoeud);
767     tabnoeud[2]=get_fem_noeud(mgtri->get_noeud2()->get_nouveau_numero());
768     tabnoeud[3]=get_fem_noeud(mgtri->get_segment2()->get_nouveau_numero()+nbmgnoeud);
769     tabnoeud[4]=get_fem_noeud(mgtri->get_noeud3()->get_nouveau_numero());
770     tabnoeud[5]=get_fem_noeud(mgtri->get_segment3()->get_nouveau_numero()+nbmgnoeud);
771     FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(mgtri,tabnoeud);
772     ajouter_fem_triangle(tri);
773     }
774     mgtri=maillage->get_suivant_triangle(it_tri);
775     }
776    
777    
778     LISTE_MG_TETRA::iterator it_tetra;
779     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
780     while(mgtetra)
781     {
782     FEM_NOEUD *tabnoeud[10];
783     tabnoeud[0]=get_fem_noeud(mgtetra->get_noeud1()->get_nouveau_numero());
784     tabnoeud[1]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud);
785     tabnoeud[2]=get_fem_noeud(mgtetra->get_noeud2()->get_nouveau_numero());
786     tabnoeud[3]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud);
787     tabnoeud[4]=get_fem_noeud(mgtetra->get_noeud3()->get_nouveau_numero());
788     tabnoeud[5]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud);
789     tabnoeud[6]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud);
790     tabnoeud[7]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud);
791     tabnoeud[8]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud);
792     tabnoeud[9]=get_fem_noeud(mgtetra->get_noeud4()->get_nouveau_numero());
793     FEM_TETRA10* tet=new FEM_TETRA10(mgtetra,tabnoeud);
794     ajouter_fem_tetra(tet);
795     mgtetra=maillage->get_suivant_tetra(it_tetra);
796     }
797     }
798    
799    
800    
801     void FEM_MAILLAGE::enregistrer(std::ostream& o)
802     {
803    
804     if (mg_geometrie==NULL) o << "%" << get_id() << "=FEM_MAILLAGE(" << degre << ",$" << maillage->get_id() << " );" << std::endl;
805     else o << "%" << get_id() << "=FEM_MAILLAGE("<< degre << ",$" << maillage->get_id() << ",$" << mg_geometrie->get_id() <<");" << std::endl;
806     LISTE_ENTITE::const_iterator i;
807     for (i=lst_entite.begin();i!=lst_entite.end();i++)
808     (*i)->enregistrer(o);
809     }
810    
811    
812     void FEM_MAILLAGE::exporter_cosmos(std::string& nomfic)
813     {
814     char chaine[500];
815     sprintf(chaine,"%s.ses",nomfic.c_str());
816     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
817     of1.precision(16);
818     of1.setf(std::ios::showpoint);
819     of1 << "TITLE, " << chaine << " : Fichier FEM de maillage MAGiC" << std::endl;
820     if (degre==1) of1 << "EGROUP,1,TETRA4,0,0,0,0,0,0,0,0;" << std::endl;
821     if (degre==2) of1 << "EGROUP,1,TETRA10,0,0,0,0,0,0,0,0;" << std::endl;
822     int nb_volume=mg_geometrie->get_nb_mg_volume();
823     int nbNoeuds = 0;
824    
825    
826     for (int i=0;i<nb_volume;i++)
827     {
828     MG_VOLUME *mgvol=mg_geometrie->get_mg_volume(i);
829     if (mgvol->get_num_materiau()>=0)
830     {
831     MT_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
832     MT_MATERIAU* mat=mtgest.get_materiau(mgvol->get_num_materiau());
833     for(int m=0; m<mat->get_nb_propriete();m++)
834     {
835     MT_PROPRIETE* prop=mat->get_propriete(m);
836     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
837     }
838     /* MT_PROPRIETE* prop=mat->get_propriete("EX");
839     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", EX, " << prop->get_valeur(2) << ";" << std::endl;
840     prop=mat->get_propriete("NUXY");
841     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", NUXY, " << prop->get_valeur(2) << ";" << std::endl;
842     prop=mat->get_propriete("GXY");
843     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", GXY, " << prop->get_valeur(2) << ";" << std::endl;
844     prop=mat->get_propriete("DENS");
845     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", DENS, " << prop->get_valeur(2) << ";" << std::endl;
846     prop=mat->get_propriete("SIGXT");
847     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGXT, " << prop->get_valeur(2) << ";" << std::endl;
848     prop=mat->get_propriete("SIGYLD");
849     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGYLD, " << prop->get_valeur(2) << ";" << std::endl;
850     prop=mat->get_propriete("ALPX");
851     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", ALPX, " << prop->get_valeur(2) << ";" << std::endl;
852     prop=mat->get_propriete("KX");
853     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", KX, " << prop->get_valeur(2) << ";" << std::endl;
854     prop=mat->get_propriete("C");
855     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", C , " << prop->get_valeur(2) << ";" << std::endl;*/
856     }
857     }
858     int nb_coques = mg_geometrie->get_nb_mg_coque();
859     for (int i=0;i<nb_coques;i++)
860     {
861     MG_COQUE *mgcoque=mg_geometrie->get_mg_coque(i);
862     if (mgcoque->get_num_materiau()>=0)
863     {
864     MT_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
865     MT_MATERIAU* mat=mtgest.get_materiau(mgcoque->get_num_materiau());
866     for(int m=0; m<mat->get_nb_propriete();m++)
867     {
868     MT_PROPRIETE* prop=mat->get_propriete(m);
869     of1<< "MPROP, "<< mgcoque->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
870     }
871     }
872     }
873     int nb_poutres = mg_geometrie->get_nb_mg_poutre();
874     for (int i=0;i<nb_poutres;i++)
875     {
876     MG_POUTRE *mgpoutre=mg_geometrie->get_mg_poutre(i);
877     if (mgpoutre->get_num_materiau()>=0)
878     {
879     MT_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
880     MT_MATERIAU* mat=mtgest.get_materiau(mgpoutre->get_num_materiau());
881    
882     for(int m=0; m<mat->get_nb_propriete();m++)
883     {
884     MT_PROPRIETE* prop=mat->get_propriete(m);
885     of1<< "MPROP, "<< mgpoutre->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
886     }
887     }
888     }
889    
890    
891    
892     of1 << "ACTSET,CS,0;" << std::endl;
893     of1 << "ACTSET,EG,1;" << std::endl;
894    
895     // �riture des noeuds
896     int ii=0;
897     double valeurunite=mg_geometrie->get_valeur_unite();
898     for (LISTE_FEM_NOEUD::iterator i=lst_fem_noeud.begin();i!=lst_fem_noeud.end();i++)
899     {
900     FEM_NOEUD* noeud=((*i).second);
901     of1 << "ND, " << noeud->get_numero() << ", " << noeud->get_x()*valeurunite << ", " << noeud->get_y()*valeurunite << ", " << noeud->get_z()*valeurunite << ";" << std::endl;
902     char nom[3];
903     int nb=noeud->get_lien_topologie()->get_nb_ccf();
904     for (int k=0;k<nb;k++)
905     {
906     noeud->get_lien_topologie()->get_type_ccf(k,nom);
907     if (strcmp(nom,"Da")==0) of1 << "DND , " << noeud->get_numero() << ", AL, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << noeud->get_numero() << ", 1;" << std::endl;
908     if (strcmp(nom,"Dx")==0) of1 << "DND , " << noeud->get_numero() << ", UX, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << noeud->get_numero() << ", 1;" << std::endl;
909     if (strcmp(nom,"Dy")==0) of1 << "DND , " << noeud->get_numero() << ", UY, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << noeud->get_numero() << ", 1;" << std::endl;
910     if (strcmp(nom,"Dz")==0) of1 << "DND , " << noeud->get_numero() << ", UZ, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << noeud->get_numero() << ", 1;" << std::endl;
911     if (strcmp(nom,"Fx")==0) of1 << "FND , " << noeud->get_numero() << ", FX, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << noeud->get_numero() << ", 1;" << std::endl;
912     if (strcmp(nom,"Fy")==0) of1 << "FND , " << noeud->get_numero() << ", FY, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << noeud->get_numero() << ", 1;" << std::endl;
913     if (strcmp(nom,"Fz")==0) of1 << "FND , " << noeud->get_numero() << ", FZ, " << noeud->get_lien_topologie()->get_valeur_ccf(k) << ", " << noeud->get_numero() << ", 1;" << std::endl;
914     }
915     ii++;
916     }
917     nbNoeuds = ii;
918     ii=0;
919    
920 bournival 131 // écriture des tétraèdres
921 5 int nummat=-10; // num�o du mat�iau
922     for (LISTE_FEM_TETRA::iterator i=lst_fem_tetra.begin();i!=lst_fem_tetra.end();i++)
923     {
924     FEM_TETRA* tetra=((*i).second);
925     MG_VOLUME* vol=(MG_VOLUME*)tetra->get_lien_topologie();
926     int nummatac=vol->get_num_materiau();
927     if ((nummatac!=nummat) && (nummatac!=-1))
928     {
929     nummat=nummatac;
930     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
931     }
932     if (degre==1) of1 << "EL, " << ii+1 << ", VL, 1, 4, " << tetra->get_fem_noeud(0)->get_numero() << ", " << tetra->get_fem_noeud(1)->get_numero() << ", " << tetra->get_fem_noeud(2)->get_numero() << ", " << tetra->get_fem_noeud(3)->get_numero() << ", " ;
933     if (degre==2) of1 << "EL, " << ii+1 << ", VL, 1,10, " << tetra->get_fem_noeud(0)->get_numero() << ", " << tetra->get_fem_noeud(2)->get_numero() << ", " << tetra->get_fem_noeud(4)->get_numero() << ", " << tetra->get_fem_noeud(9)->get_numero() << ", " << tetra->get_fem_noeud(1)->get_numero() << ", " << tetra->get_fem_noeud(3)->get_numero() << ", " << tetra->get_fem_noeud(5)->get_numero() << ", " << tetra->get_fem_noeud(6)->get_numero() << ", " << tetra->get_fem_noeud(7)->get_numero() << ", " << tetra->get_fem_noeud(8)->get_numero() << ", " ;
934     ii++;
935     MG_TETRA* tet=(MG_TETRA*)tetra->get_mg_element_maillage();
936     if (tet->get_triangle1()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
937     if (tet->get_triangle2()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
938     if (tet->get_triangle3()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
939     if (tet->get_triangle4()->get_lien_topologie()->get_dimension()!=3) of1 << "1;" << std::endl ; else of1 << "0;" << std::endl;
940     char nom[3];
941     int nb=tet->get_triangle1()->get_lien_topologie()->get_nb_ccf();
942     for (int k=0;k<nb;k++)
943     {
944     tet->get_triangle1()->get_lien_topologie()->get_type_ccf(k,nom);
945     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 1;" << std::endl;
946     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 2;" << std::endl;
947     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 3;" << std::endl;
948     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 4;" << std::endl;
949     }
950     nb=tet->get_triangle2()->get_lien_topologie()->get_nb_ccf();
951     for (int k=0;k<nb;k++)
952     {
953     tet->get_triangle2()->get_lien_topologie()->get_type_ccf(k,nom);
954     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 1;" << std::endl;
955     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 2;" << std::endl;
956     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 3;" << std::endl;
957     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 4;" << std::endl;
958     }
959     nb=tet->get_triangle3()->get_lien_topologie()->get_nb_ccf();
960     for (int k=0;k<nb;k++)
961     {
962     tet->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
963     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 1;" << std::endl;
964     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 2;" << std::endl;
965     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 3;" << std::endl;
966     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 4;" << std::endl;
967     }
968     nb=tet->get_triangle4()->get_lien_topologie()->get_nb_ccf();
969     for (int k=0;k<nb;k++)
970     {
971     tet->get_triangle4()->get_lien_topologie()->get_type_ccf(k,nom);
972     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 1;" << std::endl;
973     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 2;" << std::endl;
974     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 3;" << std::endl;
975     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 4;" << std::endl;
976     }
977     }
978    
979    
980     //*********************************************************
981 bournival 131 // Les tétras sont finis, maintenant le maillage des Coques
982 5 //*********************************************************
983     //nb_coques=mg_geometrie->get_nb_mg_coque(); //variable d��d�lar� plus haut, elle devrait avoir conserv�sa valeur
984     if (nb_coques>0)
985     {
986     if (degre==1) of1 << "EGROUP,2,SHELL3,0,0,0,0,0,0,0,0;" << std::endl; // Formulation coques minces... SHELL3T pout �aisses
987     if (degre==2) of1 << "EGROUP,2,SHELL6,0,0,0,0,0,0,0,0;" << std::endl;
988     }
989    
990 bournival 21 if (nb_poutres>0 || nb_coques>0 )
991     {
992 bournival 131 of1 << "EGROUP,3,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres
993     of1 << "RCONST,3,3,1,3," << "1, 1 , 1; " << std::endl;
994 bournival 21 of1 << "EGROUP,4,RBAR;"<< std::endl; // EGroup des RBAR
995 bournival 131 of1 << "EGROUP,5,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres infiniment rigide
996     of1 << "RCONST,5,5,1,3," << "0.01, 0.01 , 0.01; " << std::endl;
997     of1 << "EGROUP,6,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres avec inertie dans juste une direction (je sais, il n'est pas obligatoire, mais ça aide au débuggage d'avoir un #5...)
998     of1 << "RCONST,6,6,1,3," << "1e-16, 0.01 , 1e-16; " << std::endl;
999 bournival 21 }
1000    
1001 bournival 131 int RCset =7;
1002 5
1003     LISTE_MG_COQUE::iterator ico;
1004     MG_COQUE *mgcoque=mg_geometrie->get_premier_coque(ico);
1005     while(mgcoque)
1006     {
1007     int nummatac=mgcoque->get_num_materiau();
1008     if ((nummatac!=nummat)&&(nummatac!=-1)) // si c'est = 0 alors on place le dernier mat�iau choisi.
1009     {
1010     nummat=nummatac;
1011     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1012     }
1013    
1014     for (int numcoquille=0;numcoquille<mgcoque->get_nb_mg_coquille();numcoquille++)
1015     {
1016     MG_COQUILLE* mgcoquille = mgcoque->get_mg_coquille(numcoquille);
1017     for (int cf = 0; cf<mgcoquille->get_nb_mg_coface();cf++)
1018     {
1019     MG_COFACE* mgcoface = mgcoquille->get_mg_coface(cf);
1020     MG_FACE* mgface = mgcoface->get_face();
1021    
1022     double epaisseur=-1;
1023     for (int k=0;k<mgface->get_nb_ccf();k++) // aller chercher l'�aisseur de la coque
1024     {
1025     char nomCCF[3];
1026     mgface->get_type_ccf(k,nomCCF);
1027     if (strcmp(nomCCF,"EP")==0)
1028     epaisseur = mgface-> get_valeur_ccf(k);
1029     }
1030     of1 << "ACTSET,EG,2;"<< std::endl;
1031     of1 << "RCONST,2,"<< ++RCset << ",1,1," << epaisseur << ";" << std::endl; // le real constant, s'active automatiquement
1032    
1033     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_maillage = mgface->get_lien_fem_maillage();
1034     int nbelem=lien_maillage->get_nb();
1035     for (int i=0;i<nbelem;i++)
1036     {
1037     FEM_TRIANGLE* femtriangle=(FEM_TRIANGLE*)lien_maillage->get(i);
1038     if (!contient(femtriangle)) continue;
1039     if (degre==1) of1 << "EL, " << ++ii << ", SF, 0, 3, " <<femtriangle->get_fem_noeud(0)->get_numero()<< ","<< femtriangle->get_fem_noeud(1)->get_numero()<<","<<femtriangle->get_fem_noeud(2)->get_numero()<< ";" << std::endl;
1040     if (degre==2) of1 << "EL, " << ++ii << ", SF, 0, 6, " <<femtriangle->get_fem_noeud(0)->get_numero()<< ","<< femtriangle->get_fem_noeud(2)->get_numero()<<","<<femtriangle->get_fem_noeud(4)->get_numero()<< ","<<femtriangle->get_fem_noeud(1)->get_numero()<< ","<<femtriangle->get_fem_noeud(3)->get_numero()<<","<<femtriangle->get_fem_noeud(5)->get_numero()<<";"<< std::endl;
1041     // dans les noeuds des sommets sont, 1, 2 et 3. les noeuds sur les segments sont 4 5 et 6
1042    
1043     long nbc;
1044     MG_TRIANGLE* mgtri=(MG_TRIANGLE*)femtriangle->get_mg_element_maillage();
1045     char nom[3];
1046    
1047 bournival 131 /* nbc = mgtri->get_segment1()->get_lien_topologie()->get_nb_ccf();
1048 5 for (int z =0 ; z< nbc; z++) // le premier segment
1049     { // il y a au moins une CCF "EP" qu'il faut ignorer
1050     mgtri->get_segment1()->get_lien_topologie()->get_type_ccf(z,nom); // ->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1051     if (strcmp(nom,"EP")==0) continue;
1052     if (strcmp(nom,"Px")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment1()->get_lien_topologie()->get_valeur_ccf(z) << ", 1, " << ii << ", 1, 1; C* CCF de Coque... " << std::endl;
1053 bournival 131 if (strcmp(nom,"Py")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment1()->get_lien_topologie()->get_valeur_ccf(z) << ", 1, " << ii << ", 1, 2; C* CCF de Coque... " << std::endl;
1054 5 if (strcmp(nom,"Pz")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment1()->get_lien_topologie()->get_valeur_ccf(z) << ", 1, " << ii << ", 1, 3; C* CCF de Coque... "<< std::endl;
1055     if (strcmp(nom,"Pn")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment1()->get_lien_topologie()->get_valeur_ccf(z) << ", 1, " << ii << ", 1, 4; C* CCF de Coque... " << std::endl;
1056     }
1057     nbc = mgtri->get_segment2()->get_lien_topologie()->get_nb_ccf();
1058     for (int z =0 ; z< nbc; z++)
1059     {
1060     mgtri->get_segment2()->get_lien_topologie()->get_type_ccf(z,nom);
1061     if (strcmp(nom,"EP")==0) continue;
1062     if (strcmp(nom,"Px")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment2()->get_lien_topologie()->get_valeur_ccf(z) << ", 2, " << ii << ", 1, 1; C* CCF de Coque... " << std::endl;
1063     if (strcmp(nom,"Py")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment2()->get_lien_topologie()->get_valeur_ccf(z) << ", 2, " << ii << ", 1, 2; C* CCF de Coque... " << std::endl;
1064     if (strcmp(nom,"Pz")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment2()->get_lien_topologie()->get_valeur_ccf(z) << ", 2, " << ii << ", 1, 3; C* CCF de Coque... "<< std::endl;
1065     if (strcmp(nom,"Pn")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment2()->get_lien_topologie()->get_valeur_ccf(z) << ", 2, " << ii << ", 1, 4; C* CCF de Coque... " << std::endl;
1066     }
1067     nbc = mgtri->get_segment3()->get_lien_topologie()->get_nb_ccf();
1068     for (int z =0 ; z< nbc; z++)
1069     {
1070     mgtri->get_segment3()->get_lien_topologie()->get_type_ccf(z,nom);
1071     if (strcmp(nom,"EP")==0) continue;
1072     if (strcmp(nom,"Px")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment3()->get_lien_topologie()->get_valeur_ccf(z) << ", 3, " << ii << ", 1, 1; C* CCF de Coque... " << std::endl;
1073     if (strcmp(nom,"Py")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment3()->get_lien_topologie()->get_valeur_ccf(z) << ", 3, " << ii << ", 1, 2; C* CCF de Coque... " << std::endl;
1074     if (strcmp(nom,"Pz")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment3()->get_lien_topologie()->get_valeur_ccf(z) << ", 3, " << ii << ", 1, 3; C* CCF de Coque... "<< std::endl;
1075     if (strcmp(nom,"Pn")==0) of1 << "PEL, " << ii << ", " << mgtri->get_segment3()->get_lien_topologie()->get_valeur_ccf(z) << ", 3, " << ii << ", 1, 4; C* CCF de Coque... " << std::endl;
1076     }
1077    
1078 bournival 131 */
1079 5 nbc = mgtri->get_lien_topologie()->get_nb_ccf(); // et pour la face elle-m�e
1080     for (int z =0 ; z< nbc; z++)
1081     {
1082     mgtri->get_lien_topologie()->get_type_ccf(z,nom);
1083     if (strcmp(nom,"EP")==0) continue;
1084 bournival 131 if (strcmp(nom,"Px")==0) of1 << "PEL, " << ii << ", " << mgtri->get_lien_topologie()->get_valeur_ccf(z) << ", 5, " << ii << ", 1, 1; C* CCF de Coque... " << std::endl;
1085     if (strcmp(nom,"Py")==0) of1 << "PEL, " << ii << ", " << mgtri->get_lien_topologie()->get_valeur_ccf(z) << ", 5, " << ii << ", 1, 2; C* CCF de Coque... " << std::endl;
1086     if (strcmp(nom,"Pz")==0) of1 << "PEL, " << ii << ", " << mgtri->get_lien_topologie()->get_valeur_ccf(z) << ", 5, " << ii << ", 1, 3; C* CCF de Coque... "<< std::endl;
1087     if (strcmp(nom,"Pn")==0) of1 << "PEL, " << ii << ", " << mgtri->get_lien_topologie()->get_valeur_ccf(z) << ", 5, " << ii << ", 1, 4; C* CCF de Coque... " << std::endl;
1088 5 }
1089    
1090     }
1091    
1092     } // next face
1093     } // next coquille
1094     mgcoque = mg_geometrie->get_suivant_coque(ico);
1095     }// next coque
1096    
1097    
1098     // **************************
1099     // maintenant les poutres
1100     // **************************
1101    
1102    
1103 bournival 21
1104 5 //for (int i = 0 ; i<nb_poutres;i++)
1105     LISTE_MG_POUTRE::iterator it_po;
1106     MG_POUTRE* mgpoutre = mg_geometrie->get_premier_poutre(it_po);
1107     while(mgpoutre)
1108     {
1109     //MG_POUTRE* mgpoutre = mg_geometrie->get_mg_poutre(i);
1110     int nummatac=mgpoutre->get_num_materiau();
1111     if ((nummatac!=nummat)&&(nummatac!=-1))
1112     {
1113     nummat=nummatac;
1114     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1115     }
1116    
1117     for (int j = 0;j<mgpoutre->get_nb_mg_boucle();j++)
1118     {
1119     MG_BOUCLE* mgboucle = mgpoutre->get_mg_boucle(j);
1120    
1121     for (int k = 0 ; k<mgboucle->get_nb_mg_coarete();k++)
1122     {
1123     MG_COARETE* mgcoarete = mgboucle->get_mg_coarete(k);
1124     MG_ARETE* mgarete = mgcoarete->get_arete();
1125    
1126     double IXX = 0;
1127     double IYY = 0;
1128     double Aire = 0;
1129     double x3 = 0;
1130     double y3 = 0;
1131     double z3 = 0;
1132    
1133     for (int k=0;k<mgarete->get_nb_ccf();k++)
1134     {
1135     char nomCCF[3];
1136     mgarete->get_type_ccf(k,nomCCF);
1137     if (strcmp(nomCCF,"As")==0)
1138     Aire = mgarete->get_valeur_ccf(k);
1139     if (strcmp(nomCCF,"IX")==0)
1140     IXX = mgarete->get_valeur_ccf(k);
1141     if (strcmp(nomCCF,"IY")==0)
1142     IYY = mgarete->get_valeur_ccf(k);
1143     if (strcmp(nomCCF,"NX")==0)
1144     x3 = mgarete->get_valeur_ccf(k);
1145     if (strcmp(nomCCF, "NY")==0)
1146     y3 = mgarete->get_valeur_ccf(k);
1147     if (strcmp(nomCCF, "NZ")==0)
1148     z3 = mgarete->get_valeur_ccf(k);
1149     }
1150    
1151 bournival 131 if( Aire==-7) // -7 est un flag pour différencier les mini-poutres...
1152 5 { // mini-poutre
1153 bournival 131 of1 << "Actset,EG,5;"<<std::endl;
1154     of1 << "Actset,RC,5;"<<std::endl;
1155 5 of1 << "C* MINI - POUTRE" << std:: endl;
1156    
1157     for(int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1158     {
1159 bournival 131 FEM_SEGMENT* femseg = (FEM_SEGMENT*)mgarete->get_lien_fem_maillage()->get(t);
1160 5 of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1161     } // next segment
1162     }
1163     else
1164     { // poutre normale
1165     of1 << "Actset,EG,3;"<<std::endl;
1166 bournival 131 of1 << "ND,"<< ++nbNoeuds/* NDMAX+1 */ << "," << x3*valeurunite << "," << y3*valeurunite << "," << z3*valeurunite << ";" << std::endl; // création du troisème point (qui est un noeud) ND,1,5,6,7
1167     of1 << "RCONST,3,"<< ++RCset << ",1,3," << Aire << "," << IXX << "," << IYY << ";" << std::endl; //RCONST,3,66,1,3,99,98,97 ; EG associée RC , start location, nombre de constantes, aire, inertie XX, inertie YY
1168 5
1169     for(int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1170     {
1171     FEM_SEGMENT* femseg = (FEM_SEGMENT*)mgarete->get_lien_fem_maillage()->get(t);
1172     if (!contient(femseg)) continue;
1173     if (degre==1) of1 << "EL, " << ++ii << ", CR, 0, 3, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<","<< nbNoeuds << ";" << std::endl;
1174    
1175     for (int k=0;k<mgarete->get_nb_ccf();k++)
1176     {
1177     char nom[3];
1178     mgarete->get_type_ccf(k,nom);
1179     if (strcmp(nom,"Px")==0) of1 << "PEL, " << ii << ", " << femseg->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 1; C* CCF de Coque... " << std::endl;
1180     if (strcmp(nom,"Py")==0) of1 << "PEL, " << ii << ", " << femseg->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 2; C* CCF de Coque... " << std::endl;
1181     if (strcmp(nom,"Pz")==0) of1 << "PEL, " << ii << ", " << femseg->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 3; C* CCF de Coque... "<< std::endl;
1182     if (strcmp(nom,"Pn")==0) of1 << "PEL, " << ii << ", " << femseg->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 4; C* CCF de Coque... " << std::endl; // l�� va en arracher!!!
1183     }
1184     } // next segment
1185     }
1186    
1187    
1188     } // next arete
1189     } // next boucle
1190     mgpoutre=mg_geometrie->get_suivant_poutre(it_po);
1191     } // next poutre
1192    
1193 bournival 131 // Cas spécial, une arête normale est flaggée comme une mini-poutre (dans coupecoté)
1194     LISTE_MG_ARETE::iterator ita;
1195     MG_ARETE* mgarete = mg_geometrie->get_premier_arete(ita);
1196 5
1197 bournival 131 while(mgarete)
1198     {
1199     double Aire = 0;
1200    
1201     for (int k=0;k<mgarete->get_nb_ccf();k++)
1202     {
1203     char nomCCF[3];
1204     mgarete->get_type_ccf(k,nomCCF);
1205     if (strcmp(nomCCF,"As")==0)
1206     Aire = mgarete->get_valeur_ccf(k);
1207     }
1208    
1209     if( Aire==-7) // -7 est un flag pour différencier les mini-poutres... non orientée
1210     { // mini-poutre
1211     of1 << "Actset,EG,5;"<<std::endl;
1212     of1 << "Actset,RC,5;"<<std::endl;
1213     of1 << "C* MINI - POUTRE" << std:: endl;
1214    
1215     for(int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1216     {
1217     FEM_SEGMENT* femseg = (FEM_SEGMENT*)mgarete->get_lien_fem_maillage()->get(t);
1218     if (!contient(femseg)) continue;
1219     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1220     }
1221     }
1222     mgarete=mg_geometrie->get_suivant_arete(ita);
1223     }
1224    
1225    
1226    
1227 5 //************************************************************
1228 bournival 131 // Pour mettre des mini-poutres sur les faces concernées *****
1229 5 //*************************************************************
1230     // identifications des faces du qui sont des faces internes.
1231    
1232     LISTE_MG_FACE::iterator itf;
1233     MG_FACE* mgface = mg_geometrie->get_premier_face(itf);
1234    
1235    
1236 bournival 131 while(mgface)
1237     {
1238     for (int k=0;k<mgface->get_nb_ccf();k++)
1239 5 {
1240     char nomCCF[3];
1241     mgface->get_type_ccf(k,nomCCF);
1242 bournival 131
1243 5 if (strcmp(nomCCF,"FI")==0)
1244 bournival 131 {
1245 5 TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_fem_maillage = mgface->get_lien_fem_maillage();
1246     FEM_ELEMENT_MAILLAGE* element;
1247    
1248 bournival 131 //si on a une faceinterne de poutre alors on a une CCF "Po" = 0
1249     // sinon la CCF Po est égale à 1 et on a une coque
1250     int Poutre = -1;
1251    
1252     for (int z=0;z<mgface->get_nb_ccf();z++)
1253     {
1254     char nomCCF2[3];
1255     mgface->get_type_ccf(z,nomCCF);
1256     if(strcmp(nomCCF,"Po")==0)
1257 5 {
1258 bournival 131 Poutre = mgface->get_valeur_ccf(z);
1259     }
1260     }
1261 5
1262    
1263 bournival 131 if (Poutre ==0)
1264     { // mini-poutres pour des poutres
1265     of1 << "ACTSET,EG,5; C* Face avec mini-poutres de POUTRE"<<std::endl;
1266     of1 << "ACTSET,RC,5;"<<std::endl;
1267     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
1268     {
1269     FEM_TRIANGLE* femtriangle=(FEM_TRIANGLE*)lien_fem_maillage->get(i) ;
1270    
1271     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
1272     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
1273     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
1274    
1275     // Pour des mini-poutres de rigidité infinie //EL,1,CR,0,3,1,2,3,0,0,0,0,0,0 num ��ent, CR, flag asso, nb noeuds, #1, #2, #3 ;
1276     //si on veut orienter les propriétés,
1277     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
1278     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1279     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1280 5 }
1281 bournival 131 }
1282     else if(Poutre==1)
1283     { // mini-poutres pour des coques
1284     of1 << "ACTSET,EG,6; C* Face avec mini-poutres de COQUE"<<std::endl;
1285     of1 << "ACTSET,RC,6;"<<std::endl;
1286     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
1287     {
1288     FEM_TRIANGLE* femtriangle=(FEM_TRIANGLE*)lien_fem_maillage->get(i) ;
1289    
1290     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
1291     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
1292     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
1293    
1294     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1295     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd1->get_numero()<< "," << nd2->get_numero()<< "," << nd0->get_numero()<< ";" << std::endl;
1296     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd2->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
1297     }
1298     }
1299     } // end if FI
1300     } // next CCF
1301 5 mgface= mg_geometrie->get_suivant_face(itf);
1302 bournival 131 } // end while face
1303 5
1304    
1305 bournival 131
1306     //of1<< "NMERGE;" <<std::endl;
1307     //of1<< "NCOMPRESS;" <<std::endl;
1308    
1309 5 //of1<< "SETEPLOT,1,1,0,0;"<<std::endl;
1310     //of1<< "ACTECLR,1,RC,1;"<<std::endl;
1311    
1312     of1<< "EPLOT;"<<std::endl;
1313     of1<< "PSCALE;"<<std::endl;
1314     //lst_FaceInternes.vide();
1315    
1316     }
1317    
1318    
1319    
1320    
1321    
1322    
1323    
1324    
1325    
1326    
1327    
1328    
1329    
1330    
1331    
1332    
1333    
1334    
1335    
1336    
1337    
1338    
1339     void FEM_MAILLAGE::optimise_numerotation(void)
1340     {
1341     FEM_NOEUD* noeud=get_fem_noeud(0);
1342     FEM_GRAPH_NOEUD *graph;
1343     graph=new FEM_GRAPH_NOEUD(noeud,this);
1344     int e=graph->get_excentricite();
1345     TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau();
1346     int nbdernierniveau=dernierniveau.get_nb();
1347     for (int i=0;i<nbdernierniveau;i++)
1348     {
1349     FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),this);
1350     int etmp=graphtmp->get_excentricite();
1351     if (etmp>e)
1352     {
1353     delete graph;
1354     graph=graphtmp;
1355     dernierniveau=graph->get_dernier_niveau();
1356     nbdernierniveau=dernierniveau.get_nb();
1357     i=-1;
1358     e=etmp;
1359     }
1360     else delete graphtmp;
1361     }
1362     int numero=get_nb_fem_noeud();
1363     for (int i=0;i<e+1;i++)
1364     {
1365     TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i);
1366     int nbnoeud=niveau.get_nb();
1367     for (int j=0;j<nbnoeud;j++)
1368     {
1369     FEM_NOEUD* noeud=niveau.get(j);
1370     noeud->change_numero_opt(numero);
1371     numero--;
1372     }
1373     }
1374    
1375    
1376     delete graph;
1377     }
1378    
1379     void FEM_MAILLAGE::echange_numerotation(void)
1380     {
1381     int nbnoeud=get_nb_fem_noeud();
1382     for (int i=0;i<nbnoeud;i++)
1383     {
1384     FEM_NOEUD* noeud=get_fem_noeud(i);
1385     int num=noeud->get_numero();
1386     noeud->change_numero(noeud->get_numero_opt());
1387     noeud->change_numero_opt(num);
1388     }
1389    
1390     }
1391    
1392    
1393    
1394    
1395     std::ostream& operator << (std::ostream& o,FEM_MAILLAGE& maillage)
1396     {
1397     maillage.enregistrer(o);
1398     return o;
1399     }
1400    
1401    
1402    
1403    
1404    
1405    
1406    
1407    
1408    
1409    
1410    
1411    
1412    
1413    
1414