ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 325
Committed: Tue Mar 6 20:54:34 2012 UTC (13 years, 2 months ago) by francois
File size: 69302 byte(s)
Log Message:
Calcul des reactions aux appui avec code aster et sauvegarde ce celles-ci dans MAGiC

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 francois 317 if (face->get_surface()->est_periodique_u()==1)
784     {
785     double eps=1e-10*face->get_surface()->get_periode_u();
786     if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u();
787     if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u();
788     if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u();
789     if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u();
790     }
791     if (face->get_surface()->est_periodique_v()==1)
792     {
793     double eps=1e-10*face->get_surface()->get_periode_v();
794     if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v();
795     if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v();
796     if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v();
797     if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v();
798     }
799     double du=decalage.calcul_decalage_parametre_u(uv1[0]);
800 francois 283 double dv=decalage.calcul_decalage_parametre_v(uv1[1]);
801     double u1=decalage.decalage_parametre_u(uv1[0],du);
802     double v1=decalage.decalage_parametre_v(uv1[1],dv);
803     double u2=decalage.decalage_parametre_u(uv2[0],du);
804     double v2=decalage.decalage_parametre_v(uv2[1],dv);
805     double ui=0.5*(u1+u2);
806     double vi=0.5*(v1+v2);
807     double uii=decalage.decalage_parametre_u(ui,-du);
808     double vii=decalage.decalage_parametre_v(vi,-dv);
809     double uv[2],xyz[3];
810     uv[0]=uii;
811     uv[1]=vii;
812     face->evaluer(uv,xyz);
813     femnoeud= new FEM_NOEUD(mgseg,xyz[0],xyz[1],xyz[2]);
814     }
815     if (mgseg->get_lien_topologie()!=NULL)
816     {
817     if (mgseg->get_lien_topologie()->get_dimension()==3)
818     {
819     double x=0.5*(xyz1[0]+xyz2[0]);
820     double y=0.5*(xyz1[1]+xyz2[1]);
821     double z=0.5*(xyz1[2]+xyz2[2]);
822     femnoeud= new FEM_NOEUD(mgseg,x,y,z);
823     }
824     }
825     else
826     {
827     double x=0.5*(xyz1[0]+xyz2[0]);
828     double y=0.5*(xyz1[1]+xyz2[1]);
829     double z=0.5*(xyz1[2]+xyz2[2]);
830     femnoeud= new FEM_NOEUD(mgseg,x,y,z);
831     }
832     femnoeud->change_numero(i+nbmgnoeud+1);
833     ajouter_fem_noeud(femnoeud);
834     mgseg=maillage->get_suivant_segment(it_seg);
835     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
836     }
837    
838     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==1)))
839     {
840    
841     mgseg=maillage->get_premier_segment(it_seg);
842     while (mgseg)
843     {
844     if (mgseg->get_lien_topologie()!=NULL) if (mgseg->get_lien_topologie()->get_dimension()!=1) {
845     mgseg=maillage->get_suivant_segment(it_seg);
846     continue;
847     }
848     {
849     FEM_NOEUD *tabnoeud[3];
850     tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()];
851     tabnoeud[1]=lstnoeuddirect[mgseg->get_nouveau_numero()+nbmgnoeud];
852     tabnoeud[2]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()];
853     FEM_SEGMENT3* seg=new FEM_SEGMENT3(mgseg,tabnoeud);
854 francois 309 ajouter_fem_element1(seg);
855 francois 283 }
856     mgseg=maillage->get_suivant_segment(it_seg);
857     }
858     }
859     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==2)))
860     {
861     LISTE_MG_TRIANGLE::iterator it_tri;
862     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
863     while (mgtri)
864     {
865     if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2) {
866     mgtri=maillage->get_suivant_triangle(it_tri);
867     continue;
868     }
869     {
870     FEM_NOEUD *tabnoeud[6];
871     tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()];
872     tabnoeud[1]=lstnoeuddirect[mgtri->get_segment1()->get_nouveau_numero()+nbmgnoeud];
873     tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()];
874     tabnoeud[3]=lstnoeuddirect[mgtri->get_segment2()->get_nouveau_numero()+nbmgnoeud];
875     tabnoeud[4]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()];
876     tabnoeud[5]=lstnoeuddirect[mgtri->get_segment3()->get_nouveau_numero()+nbmgnoeud];
877     FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(mgtri,tabnoeud);
878 francois 309 ajouter_fem_element2(tri);
879 francois 283 }
880     mgtri=maillage->get_suivant_triangle(it_tri);
881     }
882 francois 310 LISTE_MG_QUADRANGLE::iterator it_quad;
883     MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad);
884     while (mgquad)
885     {
886     if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) {
887     mgquad=maillage->get_suivant_quadrangle(it_quad);
888     continue;
889     }
890     {
891     FEM_NOEUD *tabnoeud[8];
892     tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()];
893     tabnoeud[1]=lstnoeuddirect[mgquad->get_segment1()->get_nouveau_numero()+nbmgnoeud];
894     tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()];
895     tabnoeud[3]=lstnoeuddirect[mgquad->get_segment2()->get_nouveau_numero()+nbmgnoeud];
896     tabnoeud[4]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()];
897     tabnoeud[5]=lstnoeuddirect[mgquad->get_segment3()->get_nouveau_numero()+nbmgnoeud];
898     tabnoeud[6]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()];
899     tabnoeud[7]=lstnoeuddirect[mgquad->get_segment4()->get_nouveau_numero()+nbmgnoeud];
900     FEM_QUADRANGLE8* quad=new FEM_QUADRANGLE8(mgquad,tabnoeud);
901     ajouter_fem_element2(quad);
902     }
903     mgquad=maillage->get_suivant_quadrangle(it_quad);
904     }
905 francois 283 }
906     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==3)))
907     {
908    
909     LISTE_MG_TETRA::iterator it_tetra;
910     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
911     while (mgtetra)
912     {
913     FEM_NOEUD *tabnoeud[10];
914     tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()];
915     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
916     tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()];
917     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
918     tabnoeud[4]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()];
919     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
920     tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
921     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
922     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
923     tabnoeud[9]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()];
924     FEM_TETRA10* tet=new FEM_TETRA10(mgtetra,tabnoeud);
925 francois 309 ajouter_fem_element3(tet);
926 francois 283 mgtetra=maillage->get_suivant_tetra(it_tetra);
927     }
928 francois 310 LISTE_MG_HEXA::iterator it_hexa;
929     MG_HEXA* mghex=maillage->get_premier_hexa(it_hexa);
930     while (mghex)
931     {
932     FEM_NOEUD *tabnoeud[20];
933     tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()];
934     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
935     tabnoeud[2]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()];
936     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
937     tabnoeud[4]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()];
938     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
939     tabnoeud[6]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()];
940     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
941     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
942     tabnoeud[9]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
943     tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
944     tabnoeud[11]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
945     tabnoeud[12]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()];
946     tabnoeud[13]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud5()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
947     tabnoeud[14]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()];
948     tabnoeud[15]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud6()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
949     tabnoeud[16]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()];
950     tabnoeud[17]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud7()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
951     tabnoeud[18]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()];
952     tabnoeud[19]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud8()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
953     FEM_HEXA20* hex=new FEM_HEXA20(mghex,tabnoeud);
954     ajouter_fem_element3(hex);
955     mghex=maillage->get_suivant_hexa(it_hexa);
956     }
957 francois 283 }
958     }
959    
960    
961    
962     void FEM_MAILLAGE::enregistrer(std::ostream& o)
963     {
964    
965     if (mg_geometrie==NULL) o << "%" << get_id() << "=FEM_MAILLAGE(" << degre << ",$" << maillage->get_id() << " );" << std::endl;
966     else o << "%" << get_id() << "=FEM_MAILLAGE("<< degre << ",$" << maillage->get_id() << ",$" << mg_geometrie->get_id() <<");" << std::endl;
967     LISTE_ENTITE::const_iterator i;
968     for (i=lst_entite.begin();i!=lst_entite.end();i++)
969     (*i)->enregistrer(o);
970     }
971    
972    
973     void FEM_MAILLAGE::exporter_cosmos(std::string& nomfic)
974     {
975     char chaine[500];
976     sprintf(chaine,"%s.ses",nomfic.c_str());
977     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
978     of1.precision(16);
979     of1.setf(std::ios::showpoint);
980     of1 << "TITLE, " << chaine << " : Fichier FEM de maillage MAGiC" << std::endl;
981     if (degre==1) of1 << "EGROUP,1,TETRA4,0,0,0,0,0,0,0,0;" << std::endl;
982     if (degre==2) of1 << "EGROUP,1,TETRA10,0,0,0,0,0,0,0,0;" << std::endl;
983     int nb_volume=mg_geometrie->get_nb_mg_volume();
984     int nbNoeuds = 0;
985    
986    
987     for (int i=0;i<nb_volume;i++)
988     {
989     MG_VOLUME *mgvol=mg_geometrie->get_mg_volume(i);
990     if (mgvol->get_num_materiau()>=0)
991     {
992 francois 296 MC_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
993     MC_MATERIAU* mat=mtgest.get_materiau(mgvol->get_num_materiau());
994 francois 283 for (int m=0; m<mat->get_nb_propriete();m++)
995     {
996 francois 296 MC_PROPRIETE* prop=mat->get_propriete(m);
997 francois 283 of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
998     }
999     /* MT_PROPRIETE* prop=mat->get_propriete("EX");
1000     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", EX, " << prop->get_valeur(2) << ";" << std::endl;
1001     prop=mat->get_propriete("NUXY");
1002     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", NUXY, " << prop->get_valeur(2) << ";" << std::endl;
1003     prop=mat->get_propriete("GXY");
1004     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", GXY, " << prop->get_valeur(2) << ";" << std::endl;
1005     prop=mat->get_propriete("DENS");
1006     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", DENS, " << prop->get_valeur(2) << ";" << std::endl;
1007     prop=mat->get_propriete("SIGXT");
1008     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGXT, " << prop->get_valeur(2) << ";" << std::endl;
1009     prop=mat->get_propriete("SIGYLD");
1010     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGYLD, " << prop->get_valeur(2) << ";" << std::endl;
1011     prop=mat->get_propriete("ALPX");
1012     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", ALPX, " << prop->get_valeur(2) << ";" << std::endl;
1013     prop=mat->get_propriete("KX");
1014     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", KX, " << prop->get_valeur(2) << ";" << std::endl;
1015     prop=mat->get_propriete("C");
1016     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", C , " << prop->get_valeur(2) << ";" << std::endl;*/
1017     }
1018     }
1019     int nb_coques = mg_geometrie->get_nb_mg_coque();
1020     for (int i=0;i<nb_coques;i++)
1021     {
1022     MG_COQUE *mgcoque=mg_geometrie->get_mg_coque(i);
1023     if (mgcoque->get_num_materiau()>=0)
1024     {
1025 francois 296 MC_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1026     MC_MATERIAU* mat=mtgest.get_materiau(mgcoque->get_num_materiau());
1027 francois 283 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, "<< mgcoque->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
1031     }
1032     }
1033     }
1034     int nb_poutres = mg_geometrie->get_nb_mg_poutre();
1035     for (int i=0;i<nb_poutres;i++)
1036     {
1037     MG_POUTRE *mgpoutre=mg_geometrie->get_mg_poutre(i);
1038     if (mgpoutre->get_num_materiau()>=0)
1039     {
1040 francois 296 MC_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1041     MC_MATERIAU* mat=mtgest.get_materiau(mgpoutre->get_num_materiau());
1042 francois 283
1043     for (int m=0; m<mat->get_nb_propriete();m++)
1044     {
1045 francois 296 MC_PROPRIETE* prop=mat->get_propriete(m);
1046 francois 283 of1<< "MPROP, "<< mgpoutre->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
1047     }
1048     }
1049     }
1050    
1051    
1052    
1053     of1 << "ACTSET,CS,0;" << std::endl;
1054     of1 << "ACTSET,EG,1;" << std::endl;
1055    
1056     // �riture des noeuds
1057     int ii=0;
1058     double valeurunite=mg_geometrie->get_valeur_unite();
1059     for (LISTE_FEM_NOEUD::iterator i=lst_fem_noeud.begin();i!=lst_fem_noeud.end();i++)
1060     {
1061     FEM_NOEUD* noeud=((*i).second);
1062     of1 << "ND, " << noeud->get_numero() << ", " << noeud->get_x()*valeurunite << ", " << noeud->get_y()*valeurunite << ", " << noeud->get_z()*valeurunite << ";" << std::endl;
1063     char nom[3];
1064     int nb=noeud->get_lien_topologie()->get_nb_ccf();
1065     for (int k=0;k<nb;k++)
1066     {
1067     noeud->get_lien_topologie()->get_type_ccf(k,nom);
1068     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;
1069     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;
1070     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;
1071     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;
1072     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;
1073     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;
1074     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;
1075     }
1076     ii++;
1077     }
1078     nbNoeuds = ii;
1079     ii=0;
1080    
1081     // �criture des t�tra�dres
1082     int nummat=-10; // num�o du mat�iau
1083 francois 309 for (LISTE_FEM_ELEMENT3::iterator i=lst_fem_element3.begin();i!=lst_fem_element3.end();i++)
1084 francois 283 {
1085 francois 309 FEM_ELEMENT3* tetra=((*i).second);
1086 francois 283 MG_VOLUME* vol=(MG_VOLUME*)tetra->get_lien_topologie();
1087     int nummatac=vol->get_num_materiau();
1088     if ((nummatac!=nummat) && (nummatac!=-1))
1089     {
1090     nummat=nummatac;
1091     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1092     }
1093     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() << ", " ;
1094     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() << ", " ;
1095     ii++;
1096     MG_TETRA* tet=(MG_TETRA*)tetra->get_mg_element_maillage();
1097     if (tet->get_triangle1()->get_lien_topologie()->get_dimension()!=3) of1 << "1, ";
1098     else of1 << "0, ";
1099     if (tet->get_triangle2()->get_lien_topologie()->get_dimension()!=3) of1 << "1, ";
1100     else of1 << "0, ";
1101     if (tet->get_triangle3()->get_lien_topologie()->get_dimension()!=3) of1 << "1, ";
1102     else of1 << "0, ";
1103     if (tet->get_triangle4()->get_lien_topologie()->get_dimension()!=3) of1 << "1;" << std::endl ;
1104     else of1 << "0;" << std::endl;
1105     char nom[3];
1106     int nb=tet->get_triangle1()->get_lien_topologie()->get_nb_ccf();
1107     for (int k=0;k<nb;k++)
1108     {
1109     tet->get_triangle1()->get_lien_topologie()->get_type_ccf(k,nom);
1110     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 1;" << std::endl;
1111     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 2;" << std::endl;
1112     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 3;" << std::endl;
1113     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 4;" << std::endl;
1114     }
1115     nb=tet->get_triangle2()->get_lien_topologie()->get_nb_ccf();
1116     for (int k=0;k<nb;k++)
1117     {
1118     tet->get_triangle2()->get_lien_topologie()->get_type_ccf(k,nom);
1119     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 1;" << std::endl;
1120     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 2;" << std::endl;
1121     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 3;" << std::endl;
1122     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 4;" << std::endl;
1123     }
1124     nb=tet->get_triangle3()->get_lien_topologie()->get_nb_ccf();
1125     for (int k=0;k<nb;k++)
1126     {
1127     tet->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1128     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 1;" << std::endl;
1129     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 2;" << std::endl;
1130     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 3;" << std::endl;
1131     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 4;" << std::endl;
1132     }
1133     nb=tet->get_triangle4()->get_lien_topologie()->get_nb_ccf();
1134     for (int k=0;k<nb;k++)
1135     {
1136     tet->get_triangle4()->get_lien_topologie()->get_type_ccf(k,nom);
1137     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 1;" << std::endl;
1138     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 2;" << std::endl;
1139     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 3;" << std::endl;
1140     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 4;" << std::endl;
1141     }
1142     }
1143    
1144    
1145     //*********************************************************
1146     // Les t�tras sont finis, maintenant le maillage des Coques
1147     //*********************************************************
1148     //nb_coques=mg_geometrie->get_nb_mg_coque(); //variable d��d�lar� plus haut, elle devrait avoir conserv�sa valeur
1149     if (nb_coques>0)
1150     {
1151     if (degre==1) of1 << "EGROUP,2,SHELL3,0,0,0,0,0,0,0,0;" << std::endl; // Formulation coques minces... SHELL3T pout �aisses
1152     if (degre==2) of1 << "EGROUP,2,SHELL6,0,0,0,0,0,0,0,0;" << std::endl;
1153     }
1154    
1155     if (nb_poutres>0 || nb_coques>0 )
1156     {
1157     of1 << "EGROUP,3,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres
1158     of1 << "RCONST,3,3,1,3," << "1, 1 , 1; " << std::endl;
1159     of1 << "EGROUP,4,RBAR;"<< std::endl; // EGroup des RBAR
1160     of1 << "EGROUP,5,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres infiniment rigide
1161     of1 << "RCONST,5,5,1,3," << "0.01, 0.01 , 0.01; " << std::endl;
1162     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...)
1163     of1 << "RCONST,6,6,1,3," << "1e-16, 0.01 , 1e-16; " << std::endl;
1164     }
1165    
1166     int RCset =7;
1167    
1168     LISTE_MG_COQUE::iterator ico;
1169     MG_COQUE *mgcoque=mg_geometrie->get_premier_coque(ico);
1170     while (mgcoque)
1171     {
1172     int nummatac=mgcoque->get_num_materiau();
1173     if ((nummatac!=nummat)&&(nummatac!=-1)) // si c'est = 0 alors on place le dernier mat�iau choisi.
1174     {
1175     nummat=nummatac;
1176     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1177     }
1178    
1179     for (int numcoquille=0;numcoquille<mgcoque->get_nb_mg_coquille();numcoquille++)
1180     {
1181     MG_COQUILLE* mgcoquille = mgcoque->get_mg_coquille(numcoquille);
1182     for (int cf = 0; cf<mgcoquille->get_nb_mg_coface();cf++)
1183     {
1184     MG_COFACE* mgcoface = mgcoquille->get_mg_coface(cf);
1185     MG_FACE* mgface = mgcoface->get_face();
1186    
1187     double epaisseur=-1;
1188     for (int k=0;k<mgface->get_nb_ccf();k++) // aller chercher l'�aisseur de la coque
1189     {
1190     char nomCCF[3];
1191     mgface->get_type_ccf(k,nomCCF);
1192     if (strcmp(nomCCF,"EP")==0)
1193     epaisseur = mgface-> get_valeur_ccf(k);
1194     }
1195     of1 << "ACTSET,EG,2;"<< std::endl;
1196     of1 << "RCONST,2,"<< ++RCset << ",1,1," << epaisseur << ";" << std::endl; // le real constant, s'active automatiquement
1197    
1198     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_maillage = mgface->get_lien_fem_maillage();
1199     int nbelem=lien_maillage->get_nb();
1200     for (int i=0;i<nbelem;i++)
1201     {
1202 francois 309 FEM_ELEMENT2* femtriangle=(FEM_ELEMENT2*)lien_maillage->get(i);
1203 francois 283 if (!contient(femtriangle)) continue;
1204     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;
1205     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;
1206     // dans les noeuds des sommets sont, 1, 2 et 3. les noeuds sur les segments sont 4 5 et 6
1207    
1208     long nbc;
1209     MG_TRIANGLE* mgtri=(MG_TRIANGLE*)femtriangle->get_mg_element_maillage();
1210     char nom[3];
1211    
1212     nbc = mgtri->get_segment1()->get_lien_topologie()->get_nb_ccf();
1213     for (int z =0 ; z< nbc; z++) // le premier segment
1214     { // il y a au moins une CCF "EP" qu'il faut ignorer
1215     mgtri->get_segment1()->get_lien_topologie()->get_type_ccf(z,nom); // ->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1216     if (strcmp(nom,"EP")==0) continue;
1217     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;
1218     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;
1219     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;
1220     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;
1221     }
1222     nbc = mgtri->get_segment2()->get_lien_topologie()->get_nb_ccf();
1223     for (int z =0 ; z< nbc; z++)
1224     {
1225     mgtri->get_segment2()->get_lien_topologie()->get_type_ccf(z,nom);
1226     if (strcmp(nom,"EP")==0) continue;
1227     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;
1228     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;
1229     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;
1230     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;
1231     }
1232     nbc = mgtri->get_segment3()->get_lien_topologie()->get_nb_ccf();
1233     for (int z =0 ; z< nbc; z++)
1234     {
1235     mgtri->get_segment3()->get_lien_topologie()->get_type_ccf(z,nom);
1236     if (strcmp(nom,"EP")==0) continue;
1237     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;
1238     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;
1239     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;
1240     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;
1241     }
1242    
1243    
1244     nbc = mgtri->get_lien_topologie()->get_nb_ccf(); // et pour la face elle-m�e
1245     for (int z =0 ; z< nbc; z++)
1246     {
1247     mgtri->get_lien_topologie()->get_type_ccf(z,nom);
1248     if (strcmp(nom,"EP")==0) continue;
1249     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;
1250     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;
1251     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;
1252     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;
1253     }
1254    
1255     }
1256    
1257     } // next face
1258     } // next coquille
1259     mgcoque = mg_geometrie->get_suivant_coque(ico);
1260     }// next coque
1261    
1262    
1263     // **************************
1264     // maintenant les poutres
1265     // **************************
1266    
1267    
1268    
1269     //for (int i = 0 ; i<nb_poutres;i++)
1270     LISTE_MG_POUTRE::iterator it_po;
1271     MG_POUTRE* mgpoutre = mg_geometrie->get_premier_poutre(it_po);
1272     while (mgpoutre)
1273     {
1274     //MG_POUTRE* mgpoutre = mg_geometrie->get_mg_poutre(i);
1275     int nummatac=mgpoutre->get_num_materiau();
1276     if ((nummatac!=nummat)&&(nummatac!=-1))
1277     {
1278     nummat=nummatac;
1279     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1280     }
1281    
1282     for (int j = 0;j<mgpoutre->get_nb_mg_boucle();j++)
1283     {
1284     MG_BOUCLE* mgboucle = mgpoutre->get_mg_boucle(j);
1285    
1286     for (int k = 0 ; k<mgboucle->get_nb_mg_coarete();k++)
1287     {
1288     MG_COARETE* mgcoarete = mgboucle->get_mg_coarete(k);
1289     MG_ARETE* mgarete = mgcoarete->get_arete();
1290    
1291     double IXX = 0;
1292     double IYY = 0;
1293     double Aire = 0;
1294     double x3 = 0;
1295     double y3 = 0;
1296     double z3 = 0;
1297    
1298     for (int k=0;k<mgarete->get_nb_ccf();k++)
1299     {
1300     char nomCCF[3];
1301     mgarete->get_type_ccf(k,nomCCF);
1302     if (strcmp(nomCCF,"As")==0)
1303     Aire = mgarete->get_valeur_ccf(k);
1304     if (strcmp(nomCCF,"IX")==0)
1305     IXX = mgarete->get_valeur_ccf(k);
1306     if (strcmp(nomCCF,"IY")==0)
1307     IYY = mgarete->get_valeur_ccf(k);
1308     if (strcmp(nomCCF,"NX")==0)
1309     x3 = mgarete->get_valeur_ccf(k);
1310     if (strcmp(nomCCF, "NY")==0)
1311     y3 = mgarete->get_valeur_ccf(k);
1312     if (strcmp(nomCCF, "NZ")==0)
1313     z3 = mgarete->get_valeur_ccf(k);
1314     }
1315    
1316     if ( Aire==-7) // -7 est un flag pour diff�rencier les mini-poutres...
1317     { // mini-poutre
1318     of1 << "Actset,EG,5;"<<std::endl;
1319     of1 << "Actset,RC,5;"<<std::endl;
1320     of1 << "C* MINI - POUTRE" << std:: endl;
1321    
1322     for (int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1323     {
1324 francois 309 FEM_ELEMENT1* femseg = (FEM_ELEMENT1*)mgarete->get_lien_fem_maillage()->get(t);
1325 francois 283 of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1326     } // next segment
1327     }
1328     else
1329     { // poutre normale
1330     of1 << "Actset,EG,3;"<<std::endl;
1331     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
1332     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
1333    
1334     for (int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1335     {
1336 francois 309 FEM_ELEMENT1* femseg = (FEM_ELEMENT1*)mgarete->get_lien_fem_maillage()->get(t);
1337 francois 283 if (!contient(femseg)) continue;
1338     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;
1339    
1340     for (int k=0;k<mgarete->get_nb_ccf();k++)
1341     {
1342     char nom[3];
1343     mgarete->get_type_ccf(k,nom);
1344     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;
1345     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;
1346     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;
1347     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!!!
1348     }
1349     } // next segment
1350     }
1351    
1352    
1353     } // next arete
1354     } // next boucle
1355     mgpoutre=mg_geometrie->get_suivant_poutre(it_po);
1356     } // next poutre
1357    
1358     // Cas sp�cial, une ar�te normale est flagg�e comme une mini-poutre (dans coupecot�)
1359     LISTE_MG_ARETE::iterator ita;
1360     MG_ARETE* mgarete = mg_geometrie->get_premier_arete(ita);
1361    
1362     while (mgarete)
1363     {
1364     double Aire = 0;
1365    
1366     for (int k=0;k<mgarete->get_nb_ccf();k++)
1367     {
1368     char nomCCF[3];
1369     mgarete->get_type_ccf(k,nomCCF);
1370     if (strcmp(nomCCF,"As")==0)
1371     Aire = mgarete->get_valeur_ccf(k);
1372     }
1373    
1374     if ( Aire==-7) // -7 est un flag pour diff�rencier les mini-poutres... non orient�e
1375     { // mini-poutre
1376     of1 << "Actset,EG,5;"<<std::endl;
1377     of1 << "Actset,RC,5;"<<std::endl;
1378     of1 << "C* MINI - POUTRE" << std:: endl;
1379    
1380     for (int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1381     {
1382 francois 309 FEM_ELEMENT1* femseg = (FEM_ELEMENT1*)mgarete->get_lien_fem_maillage()->get(t);
1383 francois 283 if (!contient(femseg)) continue;
1384     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1385     }
1386     }
1387     mgarete=mg_geometrie->get_suivant_arete(ita);
1388     }
1389    
1390    
1391    
1392     //************************************************************
1393     // Pour mettre des mini-poutres sur les faces concern�es *****
1394     //*************************************************************
1395     // identifications des faces du qui sont des faces internes.
1396    
1397     LISTE_MG_FACE::iterator itf;
1398     MG_FACE* mgface = mg_geometrie->get_premier_face(itf);
1399    
1400    
1401     while (mgface)
1402     {
1403     for (int k=0;k<mgface->get_nb_ccf();k++)
1404     {
1405     char nomCCF[3];
1406     mgface->get_type_ccf(k,nomCCF);
1407    
1408     if (strcmp(nomCCF,"FI")==0)
1409     {
1410     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_fem_maillage = mgface->get_lien_fem_maillage();
1411     FEM_ELEMENT_MAILLAGE* element;
1412    
1413     //si on a une faceinterne de poutre alors on a une CCF "Po" = 0
1414     // sinon la CCF Po est �gale � 1 et on a une coque
1415     int Poutre = -1;
1416    
1417     for (int z=0;z<mgface->get_nb_ccf();z++)
1418     {
1419     char nomCCF2[3];
1420     mgface->get_type_ccf(z,nomCCF);
1421     if (strcmp(nomCCF,"Po")==0)
1422     {
1423     Poutre = mgface->get_valeur_ccf(z);
1424     }
1425     }
1426    
1427    
1428     if (Poutre ==0)
1429     { // mini-poutres pour des poutres
1430     of1 << "ACTSET,EG,5; C* Face avec mini-poutres de POUTRE"<<std::endl;
1431     of1 << "ACTSET,RC,5;"<<std::endl;
1432     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
1433     {
1434 francois 309 FEM_ELEMENT2* femtriangle=(FEM_ELEMENT2*)lien_fem_maillage->get(i) ;
1435 francois 283
1436     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
1437     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
1438     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
1439    
1440     // 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 ;
1441     //si on veut orienter les propri�t�s,
1442     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
1443     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1444     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1445     }
1446     }
1447     else if (Poutre==1)
1448     { // mini-poutres pour des coques
1449     of1 << "ACTSET,EG,6; C* Face avec mini-poutres de COQUE"<<std::endl;
1450     of1 << "ACTSET,RC,6;"<<std::endl;
1451     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
1452     {
1453 francois 309 FEM_ELEMENT2* femtriangle=(FEM_ELEMENT2*)lien_fem_maillage->get(i) ;
1454 francois 283
1455     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
1456     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
1457     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
1458    
1459     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1460     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd1->get_numero()<< "," << nd2->get_numero()<< "," << nd0->get_numero()<< ";" << std::endl;
1461     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd2->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
1462     }
1463     }
1464     } // end if FI
1465     } // next CCF
1466     mgface= mg_geometrie->get_suivant_face(itf);
1467     } // end while face
1468    
1469    
1470    
1471     //of1<< "NMERGE;" <<std::endl;
1472     //of1<< "NCOMPRESS;" <<std::endl;
1473    
1474     //of1<< "SETEPLOT,1,1,0,0;"<<std::endl;
1475     //of1<< "ACTECLR,1,RC,1;"<<std::endl;
1476    
1477     of1<< "EPLOT;"<<std::endl;
1478     of1<< "PSCALE;"<<std::endl;
1479     //lst_FaceInternes.vide();
1480    
1481     }
1482    
1483    
1484     double FEM_MAILLAGE::calcul_coef(void)
1485     {
1486     if (!deforme) return 0.;
1487     LISTE_FEM_NOEUD::iterator it;
1488     double max=0.,dmax=0.;
1489     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
1490     {
1491     double x=noeud->get_x();
1492     double y=noeud->get_y();
1493     double z=noeud->get_z();
1494     double dx=noeud->get_dx();
1495     double dy=noeud->get_dy();
1496     double dz=noeud->get_dz();
1497     if (fabs(x)>max) max=fabs(x);
1498     if (fabs(y)>max) max=fabs(y);
1499     if (fabs(z)>max) max=fabs(z);
1500     if (fabs(dx)>dmax) dmax=fabs(dx);
1501     if (fabs(dy)>dmax) dmax=fabs(dy);
1502     if (fabs(dz)>dmax) dmax=fabs(dz);
1503     }
1504     if (dmax<1e-10) return 0;
1505     double coef=0.1*max/dmax;
1506     return coef;
1507     }
1508    
1509    
1510    
1511    
1512     void FEM_MAILLAGE::calcul_deforme(FEM_SOLUTION* solx,int numx,FEM_SOLUTION* soly,int numy,FEM_SOLUTION* solz,int numz)
1513     {
1514     LISTE_FEM_NOEUD::iterator it;
1515     solx->active_solution(numx);
1516     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
1517    
1518     noeud->change_dx(noeud->get_solution()/get_mg_geometrie()->get_valeur_unite());
1519    
1520     soly->active_solution(numy);
1521     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
1522    
1523     noeud->change_dy(noeud->get_solution()/get_mg_geometrie()->get_valeur_unite());
1524    
1525     solz->active_solution(numz);
1526     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
1527    
1528     noeud->change_dz(noeud->get_solution()/get_mg_geometrie()->get_valeur_unite());
1529    
1530     deforme=1;
1531     }
1532    
1533    
1534     int FEM_MAILLAGE::existe_deforme(void)
1535     {
1536     return deforme;
1537     }
1538    
1539     void FEM_MAILLAGE::active_deforme(void)
1540     {
1541     deforme=1;
1542     }
1543    
1544 gervaislavoie 304 void FEM_MAILLAGE::desactive_deforme(void)
1545     {
1546     deforme=0;
1547     }
1548 francois 283
1549    
1550 francois 325 void FEM_MAILLAGE::calcul_somme_reaction(double &rx,double &ry,double &rz)
1551     {
1552     rx=0.;
1553     ry=0.;
1554     rz=0.;
1555     LISTE_FEM_NOEUD::iterator it;
1556     for (FEM_NOEUD* no=get_premier_noeud(it);no!=NULL;no=get_suivant_noeud(it))
1557     {
1558     rx=rx+no->get_rx();
1559     ry=ry+no->get_ry();
1560     rz=rz+no->get_rz();
1561     }
1562     }
1563 francois 283
1564    
1565    
1566    
1567    
1568    
1569    
1570     void FEM_MAILLAGE::optimise_numerotation(void)
1571     {
1572     FEM_NOEUD* noeud=get_fem_noeud(0);
1573     FEM_GRAPH_NOEUD *graph;
1574     graph=new FEM_GRAPH_NOEUD(noeud,this);
1575     int e=graph->get_excentricite();
1576     TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau();
1577     int nbdernierniveau=dernierniveau.get_nb();
1578     for (int i=0;i<nbdernierniveau;i++)
1579     {
1580     FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),this);
1581     int etmp=graphtmp->get_excentricite();
1582     if (etmp>e)
1583     {
1584     delete graph;
1585     graph=graphtmp;
1586     dernierniveau=graph->get_dernier_niveau();
1587     nbdernierniveau=dernierniveau.get_nb();
1588     i=-1;
1589     e=etmp;
1590     }
1591     else delete graphtmp;
1592     }
1593     int numero=get_nb_fem_noeud();
1594     for (int i=0;i<e+1;i++)
1595     {
1596     TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i);
1597     int nbnoeud=niveau.get_nb();
1598     for (int j=0;j<nbnoeud;j++)
1599     {
1600     FEM_NOEUD* noeud=niveau.get(j);
1601     noeud->change_numero_opt(numero);
1602     numero--;
1603     }
1604     }
1605    
1606    
1607     delete graph;
1608     }
1609    
1610     void FEM_MAILLAGE::echange_numerotation(void)
1611     {
1612     int nbnoeud=get_nb_fem_noeud();
1613     for (int i=0;i<nbnoeud;i++)
1614     {
1615     FEM_NOEUD* noeud=get_fem_noeud(i);
1616     int num=noeud->get_numero();
1617     noeud->change_numero(noeud->get_numero_opt());
1618     noeud->change_numero_opt(num);
1619     }
1620    
1621     }
1622    
1623    
1624    
1625    
1626     std::ostream& operator << (std::ostream& o,FEM_MAILLAGE& maillage)
1627     {
1628     maillage.enregistrer(o);
1629     return o;
1630     }
1631    
1632    
1633 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)
1634     {
1635     nb_noeud=get_nb_fem_noeud();
1636     LISTE_FEM_ELEMENT1::iterator it1;
1637     for (FEM_ELEMENT1* ele=get_premier_element1(it1);ele!=NULL;ele=get_suivant_element1(it1))
1638     {
1639     int nb=ele->get_nb_fem_noeud();
1640     if (nb==2) nb_seg2++;
1641     if (nb==3) nb_seg3++;
1642     }
1643     LISTE_FEM_ELEMENT2::iterator it2;
1644     for (FEM_ELEMENT2* ele=get_premier_element2(it2);ele!=NULL;ele=get_suivant_element2(it2))
1645     {
1646     int nb=ele->get_nb_fem_noeud();
1647     if (nb==3) nb_tri3++;
1648     if (nb==4) nb_quad4++;
1649     if (nb==6) nb_tri6++;
1650     if (nb==8) nb_quad8++;
1651     }
1652     LISTE_FEM_ELEMENT3::iterator it3;
1653     for (FEM_ELEMENT3* ele=get_premier_element3(it3);ele!=NULL;ele=get_suivant_element3(it3))
1654     {
1655     int nb=ele->get_nb_fem_noeud();
1656     if (nb==4) nb_tet4++;
1657     if (nb==8) nb_hex8++;
1658     if (nb==10) nb_tet10++;
1659     if (nb==20) nb_hex20++;
1660     }
1661     }
1662 francois 283
1663    
1664    
1665    
1666    
1667    
1668    
1669    
1670    
1671    
1672    
1673