ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 21
Committed: Wed Jul 4 21:09:12 2007 UTC (17 years, 10 months ago) by bournival
Original Path: magic/lib/geometrie/geometrie/src/fem_maillage.cpp
File size: 54230 byte(s)
Log Message:

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     FEM_TETRA* FEM_MAILLAGE::get_suivant_triangle(LISTE_FEM_TETRA::iterator & it)
573     {
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     // �riture des t�ra�res
920     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     // Les t�ras sont finis, maintenant le maillage des Coques
981     //*********************************************************
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     of1 << "EGROUP,4,RBAR;"<< std::endl; // EGroup des RBAR
992     of1 << "EGROUP,3,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl;
993     of1 << "RCONST,3,"<< 1 << ",1,3," << "1e3,1e3 , 1e3; " << std::endl;
994     }
995    
996 5 int RCset =1;
997    
998     LISTE_MG_COQUE::iterator ico;
999     MG_COQUE *mgcoque=mg_geometrie->get_premier_coque(ico);
1000     while(mgcoque)
1001     {
1002     int nummatac=mgcoque->get_num_materiau();
1003     if ((nummatac!=nummat)&&(nummatac!=-1)) // si c'est = 0 alors on place le dernier mat�iau choisi.
1004     {
1005     nummat=nummatac;
1006     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1007     }
1008    
1009     for (int numcoquille=0;numcoquille<mgcoque->get_nb_mg_coquille();numcoquille++)
1010     {
1011     MG_COQUILLE* mgcoquille = mgcoque->get_mg_coquille(numcoquille);
1012     for (int cf = 0; cf<mgcoquille->get_nb_mg_coface();cf++)
1013     {
1014     MG_COFACE* mgcoface = mgcoquille->get_mg_coface(cf);
1015     MG_FACE* mgface = mgcoface->get_face();
1016    
1017     double epaisseur=-1;
1018     for (int k=0;k<mgface->get_nb_ccf();k++) // aller chercher l'�aisseur de la coque
1019     {
1020     char nomCCF[3];
1021     mgface->get_type_ccf(k,nomCCF);
1022     if (strcmp(nomCCF,"EP")==0)
1023     epaisseur = mgface-> get_valeur_ccf(k);
1024     }
1025     of1 << "ACTSET,EG,2;"<< std::endl;
1026     of1 << "RCONST,2,"<< ++RCset << ",1,1," << epaisseur << ";" << std::endl; // le real constant, s'active automatiquement
1027    
1028     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_maillage = mgface->get_lien_fem_maillage();
1029     int nbelem=lien_maillage->get_nb();
1030     for (int i=0;i<nbelem;i++)
1031     {
1032     FEM_TRIANGLE* femtriangle=(FEM_TRIANGLE*)lien_maillage->get(i);
1033     if (!contient(femtriangle)) continue;
1034     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;
1035     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;
1036     // dans les noeuds des sommets sont, 1, 2 et 3. les noeuds sur les segments sont 4 5 et 6
1037    
1038     long nbc;
1039     MG_TRIANGLE* mgtri=(MG_TRIANGLE*)femtriangle->get_mg_element_maillage();
1040     char nom[3];
1041    
1042     nbc = mgtri->get_segment1()->get_lien_topologie()->get_nb_ccf();
1043     for (int z =0 ; z< nbc; z++) // le premier segment
1044     { // il y a au moins une CCF "EP" qu'il faut ignorer
1045     mgtri->get_segment1()->get_lien_topologie()->get_type_ccf(z,nom); // ->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1046     if (strcmp(nom,"EP")==0) continue;
1047     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;
1048     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;
1049     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;
1050     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;
1051     }
1052     nbc = mgtri->get_segment2()->get_lien_topologie()->get_nb_ccf();
1053     for (int z =0 ; z< nbc; z++)
1054     {
1055     mgtri->get_segment2()->get_lien_topologie()->get_type_ccf(z,nom);
1056     if (strcmp(nom,"EP")==0) continue;
1057     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;
1058     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;
1059     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;
1060     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;
1061     }
1062     nbc = mgtri->get_segment3()->get_lien_topologie()->get_nb_ccf();
1063     for (int z =0 ; z< nbc; z++)
1064     {
1065     mgtri->get_segment3()->get_lien_topologie()->get_type_ccf(z,nom);
1066     if (strcmp(nom,"EP")==0) continue;
1067     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;
1068     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;
1069     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;
1070     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;
1071     }
1072    
1073    
1074     nbc = mgtri->get_lien_topologie()->get_nb_ccf(); // et pour la face elle-m�e
1075     for (int z =0 ; z< nbc; z++)
1076     {
1077     mgtri->get_lien_topologie()->get_type_ccf(z,nom);
1078     if (strcmp(nom,"EP")==0) continue;
1079     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;
1080     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;
1081     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;
1082     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;
1083     }
1084    
1085     }
1086    
1087     } // next face
1088     } // next coquille
1089     mgcoque = mg_geometrie->get_suivant_coque(ico);
1090     }// next coque
1091    
1092    
1093     // **************************
1094     // maintenant les poutres
1095     // **************************
1096    
1097    
1098 bournival 21
1099 5 //for (int i = 0 ; i<nb_poutres;i++)
1100     LISTE_MG_POUTRE::iterator it_po;
1101     MG_POUTRE* mgpoutre = mg_geometrie->get_premier_poutre(it_po);
1102     while(mgpoutre)
1103     {
1104     //MG_POUTRE* mgpoutre = mg_geometrie->get_mg_poutre(i);
1105     int nummatac=mgpoutre->get_num_materiau();
1106     if ((nummatac!=nummat)&&(nummatac!=-1))
1107     {
1108     nummat=nummatac;
1109     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1110     }
1111    
1112     for (int j = 0;j<mgpoutre->get_nb_mg_boucle();j++)
1113     {
1114     MG_BOUCLE* mgboucle = mgpoutre->get_mg_boucle(j);
1115    
1116     for (int k = 0 ; k<mgboucle->get_nb_mg_coarete();k++)
1117     {
1118     MG_COARETE* mgcoarete = mgboucle->get_mg_coarete(k);
1119     MG_ARETE* mgarete = mgcoarete->get_arete();
1120    
1121     double IXX = 0;
1122     double IYY = 0;
1123     double Aire = 0;
1124     double x3 = 0;
1125     double y3 = 0;
1126     double z3 = 0;
1127    
1128     for (int k=0;k<mgarete->get_nb_ccf();k++)
1129     {
1130     char nomCCF[3];
1131     mgarete->get_type_ccf(k,nomCCF);
1132     if (strcmp(nomCCF,"As")==0)
1133     Aire = mgarete->get_valeur_ccf(k);
1134     if (strcmp(nomCCF,"IX")==0)
1135     IXX = mgarete->get_valeur_ccf(k);
1136     if (strcmp(nomCCF,"IY")==0)
1137     IYY = mgarete->get_valeur_ccf(k);
1138     if (strcmp(nomCCF,"NX")==0)
1139     x3 = mgarete->get_valeur_ccf(k);
1140     if (strcmp(nomCCF, "NY")==0)
1141     y3 = mgarete->get_valeur_ccf(k);
1142     if (strcmp(nomCCF, "NZ")==0)
1143     z3 = mgarete->get_valeur_ccf(k);
1144     }
1145    
1146     if( Aire==-7) // -7 est un flag pour diff�encier les mini-poutres...
1147     { // mini-poutre
1148     of1 << "Actset,EG,3;"<<std::endl;
1149     of1 << "Actset,RC,1;"<<std::endl;
1150     of1 << "C* MINI - POUTRE" << std:: endl;
1151    
1152     for(int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1153     {
1154     FEM_SEGMENT* femseg = (FEM_SEGMENT*)mgarete->get_lien_fem_maillage()->get(t); // 10 poutres superpos�s devraient rendre le mod�e rigide :-)
1155     if (!contient(femseg)) continue;
1156     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1157     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1158     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1159     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1160     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1161     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1162     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1163     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1164     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1165     } // next segment
1166     }
1167     else
1168     { // poutre normale
1169     of1 << "Actset,EG,3;"<<std::endl;
1170     of1 << "ND,"<< ++nbNoeuds/* NDMAX+1 */ << "," << x3*valeurunite << "," << y3*valeurunite << "," << z3*valeurunite << ";" << std::endl; // cr�tion du troisi�e point (qui est un noeud) ND,1,5,6,7
1171     of1 << "RCONST,3,"<< ++RCset << ",1,3," << Aire << "," << IXX << "," << IYY << ";" << std::endl; //RCONST,3,66,1,3,99,98,97 ; EG associ� #RC , start location, nombre de constantes, aire, inertie XX, inertie YY
1172    
1173     for(int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1174     {
1175     FEM_SEGMENT* femseg = (FEM_SEGMENT*)mgarete->get_lien_fem_maillage()->get(t);
1176     if (!contient(femseg)) continue;
1177     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;
1178    
1179     for (int k=0;k<mgarete->get_nb_ccf();k++)
1180     {
1181     char nom[3];
1182     mgarete->get_type_ccf(k,nom);
1183     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;
1184     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;
1185     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;
1186     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!!!
1187     }
1188     } // next segment
1189     }
1190    
1191    
1192     } // next arete
1193     } // next boucle
1194     mgpoutre=mg_geometrie->get_suivant_poutre(it_po);
1195     } // next poutre
1196    
1197    
1198     //************************************************************
1199     // Pour mettre des mini-poutres sur les faces concern� *****
1200     //*************************************************************
1201     // identifications des faces du qui sont des faces internes.
1202    
1203     LISTE_MG_FACE::iterator itf;
1204     MG_FACE* mgface = mg_geometrie->get_premier_face(itf);
1205     //of1 << "EGROUP,4,RBAR;"<< std::endl;
1206     //of1 << "ACTSET,EG,4;"<<std::endl;
1207    
1208     of1 << "ACTSET,EG,3;"<<std::endl;
1209     of1 << "ACTSET,RC,1;"<<std::endl;
1210    
1211     while(mgface)//for (unsigned int f=0; f<mg_geometrie->get_nb_mg_face();f++)
1212     {
1213     for (int k=0;k<mgface->get_nb_ccf();k++) // aller chercher l'�aisseur de la coque
1214     {
1215     char nomCCF[3];
1216     mgface->get_type_ccf(k,nomCCF);
1217     if (strcmp(nomCCF,"FI")==0)
1218     {
1219     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_fem_maillage = mgface->get_lien_fem_maillage();
1220     FEM_ELEMENT_MAILLAGE* element;
1221    
1222     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
1223     {
1224     FEM_TRIANGLE* femtriangle=(FEM_TRIANGLE*)lien_fem_maillage->get(i) ;
1225    
1226     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
1227     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
1228     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
1229    
1230     //EL,1,CR,0,3,1,2,3,0,0,0,0,0,0 num ��ent, CR, flag asso, nb noeuds, #1, #2, #3 ;;
1231     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
1232     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1233     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1234     }
1235     }
1236     }
1237     mgface= mg_geometrie->get_suivant_face(itf);
1238     }
1239    
1240     of1<< "NMERGE;" <<std::endl;
1241     of1<< "NCOMPRESS;" <<std::endl;
1242    
1243     //of1<< "SETEPLOT,1,1,0,0;"<<std::endl;
1244     //of1<< "ACTECLR,1,RC,1;"<<std::endl;
1245    
1246     of1<< "EPLOT;"<<std::endl;
1247     of1<< "PSCALE;"<<std::endl;
1248     //lst_FaceInternes.vide();
1249    
1250     }
1251    
1252    
1253    
1254    
1255    
1256    
1257    
1258    
1259    
1260    
1261    
1262    
1263    
1264    
1265    
1266    
1267    
1268    
1269    
1270    
1271    
1272    
1273     void FEM_MAILLAGE::optimise_numerotation(void)
1274     {
1275     FEM_NOEUD* noeud=get_fem_noeud(0);
1276     FEM_GRAPH_NOEUD *graph;
1277     graph=new FEM_GRAPH_NOEUD(noeud,this);
1278     int e=graph->get_excentricite();
1279     TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau();
1280     int nbdernierniveau=dernierniveau.get_nb();
1281     for (int i=0;i<nbdernierniveau;i++)
1282     {
1283     FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),this);
1284     int etmp=graphtmp->get_excentricite();
1285     if (etmp>e)
1286     {
1287     delete graph;
1288     graph=graphtmp;
1289     dernierniveau=graph->get_dernier_niveau();
1290     nbdernierniveau=dernierniveau.get_nb();
1291     i=-1;
1292     e=etmp;
1293     }
1294     else delete graphtmp;
1295     }
1296     int numero=get_nb_fem_noeud();
1297     for (int i=0;i<e+1;i++)
1298     {
1299     TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i);
1300     int nbnoeud=niveau.get_nb();
1301     for (int j=0;j<nbnoeud;j++)
1302     {
1303     FEM_NOEUD* noeud=niveau.get(j);
1304     noeud->change_numero_opt(numero);
1305     numero--;
1306     }
1307     }
1308    
1309    
1310     delete graph;
1311     }
1312    
1313     void FEM_MAILLAGE::echange_numerotation(void)
1314     {
1315     int nbnoeud=get_nb_fem_noeud();
1316     for (int i=0;i<nbnoeud;i++)
1317     {
1318     FEM_NOEUD* noeud=get_fem_noeud(i);
1319     int num=noeud->get_numero();
1320     noeud->change_numero(noeud->get_numero_opt());
1321     noeud->change_numero_opt(num);
1322     }
1323    
1324     }
1325    
1326    
1327    
1328    
1329     std::ostream& operator << (std::ostream& o,FEM_MAILLAGE& maillage)
1330     {
1331     maillage.enregistrer(o);
1332     return o;
1333     }
1334    
1335    
1336    
1337    
1338    
1339    
1340    
1341    
1342    
1343    
1344    
1345    
1346    
1347    
1348