ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/fem_maillage.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months, 1 week ago) by francois
File size: 62622 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

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