ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 1112
Committed: Thu Apr 20 20:14:29 2023 UTC (2 years, 1 month ago) by francois
File size: 65521 byte(s)
Log Message:
reglage du degre des maillage FEM pour les calculs sur des maillages externe à MAGiC

File Contents

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