ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 206
Committed: Thu Jul 23 21:14:07 2009 UTC (15 years, 9 months ago) by bournival
Original Path: magic/lib/geometrie/geometrie/src/fem_maillage.cpp
File size: 57816 byte(s)
Log Message:
Le commit devrait marcher cette fois...

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 francois 195 int dimsansgeo=0;
613     if (get_mg_geometrie()==NULL)
614     {
615     if (maillage->get_nb_mg_tetra()!=0) dimsansgeo=3;
616     else if (maillage->get_nb_mg_triangle()!=0) dimsansgeo=2;
617     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
618     }
619     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==1)))
620     {
621 5 LISTE_MG_SEGMENT::iterator it_seg;
622     MG_SEGMENT * mgseg = maillage->get_premier_segment(it_seg);
623     while(mgseg)
624     {
625 francois 195 if (mgseg->get_lien_topologie()!=NULL) if (mgseg->get_lien_topologie()->get_dimension()!=1) { mgseg=maillage->get_suivant_segment(it_seg);continue;}
626 5 {
627     FEM_NOEUD *tabnoeud[2];
628     tabnoeud[0]=get_fem_noeud(mgseg->get_noeud1()->get_nouveau_numero());
629     tabnoeud[1]=get_fem_noeud(mgseg->get_noeud2()->get_nouveau_numero());
630     FEM_SEGMENT2* seg=new FEM_SEGMENT2(mgseg,tabnoeud);
631     ajouter_fem_segment(seg);
632     }
633     mgseg=maillage->get_suivant_segment(it_seg);
634     }
635 francois 195 }
636     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==2)))
637     {
638 5 LISTE_MG_TRIANGLE::iterator it_tri;
639     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
640     while(mgtri)
641     {
642 francois 195 if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2) {mgtri=maillage->get_suivant_triangle(it_tri);continue;}
643     FEM_NOEUD *tabnoeud[3];
644     tabnoeud[0]=get_fem_noeud(mgtri->get_noeud1()->get_nouveau_numero());
645     tabnoeud[1]=get_fem_noeud(mgtri->get_noeud2()->get_nouveau_numero());
646     tabnoeud[2]=get_fem_noeud(mgtri->get_noeud3()->get_nouveau_numero());
647     FEM_TRIANGLE3* tri=new FEM_TRIANGLE3(mgtri,tabnoeud);
648     ajouter_fem_triangle(tri);
649 5 mgtri=maillage->get_suivant_triangle(it_tri);
650     }
651 francois 195 }
652     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==3)))
653     {
654 5 LISTE_MG_TETRA::iterator it_tetra;
655     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
656     while (mgtetra)
657     {
658     FEM_NOEUD *tabnoeud[4];
659     tabnoeud[0]=get_fem_noeud(mgtetra->get_noeud1()->get_nouveau_numero());
660     tabnoeud[1]=get_fem_noeud(mgtetra->get_noeud2()->get_nouveau_numero());
661     tabnoeud[2]=get_fem_noeud(mgtetra->get_noeud3()->get_nouveau_numero());
662     tabnoeud[3]=get_fem_noeud(mgtetra->get_noeud4()->get_nouveau_numero());
663     FEM_TETRA4* tet=new FEM_TETRA4(mgtetra,tabnoeud);
664     ajouter_fem_tetra(tet);
665     mgtetra=maillage->get_suivant_tetra(it_tetra);
666     }
667     }
668 francois 195 }
669 5
670    
671     void FEM_MAILLAGE::construire_quadratique(void)
672     {
673     LISTE_MG_NOEUD::iterator it_nd;
674     MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_nd);
675     unsigned int i=0;
676     while(mgnoeud)
677     {
678     mgnoeud->change_nouveau_numero(i);
679     FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud);
680     femnoeud->change_numero(i+1);
681     i++ ;
682     ajouter_fem_noeud(femnoeud);
683     mgnoeud=maillage->get_suivant_noeud(it_nd);
684     }
685 francois 195 int dimsansgeo=0;
686     if (get_mg_geometrie()==NULL)
687     {
688     if (maillage->get_nb_mg_tetra()!=0) dimsansgeo=3;
689     else if (maillage->get_nb_mg_triangle()!=0) dimsansgeo=2;
690     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
691     }
692     int nbmgnoeud = maillage->get_nb_mg_noeud();
693 5
694     LISTE_MG_SEGMENT::iterator it_seg;
695     MG_SEGMENT* mgseg=maillage->get_premier_segment(it_seg);
696     i=0;
697     while(mgseg)
698     {
699     mgseg->change_nouveau_numero(i++);
700     MG_NOEUD *noeud1=mgseg->get_noeud1();
701     MG_NOEUD *noeud2=mgseg->get_noeud2();
702     double *xyz1=noeud1->get_coord();
703     double *xyz2=noeud2->get_coord();
704     FEM_NOEUD* femnoeud;
705 francois 195 if (mgseg->get_lien_topologie()!=NULL)
706     if (mgseg->get_lien_topologie()->get_dimension()==1)
707 5 {
708     MG_ARETE* arete=(MG_ARETE*)(mgseg->get_lien_topologie());
709     double t1,t2;
710     arete->inverser(t1,xyz1);
711     arete->inverser(t2,xyz2);
712     if (arete->get_courbe()->est_periodique())
713     if (t1>t2) t2=t2+arete->get_courbe()->get_periode();
714     double t=0.5*(t1+t2);
715     double xyz[2];
716     arete->evaluer(t,xyz);
717     femnoeud= new FEM_NOEUD(mgseg,xyz[0],xyz[1],xyz[2]);
718     }
719 francois 195 if (mgseg->get_lien_topologie()!=NULL)
720     if (mgseg->get_lien_topologie()->get_dimension()==2)
721 5 {
722     MG_FACE* face=(MG_FACE*)(mgseg->get_lien_topologie());
723     double uv1[2],uv2[2];
724     OT_DECALAGE_PARAMETRE decalage(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
725     face->inverser(uv1,xyz1);
726     face->inverser(uv2,xyz2);
727     double du=decalage.calcul_decalage_parametre_u(uv1[0]);
728     double dv=decalage.calcul_decalage_parametre_v(uv1[1]);
729     double u1=decalage.decalage_parametre_u(uv1[0],du);
730     double v1=decalage.decalage_parametre_v(uv1[1],dv);
731     double u2=decalage.decalage_parametre_u(uv2[0],du);
732     double v2=decalage.decalage_parametre_v(uv2[1],dv);
733     double ui=0.5*(u1+u2);
734     double vi=0.5*(v1+v2);
735     double uii=decalage.decalage_parametre_u(ui,-du);
736     double vii=decalage.decalage_parametre_v(vi,-dv);
737     double uv[2],xyz[3];
738     uv[0]=uii;
739     uv[1]=vii;
740     face->evaluer(uv,xyz);
741     femnoeud= new FEM_NOEUD(mgseg,xyz[0],xyz[1],xyz[2]);
742     }
743 francois 195 if (mgseg->get_lien_topologie()!=NULL)
744     {
745     if (mgseg->get_lien_topologie()->get_dimension()==3)
746     {
747     double x=0.5*(xyz1[0]+xyz2[0]);
748     double y=0.5*(xyz1[1]+xyz2[1]);
749     double z=0.5*(xyz1[2]+xyz2[2]);
750     femnoeud= new FEM_NOEUD(mgseg,x,y,z);
751     }
752     }
753     else
754     {
755 5 double x=0.5*(xyz1[0]+xyz2[0]);
756     double y=0.5*(xyz1[1]+xyz2[1]);
757     double z=0.5*(xyz1[2]+xyz2[2]);
758     femnoeud= new FEM_NOEUD(mgseg,x,y,z);
759 francois 195 }
760 5 femnoeud->change_numero(i+nbmgnoeud+1);
761     ajouter_fem_noeud(femnoeud);
762     mgseg=maillage->get_suivant_segment(it_seg);
763     }
764    
765 francois 195 if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==1)))
766     {
767    
768 5 mgseg=maillage->get_premier_segment(it_seg);
769     while(mgseg)
770     {
771 francois 195 if (mgseg->get_lien_topologie()!=NULL) if (mgseg->get_lien_topologie()->get_dimension()!=1) { mgseg=maillage->get_suivant_segment(it_seg);continue;}
772 5 {
773     FEM_NOEUD *tabnoeud[3];
774     tabnoeud[0]=get_fem_noeud(mgseg->get_noeud1()->get_nouveau_numero());
775     tabnoeud[1]=get_fem_noeud(mgseg->get_nouveau_numero()+nbmgnoeud);
776     tabnoeud[2]=get_fem_noeud(mgseg->get_noeud2()->get_nouveau_numero());
777     FEM_SEGMENT3* seg=new FEM_SEGMENT3(mgseg,tabnoeud);
778     ajouter_fem_segment(seg);
779     }
780     mgseg=maillage->get_suivant_segment(it_seg);
781     }
782 francois 195 }
783     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==2)))
784     {
785 5 LISTE_MG_TRIANGLE::iterator it_tri;
786     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
787    
788     while(mgtri)
789     {
790 francois 195 if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2) {mgtri=maillage->get_suivant_triangle(it_tri);continue;}
791 5 {
792     FEM_NOEUD *tabnoeud[6];
793     tabnoeud[0]=get_fem_noeud(mgtri->get_noeud1()->get_nouveau_numero());
794     tabnoeud[1]=get_fem_noeud(mgtri->get_segment1()->get_nouveau_numero()+nbmgnoeud);
795     tabnoeud[2]=get_fem_noeud(mgtri->get_noeud2()->get_nouveau_numero());
796     tabnoeud[3]=get_fem_noeud(mgtri->get_segment2()->get_nouveau_numero()+nbmgnoeud);
797     tabnoeud[4]=get_fem_noeud(mgtri->get_noeud3()->get_nouveau_numero());
798     tabnoeud[5]=get_fem_noeud(mgtri->get_segment3()->get_nouveau_numero()+nbmgnoeud);
799     FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(mgtri,tabnoeud);
800     ajouter_fem_triangle(tri);
801     }
802     mgtri=maillage->get_suivant_triangle(it_tri);
803     }
804 francois 195 }
805     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==3)))
806     {
807 5
808     LISTE_MG_TETRA::iterator it_tetra;
809     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
810     while(mgtetra)
811     {
812     FEM_NOEUD *tabnoeud[10];
813     tabnoeud[0]=get_fem_noeud(mgtetra->get_noeud1()->get_nouveau_numero());
814     tabnoeud[1]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud);
815     tabnoeud[2]=get_fem_noeud(mgtetra->get_noeud2()->get_nouveau_numero());
816     tabnoeud[3]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud);
817     tabnoeud[4]=get_fem_noeud(mgtetra->get_noeud3()->get_nouveau_numero());
818     tabnoeud[5]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud);
819     tabnoeud[6]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud);
820     tabnoeud[7]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud);
821     tabnoeud[8]=get_fem_noeud(maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud);
822     tabnoeud[9]=get_fem_noeud(mgtetra->get_noeud4()->get_nouveau_numero());
823     FEM_TETRA10* tet=new FEM_TETRA10(mgtetra,tabnoeud);
824     ajouter_fem_tetra(tet);
825     mgtetra=maillage->get_suivant_tetra(it_tetra);
826     }
827     }
828 francois 195 }
829 5
830    
831    
832     void FEM_MAILLAGE::enregistrer(std::ostream& o)
833     {
834    
835     if (mg_geometrie==NULL) o << "%" << get_id() << "=FEM_MAILLAGE(" << degre << ",$" << maillage->get_id() << " );" << std::endl;
836     else o << "%" << get_id() << "=FEM_MAILLAGE("<< degre << ",$" << maillage->get_id() << ",$" << mg_geometrie->get_id() <<");" << std::endl;
837     LISTE_ENTITE::const_iterator i;
838     for (i=lst_entite.begin();i!=lst_entite.end();i++)
839     (*i)->enregistrer(o);
840     }
841    
842    
843     void FEM_MAILLAGE::exporter_cosmos(std::string& nomfic)
844     {
845     char chaine[500];
846     sprintf(chaine,"%s.ses",nomfic.c_str());
847     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
848     of1.precision(16);
849     of1.setf(std::ios::showpoint);
850     of1 << "TITLE, " << chaine << " : Fichier FEM de maillage MAGiC" << std::endl;
851     if (degre==1) of1 << "EGROUP,1,TETRA4,0,0,0,0,0,0,0,0;" << std::endl;
852     if (degre==2) of1 << "EGROUP,1,TETRA10,0,0,0,0,0,0,0,0;" << std::endl;
853     int nb_volume=mg_geometrie->get_nb_mg_volume();
854     int nbNoeuds = 0;
855    
856    
857     for (int i=0;i<nb_volume;i++)
858     {
859     MG_VOLUME *mgvol=mg_geometrie->get_mg_volume(i);
860     if (mgvol->get_num_materiau()>=0)
861     {
862     MT_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
863     MT_MATERIAU* mat=mtgest.get_materiau(mgvol->get_num_materiau());
864     for(int m=0; m<mat->get_nb_propriete();m++)
865     {
866     MT_PROPRIETE* prop=mat->get_propriete(m);
867     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
868     }
869     /* MT_PROPRIETE* prop=mat->get_propriete("EX");
870     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", EX, " << prop->get_valeur(2) << ";" << std::endl;
871     prop=mat->get_propriete("NUXY");
872     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", NUXY, " << prop->get_valeur(2) << ";" << std::endl;
873     prop=mat->get_propriete("GXY");
874     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", GXY, " << prop->get_valeur(2) << ";" << std::endl;
875     prop=mat->get_propriete("DENS");
876     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", DENS, " << prop->get_valeur(2) << ";" << std::endl;
877     prop=mat->get_propriete("SIGXT");
878     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGXT, " << prop->get_valeur(2) << ";" << std::endl;
879     prop=mat->get_propriete("SIGYLD");
880     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGYLD, " << prop->get_valeur(2) << ";" << std::endl;
881     prop=mat->get_propriete("ALPX");
882     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", ALPX, " << prop->get_valeur(2) << ";" << std::endl;
883     prop=mat->get_propriete("KX");
884     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", KX, " << prop->get_valeur(2) << ";" << std::endl;
885     prop=mat->get_propriete("C");
886     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", C , " << prop->get_valeur(2) << ";" << std::endl;*/
887     }
888     }
889     int nb_coques = mg_geometrie->get_nb_mg_coque();
890     for (int i=0;i<nb_coques;i++)
891     {
892     MG_COQUE *mgcoque=mg_geometrie->get_mg_coque(i);
893     if (mgcoque->get_num_materiau()>=0)
894     {
895     MT_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
896     MT_MATERIAU* mat=mtgest.get_materiau(mgcoque->get_num_materiau());
897     for(int m=0; m<mat->get_nb_propriete();m++)
898     {
899     MT_PROPRIETE* prop=mat->get_propriete(m);
900     of1<< "MPROP, "<< mgcoque->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
901     }
902     }
903     }
904     int nb_poutres = mg_geometrie->get_nb_mg_poutre();
905     for (int i=0;i<nb_poutres;i++)
906     {
907     MG_POUTRE *mgpoutre=mg_geometrie->get_mg_poutre(i);
908     if (mgpoutre->get_num_materiau()>=0)
909     {
910     MT_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
911     MT_MATERIAU* mat=mtgest.get_materiau(mgpoutre->get_num_materiau());
912    
913     for(int m=0; m<mat->get_nb_propriete();m++)
914     {
915     MT_PROPRIETE* prop=mat->get_propriete(m);
916     of1<< "MPROP, "<< mgpoutre->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
917     }
918     }
919     }
920    
921    
922    
923     of1 << "ACTSET,CS,0;" << std::endl;
924     of1 << "ACTSET,EG,1;" << std::endl;
925    
926     // �riture des noeuds
927     int ii=0;
928     double valeurunite=mg_geometrie->get_valeur_unite();
929     for (LISTE_FEM_NOEUD::iterator i=lst_fem_noeud.begin();i!=lst_fem_noeud.end();i++)
930     {
931     FEM_NOEUD* noeud=((*i).second);
932     of1 << "ND, " << noeud->get_numero() << ", " << noeud->get_x()*valeurunite << ", " << noeud->get_y()*valeurunite << ", " << noeud->get_z()*valeurunite << ";" << std::endl;
933     char nom[3];
934     int nb=noeud->get_lien_topologie()->get_nb_ccf();
935     for (int k=0;k<nb;k++)
936     {
937     noeud->get_lien_topologie()->get_type_ccf(k,nom);
938     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;
939     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;
940     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;
941     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;
942     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;
943     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;
944     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;
945     }
946     ii++;
947     }
948     nbNoeuds = ii;
949     ii=0;
950    
951 francois 195 // �criture des t�tra�dres
952 5 int nummat=-10; // num�o du mat�iau
953     for (LISTE_FEM_TETRA::iterator i=lst_fem_tetra.begin();i!=lst_fem_tetra.end();i++)
954     {
955     FEM_TETRA* tetra=((*i).second);
956     MG_VOLUME* vol=(MG_VOLUME*)tetra->get_lien_topologie();
957     int nummatac=vol->get_num_materiau();
958     if ((nummatac!=nummat) && (nummatac!=-1))
959     {
960     nummat=nummatac;
961     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
962     }
963     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() << ", " ;
964     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() << ", " ;
965     ii++;
966     MG_TETRA* tet=(MG_TETRA*)tetra->get_mg_element_maillage();
967     if (tet->get_triangle1()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
968     if (tet->get_triangle2()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
969     if (tet->get_triangle3()->get_lien_topologie()->get_dimension()!=3) of1 << "1, "; else of1 << "0, ";
970     if (tet->get_triangle4()->get_lien_topologie()->get_dimension()!=3) of1 << "1;" << std::endl ; else of1 << "0;" << std::endl;
971     char nom[3];
972     int nb=tet->get_triangle1()->get_lien_topologie()->get_nb_ccf();
973     for (int k=0;k<nb;k++)
974     {
975     tet->get_triangle1()->get_lien_topologie()->get_type_ccf(k,nom);
976     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 1;" << std::endl;
977     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 2;" << std::endl;
978     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 3;" << std::endl;
979     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 4;" << std::endl;
980     }
981     nb=tet->get_triangle2()->get_lien_topologie()->get_nb_ccf();
982     for (int k=0;k<nb;k++)
983     {
984     tet->get_triangle2()->get_lien_topologie()->get_type_ccf(k,nom);
985     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 1;" << std::endl;
986     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 2;" << std::endl;
987     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 3;" << std::endl;
988     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 4;" << std::endl;
989     }
990     nb=tet->get_triangle3()->get_lien_topologie()->get_nb_ccf();
991     for (int k=0;k<nb;k++)
992     {
993     tet->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
994     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 1;" << std::endl;
995     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 2;" << std::endl;
996     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 3;" << std::endl;
997     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 4;" << std::endl;
998     }
999     nb=tet->get_triangle4()->get_lien_topologie()->get_nb_ccf();
1000     for (int k=0;k<nb;k++)
1001     {
1002     tet->get_triangle4()->get_lien_topologie()->get_type_ccf(k,nom);
1003     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 1;" << std::endl;
1004     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 2;" << std::endl;
1005     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 3;" << std::endl;
1006     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 4;" << std::endl;
1007     }
1008     }
1009    
1010    
1011     //*********************************************************
1012 francois 195 // Les t�tras sont finis, maintenant le maillage des Coques
1013 5 //*********************************************************
1014     //nb_coques=mg_geometrie->get_nb_mg_coque(); //variable d��d�lar� plus haut, elle devrait avoir conserv�sa valeur
1015     if (nb_coques>0)
1016     {
1017     if (degre==1) of1 << "EGROUP,2,SHELL3,0,0,0,0,0,0,0,0;" << std::endl; // Formulation coques minces... SHELL3T pout �aisses
1018     if (degre==2) of1 << "EGROUP,2,SHELL6,0,0,0,0,0,0,0,0;" << std::endl;
1019     }
1020    
1021 bournival 21 if (nb_poutres>0 || nb_coques>0 )
1022     {
1023 bournival 131 of1 << "EGROUP,3,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres
1024     of1 << "RCONST,3,3,1,3," << "1, 1 , 1; " << std::endl;
1025 bournival 21 of1 << "EGROUP,4,RBAR;"<< std::endl; // EGroup des RBAR
1026 bournival 131 of1 << "EGROUP,5,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres infiniment rigide
1027     of1 << "RCONST,5,5,1,3," << "0.01, 0.01 , 0.01; " << std::endl;
1028 francois 195 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...)
1029 bournival 131 of1 << "RCONST,6,6,1,3," << "1e-16, 0.01 , 1e-16; " << std::endl;
1030 bournival 21 }
1031    
1032 bournival 131 int RCset =7;
1033 5
1034     LISTE_MG_COQUE::iterator ico;
1035     MG_COQUE *mgcoque=mg_geometrie->get_premier_coque(ico);
1036     while(mgcoque)
1037     {
1038     int nummatac=mgcoque->get_num_materiau();
1039     if ((nummatac!=nummat)&&(nummatac!=-1)) // si c'est = 0 alors on place le dernier mat�iau choisi.
1040     {
1041     nummat=nummatac;
1042     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1043     }
1044    
1045     for (int numcoquille=0;numcoquille<mgcoque->get_nb_mg_coquille();numcoquille++)
1046     {
1047     MG_COQUILLE* mgcoquille = mgcoque->get_mg_coquille(numcoquille);
1048     for (int cf = 0; cf<mgcoquille->get_nb_mg_coface();cf++)
1049     {
1050     MG_COFACE* mgcoface = mgcoquille->get_mg_coface(cf);
1051     MG_FACE* mgface = mgcoface->get_face();
1052    
1053     double epaisseur=-1;
1054     for (int k=0;k<mgface->get_nb_ccf();k++) // aller chercher l'�aisseur de la coque
1055     {
1056     char nomCCF[3];
1057     mgface->get_type_ccf(k,nomCCF);
1058     if (strcmp(nomCCF,"EP")==0)
1059     epaisseur = mgface-> get_valeur_ccf(k);
1060     }
1061     of1 << "ACTSET,EG,2;"<< std::endl;
1062     of1 << "RCONST,2,"<< ++RCset << ",1,1," << epaisseur << ";" << std::endl; // le real constant, s'active automatiquement
1063    
1064     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_maillage = mgface->get_lien_fem_maillage();
1065     int nbelem=lien_maillage->get_nb();
1066     for (int i=0;i<nbelem;i++)
1067     {
1068     FEM_TRIANGLE* femtriangle=(FEM_TRIANGLE*)lien_maillage->get(i);
1069     if (!contient(femtriangle)) continue;
1070     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;
1071     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;
1072     // dans les noeuds des sommets sont, 1, 2 et 3. les noeuds sur les segments sont 4 5 et 6
1073    
1074     long nbc;
1075     MG_TRIANGLE* mgtri=(MG_TRIANGLE*)femtriangle->get_mg_element_maillage();
1076     char nom[3];
1077    
1078 bournival 206 nbc = mgtri->get_segment1()->get_lien_topologie()->get_nb_ccf();
1079 5 for (int z =0 ; z< nbc; z++) // le premier segment
1080     { // il y a au moins une CCF "EP" qu'il faut ignorer
1081     mgtri->get_segment1()->get_lien_topologie()->get_type_ccf(z,nom); // ->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1082     if (strcmp(nom,"EP")==0) continue;
1083     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;
1084 bournival 206 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;
1085 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;
1086     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;
1087     }
1088     nbc = mgtri->get_segment2()->get_lien_topologie()->get_nb_ccf();
1089     for (int z =0 ; z< nbc; z++)
1090     {
1091     mgtri->get_segment2()->get_lien_topologie()->get_type_ccf(z,nom);
1092     if (strcmp(nom,"EP")==0) continue;
1093     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;
1094     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;
1095     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;
1096     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;
1097     }
1098     nbc = mgtri->get_segment3()->get_lien_topologie()->get_nb_ccf();
1099     for (int z =0 ; z< nbc; z++)
1100     {
1101     mgtri->get_segment3()->get_lien_topologie()->get_type_ccf(z,nom);
1102     if (strcmp(nom,"EP")==0) continue;
1103     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;
1104     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;
1105     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;
1106     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;
1107     }
1108    
1109 bournival 206
1110 5 nbc = mgtri->get_lien_topologie()->get_nb_ccf(); // et pour la face elle-m�e
1111     for (int z =0 ; z< nbc; z++)
1112     {
1113     mgtri->get_lien_topologie()->get_type_ccf(z,nom);
1114     if (strcmp(nom,"EP")==0) continue;
1115 bournival 206 if (strcmp(nom,"Px")==0) of1 << "PEL, " << ii << ", " << mgtri->get_lien_topologie()->get_valeur_ccf(z) << ", 4, " << ii << ", 1, 1; C* CCF de Coque... " << std::endl;
1116     if (strcmp(nom,"Py")==0) of1 << "PEL, " << ii << ", " << mgtri->get_lien_topologie()->get_valeur_ccf(z) << ", 4, " << ii << ", 1, 2; C* CCF de Coque... " << std::endl;
1117     if (strcmp(nom,"Pz")==0) of1 << "PEL, " << ii << ", " << mgtri->get_lien_topologie()->get_valeur_ccf(z) << ", 4, " << ii << ", 1, 3; C* CCF de Coque... "<< std::endl;
1118     if (strcmp(nom,"Pn")==0) of1 << "PEL, " << ii << ", " << mgtri->get_lien_topologie()->get_valeur_ccf(z) << ", 4, " << ii << ", 1, 4; C* CCF de Coque... " << std::endl;
1119 5 }
1120    
1121     }
1122    
1123     } // next face
1124     } // next coquille
1125     mgcoque = mg_geometrie->get_suivant_coque(ico);
1126     }// next coque
1127    
1128    
1129     // **************************
1130     // maintenant les poutres
1131     // **************************
1132    
1133    
1134 bournival 21
1135 5 //for (int i = 0 ; i<nb_poutres;i++)
1136     LISTE_MG_POUTRE::iterator it_po;
1137     MG_POUTRE* mgpoutre = mg_geometrie->get_premier_poutre(it_po);
1138     while(mgpoutre)
1139     {
1140     //MG_POUTRE* mgpoutre = mg_geometrie->get_mg_poutre(i);
1141     int nummatac=mgpoutre->get_num_materiau();
1142     if ((nummatac!=nummat)&&(nummatac!=-1))
1143     {
1144     nummat=nummatac;
1145     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1146     }
1147    
1148     for (int j = 0;j<mgpoutre->get_nb_mg_boucle();j++)
1149     {
1150     MG_BOUCLE* mgboucle = mgpoutre->get_mg_boucle(j);
1151    
1152     for (int k = 0 ; k<mgboucle->get_nb_mg_coarete();k++)
1153     {
1154     MG_COARETE* mgcoarete = mgboucle->get_mg_coarete(k);
1155     MG_ARETE* mgarete = mgcoarete->get_arete();
1156    
1157     double IXX = 0;
1158     double IYY = 0;
1159     double Aire = 0;
1160     double x3 = 0;
1161     double y3 = 0;
1162     double z3 = 0;
1163    
1164     for (int k=0;k<mgarete->get_nb_ccf();k++)
1165     {
1166     char nomCCF[3];
1167     mgarete->get_type_ccf(k,nomCCF);
1168     if (strcmp(nomCCF,"As")==0)
1169     Aire = mgarete->get_valeur_ccf(k);
1170     if (strcmp(nomCCF,"IX")==0)
1171     IXX = mgarete->get_valeur_ccf(k);
1172     if (strcmp(nomCCF,"IY")==0)
1173     IYY = mgarete->get_valeur_ccf(k);
1174     if (strcmp(nomCCF,"NX")==0)
1175     x3 = mgarete->get_valeur_ccf(k);
1176     if (strcmp(nomCCF, "NY")==0)
1177     y3 = mgarete->get_valeur_ccf(k);
1178     if (strcmp(nomCCF, "NZ")==0)
1179     z3 = mgarete->get_valeur_ccf(k);
1180     }
1181    
1182 francois 195 if( Aire==-7) // -7 est un flag pour diff�rencier les mini-poutres...
1183 5 { // mini-poutre
1184 bournival 131 of1 << "Actset,EG,5;"<<std::endl;
1185     of1 << "Actset,RC,5;"<<std::endl;
1186 5 of1 << "C* MINI - POUTRE" << std:: endl;
1187    
1188     for(int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1189     {
1190 bournival 131 FEM_SEGMENT* femseg = (FEM_SEGMENT*)mgarete->get_lien_fem_maillage()->get(t);
1191 5 of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1192     } // next segment
1193     }
1194     else
1195     { // poutre normale
1196     of1 << "Actset,EG,3;"<<std::endl;
1197 francois 195 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
1198     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
1199 5
1200     for(int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1201     {
1202     FEM_SEGMENT* femseg = (FEM_SEGMENT*)mgarete->get_lien_fem_maillage()->get(t);
1203     if (!contient(femseg)) continue;
1204     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;
1205    
1206     for (int k=0;k<mgarete->get_nb_ccf();k++)
1207     {
1208     char nom[3];
1209     mgarete->get_type_ccf(k,nom);
1210     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;
1211     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;
1212     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;
1213     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!!!
1214     }
1215     } // next segment
1216     }
1217    
1218    
1219     } // next arete
1220     } // next boucle
1221     mgpoutre=mg_geometrie->get_suivant_poutre(it_po);
1222     } // next poutre
1223    
1224 francois 195 // Cas sp�cial, une ar�te normale est flagg�e comme une mini-poutre (dans coupecot�)
1225 bournival 131 LISTE_MG_ARETE::iterator ita;
1226     MG_ARETE* mgarete = mg_geometrie->get_premier_arete(ita);
1227 5
1228 bournival 131 while(mgarete)
1229     {
1230     double Aire = 0;
1231    
1232     for (int k=0;k<mgarete->get_nb_ccf();k++)
1233     {
1234     char nomCCF[3];
1235     mgarete->get_type_ccf(k,nomCCF);
1236     if (strcmp(nomCCF,"As")==0)
1237     Aire = mgarete->get_valeur_ccf(k);
1238     }
1239    
1240 francois 195 if( Aire==-7) // -7 est un flag pour diff�rencier les mini-poutres... non orient�e
1241 bournival 131 { // mini-poutre
1242     of1 << "Actset,EG,5;"<<std::endl;
1243     of1 << "Actset,RC,5;"<<std::endl;
1244     of1 << "C* MINI - POUTRE" << std:: endl;
1245    
1246     for(int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1247     {
1248     FEM_SEGMENT* femseg = (FEM_SEGMENT*)mgarete->get_lien_fem_maillage()->get(t);
1249     if (!contient(femseg)) continue;
1250     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1251     }
1252     }
1253     mgarete=mg_geometrie->get_suivant_arete(ita);
1254     }
1255    
1256    
1257    
1258 5 //************************************************************
1259 francois 195 // Pour mettre des mini-poutres sur les faces concern�es *****
1260 5 //*************************************************************
1261     // identifications des faces du qui sont des faces internes.
1262    
1263     LISTE_MG_FACE::iterator itf;
1264     MG_FACE* mgface = mg_geometrie->get_premier_face(itf);
1265    
1266    
1267 bournival 131 while(mgface)
1268     {
1269     for (int k=0;k<mgface->get_nb_ccf();k++)
1270 5 {
1271     char nomCCF[3];
1272     mgface->get_type_ccf(k,nomCCF);
1273 bournival 131
1274 5 if (strcmp(nomCCF,"FI")==0)
1275 bournival 131 {
1276 5 TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_fem_maillage = mgface->get_lien_fem_maillage();
1277     FEM_ELEMENT_MAILLAGE* element;
1278    
1279 bournival 131 //si on a une faceinterne de poutre alors on a une CCF "Po" = 0
1280 francois 195 // sinon la CCF Po est �gale � 1 et on a une coque
1281 bournival 131 int Poutre = -1;
1282    
1283     for (int z=0;z<mgface->get_nb_ccf();z++)
1284     {
1285     char nomCCF2[3];
1286     mgface->get_type_ccf(z,nomCCF);
1287     if(strcmp(nomCCF,"Po")==0)
1288 5 {
1289 bournival 131 Poutre = mgface->get_valeur_ccf(z);
1290     }
1291     }
1292 5
1293    
1294 bournival 131 if (Poutre ==0)
1295     { // mini-poutres pour des poutres
1296     of1 << "ACTSET,EG,5; C* Face avec mini-poutres de POUTRE"<<std::endl;
1297     of1 << "ACTSET,RC,5;"<<std::endl;
1298     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
1299     {
1300     FEM_TRIANGLE* femtriangle=(FEM_TRIANGLE*)lien_fem_maillage->get(i) ;
1301    
1302     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
1303     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
1304     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
1305    
1306 francois 195 // 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 ;
1307     //si on veut orienter les propri�t�s,
1308 bournival 131 of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
1309     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1310     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1311 5 }
1312 bournival 131 }
1313     else if(Poutre==1)
1314     { // mini-poutres pour des coques
1315     of1 << "ACTSET,EG,6; C* Face avec mini-poutres de COQUE"<<std::endl;
1316     of1 << "ACTSET,RC,6;"<<std::endl;
1317     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
1318     {
1319     FEM_TRIANGLE* femtriangle=(FEM_TRIANGLE*)lien_fem_maillage->get(i) ;
1320    
1321     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
1322     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
1323     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
1324    
1325     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1326     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd1->get_numero()<< "," << nd2->get_numero()<< "," << nd0->get_numero()<< ";" << std::endl;
1327     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd2->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
1328     }
1329     }
1330     } // end if FI
1331     } // next CCF
1332 5 mgface= mg_geometrie->get_suivant_face(itf);
1333 bournival 131 } // end while face
1334 5
1335    
1336 bournival 131
1337     //of1<< "NMERGE;" <<std::endl;
1338     //of1<< "NCOMPRESS;" <<std::endl;
1339    
1340 5 //of1<< "SETEPLOT,1,1,0,0;"<<std::endl;
1341     //of1<< "ACTECLR,1,RC,1;"<<std::endl;
1342    
1343     of1<< "EPLOT;"<<std::endl;
1344     of1<< "PSCALE;"<<std::endl;
1345     //lst_FaceInternes.vide();
1346    
1347     }
1348    
1349    
1350    
1351    
1352    
1353    
1354    
1355    
1356    
1357    
1358    
1359    
1360    
1361    
1362    
1363    
1364    
1365    
1366    
1367    
1368    
1369    
1370     void FEM_MAILLAGE::optimise_numerotation(void)
1371     {
1372     FEM_NOEUD* noeud=get_fem_noeud(0);
1373     FEM_GRAPH_NOEUD *graph;
1374     graph=new FEM_GRAPH_NOEUD(noeud,this);
1375     int e=graph->get_excentricite();
1376     TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau();
1377     int nbdernierniveau=dernierniveau.get_nb();
1378     for (int i=0;i<nbdernierniveau;i++)
1379     {
1380     FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),this);
1381     int etmp=graphtmp->get_excentricite();
1382     if (etmp>e)
1383     {
1384     delete graph;
1385     graph=graphtmp;
1386     dernierniveau=graph->get_dernier_niveau();
1387     nbdernierniveau=dernierniveau.get_nb();
1388     i=-1;
1389     e=etmp;
1390     }
1391     else delete graphtmp;
1392     }
1393     int numero=get_nb_fem_noeud();
1394     for (int i=0;i<e+1;i++)
1395     {
1396     TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i);
1397     int nbnoeud=niveau.get_nb();
1398     for (int j=0;j<nbnoeud;j++)
1399     {
1400     FEM_NOEUD* noeud=niveau.get(j);
1401     noeud->change_numero_opt(numero);
1402     numero--;
1403     }
1404     }
1405    
1406    
1407     delete graph;
1408     }
1409    
1410     void FEM_MAILLAGE::echange_numerotation(void)
1411     {
1412     int nbnoeud=get_nb_fem_noeud();
1413     for (int i=0;i<nbnoeud;i++)
1414     {
1415     FEM_NOEUD* noeud=get_fem_noeud(i);
1416     int num=noeud->get_numero();
1417     noeud->change_numero(noeud->get_numero_opt());
1418     noeud->change_numero_opt(num);
1419     }
1420    
1421     }
1422    
1423    
1424    
1425    
1426     std::ostream& operator << (std::ostream& o,FEM_MAILLAGE& maillage)
1427     {
1428     maillage.enregistrer(o);
1429     return o;
1430     }
1431    
1432    
1433    
1434    
1435    
1436    
1437    
1438    
1439    
1440    
1441    
1442    
1443    
1444    
1445