ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 210
Committed: Fri Jul 31 16:19:04 2009 UTC (15 years, 9 months ago) by francois
Original Path: magic/lib/geometrie/geometrie/src/fem_maillage.cpp
File size: 59409 byte(s)
Log Message:
Nouvelle facon de representer la deforme + groupe topologique pour le maillage + bug idmax

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