ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 131
Committed: Wed Jul 30 21:32:52 2008 UTC (16 years, 9 months ago) by bournival
Original Path: magic/lib/geometrie/geometrie/src/fem_maillage.cpp
File size: 56134 byte(s)
Log Message:
Des modifications au sld_import et fem_maillage pour les études multidimensionnelles.  Le code ne devrait pas affecter les autres études.

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