ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 339
Committed: Wed May 30 18:20:47 2012 UTC (12 years, 11 months ago) by francois
File size: 72390 byte(s)
Log Message:
Correction bug mailleur bloc + correction bug inversion avec open cascade + preparation pour element  XFEM

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 francois 339 FEM_MAILLAGE::FEM_MAILLAGE(MG_GEOMETRIE* geo,MG_MAILLAGE* mai,int deg):MG_IDENTIFICATEUR(),mg_geometrie(geo),maillage(mai),degre(deg),deforme(0),reaction(0)
56 francois 283 {
57     }
58    
59 francois 339 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),reaction(0)
60 francois 283 {
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 francois 339 // ENTITE XFEM_ELEMENT3
595 francois 283
596    
597 francois 339 int FEM_MAILLAGE::ajouter_xfem_element3(XFEM_ELEMENT3 *femele)
598     {
599     gest->recherche_bonid(*femele);
600     MG_IDENTIFICATEUR *id=femele;
601     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
602     if (!p.second)
603     {
604     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
605     return FAIL;
606     }
607 francois 283
608 francois 339 std::pair<const unsigned long,XFEM_ELEMENT3*> tmp(femele->get_id(),femele);
609     lst_xfem_element3.insert(tmp);
610     return OK;
611     }
612 francois 283
613 francois 339 XFEM_ELEMENT3* FEM_MAILLAGE::get_xfem_element3id(unsigned long num)
614     {
615     LISTE_XFEM_ELEMENT3::iterator i=lst_xfem_element3.find(num);
616     if (i==lst_xfem_element3.end())
617     {
618     // afficheur << INEXISTE << enderr;
619     return NULL;
620     }
621     return ((*i).second);
622     }
623    
624     unsigned int FEM_MAILLAGE::get_nb_xfem_element3(void)
625     {
626     return lst_xfem_element3.size();
627     }
628    
629    
630    
631     XFEM_ELEMENT3* FEM_MAILLAGE::get_xfem_element3(unsigned int num)
632     {
633     if (!(num<lst_xfem_element3.size()))
634     {
635     // afficheur << INEXISTE << enderr;
636     return NULL;
637     }
638     LISTE_XFEM_ELEMENT3::iterator i=lst_xfem_element3.begin();
639     for (unsigned long j=0;j<num;j++) i++;
640     return ((*i).second);
641     }
642    
643    
644    
645     int FEM_MAILLAGE::supprimer_xfem_element3id(unsigned long num)
646     {
647     XFEM_ELEMENT3* femele=get_xfem_element3id(num);
648     if (femele==NULL)
649     {
650     // afficheur << INEXISTE2 << enderr;
651     return FAIL;
652     }
653     MG_IDENTIFICATEUR* id=femele;
654     LISTE_ENTITE::iterator i=lst_entite.find(id);
655     lst_entite.erase(i);
656     LISTE_XFEM_ELEMENT3::iterator j=lst_xfem_element3.find(num);
657     lst_xfem_element3.erase(j);
658     delete femele;
659     return OK;
660     }
661    
662     int FEM_MAILLAGE::supprimer_xfem_element3(unsigned int num)
663     {
664     XFEM_ELEMENT3* femele=get_xfem_element3(num);
665     if (femele==NULL)
666     {
667     // afficheur << INEXISTE2 << enderr;
668     return FAIL;
669     }
670     MG_IDENTIFICATEUR* id=femele;
671     LISTE_ENTITE::iterator i=lst_entite.find(id);
672     lst_entite.erase(i);
673     LISTE_XFEM_ELEMENT3::iterator j=lst_xfem_element3.find(num);
674     lst_xfem_element3.erase(j);
675     delete femele;
676     return OK;
677     }
678    
679     void FEM_MAILLAGE::supprimer_tout_xfem_element3(void)
680     {
681     while (get_nb_xfem_element3()!=0)
682     {
683     LISTE_XFEM_ELEMENT3::iterator j=lst_xfem_element3.begin();
684     XFEM_ELEMENT3* femele=(*j).second;
685     MG_IDENTIFICATEUR* id=femele;
686     LISTE_ENTITE::iterator i=lst_entite.find(id);
687     lst_entite.erase(i);
688     lst_xfem_element3.erase(j);
689     delete femele;
690     }
691     }
692    
693    
694     XFEM_ELEMENT3* FEM_MAILLAGE::get_premier_xelement3(LISTE_XFEM_ELEMENT3::iterator & it)
695     {
696     it = lst_xfem_element3.begin();
697     if (it == lst_xfem_element3.end())
698     return NULL;
699     return it->second ;
700     }
701    
702     XFEM_ELEMENT3* FEM_MAILLAGE::get_suivant_xelement3(LISTE_XFEM_ELEMENT3::iterator & it)
703     {
704     it++;
705     if (it==lst_xfem_element3.end())
706     return NULL;
707     return it->second;
708     }
709    
710    
711    
712 francois 283 void FEM_MAILLAGE::construire(int num)
713     {
714 francois 310 if (degre==1) construire_lineaire();
715 francois 283 if (degre==2) construire_quadratique();
716     if (num>0) optimise_numerotation();
717     if (num>1) echange_numerotation();
718    
719     }
720    
721    
722    
723    
724 francois 310 void FEM_MAILLAGE::construire_lineaire(void)
725 francois 283 {
726     LISTE_MG_NOEUD::iterator it_noeud;
727     MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_noeud);
728 francois 295 std::vector<FEM_NOEUD*> lstnoeuddirect;
729 francois 283 unsigned int i=0;
730     while (mgnoeud)
731     {
732     mgnoeud->change_nouveau_numero(i);
733     FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud);
734     femnoeud->change_numero(i+1);
735     i++;
736     ajouter_fem_noeud(femnoeud);
737     mgnoeud=maillage->get_suivant_noeud(it_noeud);
738     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
739     }
740     int dimsansgeo=0;
741     if (get_mg_geometrie()==NULL)
742     {
743 francois 310 if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3;
744     else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2;
745 francois 283 else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
746     }
747     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==1)))
748     {
749     LISTE_MG_SEGMENT::iterator it_seg;
750     MG_SEGMENT * mgseg = maillage->get_premier_segment(it_seg);
751     while (mgseg)
752     {
753     if (mgseg->get_lien_topologie()!=NULL) if (mgseg->get_lien_topologie()->get_dimension()!=1) {
754     mgseg=maillage->get_suivant_segment(it_seg);
755     continue;
756     }
757     {
758     FEM_NOEUD *tabnoeud[2];
759     tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()];
760     tabnoeud[1]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()];
761     FEM_SEGMENT2* seg=new FEM_SEGMENT2(mgseg,tabnoeud);
762 francois 309 ajouter_fem_element1(seg);
763 francois 283 }
764     mgseg=maillage->get_suivant_segment(it_seg);
765     }
766     }
767     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==2)))
768     {
769     LISTE_MG_TRIANGLE::iterator it_tri;
770     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
771     while (mgtri)
772     {
773     if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2) {
774     mgtri=maillage->get_suivant_triangle(it_tri);
775     continue;
776     }
777     FEM_NOEUD *tabnoeud[3];
778     tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()];
779     tabnoeud[1]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()];
780     tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()];
781     FEM_TRIANGLE3* tri=new FEM_TRIANGLE3(mgtri,tabnoeud);
782 francois 309 ajouter_fem_element2(tri);
783 francois 283 mgtri=maillage->get_suivant_triangle(it_tri);
784     }
785 francois 310 LISTE_MG_QUADRANGLE::iterator it_quad;
786     MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad);
787     while (mgquad)
788     {
789     if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) {
790     mgquad=maillage->get_suivant_quadrangle(it_quad);
791     continue;
792     }
793     FEM_NOEUD *tabnoeud[4];
794     tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()];
795     tabnoeud[1]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()];
796     tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()];
797     tabnoeud[3]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()];
798     FEM_QUADRANGLE4* quad=new FEM_QUADRANGLE4(mgquad,tabnoeud);
799     ajouter_fem_element2(quad);
800     mgquad=maillage->get_suivant_quadrangle(it_quad);
801     }
802 francois 283 }
803     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==3)))
804     {
805     LISTE_MG_TETRA::iterator it_tetra;
806     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
807     while (mgtetra)
808     {
809     FEM_NOEUD *tabnoeud[4];
810     tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()];
811     tabnoeud[1]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()];
812     tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()];
813     tabnoeud[3]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()];
814     FEM_TETRA4* tet=new FEM_TETRA4(mgtetra,tabnoeud);
815 francois 309 ajouter_fem_element3(tet);
816 francois 283 mgtetra=maillage->get_suivant_tetra(it_tetra);
817     }
818 francois 310 LISTE_MG_HEXA::iterator it_hex;
819     MG_HEXA* mghex=maillage->get_premier_hexa(it_hex);
820     while (mghex)
821     {
822     FEM_NOEUD *tabnoeud[8];
823     tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()];
824     tabnoeud[1]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()];
825     tabnoeud[2]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()];
826     tabnoeud[3]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()];
827     tabnoeud[4]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()];
828     tabnoeud[5]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()];
829     tabnoeud[6]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()];
830     tabnoeud[7]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()];
831     FEM_HEXA8* hex=new FEM_HEXA8(mghex,tabnoeud);
832     ajouter_fem_element3(hex);
833     mghex=maillage->get_suivant_hexa(it_hex);
834     }
835 francois 283 }
836     }
837    
838    
839     void FEM_MAILLAGE::construire_quadratique(void)
840     {
841     LISTE_MG_NOEUD::iterator it_nd;
842     MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_nd);
843 francois 295 std::vector<FEM_NOEUD*> lstnoeuddirect;
844 francois 283 unsigned int i=0;
845     while (mgnoeud)
846     {
847     mgnoeud->change_nouveau_numero(i);
848     FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud);
849     femnoeud->change_numero(i+1);
850     i++ ;
851     ajouter_fem_noeud(femnoeud);
852     mgnoeud=maillage->get_suivant_noeud(it_nd);
853     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
854     }
855     int dimsansgeo=0;
856     if (get_mg_geometrie()==NULL)
857     {
858     if (maillage->get_nb_mg_tetra()!=0) dimsansgeo=3;
859     else if (maillage->get_nb_mg_triangle()!=0) dimsansgeo=2;
860     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
861     }
862     int nbmgnoeud = maillage->get_nb_mg_noeud();
863    
864     LISTE_MG_SEGMENT::iterator it_seg;
865     MG_SEGMENT* mgseg=maillage->get_premier_segment(it_seg);
866     i=0;
867     while (mgseg)
868     {
869     mgseg->change_nouveau_numero(i++);
870     MG_NOEUD *noeud1=mgseg->get_noeud1();
871     MG_NOEUD *noeud2=mgseg->get_noeud2();
872     double *xyz1=noeud1->get_coord();
873     double *xyz2=noeud2->get_coord();
874     FEM_NOEUD* femnoeud;
875     if (mgseg->get_lien_topologie()!=NULL)
876     if (mgseg->get_lien_topologie()->get_dimension()==1)
877     {
878     MG_ARETE* arete=(MG_ARETE*)(mgseg->get_lien_topologie());
879     double t1,t2;
880     arete->inverser(t1,xyz1);
881     arete->inverser(t2,xyz2);
882     if (arete->get_courbe()->est_periodique())
883     if (t1>t2) t2=t2+arete->get_courbe()->get_periode();
884     double t=0.5*(t1+t2);
885     double xyz[2];
886     arete->evaluer(t,xyz);
887     femnoeud= new FEM_NOEUD(mgseg,xyz[0],xyz[1],xyz[2]);
888     }
889     if (mgseg->get_lien_topologie()!=NULL)
890     if (mgseg->get_lien_topologie()->get_dimension()==2)
891     {
892     MG_FACE* face=(MG_FACE*)(mgseg->get_lien_topologie());
893     double uv1[2],uv2[2];
894     OT_DECALAGE_PARAMETRE decalage(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
895     face->inverser(uv1,xyz1);
896     face->inverser(uv2,xyz2);
897 francois 317 if (face->get_surface()->est_periodique_u()==1)
898     {
899     double eps=1e-10*face->get_surface()->get_periode_u();
900     if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u();
901     if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u();
902     if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u();
903     if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u();
904     }
905     if (face->get_surface()->est_periodique_v()==1)
906     {
907     double eps=1e-10*face->get_surface()->get_periode_v();
908     if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v();
909     if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v();
910     if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v();
911     if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v();
912     }
913     double du=decalage.calcul_decalage_parametre_u(uv1[0]);
914 francois 283 double dv=decalage.calcul_decalage_parametre_v(uv1[1]);
915     double u1=decalage.decalage_parametre_u(uv1[0],du);
916     double v1=decalage.decalage_parametre_v(uv1[1],dv);
917     double u2=decalage.decalage_parametre_u(uv2[0],du);
918     double v2=decalage.decalage_parametre_v(uv2[1],dv);
919     double ui=0.5*(u1+u2);
920     double vi=0.5*(v1+v2);
921     double uii=decalage.decalage_parametre_u(ui,-du);
922     double vii=decalage.decalage_parametre_v(vi,-dv);
923     double uv[2],xyz[3];
924     uv[0]=uii;
925     uv[1]=vii;
926     face->evaluer(uv,xyz);
927     femnoeud= new FEM_NOEUD(mgseg,xyz[0],xyz[1],xyz[2]);
928     }
929     if (mgseg->get_lien_topologie()!=NULL)
930     {
931     if (mgseg->get_lien_topologie()->get_dimension()==3)
932     {
933     double x=0.5*(xyz1[0]+xyz2[0]);
934     double y=0.5*(xyz1[1]+xyz2[1]);
935     double z=0.5*(xyz1[2]+xyz2[2]);
936     femnoeud= new FEM_NOEUD(mgseg,x,y,z);
937     }
938     }
939     else
940     {
941     double x=0.5*(xyz1[0]+xyz2[0]);
942     double y=0.5*(xyz1[1]+xyz2[1]);
943     double z=0.5*(xyz1[2]+xyz2[2]);
944     femnoeud= new FEM_NOEUD(mgseg,x,y,z);
945     }
946     femnoeud->change_numero(i+nbmgnoeud+1);
947     ajouter_fem_noeud(femnoeud);
948     mgseg=maillage->get_suivant_segment(it_seg);
949     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
950     }
951    
952     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==1)))
953     {
954    
955     mgseg=maillage->get_premier_segment(it_seg);
956     while (mgseg)
957     {
958     if (mgseg->get_lien_topologie()!=NULL) if (mgseg->get_lien_topologie()->get_dimension()!=1) {
959     mgseg=maillage->get_suivant_segment(it_seg);
960     continue;
961     }
962     {
963     FEM_NOEUD *tabnoeud[3];
964     tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()];
965     tabnoeud[1]=lstnoeuddirect[mgseg->get_nouveau_numero()+nbmgnoeud];
966     tabnoeud[2]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()];
967     FEM_SEGMENT3* seg=new FEM_SEGMENT3(mgseg,tabnoeud);
968 francois 309 ajouter_fem_element1(seg);
969 francois 283 }
970     mgseg=maillage->get_suivant_segment(it_seg);
971     }
972     }
973     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==2)))
974     {
975     LISTE_MG_TRIANGLE::iterator it_tri;
976     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
977     while (mgtri)
978     {
979     if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2) {
980     mgtri=maillage->get_suivant_triangle(it_tri);
981     continue;
982     }
983     {
984     FEM_NOEUD *tabnoeud[6];
985     tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()];
986     tabnoeud[1]=lstnoeuddirect[mgtri->get_segment1()->get_nouveau_numero()+nbmgnoeud];
987     tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()];
988     tabnoeud[3]=lstnoeuddirect[mgtri->get_segment2()->get_nouveau_numero()+nbmgnoeud];
989     tabnoeud[4]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()];
990     tabnoeud[5]=lstnoeuddirect[mgtri->get_segment3()->get_nouveau_numero()+nbmgnoeud];
991     FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(mgtri,tabnoeud);
992 francois 309 ajouter_fem_element2(tri);
993 francois 283 }
994     mgtri=maillage->get_suivant_triangle(it_tri);
995     }
996 francois 310 LISTE_MG_QUADRANGLE::iterator it_quad;
997     MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad);
998     while (mgquad)
999     {
1000     if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) {
1001     mgquad=maillage->get_suivant_quadrangle(it_quad);
1002     continue;
1003     }
1004     {
1005     FEM_NOEUD *tabnoeud[8];
1006     tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()];
1007     tabnoeud[1]=lstnoeuddirect[mgquad->get_segment1()->get_nouveau_numero()+nbmgnoeud];
1008     tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()];
1009     tabnoeud[3]=lstnoeuddirect[mgquad->get_segment2()->get_nouveau_numero()+nbmgnoeud];
1010     tabnoeud[4]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()];
1011     tabnoeud[5]=lstnoeuddirect[mgquad->get_segment3()->get_nouveau_numero()+nbmgnoeud];
1012     tabnoeud[6]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()];
1013     tabnoeud[7]=lstnoeuddirect[mgquad->get_segment4()->get_nouveau_numero()+nbmgnoeud];
1014     FEM_QUADRANGLE8* quad=new FEM_QUADRANGLE8(mgquad,tabnoeud);
1015     ajouter_fem_element2(quad);
1016     }
1017     mgquad=maillage->get_suivant_quadrangle(it_quad);
1018     }
1019 francois 283 }
1020     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==3)))
1021     {
1022    
1023     LISTE_MG_TETRA::iterator it_tetra;
1024     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
1025     while (mgtetra)
1026     {
1027     FEM_NOEUD *tabnoeud[10];
1028     tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()];
1029     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
1030     tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()];
1031     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
1032     tabnoeud[4]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()];
1033     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
1034     tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
1035     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
1036     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
1037     tabnoeud[9]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()];
1038     FEM_TETRA10* tet=new FEM_TETRA10(mgtetra,tabnoeud);
1039 francois 309 ajouter_fem_element3(tet);
1040 francois 283 mgtetra=maillage->get_suivant_tetra(it_tetra);
1041     }
1042 francois 310 LISTE_MG_HEXA::iterator it_hexa;
1043     MG_HEXA* mghex=maillage->get_premier_hexa(it_hexa);
1044     while (mghex)
1045     {
1046     FEM_NOEUD *tabnoeud[20];
1047     tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()];
1048     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
1049     tabnoeud[2]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()];
1050     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
1051     tabnoeud[4]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()];
1052     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
1053     tabnoeud[6]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()];
1054     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
1055     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
1056     tabnoeud[9]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
1057     tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
1058     tabnoeud[11]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
1059     tabnoeud[12]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()];
1060     tabnoeud[13]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud5()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
1061     tabnoeud[14]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()];
1062     tabnoeud[15]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud6()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
1063     tabnoeud[16]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()];
1064     tabnoeud[17]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud7()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
1065     tabnoeud[18]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()];
1066     tabnoeud[19]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud8()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
1067     FEM_HEXA20* hex=new FEM_HEXA20(mghex,tabnoeud);
1068     ajouter_fem_element3(hex);
1069     mghex=maillage->get_suivant_hexa(it_hexa);
1070     }
1071 francois 283 }
1072     }
1073    
1074    
1075    
1076     void FEM_MAILLAGE::enregistrer(std::ostream& o)
1077     {
1078    
1079     if (mg_geometrie==NULL) o << "%" << get_id() << "=FEM_MAILLAGE(" << degre << ",$" << maillage->get_id() << " );" << std::endl;
1080     else o << "%" << get_id() << "=FEM_MAILLAGE("<< degre << ",$" << maillage->get_id() << ",$" << mg_geometrie->get_id() <<");" << std::endl;
1081     LISTE_ENTITE::const_iterator i;
1082     for (i=lst_entite.begin();i!=lst_entite.end();i++)
1083     (*i)->enregistrer(o);
1084     }
1085    
1086    
1087     void FEM_MAILLAGE::exporter_cosmos(std::string& nomfic)
1088     {
1089     char chaine[500];
1090     sprintf(chaine,"%s.ses",nomfic.c_str());
1091     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
1092     of1.precision(16);
1093     of1.setf(std::ios::showpoint);
1094     of1 << "TITLE, " << chaine << " : Fichier FEM de maillage MAGiC" << std::endl;
1095     if (degre==1) of1 << "EGROUP,1,TETRA4,0,0,0,0,0,0,0,0;" << std::endl;
1096     if (degre==2) of1 << "EGROUP,1,TETRA10,0,0,0,0,0,0,0,0;" << std::endl;
1097     int nb_volume=mg_geometrie->get_nb_mg_volume();
1098     int nbNoeuds = 0;
1099    
1100    
1101     for (int i=0;i<nb_volume;i++)
1102     {
1103     MG_VOLUME *mgvol=mg_geometrie->get_mg_volume(i);
1104     if (mgvol->get_num_materiau()>=0)
1105     {
1106 francois 296 MC_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1107     MC_MATERIAU* mat=mtgest.get_materiau(mgvol->get_num_materiau());
1108 francois 283 for (int m=0; m<mat->get_nb_propriete();m++)
1109     {
1110 francois 296 MC_PROPRIETE* prop=mat->get_propriete(m);
1111 francois 283 of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
1112     }
1113     /* MT_PROPRIETE* prop=mat->get_propriete("EX");
1114     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", EX, " << prop->get_valeur(2) << ";" << std::endl;
1115     prop=mat->get_propriete("NUXY");
1116     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", NUXY, " << prop->get_valeur(2) << ";" << std::endl;
1117     prop=mat->get_propriete("GXY");
1118     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", GXY, " << prop->get_valeur(2) << ";" << std::endl;
1119     prop=mat->get_propriete("DENS");
1120     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", DENS, " << prop->get_valeur(2) << ";" << std::endl;
1121     prop=mat->get_propriete("SIGXT");
1122     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGXT, " << prop->get_valeur(2) << ";" << std::endl;
1123     prop=mat->get_propriete("SIGYLD");
1124     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGYLD, " << prop->get_valeur(2) << ";" << std::endl;
1125     prop=mat->get_propriete("ALPX");
1126     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", ALPX, " << prop->get_valeur(2) << ";" << std::endl;
1127     prop=mat->get_propriete("KX");
1128     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", KX, " << prop->get_valeur(2) << ";" << std::endl;
1129     prop=mat->get_propriete("C");
1130     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", C , " << prop->get_valeur(2) << ";" << std::endl;*/
1131     }
1132     }
1133     int nb_coques = mg_geometrie->get_nb_mg_coque();
1134     for (int i=0;i<nb_coques;i++)
1135     {
1136     MG_COQUE *mgcoque=mg_geometrie->get_mg_coque(i);
1137     if (mgcoque->get_num_materiau()>=0)
1138     {
1139 francois 296 MC_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1140     MC_MATERIAU* mat=mtgest.get_materiau(mgcoque->get_num_materiau());
1141 francois 283 for (int m=0; m<mat->get_nb_propriete();m++)
1142     {
1143 francois 296 MC_PROPRIETE* prop=mat->get_propriete(m);
1144 francois 283 of1<< "MPROP, "<< mgcoque->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
1145     }
1146     }
1147     }
1148     int nb_poutres = mg_geometrie->get_nb_mg_poutre();
1149     for (int i=0;i<nb_poutres;i++)
1150     {
1151     MG_POUTRE *mgpoutre=mg_geometrie->get_mg_poutre(i);
1152     if (mgpoutre->get_num_materiau()>=0)
1153     {
1154 francois 296 MC_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1155     MC_MATERIAU* mat=mtgest.get_materiau(mgpoutre->get_num_materiau());
1156 francois 283
1157     for (int m=0; m<mat->get_nb_propriete();m++)
1158     {
1159 francois 296 MC_PROPRIETE* prop=mat->get_propriete(m);
1160 francois 283 of1<< "MPROP, "<< mgpoutre->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
1161     }
1162     }
1163     }
1164    
1165    
1166    
1167     of1 << "ACTSET,CS,0;" << std::endl;
1168     of1 << "ACTSET,EG,1;" << std::endl;
1169    
1170     // �riture des noeuds
1171     int ii=0;
1172     double valeurunite=mg_geometrie->get_valeur_unite();
1173     for (LISTE_FEM_NOEUD::iterator i=lst_fem_noeud.begin();i!=lst_fem_noeud.end();i++)
1174     {
1175     FEM_NOEUD* noeud=((*i).second);
1176     of1 << "ND, " << noeud->get_numero() << ", " << noeud->get_x()*valeurunite << ", " << noeud->get_y()*valeurunite << ", " << noeud->get_z()*valeurunite << ";" << std::endl;
1177     char nom[3];
1178     int nb=noeud->get_lien_topologie()->get_nb_ccf();
1179     for (int k=0;k<nb;k++)
1180     {
1181     noeud->get_lien_topologie()->get_type_ccf(k,nom);
1182     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;
1183     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;
1184     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;
1185     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;
1186     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;
1187     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;
1188     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;
1189     }
1190     ii++;
1191     }
1192     nbNoeuds = ii;
1193     ii=0;
1194    
1195     // �criture des t�tra�dres
1196     int nummat=-10; // num�o du mat�iau
1197 francois 309 for (LISTE_FEM_ELEMENT3::iterator i=lst_fem_element3.begin();i!=lst_fem_element3.end();i++)
1198 francois 283 {
1199 francois 309 FEM_ELEMENT3* tetra=((*i).second);
1200 francois 283 MG_VOLUME* vol=(MG_VOLUME*)tetra->get_lien_topologie();
1201     int nummatac=vol->get_num_materiau();
1202     if ((nummatac!=nummat) && (nummatac!=-1))
1203     {
1204     nummat=nummatac;
1205     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1206     }
1207     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() << ", " ;
1208     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() << ", " ;
1209     ii++;
1210     MG_TETRA* tet=(MG_TETRA*)tetra->get_mg_element_maillage();
1211     if (tet->get_triangle1()->get_lien_topologie()->get_dimension()!=3) of1 << "1, ";
1212     else of1 << "0, ";
1213     if (tet->get_triangle2()->get_lien_topologie()->get_dimension()!=3) of1 << "1, ";
1214     else of1 << "0, ";
1215     if (tet->get_triangle3()->get_lien_topologie()->get_dimension()!=3) of1 << "1, ";
1216     else of1 << "0, ";
1217     if (tet->get_triangle4()->get_lien_topologie()->get_dimension()!=3) of1 << "1;" << std::endl ;
1218     else of1 << "0;" << std::endl;
1219     char nom[3];
1220     int nb=tet->get_triangle1()->get_lien_topologie()->get_nb_ccf();
1221     for (int k=0;k<nb;k++)
1222     {
1223     tet->get_triangle1()->get_lien_topologie()->get_type_ccf(k,nom);
1224     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 1;" << std::endl;
1225     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 2;" << std::endl;
1226     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 3;" << std::endl;
1227     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 4;" << std::endl;
1228     }
1229     nb=tet->get_triangle2()->get_lien_topologie()->get_nb_ccf();
1230     for (int k=0;k<nb;k++)
1231     {
1232     tet->get_triangle2()->get_lien_topologie()->get_type_ccf(k,nom);
1233     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 1;" << std::endl;
1234     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 2;" << std::endl;
1235     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 3;" << std::endl;
1236     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 4;" << std::endl;
1237     }
1238     nb=tet->get_triangle3()->get_lien_topologie()->get_nb_ccf();
1239     for (int k=0;k<nb;k++)
1240     {
1241     tet->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1242     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 1;" << std::endl;
1243     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 2;" << std::endl;
1244     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 3;" << std::endl;
1245     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 4;" << std::endl;
1246     }
1247     nb=tet->get_triangle4()->get_lien_topologie()->get_nb_ccf();
1248     for (int k=0;k<nb;k++)
1249     {
1250     tet->get_triangle4()->get_lien_topologie()->get_type_ccf(k,nom);
1251     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 1;" << std::endl;
1252     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 2;" << std::endl;
1253     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 3;" << std::endl;
1254     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 4;" << std::endl;
1255     }
1256     }
1257    
1258    
1259     //*********************************************************
1260     // Les t�tras sont finis, maintenant le maillage des Coques
1261     //*********************************************************
1262     //nb_coques=mg_geometrie->get_nb_mg_coque(); //variable d��d�lar� plus haut, elle devrait avoir conserv�sa valeur
1263     if (nb_coques>0)
1264     {
1265     if (degre==1) of1 << "EGROUP,2,SHELL3,0,0,0,0,0,0,0,0;" << std::endl; // Formulation coques minces... SHELL3T pout �aisses
1266     if (degre==2) of1 << "EGROUP,2,SHELL6,0,0,0,0,0,0,0,0;" << std::endl;
1267     }
1268    
1269     if (nb_poutres>0 || nb_coques>0 )
1270     {
1271     of1 << "EGROUP,3,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres
1272     of1 << "RCONST,3,3,1,3," << "1, 1 , 1; " << std::endl;
1273     of1 << "EGROUP,4,RBAR;"<< std::endl; // EGroup des RBAR
1274     of1 << "EGROUP,5,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres infiniment rigide
1275     of1 << "RCONST,5,5,1,3," << "0.01, 0.01 , 0.01; " << std::endl;
1276     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...)
1277     of1 << "RCONST,6,6,1,3," << "1e-16, 0.01 , 1e-16; " << std::endl;
1278     }
1279    
1280     int RCset =7;
1281    
1282     LISTE_MG_COQUE::iterator ico;
1283     MG_COQUE *mgcoque=mg_geometrie->get_premier_coque(ico);
1284     while (mgcoque)
1285     {
1286     int nummatac=mgcoque->get_num_materiau();
1287     if ((nummatac!=nummat)&&(nummatac!=-1)) // si c'est = 0 alors on place le dernier mat�iau choisi.
1288     {
1289     nummat=nummatac;
1290     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1291     }
1292    
1293     for (int numcoquille=0;numcoquille<mgcoque->get_nb_mg_coquille();numcoquille++)
1294     {
1295     MG_COQUILLE* mgcoquille = mgcoque->get_mg_coquille(numcoquille);
1296     for (int cf = 0; cf<mgcoquille->get_nb_mg_coface();cf++)
1297     {
1298     MG_COFACE* mgcoface = mgcoquille->get_mg_coface(cf);
1299     MG_FACE* mgface = mgcoface->get_face();
1300    
1301     double epaisseur=-1;
1302     for (int k=0;k<mgface->get_nb_ccf();k++) // aller chercher l'�aisseur de la coque
1303     {
1304     char nomCCF[3];
1305     mgface->get_type_ccf(k,nomCCF);
1306     if (strcmp(nomCCF,"EP")==0)
1307     epaisseur = mgface-> get_valeur_ccf(k);
1308     }
1309     of1 << "ACTSET,EG,2;"<< std::endl;
1310     of1 << "RCONST,2,"<< ++RCset << ",1,1," << epaisseur << ";" << std::endl; // le real constant, s'active automatiquement
1311    
1312     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_maillage = mgface->get_lien_fem_maillage();
1313     int nbelem=lien_maillage->get_nb();
1314     for (int i=0;i<nbelem;i++)
1315     {
1316 francois 309 FEM_ELEMENT2* femtriangle=(FEM_ELEMENT2*)lien_maillage->get(i);
1317 francois 283 if (!contient(femtriangle)) continue;
1318     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;
1319     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;
1320     // dans les noeuds des sommets sont, 1, 2 et 3. les noeuds sur les segments sont 4 5 et 6
1321    
1322     long nbc;
1323     MG_TRIANGLE* mgtri=(MG_TRIANGLE*)femtriangle->get_mg_element_maillage();
1324     char nom[3];
1325    
1326     nbc = mgtri->get_segment1()->get_lien_topologie()->get_nb_ccf();
1327     for (int z =0 ; z< nbc; z++) // le premier segment
1328     { // il y a au moins une CCF "EP" qu'il faut ignorer
1329     mgtri->get_segment1()->get_lien_topologie()->get_type_ccf(z,nom); // ->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1330     if (strcmp(nom,"EP")==0) continue;
1331     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;
1332     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;
1333     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;
1334     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;
1335     }
1336     nbc = mgtri->get_segment2()->get_lien_topologie()->get_nb_ccf();
1337     for (int z =0 ; z< nbc; z++)
1338     {
1339     mgtri->get_segment2()->get_lien_topologie()->get_type_ccf(z,nom);
1340     if (strcmp(nom,"EP")==0) continue;
1341     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;
1342     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;
1343     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;
1344     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;
1345     }
1346     nbc = mgtri->get_segment3()->get_lien_topologie()->get_nb_ccf();
1347     for (int z =0 ; z< nbc; z++)
1348     {
1349     mgtri->get_segment3()->get_lien_topologie()->get_type_ccf(z,nom);
1350     if (strcmp(nom,"EP")==0) continue;
1351     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;
1352     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;
1353     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;
1354     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;
1355     }
1356    
1357    
1358     nbc = mgtri->get_lien_topologie()->get_nb_ccf(); // et pour la face elle-m�e
1359     for (int z =0 ; z< nbc; z++)
1360     {
1361     mgtri->get_lien_topologie()->get_type_ccf(z,nom);
1362     if (strcmp(nom,"EP")==0) continue;
1363     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;
1364     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;
1365     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;
1366     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;
1367     }
1368    
1369     }
1370    
1371     } // next face
1372     } // next coquille
1373     mgcoque = mg_geometrie->get_suivant_coque(ico);
1374     }// next coque
1375    
1376    
1377     // **************************
1378     // maintenant les poutres
1379     // **************************
1380    
1381    
1382    
1383     //for (int i = 0 ; i<nb_poutres;i++)
1384     LISTE_MG_POUTRE::iterator it_po;
1385     MG_POUTRE* mgpoutre = mg_geometrie->get_premier_poutre(it_po);
1386     while (mgpoutre)
1387     {
1388     //MG_POUTRE* mgpoutre = mg_geometrie->get_mg_poutre(i);
1389     int nummatac=mgpoutre->get_num_materiau();
1390     if ((nummatac!=nummat)&&(nummatac!=-1))
1391     {
1392     nummat=nummatac;
1393     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1394     }
1395    
1396     for (int j = 0;j<mgpoutre->get_nb_mg_boucle();j++)
1397     {
1398     MG_BOUCLE* mgboucle = mgpoutre->get_mg_boucle(j);
1399    
1400     for (int k = 0 ; k<mgboucle->get_nb_mg_coarete();k++)
1401     {
1402     MG_COARETE* mgcoarete = mgboucle->get_mg_coarete(k);
1403     MG_ARETE* mgarete = mgcoarete->get_arete();
1404    
1405     double IXX = 0;
1406     double IYY = 0;
1407     double Aire = 0;
1408     double x3 = 0;
1409     double y3 = 0;
1410     double z3 = 0;
1411    
1412     for (int k=0;k<mgarete->get_nb_ccf();k++)
1413     {
1414     char nomCCF[3];
1415     mgarete->get_type_ccf(k,nomCCF);
1416     if (strcmp(nomCCF,"As")==0)
1417     Aire = mgarete->get_valeur_ccf(k);
1418     if (strcmp(nomCCF,"IX")==0)
1419     IXX = mgarete->get_valeur_ccf(k);
1420     if (strcmp(nomCCF,"IY")==0)
1421     IYY = mgarete->get_valeur_ccf(k);
1422     if (strcmp(nomCCF,"NX")==0)
1423     x3 = mgarete->get_valeur_ccf(k);
1424     if (strcmp(nomCCF, "NY")==0)
1425     y3 = mgarete->get_valeur_ccf(k);
1426     if (strcmp(nomCCF, "NZ")==0)
1427     z3 = mgarete->get_valeur_ccf(k);
1428     }
1429    
1430     if ( Aire==-7) // -7 est un flag pour diff�rencier les mini-poutres...
1431     { // mini-poutre
1432     of1 << "Actset,EG,5;"<<std::endl;
1433     of1 << "Actset,RC,5;"<<std::endl;
1434     of1 << "C* MINI - POUTRE" << std:: endl;
1435    
1436     for (int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1437     {
1438 francois 309 FEM_ELEMENT1* femseg = (FEM_ELEMENT1*)mgarete->get_lien_fem_maillage()->get(t);
1439 francois 283 of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1440     } // next segment
1441     }
1442     else
1443     { // poutre normale
1444     of1 << "Actset,EG,3;"<<std::endl;
1445     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
1446     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
1447    
1448     for (int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1449     {
1450 francois 309 FEM_ELEMENT1* femseg = (FEM_ELEMENT1*)mgarete->get_lien_fem_maillage()->get(t);
1451 francois 283 if (!contient(femseg)) continue;
1452     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;
1453    
1454     for (int k=0;k<mgarete->get_nb_ccf();k++)
1455     {
1456     char nom[3];
1457     mgarete->get_type_ccf(k,nom);
1458     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;
1459     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;
1460     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;
1461     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!!!
1462     }
1463     } // next segment
1464     }
1465    
1466    
1467     } // next arete
1468     } // next boucle
1469     mgpoutre=mg_geometrie->get_suivant_poutre(it_po);
1470     } // next poutre
1471    
1472     // Cas sp�cial, une ar�te normale est flagg�e comme une mini-poutre (dans coupecot�)
1473     LISTE_MG_ARETE::iterator ita;
1474     MG_ARETE* mgarete = mg_geometrie->get_premier_arete(ita);
1475    
1476     while (mgarete)
1477     {
1478     double Aire = 0;
1479    
1480     for (int k=0;k<mgarete->get_nb_ccf();k++)
1481     {
1482     char nomCCF[3];
1483     mgarete->get_type_ccf(k,nomCCF);
1484     if (strcmp(nomCCF,"As")==0)
1485     Aire = mgarete->get_valeur_ccf(k);
1486     }
1487    
1488     if ( Aire==-7) // -7 est un flag pour diff�rencier les mini-poutres... non orient�e
1489     { // mini-poutre
1490     of1 << "Actset,EG,5;"<<std::endl;
1491     of1 << "Actset,RC,5;"<<std::endl;
1492     of1 << "C* MINI - POUTRE" << std:: endl;
1493    
1494     for (int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
1495     {
1496 francois 309 FEM_ELEMENT1* femseg = (FEM_ELEMENT1*)mgarete->get_lien_fem_maillage()->get(t);
1497 francois 283 if (!contient(femseg)) continue;
1498     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
1499     }
1500     }
1501     mgarete=mg_geometrie->get_suivant_arete(ita);
1502     }
1503    
1504    
1505    
1506     //************************************************************
1507     // Pour mettre des mini-poutres sur les faces concern�es *****
1508     //*************************************************************
1509     // identifications des faces du qui sont des faces internes.
1510    
1511     LISTE_MG_FACE::iterator itf;
1512     MG_FACE* mgface = mg_geometrie->get_premier_face(itf);
1513    
1514    
1515     while (mgface)
1516     {
1517     for (int k=0;k<mgface->get_nb_ccf();k++)
1518     {
1519     char nomCCF[3];
1520     mgface->get_type_ccf(k,nomCCF);
1521    
1522     if (strcmp(nomCCF,"FI")==0)
1523     {
1524     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_fem_maillage = mgface->get_lien_fem_maillage();
1525     FEM_ELEMENT_MAILLAGE* element;
1526    
1527     //si on a une faceinterne de poutre alors on a une CCF "Po" = 0
1528     // sinon la CCF Po est �gale � 1 et on a une coque
1529     int Poutre = -1;
1530    
1531     for (int z=0;z<mgface->get_nb_ccf();z++)
1532     {
1533     char nomCCF2[3];
1534     mgface->get_type_ccf(z,nomCCF);
1535     if (strcmp(nomCCF,"Po")==0)
1536     {
1537     Poutre = mgface->get_valeur_ccf(z);
1538     }
1539     }
1540    
1541    
1542     if (Poutre ==0)
1543     { // mini-poutres pour des poutres
1544     of1 << "ACTSET,EG,5; C* Face avec mini-poutres de POUTRE"<<std::endl;
1545     of1 << "ACTSET,RC,5;"<<std::endl;
1546     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
1547     {
1548 francois 309 FEM_ELEMENT2* femtriangle=(FEM_ELEMENT2*)lien_fem_maillage->get(i) ;
1549 francois 283
1550     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
1551     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
1552     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
1553    
1554     // 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 ;
1555     //si on veut orienter les propri�t�s,
1556     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
1557     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1558     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1559     }
1560     }
1561     else if (Poutre==1)
1562     { // mini-poutres pour des coques
1563     of1 << "ACTSET,EG,6; C* Face avec mini-poutres de COQUE"<<std::endl;
1564     of1 << "ACTSET,RC,6;"<<std::endl;
1565     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
1566     {
1567 francois 309 FEM_ELEMENT2* femtriangle=(FEM_ELEMENT2*)lien_fem_maillage->get(i) ;
1568 francois 283
1569     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
1570     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
1571     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
1572    
1573     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
1574     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd1->get_numero()<< "," << nd2->get_numero()<< "," << nd0->get_numero()<< ";" << std::endl;
1575     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd2->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
1576     }
1577     }
1578     } // end if FI
1579     } // next CCF
1580     mgface= mg_geometrie->get_suivant_face(itf);
1581     } // end while face
1582    
1583    
1584    
1585     //of1<< "NMERGE;" <<std::endl;
1586     //of1<< "NCOMPRESS;" <<std::endl;
1587    
1588     //of1<< "SETEPLOT,1,1,0,0;"<<std::endl;
1589     //of1<< "ACTECLR,1,RC,1;"<<std::endl;
1590    
1591     of1<< "EPLOT;"<<std::endl;
1592     of1<< "PSCALE;"<<std::endl;
1593     //lst_FaceInternes.vide();
1594    
1595     }
1596    
1597    
1598     double FEM_MAILLAGE::calcul_coef(void)
1599     {
1600     if (!deforme) return 0.;
1601     LISTE_FEM_NOEUD::iterator it;
1602     double max=0.,dmax=0.;
1603     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
1604     {
1605     double x=noeud->get_x();
1606     double y=noeud->get_y();
1607     double z=noeud->get_z();
1608     double dx=noeud->get_dx();
1609     double dy=noeud->get_dy();
1610     double dz=noeud->get_dz();
1611     if (fabs(x)>max) max=fabs(x);
1612     if (fabs(y)>max) max=fabs(y);
1613     if (fabs(z)>max) max=fabs(z);
1614     if (fabs(dx)>dmax) dmax=fabs(dx);
1615     if (fabs(dy)>dmax) dmax=fabs(dy);
1616     if (fabs(dz)>dmax) dmax=fabs(dz);
1617     }
1618     if (dmax<1e-10) return 0;
1619     double coef=0.1*max/dmax;
1620     return coef;
1621     }
1622    
1623    
1624    
1625    
1626     void FEM_MAILLAGE::calcul_deforme(FEM_SOLUTION* solx,int numx,FEM_SOLUTION* soly,int numy,FEM_SOLUTION* solz,int numz)
1627     {
1628     LISTE_FEM_NOEUD::iterator it;
1629     solx->active_solution(numx);
1630     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
1631    
1632     noeud->change_dx(noeud->get_solution()/get_mg_geometrie()->get_valeur_unite());
1633    
1634     soly->active_solution(numy);
1635     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
1636    
1637     noeud->change_dy(noeud->get_solution()/get_mg_geometrie()->get_valeur_unite());
1638    
1639     solz->active_solution(numz);
1640     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
1641    
1642     noeud->change_dz(noeud->get_solution()/get_mg_geometrie()->get_valeur_unite());
1643    
1644     deforme=1;
1645     }
1646    
1647    
1648     int FEM_MAILLAGE::existe_deforme(void)
1649     {
1650     return deforme;
1651     }
1652    
1653     void FEM_MAILLAGE::active_deforme(void)
1654     {
1655     deforme=1;
1656     }
1657    
1658 gervaislavoie 304 void FEM_MAILLAGE::desactive_deforme(void)
1659     {
1660     deforme=0;
1661     }
1662 francois 283
1663 francois 339 int FEM_MAILLAGE::existe_reaction(void)
1664     {
1665     return reaction;
1666     }
1667 francois 283
1668 francois 339 void FEM_MAILLAGE::active_reaction(void)
1669     {
1670     reaction=1;
1671     }
1672    
1673     void FEM_MAILLAGE::desactive_reaction(void)
1674     {
1675     reaction=0;
1676     }
1677    
1678 francois 325 void FEM_MAILLAGE::calcul_somme_reaction(double &rx,double &ry,double &rz)
1679     {
1680     rx=0.;
1681     ry=0.;
1682     rz=0.;
1683     LISTE_FEM_NOEUD::iterator it;
1684     for (FEM_NOEUD* no=get_premier_noeud(it);no!=NULL;no=get_suivant_noeud(it))
1685     {
1686     rx=rx+no->get_rx();
1687     ry=ry+no->get_ry();
1688     rz=rz+no->get_rz();
1689     }
1690     }
1691 francois 283
1692    
1693    
1694    
1695    
1696    
1697    
1698     void FEM_MAILLAGE::optimise_numerotation(void)
1699     {
1700     FEM_NOEUD* noeud=get_fem_noeud(0);
1701     FEM_GRAPH_NOEUD *graph;
1702     graph=new FEM_GRAPH_NOEUD(noeud,this);
1703     int e=graph->get_excentricite();
1704     TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau();
1705     int nbdernierniveau=dernierniveau.get_nb();
1706     for (int i=0;i<nbdernierniveau;i++)
1707     {
1708     FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),this);
1709     int etmp=graphtmp->get_excentricite();
1710     if (etmp>e)
1711     {
1712     delete graph;
1713     graph=graphtmp;
1714     dernierniveau=graph->get_dernier_niveau();
1715     nbdernierniveau=dernierniveau.get_nb();
1716     i=-1;
1717     e=etmp;
1718     }
1719     else delete graphtmp;
1720     }
1721     int numero=get_nb_fem_noeud();
1722     for (int i=0;i<e+1;i++)
1723     {
1724     TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i);
1725     int nbnoeud=niveau.get_nb();
1726     for (int j=0;j<nbnoeud;j++)
1727     {
1728     FEM_NOEUD* noeud=niveau.get(j);
1729     noeud->change_numero_opt(numero);
1730     numero--;
1731     }
1732     }
1733    
1734    
1735     delete graph;
1736     }
1737    
1738     void FEM_MAILLAGE::echange_numerotation(void)
1739     {
1740     int nbnoeud=get_nb_fem_noeud();
1741     for (int i=0;i<nbnoeud;i++)
1742     {
1743     FEM_NOEUD* noeud=get_fem_noeud(i);
1744     int num=noeud->get_numero();
1745     noeud->change_numero(noeud->get_numero_opt());
1746     noeud->change_numero_opt(num);
1747     }
1748    
1749     }
1750    
1751    
1752    
1753    
1754     std::ostream& operator << (std::ostream& o,FEM_MAILLAGE& maillage)
1755     {
1756     maillage.enregistrer(o);
1757     return o;
1758     }
1759    
1760    
1761 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)
1762     {
1763     nb_noeud=get_nb_fem_noeud();
1764     LISTE_FEM_ELEMENT1::iterator it1;
1765     for (FEM_ELEMENT1* ele=get_premier_element1(it1);ele!=NULL;ele=get_suivant_element1(it1))
1766     {
1767     int nb=ele->get_nb_fem_noeud();
1768     if (nb==2) nb_seg2++;
1769     if (nb==3) nb_seg3++;
1770     }
1771     LISTE_FEM_ELEMENT2::iterator it2;
1772     for (FEM_ELEMENT2* ele=get_premier_element2(it2);ele!=NULL;ele=get_suivant_element2(it2))
1773     {
1774     int nb=ele->get_nb_fem_noeud();
1775     if (nb==3) nb_tri3++;
1776     if (nb==4) nb_quad4++;
1777     if (nb==6) nb_tri6++;
1778     if (nb==8) nb_quad8++;
1779     }
1780     LISTE_FEM_ELEMENT3::iterator it3;
1781     for (FEM_ELEMENT3* ele=get_premier_element3(it3);ele!=NULL;ele=get_suivant_element3(it3))
1782     {
1783     int nb=ele->get_nb_fem_noeud();
1784     if (nb==4) nb_tet4++;
1785     if (nb==8) nb_hex8++;
1786     if (nb==10) nb_tet10++;
1787     if (nb==20) nb_hex20++;
1788     }
1789     }
1790 francois 283
1791    
1792    
1793    
1794