ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 380
Committed: Thu Nov 29 15:40:22 2012 UTC (12 years, 5 months ago) by francois
File size: 78191 byte(s)
Log Message:
gestion des entités xfem 1d et 2d 

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