ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 59670 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

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