ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 310
Committed: Thu Jan 26 21:14:45 2012 UTC (13 years, 3 months ago) by francois
File size: 67991 byte(s)
Log Message:
Ajout des elements quadrangle et hexaedre dans les maillages FEM
Changement de la version des fichier de visu sous GMSH. Les .pos ont disparus et tout est intégré dans les .msh

File Contents

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