ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 626
Committed: Tue Jan 6 20:23:47 2015 UTC (10 years, 4 months ago) by francois
File size: 91187 byte(s)
Log Message:
Probleme de relecture des fem_maillage et pb des pointeurs de la mg_geometrie depuis les fem_element. Dans le cas quadratique les noeuds milieux n'ont pas de correcpondant dans le MG.

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�e et Vincent FRANCOIS
5     // D�artement de G�ie M�anique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�artement
8     // de g�ie m�anique de l'Universit�du Qu�ec �
9     // Trois Rivi�es
10     // Les librairies ne peuvent �re utilis�s sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mg_maillage.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 �11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <fstream>
27     #include <iostream>
28     #include <string.h>
29     #include <math.h>
30    
31    
32     #include "fem_maillage.h"
33 francois 310 #include "fem_segment2.h"
34     #include "fem_segment3.h"
35     #include "fem_triangle3.h"
36     #include "fem_triangle6.h"
37     #include "fem_quadrangle4.h"
38     #include "fem_quadrangle8.h"
39     #include "fem_tetra4.h"
40     #include "fem_tetra10.h"
41     #include "fem_hexa8.h"
42     #include "fem_hexa20.h"
43 francois 283 #include "fem_graph_noeud.h"
44     #include "mg_gestionnaire.h"
45 francois 296 #include "mc_gestionnaire.h"
46     #include "mc_propriete.h"
47     #include "mc_materiau.h"
48 francois 283 #include "ot_decalage_parametre.h"
49     #include "tpl_map_entite.h"
50     #include "tpl_liste_entite.h"
51 francois 612 #include "fem_maillage_quadratique_outils.h"
52 francois 283 //#include "message.h"
53    
54    
55    
56 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)
57 francois 283 {
58     }
59    
60 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)
61 francois 283 {
62     }
63    
64     FEM_MAILLAGE::~FEM_MAILLAGE()
65     {
66 francois 378 supprimer_tout_xfem_element3();
67 francois 309 supprimer_tout_fem_element3();
68     supprimer_tout_fem_element2();
69     supprimer_tout_fem_element1();
70 francois 283 supprimer_tout_fem_noeud();
71     }
72    
73     FEM_MAILLAGE* FEM_MAILLAGE::dupliquer(MG_GESTIONNAIRE* gest)
74     {
75     FEM_MAILLAGE* mai=new FEM_MAILLAGE(mg_geometrie,maillage,degre);
76     gest->ajouter_fem_maillage(mai);
77     long decalage=mai->get_id()-this->get_id();
78     LISTE_ENTITE::const_iterator i;
79     for (i=lst_entite.begin();i!=lst_entite.end();i++)
80     {
81     FEM_ELEMENT_MAILLAGE& ele=(FEM_ELEMENT_MAILLAGE&)(*(*i));
82     ele.dupliquer(mai,decalage);
83     }
84     return mai;
85     }
86    
87     MG_GEOMETRIE* FEM_MAILLAGE::get_mg_geometrie(void)
88     {
89     return mg_geometrie;
90     }
91    
92     MG_MAILLAGE* FEM_MAILLAGE::get_mg_maillage(void)
93     {
94     return maillage;
95     }
96    
97     int FEM_MAILLAGE::get_degre(void)
98     {
99     return degre;
100     }
101    
102     bool FEM_MAILLAGE::contient ( MG_IDENTIFICATEUR * id )
103     {
104     return ( lst_entite.find ( id ) != lst_entite.end() );
105     }
106    
107     void FEM_MAILLAGE::change_gestionnaire(MG_GESTIONNAIRE* mggest)
108     {
109     gest=mggest;
110     }
111    
112     // ENTITE FEM_NOEUD
113     FEM_NOEUD* FEM_MAILLAGE::ajouter_fem_noeud(MG_NOEUD* mgnoeud,unsigned long num)
114     {
115     FEM_NOEUD* femnoeud;
116     if (num==0) femnoeud=new FEM_NOEUD(mgnoeud);
117     else femnoeud=new FEM_NOEUD(num,mgnoeud);
118     int resultat = ajouter_fem_noeud(femnoeud);
119     if (resultat==FAIL)
120     {
121     delete femnoeud;
122     return NULL;
123     }
124     return femnoeud;
125     }
126    
127     int FEM_MAILLAGE::ajouter_fem_noeud(FEM_NOEUD *femnoeud)
128     {
129     gest->recherche_bonid(*femnoeud);
130     MG_IDENTIFICATEUR *id=femnoeud;
131     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
132     if (!p.second)
133     {
134     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
135     return FAIL;
136     }
137    
138     std::pair<const unsigned long,FEM_NOEUD*> tmp(femnoeud->get_id(),femnoeud);
139     lst_fem_noeud.insert(tmp);
140     return OK;
141     }
142    
143    
144     FEM_NOEUD* FEM_MAILLAGE::get_fem_noeudid(unsigned long num)
145     {
146     LISTE_FEM_NOEUD::iterator i=lst_fem_noeud.find(num);
147     if (i==lst_fem_noeud.end())
148     {
149     // afficheur << INEXISTE << enderr;
150     return NULL;
151     }
152     return ((*i).second);
153     }
154    
155    
156    
157     FEM_NOEUD* FEM_MAILLAGE::get_fem_noeud(unsigned int num)
158     {
159     if (!(num<lst_fem_noeud.size()))
160     {
161     // afficheur << INEXISTE << enderr;
162     return NULL;
163     }
164     LISTE_FEM_NOEUD::iterator i = lst_fem_noeud.begin();
165     std::advance(i, num);
166    
167     return ((*i).second);
168     }
169    
170     FEM_NOEUD* FEM_MAILLAGE::get_premier_noeud(LISTE_FEM_NOEUD::iterator & it)
171     {
172     it = lst_fem_noeud.begin();
173     if (it == lst_fem_noeud.end())
174     return NULL;
175     return it->second ;
176     }
177    
178     FEM_NOEUD* FEM_MAILLAGE::get_suivant_noeud(LISTE_FEM_NOEUD::iterator & it)
179     {
180     it++;
181     if (it==lst_fem_noeud.end())
182     return NULL;
183     return it->second;
184     }
185    
186     unsigned int FEM_MAILLAGE::get_nb_fem_noeud(void)
187     {
188     return lst_fem_noeud.size();
189     }
190    
191    
192     int FEM_MAILLAGE::supprimer_fem_noeudid(unsigned long num)
193     {
194     FEM_NOEUD* femnoeud=get_fem_noeudid(num);
195     if (femnoeud==NULL)
196     {
197     // afficheur << INEXISTE2 << enderr;
198     return FAIL;
199     }
200     MG_IDENTIFICATEUR* id=femnoeud;
201     LISTE_ENTITE::iterator i=lst_entite.find(id);
202     lst_entite.erase(i);
203     LISTE_FEM_NOEUD::iterator j=lst_fem_noeud.find(num);
204     lst_fem_noeud.erase(j);
205     delete femnoeud;
206     return OK;
207     }
208    
209    
210     int FEM_MAILLAGE::supprimer_fem_noeud(unsigned int num)
211     {
212     FEM_NOEUD* femnoeud=get_fem_noeud(num);
213     if (femnoeud==NULL)
214     {
215     // afficheur << INEXISTE2 << enderr;
216     return FAIL;
217     }
218     MG_IDENTIFICATEUR* id=femnoeud;
219     LISTE_ENTITE::iterator i=lst_entite.find(id);
220     lst_entite.erase(i);
221     LISTE_FEM_NOEUD::iterator j=lst_fem_noeud.begin();
222     for (unsigned int k=0;k<num;k++) j++;
223     lst_fem_noeud.erase(j);
224     delete femnoeud;
225     return OK;
226     }
227    
228    
229     void FEM_MAILLAGE::supprimer_tout_fem_noeud(void)
230     {
231     while (get_nb_fem_noeud()!=0)
232     {
233     LISTE_FEM_NOEUD::iterator j=lst_fem_noeud.begin();
234     FEM_NOEUD* femnoeud=(*j).second;
235     MG_IDENTIFICATEUR* id=femnoeud;
236     LISTE_ENTITE::iterator i=lst_entite.find(id);
237     lst_entite.erase(i);
238     lst_fem_noeud.erase(j);
239     delete femnoeud;
240     }
241     }
242 francois 399 // ENTITE FEM_ELEMENT0
243 francois 283
244    
245 francois 399 int FEM_MAILLAGE::ajouter_fem_element0(FEM_ELEMENT0 *femnoeud)
246     {
247     gest->recherche_bonid(*femnoeud);
248     MG_IDENTIFICATEUR *id=femnoeud;
249     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
250     if (!p.second)
251     {
252     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
253     return FAIL;
254     }
255    
256     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     // afficheur << INEXISTE << enderr;
267     return NULL;
268     }
269     return ((*i).second);
270     }
271    
272     unsigned int FEM_MAILLAGE::get_nb_fem_element0(void)
273     {
274     return lst_fem_element0.size();
275     }
276    
277    
278    
279     FEM_ELEMENT0* FEM_MAILLAGE::get_fem_element0(unsigned int num)
280     {
281     if (!(num<lst_fem_element0.size()))
282     {
283     // afficheur << INEXISTE << enderr;
284     return NULL;
285     }
286     LISTE_FEM_ELEMENT0::iterator i=lst_fem_element0.begin();
287     for (unsigned long j=0;j<num;j++) i++;
288     return ((*i).second);
289     }
290    
291    
292    
293     int FEM_MAILLAGE::supprimer_fem_element0id(unsigned long num)
294     {
295     FEM_ELEMENT0* fem=get_fem_element0id(num);
296     if (fem==NULL)
297     {
298     // afficheur << INEXISTE2 << enderr;
299     return FAIL;
300     }
301     MG_IDENTIFICATEUR* id=fem;
302     LISTE_ENTITE::iterator i=lst_entite.find(id);
303     lst_entite.erase(i);
304     LISTE_FEM_ELEMENT0::iterator j=lst_fem_element0.find(num);
305     lst_fem_element0.erase(j);
306     delete fem;
307     return OK;
308     }
309    
310     int FEM_MAILLAGE::supprimer_fem_element0(unsigned int num)
311     {
312     FEM_ELEMENT0* fem=get_fem_element0(num);
313     if (fem==NULL)
314     {
315     // afficheur << INEXISTE2 << enderr;
316     return FAIL;
317     }
318     MG_IDENTIFICATEUR* id=fem;
319     LISTE_ENTITE::iterator i=lst_entite.find(id);
320     lst_entite.erase(i);
321     LISTE_FEM_ELEMENT0::iterator j=lst_fem_element0.find(num);
322     lst_fem_element0.erase(j);
323     delete fem;
324     return OK;
325     }
326    
327     void FEM_MAILLAGE::supprimer_tout_fem_element0(void)
328     {
329     while (get_nb_fem_element0()!=0)
330     {
331     LISTE_FEM_ELEMENT0::iterator j=lst_fem_element0.begin();
332     FEM_ELEMENT0* fem=(*j).second;
333     MG_IDENTIFICATEUR* id=fem;
334     LISTE_ENTITE::iterator i=lst_entite.find(id);
335     lst_entite.erase(i);
336     lst_fem_element0.erase(j);
337     delete fem;
338     }
339     }
340    
341    
342     FEM_ELEMENT0* FEM_MAILLAGE::get_premier_element0(LISTE_FEM_ELEMENT0::iterator & it)
343     {
344     it = lst_fem_element0.begin();
345     if (it == lst_fem_element0.end())
346     return NULL;
347     return it->second ;
348     }
349    
350     FEM_ELEMENT0* FEM_MAILLAGE::get_suivant_element0(LISTE_FEM_ELEMENT0::iterator & it)
351     {
352     it++;
353     if (it==lst_fem_element0.end())
354     return NULL;
355     return it->second;
356     }
357    
358    
359 francois 309 // ENTITE FEM_ELEMENT1
360 francois 283
361    
362 francois 309 int FEM_MAILLAGE::ajouter_fem_element1(FEM_ELEMENT1 *femsegment)
363 francois 283 {
364     gest->recherche_bonid(*femsegment);
365     MG_IDENTIFICATEUR *id=femsegment;
366     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
367     if (!p.second)
368     {
369     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
370     return FAIL;
371     }
372    
373 francois 309 std::pair<const unsigned long,FEM_ELEMENT1*> tmp(femsegment->get_id(),femsegment);
374     lst_fem_element1.insert(tmp);
375 francois 283 return OK;
376     }
377    
378 francois 309 FEM_ELEMENT1* FEM_MAILLAGE::get_fem_element1id(unsigned long num)
379 francois 283 {
380 francois 309 LISTE_FEM_ELEMENT1::iterator i=lst_fem_element1.find(num);
381     if (i==lst_fem_element1.end())
382 francois 283 {
383     // afficheur << INEXISTE << enderr;
384     return NULL;
385     }
386     return ((*i).second);
387     }
388    
389 francois 309 unsigned int FEM_MAILLAGE::get_nb_fem_element1(void)
390 francois 283 {
391 francois 309 return lst_fem_element1.size();
392 francois 283 }
393    
394    
395    
396 francois 309 FEM_ELEMENT1* FEM_MAILLAGE::get_fem_element1(unsigned int num)
397 francois 283 {
398 francois 309 if (!(num<lst_fem_element1.size()))
399 francois 283 {
400     // afficheur << INEXISTE << enderr;
401     return NULL;
402     }
403 francois 309 LISTE_FEM_ELEMENT1::iterator i=lst_fem_element1.begin();
404 francois 283 for (unsigned long j=0;j<num;j++) i++;
405     return ((*i).second);
406     }
407    
408    
409    
410 francois 309 int FEM_MAILLAGE::supprimer_fem_element1id(unsigned long num)
411 francois 283 {
412 francois 309 FEM_ELEMENT1* femsegment=get_fem_element1id(num);
413 francois 283 if (femsegment==NULL)
414     {
415     // afficheur << INEXISTE2 << enderr;
416     return FAIL;
417     }
418     MG_IDENTIFICATEUR* id=femsegment;
419     LISTE_ENTITE::iterator i=lst_entite.find(id);
420     lst_entite.erase(i);
421 francois 309 LISTE_FEM_ELEMENT1::iterator j=lst_fem_element1.find(num);
422     lst_fem_element1.erase(j);
423 francois 283 delete femsegment;
424     return OK;
425     }
426    
427 francois 309 int FEM_MAILLAGE::supprimer_fem_element1(unsigned int num)
428 francois 283 {
429 francois 309 FEM_ELEMENT1* femsegment=get_fem_element1(num);
430 francois 283 if (femsegment==NULL)
431     {
432     // afficheur << INEXISTE2 << enderr;
433     return FAIL;
434     }
435     MG_IDENTIFICATEUR* id=femsegment;
436     LISTE_ENTITE::iterator i=lst_entite.find(id);
437     lst_entite.erase(i);
438 francois 309 LISTE_FEM_ELEMENT1::iterator j=lst_fem_element1.find(num);
439     lst_fem_element1.erase(j);
440 francois 283 delete femsegment;
441     return OK;
442     }
443    
444 francois 309 void FEM_MAILLAGE::supprimer_tout_fem_element1(void)
445 francois 283 {
446 francois 309 while (get_nb_fem_element1()!=0)
447 francois 283 {
448 francois 309 LISTE_FEM_ELEMENT1::iterator j=lst_fem_element1.begin();
449     FEM_ELEMENT1* femsegment=(*j).second;
450 francois 283 MG_IDENTIFICATEUR* id=femsegment;
451     LISTE_ENTITE::iterator i=lst_entite.find(id);
452     lst_entite.erase(i);
453 francois 309 lst_fem_element1.erase(j);
454 francois 283 delete femsegment;
455     }
456     }
457    
458    
459 francois 309 FEM_ELEMENT1* FEM_MAILLAGE::get_premier_element1(LISTE_FEM_ELEMENT1::iterator & it)
460 francois 283 {
461 francois 309 it = lst_fem_element1.begin();
462     if (it == lst_fem_element1.end())
463 francois 283 return NULL;
464     return it->second ;
465     }
466    
467 francois 309 FEM_ELEMENT1* FEM_MAILLAGE::get_suivant_element1(LISTE_FEM_ELEMENT1::iterator & it)
468 francois 283 {
469     it++;
470 francois 309 if (it==lst_fem_element1.end())
471 francois 283 return NULL;
472     return it->second;
473     }
474    
475    
476    
477 francois 309 // ENTITE FEM_ELEMENT2
478 francois 283
479    
480 francois 309 int FEM_MAILLAGE::ajouter_fem_element2(FEM_ELEMENT2 *femtriangle)
481 francois 283 {
482     gest->recherche_bonid(*femtriangle);
483     MG_IDENTIFICATEUR *id=femtriangle;
484     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
485     if (!p.second)
486     {
487     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
488     return FAIL;
489     }
490    
491 francois 309 std::pair<const unsigned long,FEM_ELEMENT2*> tmp(femtriangle->get_id(),femtriangle);
492     lst_fem_element2.insert(tmp);
493 francois 283 return OK;
494     }
495    
496 francois 309 FEM_ELEMENT2* FEM_MAILLAGE::get_fem_element2id(unsigned long num)
497 francois 283 {
498 francois 309 LISTE_FEM_ELEMENT2::iterator i=lst_fem_element2.find(num);
499     if (i==lst_fem_element2.end())
500 francois 283 {
501     // afficheur << INEXISTE << enderr;
502     return NULL;
503     }
504     return ((*i).second);
505     }
506    
507 francois 309 unsigned int FEM_MAILLAGE::get_nb_fem_element2(void)
508 francois 283 {
509 francois 309 return lst_fem_element2.size();
510 francois 283 }
511    
512    
513    
514 francois 309 FEM_ELEMENT2* FEM_MAILLAGE::get_fem_element2(unsigned int num)
515 francois 283 {
516 francois 309 if (!(num<lst_fem_element2.size()))
517 francois 283 {
518     // afficheur << INEXISTE << enderr;
519     return NULL;
520     }
521 francois 309 LISTE_FEM_ELEMENT2::iterator i=lst_fem_element2.begin();
522 francois 283 for (unsigned long j=0;j<num;j++) i++;
523     return ((*i).second);
524     }
525    
526    
527    
528 francois 309 int FEM_MAILLAGE::supprimer_fem_element2id(unsigned long num)
529 francois 283 {
530 francois 309 FEM_ELEMENT2* femtriangle=get_fem_element2id(num);
531 francois 283 if (femtriangle==NULL)
532     {
533     // afficheur << INEXISTE2 << enderr;
534     return FAIL;
535     }
536     MG_IDENTIFICATEUR* id=femtriangle;
537     LISTE_ENTITE::iterator i=lst_entite.find(id);
538     lst_entite.erase(i);
539 francois 309 LISTE_FEM_ELEMENT2::iterator j=lst_fem_element2.find(num);
540     lst_fem_element2.erase(j);
541 francois 283 delete femtriangle;
542     return OK;
543     }
544    
545 francois 309 int FEM_MAILLAGE::supprimer_fem_element2(unsigned int num)
546 francois 283 {
547 francois 309 FEM_ELEMENT2* femtriangle=get_fem_element2(num);
548 francois 283 if (femtriangle==NULL)
549     {
550     // afficheur << INEXISTE2 << enderr;
551     return FAIL;
552     }
553     MG_IDENTIFICATEUR* id=femtriangle;
554     LISTE_ENTITE::iterator i=lst_entite.find(id);
555     lst_entite.erase(i);
556 francois 309 LISTE_FEM_ELEMENT2::iterator j=lst_fem_element2.find(num);
557     lst_fem_element2.erase(j);
558 francois 283 delete femtriangle;
559     return OK;
560     }
561    
562 francois 309 void FEM_MAILLAGE::supprimer_tout_fem_element2(void)
563 francois 283 {
564 francois 309 while (get_nb_fem_element2()!=0)
565 francois 283 {
566 francois 309 LISTE_FEM_ELEMENT2::iterator j=lst_fem_element2.begin();
567     FEM_ELEMENT2* femtriangle=(*j).second;
568 francois 283 MG_IDENTIFICATEUR* id=femtriangle;
569     LISTE_ENTITE::iterator i=lst_entite.find(id);
570     lst_entite.erase(i);
571 francois 309 lst_fem_element2.erase(j);
572 francois 283 delete femtriangle;
573     }
574     }
575    
576    
577 francois 309 FEM_ELEMENT2* FEM_MAILLAGE::get_premier_element2(LISTE_FEM_ELEMENT2::iterator & it)
578 francois 283 {
579 francois 309 it = lst_fem_element2.begin();
580     if (it == lst_fem_element2.end())
581 francois 283 return NULL;
582     return it->second ;
583     }
584    
585 francois 309 FEM_ELEMENT2* FEM_MAILLAGE::get_suivant_element2(LISTE_FEM_ELEMENT2::iterator & it)
586 francois 283 {
587     it++;
588 francois 309 if (it==lst_fem_element2.end())
589 francois 283 return NULL;
590     return it->second;
591     }
592    
593    
594     // ENTITE FEM_TETRA
595    
596    
597 francois 309 int FEM_MAILLAGE::ajouter_fem_element3(FEM_ELEMENT3 *femele)
598 francois 283 {
599 francois 309 gest->recherche_bonid(*femele);
600     MG_IDENTIFICATEUR *id=femele;
601 francois 283 std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
602     if (!p.second)
603     {
604     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
605     return FAIL;
606     }
607    
608 francois 309 std::pair<const unsigned long,FEM_ELEMENT3*> tmp(femele->get_id(),femele);
609     lst_fem_element3.insert(tmp);
610 francois 283 return OK;
611     }
612    
613 francois 309 FEM_ELEMENT3* FEM_MAILLAGE::get_fem_element3id(unsigned long num)
614 francois 283 {
615 francois 309 LISTE_FEM_ELEMENT3::iterator i=lst_fem_element3.find(num);
616     if (i==lst_fem_element3.end())
617 francois 283 {
618     // afficheur << INEXISTE << enderr;
619     return NULL;
620     }
621     return ((*i).second);
622     }
623    
624 francois 309 unsigned int FEM_MAILLAGE::get_nb_fem_element3(void)
625 francois 283 {
626 francois 309 return lst_fem_element3.size();
627 francois 283 }
628    
629    
630    
631 francois 309 FEM_ELEMENT3* FEM_MAILLAGE::get_fem_element3(unsigned int num)
632 francois 283 {
633 francois 309 if (!(num<lst_fem_element3.size()))
634 francois 283 {
635     // afficheur << INEXISTE << enderr;
636     return NULL;
637     }
638 francois 309 LISTE_FEM_ELEMENT3::iterator i=lst_fem_element3.begin();
639 francois 283 for (unsigned long j=0;j<num;j++) i++;
640     return ((*i).second);
641     }
642    
643    
644    
645 francois 309 int FEM_MAILLAGE::supprimer_fem_element3id(unsigned long num)
646 francois 283 {
647 francois 309 FEM_ELEMENT3* femele=get_fem_element3id(num);
648     if (femele==NULL)
649 francois 283 {
650     // afficheur << INEXISTE2 << enderr;
651     return FAIL;
652     }
653 francois 309 MG_IDENTIFICATEUR* id=femele;
654 francois 283 LISTE_ENTITE::iterator i=lst_entite.find(id);
655     lst_entite.erase(i);
656 francois 309 LISTE_FEM_ELEMENT3::iterator j=lst_fem_element3.find(num);
657     lst_fem_element3.erase(j);
658     delete femele;
659 francois 283 return OK;
660     }
661    
662 francois 309 int FEM_MAILLAGE::supprimer_fem_element3(unsigned int num)
663 francois 283 {
664 francois 309 FEM_ELEMENT3* femele=get_fem_element3(num);
665     if (femele==NULL)
666 francois 283 {
667     // afficheur << INEXISTE2 << enderr;
668     return FAIL;
669     }
670 francois 309 MG_IDENTIFICATEUR* id=femele;
671 francois 283 LISTE_ENTITE::iterator i=lst_entite.find(id);
672     lst_entite.erase(i);
673 francois 309 LISTE_FEM_ELEMENT3::iterator j=lst_fem_element3.find(num);
674     lst_fem_element3.erase(j);
675     delete femele;
676 francois 283 return OK;
677     }
678    
679 francois 309 void FEM_MAILLAGE::supprimer_tout_fem_element3(void)
680 francois 283 {
681 francois 309 while (get_nb_fem_element3()!=0)
682 francois 283 {
683 francois 309 LISTE_FEM_ELEMENT3::iterator j=lst_fem_element3.begin();
684     FEM_ELEMENT3* femele=(*j).second;
685     MG_IDENTIFICATEUR* id=femele;
686 francois 283 LISTE_ENTITE::iterator i=lst_entite.find(id);
687     lst_entite.erase(i);
688 francois 309 lst_fem_element3.erase(j);
689     delete femele;
690 francois 283 }
691     }
692    
693    
694 francois 309 FEM_ELEMENT3* FEM_MAILLAGE::get_premier_element3(LISTE_FEM_ELEMENT3::iterator & it)
695 francois 283 {
696 francois 309 it = lst_fem_element3.begin();
697     if (it == lst_fem_element3.end())
698 francois 283 return NULL;
699     return it->second ;
700     }
701    
702 francois 309 FEM_ELEMENT3* FEM_MAILLAGE::get_suivant_element3(LISTE_FEM_ELEMENT3::iterator & it)
703 francois 283 {
704     it++;
705 francois 309 if (it==lst_fem_element3.end())
706 francois 283 return NULL;
707     return it->second;
708     }
709    
710 francois 399 // ENTITE XFEM_ELEMENT0
711    
712    
713     int FEM_MAILLAGE::ajouter_xfem_element0(XFEM_ELEMENT0 *femele)
714     {
715     gest->recherche_bonid(*femele);
716     MG_IDENTIFICATEUR *id=femele;
717     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
718     if (!p.second)
719     {
720     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
721     return FAIL;
722     }
723    
724     std::pair<const unsigned long,XFEM_ELEMENT0*> tmp(femele->get_id(),femele);
725     lst_xfem_element0.insert(tmp);
726     return OK;
727     }
728    
729     XFEM_ELEMENT0* FEM_MAILLAGE::get_xfem_element0id(unsigned long num)
730     {
731     LISTE_XFEM_ELEMENT0::iterator i=lst_xfem_element0.find(num);
732     if (i==lst_xfem_element0.end())
733     {
734     // afficheur << INEXISTE << enderr;
735     return NULL;
736     }
737     return ((*i).second);
738     }
739    
740     unsigned int FEM_MAILLAGE::get_nb_xfem_element0(void)
741     {
742     return lst_xfem_element0.size();
743     }
744    
745    
746    
747     XFEM_ELEMENT0* FEM_MAILLAGE::get_xfem_element0(unsigned int num)
748     {
749     if (!(num<lst_xfem_element0.size()))
750     {
751     // afficheur << INEXISTE << enderr;
752     return NULL;
753     }
754     LISTE_XFEM_ELEMENT0::iterator i=lst_xfem_element0.begin();
755     for (unsigned long j=0;j<num;j++) i++;
756     return ((*i).second);
757     }
758    
759    
760    
761     int FEM_MAILLAGE::supprimer_xfem_element0id(unsigned long num)
762     {
763     XFEM_ELEMENT0* femele=get_xfem_element0id(num);
764     if (femele==NULL)
765     {
766     // afficheur << INEXISTE2 << enderr;
767     return FAIL;
768     }
769     MG_IDENTIFICATEUR* id=femele;
770     LISTE_ENTITE::iterator i=lst_entite.find(id);
771     lst_entite.erase(i);
772     LISTE_XFEM_ELEMENT0::iterator j=lst_xfem_element0.find(num);
773     lst_xfem_element0.erase(j);
774     delete femele;
775     return OK;
776     }
777    
778     int FEM_MAILLAGE::supprimer_xfem_element0(unsigned int num)
779     {
780     XFEM_ELEMENT0* femele=get_xfem_element0(num);
781     if (femele==NULL)
782     {
783     // afficheur << INEXISTE2 << enderr;
784     return FAIL;
785     }
786     MG_IDENTIFICATEUR* id=femele;
787     LISTE_ENTITE::iterator i=lst_entite.find(id);
788     lst_entite.erase(i);
789     LISTE_XFEM_ELEMENT0::iterator j=lst_xfem_element0.find(num);
790     lst_xfem_element0.erase(j);
791     delete femele;
792     return OK;
793     }
794    
795     void FEM_MAILLAGE::supprimer_tout_xfem_element0(void)
796     {
797     while (get_nb_xfem_element0()!=0)
798     {
799     LISTE_XFEM_ELEMENT0::iterator j=lst_xfem_element0.begin();
800     XFEM_ELEMENT0* femele=(*j).second;
801     MG_IDENTIFICATEUR* id=femele;
802     LISTE_ENTITE::iterator i=lst_entite.find(id);
803     lst_entite.erase(i);
804     lst_xfem_element0.erase(j);
805     delete femele;
806     }
807     }
808    
809    
810     XFEM_ELEMENT0* FEM_MAILLAGE::get_premier_xelement0(LISTE_XFEM_ELEMENT0::iterator & it)
811     {
812     it = lst_xfem_element0.begin();
813     if (it == lst_xfem_element0.end())
814     return NULL;
815     return it->second ;
816     }
817    
818     XFEM_ELEMENT0* FEM_MAILLAGE::get_suivant_xelement0(LISTE_XFEM_ELEMENT0::iterator & it)
819     {
820     it++;
821     if (it==lst_xfem_element0.end())
822     return NULL;
823     return it->second;
824     }
825    
826    
827 francois 380 // ENTITE XFEM_ELEMENT1
828 francois 283
829 francois 380
830     int FEM_MAILLAGE::ajouter_xfem_element1(XFEM_ELEMENT1 *femele)
831     {
832     gest->recherche_bonid(*femele);
833     MG_IDENTIFICATEUR *id=femele;
834     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
835     if (!p.second)
836     {
837     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
838     return FAIL;
839     }
840    
841     std::pair<const unsigned long,XFEM_ELEMENT1*> tmp(femele->get_id(),femele);
842     lst_xfem_element1.insert(tmp);
843     return OK;
844     }
845    
846     XFEM_ELEMENT1* FEM_MAILLAGE::get_xfem_element1id(unsigned long num)
847     {
848     LISTE_XFEM_ELEMENT1::iterator i=lst_xfem_element1.find(num);
849     if (i==lst_xfem_element1.end())
850     {
851     // afficheur << INEXISTE << enderr;
852     return NULL;
853     }
854     return ((*i).second);
855     }
856    
857     unsigned int FEM_MAILLAGE::get_nb_xfem_element1(void)
858     {
859     return lst_xfem_element1.size();
860     }
861    
862    
863    
864     XFEM_ELEMENT1* FEM_MAILLAGE::get_xfem_element1(unsigned int num)
865     {
866     if (!(num<lst_xfem_element1.size()))
867     {
868     // afficheur << INEXISTE << enderr;
869     return NULL;
870     }
871     LISTE_XFEM_ELEMENT1::iterator i=lst_xfem_element1.begin();
872     for (unsigned long j=0;j<num;j++) i++;
873     return ((*i).second);
874     }
875    
876    
877    
878     int FEM_MAILLAGE::supprimer_xfem_element1id(unsigned long num)
879     {
880     XFEM_ELEMENT1* femele=get_xfem_element1id(num);
881     if (femele==NULL)
882     {
883     // afficheur << INEXISTE2 << enderr;
884     return FAIL;
885     }
886     MG_IDENTIFICATEUR* id=femele;
887     LISTE_ENTITE::iterator i=lst_entite.find(id);
888     lst_entite.erase(i);
889     LISTE_XFEM_ELEMENT1::iterator j=lst_xfem_element1.find(num);
890     lst_xfem_element1.erase(j);
891     delete femele;
892     return OK;
893     }
894    
895     int FEM_MAILLAGE::supprimer_xfem_element1(unsigned int num)
896     {
897     XFEM_ELEMENT1* femele=get_xfem_element1(num);
898     if (femele==NULL)
899     {
900     // afficheur << INEXISTE2 << enderr;
901     return FAIL;
902     }
903     MG_IDENTIFICATEUR* id=femele;
904     LISTE_ENTITE::iterator i=lst_entite.find(id);
905     lst_entite.erase(i);
906     LISTE_XFEM_ELEMENT1::iterator j=lst_xfem_element1.find(num);
907     lst_xfem_element1.erase(j);
908     delete femele;
909     return OK;
910     }
911    
912     void FEM_MAILLAGE::supprimer_tout_xfem_element1(void)
913     {
914     while (get_nb_xfem_element1()!=0)
915     {
916     LISTE_XFEM_ELEMENT1::iterator j=lst_xfem_element1.begin();
917     XFEM_ELEMENT1* femele=(*j).second;
918     MG_IDENTIFICATEUR* id=femele;
919     LISTE_ENTITE::iterator i=lst_entite.find(id);
920     lst_entite.erase(i);
921     lst_xfem_element1.erase(j);
922     delete femele;
923     }
924     }
925    
926    
927     XFEM_ELEMENT1* FEM_MAILLAGE::get_premier_xelement1(LISTE_XFEM_ELEMENT1::iterator & it)
928     {
929     it = lst_xfem_element1.begin();
930     if (it == lst_xfem_element1.end())
931     return NULL;
932     return it->second ;
933     }
934    
935     XFEM_ELEMENT1* FEM_MAILLAGE::get_suivant_xelement1(LISTE_XFEM_ELEMENT1::iterator & it)
936     {
937     it++;
938     if (it==lst_xfem_element1.end())
939     return NULL;
940     return it->second;
941     }
942    
943    
944    
945     // ENTITE XFEM_ELEMENT2
946    
947    
948     int FEM_MAILLAGE::ajouter_xfem_element2(XFEM_ELEMENT2 *femele)
949     {
950     gest->recherche_bonid(*femele);
951     MG_IDENTIFICATEUR *id=femele;
952     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
953     if (!p.second)
954     {
955     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
956     return FAIL;
957     }
958    
959     std::pair<const unsigned long,XFEM_ELEMENT2*> tmp(femele->get_id(),femele);
960     lst_xfem_element2.insert(tmp);
961     return OK;
962     }
963    
964     XFEM_ELEMENT2* FEM_MAILLAGE::get_xfem_element2id(unsigned long num)
965     {
966     LISTE_XFEM_ELEMENT2::iterator i=lst_xfem_element2.find(num);
967     if (i==lst_xfem_element2.end())
968     {
969     // afficheur << INEXISTE << enderr;
970     return NULL;
971     }
972     return ((*i).second);
973     }
974    
975     unsigned int FEM_MAILLAGE::get_nb_xfem_element2(void)
976     {
977     return lst_xfem_element2.size();
978     }
979    
980    
981    
982     XFEM_ELEMENT2* FEM_MAILLAGE::get_xfem_element2(unsigned int num)
983     {
984     if (!(num<lst_xfem_element2.size()))
985     {
986     // afficheur << INEXISTE << enderr;
987     return NULL;
988     }
989     LISTE_XFEM_ELEMENT2::iterator i=lst_xfem_element2.begin();
990     for (unsigned long j=0;j<num;j++) i++;
991     return ((*i).second);
992     }
993    
994    
995    
996     int FEM_MAILLAGE::supprimer_xfem_element2id(unsigned long num)
997     {
998     XFEM_ELEMENT2* femele=get_xfem_element2id(num);
999     if (femele==NULL)
1000     {
1001     // afficheur << INEXISTE2 << enderr;
1002     return FAIL;
1003     }
1004     MG_IDENTIFICATEUR* id=femele;
1005     LISTE_ENTITE::iterator i=lst_entite.find(id);
1006     lst_entite.erase(i);
1007     LISTE_XFEM_ELEMENT2::iterator j=lst_xfem_element2.find(num);
1008     lst_xfem_element2.erase(j);
1009     delete femele;
1010     return OK;
1011     }
1012    
1013     int FEM_MAILLAGE::supprimer_xfem_element2(unsigned int num)
1014     {
1015     XFEM_ELEMENT2* femele=get_xfem_element2(num);
1016     if (femele==NULL)
1017     {
1018     // afficheur << INEXISTE2 << enderr;
1019     return FAIL;
1020     }
1021     MG_IDENTIFICATEUR* id=femele;
1022     LISTE_ENTITE::iterator i=lst_entite.find(id);
1023     lst_entite.erase(i);
1024     LISTE_XFEM_ELEMENT2::iterator j=lst_xfem_element2.find(num);
1025     lst_xfem_element2.erase(j);
1026     delete femele;
1027     return OK;
1028     }
1029    
1030     void FEM_MAILLAGE::supprimer_tout_xfem_element2(void)
1031     {
1032     while (get_nb_xfem_element2()!=0)
1033     {
1034     LISTE_XFEM_ELEMENT2::iterator j=lst_xfem_element2.begin();
1035     XFEM_ELEMENT2* femele=(*j).second;
1036     MG_IDENTIFICATEUR* id=femele;
1037     LISTE_ENTITE::iterator i=lst_entite.find(id);
1038     lst_entite.erase(i);
1039     lst_xfem_element2.erase(j);
1040     delete femele;
1041     }
1042     }
1043    
1044    
1045     XFEM_ELEMENT2* FEM_MAILLAGE::get_premier_xelement2(LISTE_XFEM_ELEMENT2::iterator & it)
1046     {
1047     it = lst_xfem_element2.begin();
1048     if (it == lst_xfem_element2.end())
1049     return NULL;
1050     return it->second ;
1051     }
1052    
1053     XFEM_ELEMENT2* FEM_MAILLAGE::get_suivant_xelement2(LISTE_XFEM_ELEMENT2::iterator & it)
1054     {
1055     it++;
1056     if (it==lst_xfem_element2.end())
1057     return NULL;
1058     return it->second;
1059     }
1060    
1061    
1062    
1063 francois 339 // ENTITE XFEM_ELEMENT3
1064 francois 283
1065    
1066 francois 339 int FEM_MAILLAGE::ajouter_xfem_element3(XFEM_ELEMENT3 *femele)
1067     {
1068     gest->recherche_bonid(*femele);
1069     MG_IDENTIFICATEUR *id=femele;
1070     std::pair<LISTE_ENTITE::iterator,bool> p=lst_entite.insert(id);
1071     if (!p.second)
1072     {
1073     // afficheur << ENTITEID << id->get_id() << DUPLIQUE << enderr;
1074     return FAIL;
1075     }
1076 francois 283
1077 francois 339 std::pair<const unsigned long,XFEM_ELEMENT3*> tmp(femele->get_id(),femele);
1078     lst_xfem_element3.insert(tmp);
1079     return OK;
1080     }
1081 francois 283
1082 francois 339 XFEM_ELEMENT3* FEM_MAILLAGE::get_xfem_element3id(unsigned long num)
1083     {
1084     LISTE_XFEM_ELEMENT3::iterator i=lst_xfem_element3.find(num);
1085     if (i==lst_xfem_element3.end())
1086     {
1087     // afficheur << INEXISTE << enderr;
1088     return NULL;
1089     }
1090     return ((*i).second);
1091     }
1092    
1093     unsigned int FEM_MAILLAGE::get_nb_xfem_element3(void)
1094     {
1095     return lst_xfem_element3.size();
1096     }
1097    
1098    
1099    
1100     XFEM_ELEMENT3* FEM_MAILLAGE::get_xfem_element3(unsigned int num)
1101     {
1102     if (!(num<lst_xfem_element3.size()))
1103     {
1104     // afficheur << INEXISTE << enderr;
1105     return NULL;
1106     }
1107     LISTE_XFEM_ELEMENT3::iterator i=lst_xfem_element3.begin();
1108     for (unsigned long j=0;j<num;j++) i++;
1109     return ((*i).second);
1110     }
1111    
1112    
1113    
1114     int FEM_MAILLAGE::supprimer_xfem_element3id(unsigned long num)
1115     {
1116     XFEM_ELEMENT3* femele=get_xfem_element3id(num);
1117     if (femele==NULL)
1118     {
1119     // afficheur << INEXISTE2 << enderr;
1120     return FAIL;
1121     }
1122     MG_IDENTIFICATEUR* id=femele;
1123     LISTE_ENTITE::iterator i=lst_entite.find(id);
1124     lst_entite.erase(i);
1125     LISTE_XFEM_ELEMENT3::iterator j=lst_xfem_element3.find(num);
1126     lst_xfem_element3.erase(j);
1127     delete femele;
1128     return OK;
1129     }
1130    
1131     int FEM_MAILLAGE::supprimer_xfem_element3(unsigned int num)
1132     {
1133     XFEM_ELEMENT3* femele=get_xfem_element3(num);
1134     if (femele==NULL)
1135     {
1136     // afficheur << INEXISTE2 << enderr;
1137     return FAIL;
1138     }
1139     MG_IDENTIFICATEUR* id=femele;
1140     LISTE_ENTITE::iterator i=lst_entite.find(id);
1141     lst_entite.erase(i);
1142     LISTE_XFEM_ELEMENT3::iterator j=lst_xfem_element3.find(num);
1143     lst_xfem_element3.erase(j);
1144     delete femele;
1145     return OK;
1146     }
1147    
1148     void FEM_MAILLAGE::supprimer_tout_xfem_element3(void)
1149     {
1150     while (get_nb_xfem_element3()!=0)
1151     {
1152     LISTE_XFEM_ELEMENT3::iterator j=lst_xfem_element3.begin();
1153     XFEM_ELEMENT3* femele=(*j).second;
1154     MG_IDENTIFICATEUR* id=femele;
1155     LISTE_ENTITE::iterator i=lst_entite.find(id);
1156     lst_entite.erase(i);
1157     lst_xfem_element3.erase(j);
1158     delete femele;
1159     }
1160     }
1161    
1162    
1163     XFEM_ELEMENT3* FEM_MAILLAGE::get_premier_xelement3(LISTE_XFEM_ELEMENT3::iterator & it)
1164     {
1165     it = lst_xfem_element3.begin();
1166     if (it == lst_xfem_element3.end())
1167     return NULL;
1168     return it->second ;
1169     }
1170    
1171     XFEM_ELEMENT3* FEM_MAILLAGE::get_suivant_xelement3(LISTE_XFEM_ELEMENT3::iterator & it)
1172     {
1173     it++;
1174     if (it==lst_xfem_element3.end())
1175     return NULL;
1176     return it->second;
1177     }
1178    
1179    
1180    
1181 francois 283 void FEM_MAILLAGE::construire(int num)
1182     {
1183 francois 310 if (degre==1) construire_lineaire();
1184 francois 283 if (degre==2) construire_quadratique();
1185     if (num>0) optimise_numerotation();
1186     if (num>1) echange_numerotation();
1187 francois 465 BOITE_3D b;
1188     int nx,ny,nz;
1189     bool structure=maillage->get_param_structure(b,nx,ny,nz);
1190     if (structure==true)
1191     change_param_structure(b,nx,ny,nz);
1192 francois 283
1193     }
1194    
1195    
1196    
1197    
1198 francois 310 void FEM_MAILLAGE::construire_lineaire(void)
1199 francois 283 {
1200     LISTE_MG_NOEUD::iterator it_noeud;
1201     MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_noeud);
1202 francois 295 std::vector<FEM_NOEUD*> lstnoeuddirect;
1203 francois 283 unsigned int i=0;
1204     while (mgnoeud)
1205     {
1206     mgnoeud->change_nouveau_numero(i);
1207     FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud);
1208     femnoeud->change_numero(i+1);
1209     i++;
1210     ajouter_fem_noeud(femnoeud);
1211     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
1212 francois 399 if (mgnoeud->get_lien_topologie()!=NULL)
1213     if (mgnoeud->get_lien_topologie()->get_dimension()==0)
1214     {
1215     FEM_ELEMENT0* femele=new FEM_ELEMENT0(mgnoeud->get_lien_topologie(),mgnoeud,&femnoeud);
1216     ajouter_fem_element0(femele);
1217     }
1218     mgnoeud=maillage->get_suivant_noeud(it_noeud);
1219    
1220 francois 283 }
1221     int dimsansgeo=0;
1222     if (get_mg_geometrie()==NULL)
1223     {
1224 francois 310 if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3;
1225     else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2;
1226 francois 283 else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
1227     }
1228 francois 581 if (get_mg_geometrie()!=NULL)
1229     if (strcmp(get_mg_geometrie()->get_type_geometrie(),"VIRTUEL")==0)
1230     {
1231     if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3;
1232     else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2;
1233     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
1234     }
1235    
1236 francois 283 if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==1)))
1237     {
1238     LISTE_MG_SEGMENT::iterator it_seg;
1239     MG_SEGMENT * mgseg = maillage->get_premier_segment(it_seg);
1240     while (mgseg)
1241     {
1242 francois 581 if (mgseg->get_lien_topologie()!=NULL)
1243     if (mgseg->get_lien_topologie()->get_dimension()!=1)
1244     {
1245 francois 283 mgseg=maillage->get_suivant_segment(it_seg);
1246     continue;
1247 francois 581 }
1248     if (get_mg_geometrie()!=NULL)
1249     if (mgseg->get_lien_topologie()==NULL)
1250     if (dimsansgeo!=1)
1251     {
1252     mgseg=maillage->get_suivant_segment(it_seg);
1253     continue;
1254     }
1255 francois 283 FEM_NOEUD *tabnoeud[2];
1256     tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()];
1257     tabnoeud[1]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()];
1258     FEM_SEGMENT2* seg=new FEM_SEGMENT2(mgseg,tabnoeud);
1259 francois 309 ajouter_fem_element1(seg);
1260 francois 283 mgseg=maillage->get_suivant_segment(it_seg);
1261     }
1262     }
1263     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==2)))
1264     {
1265     LISTE_MG_TRIANGLE::iterator it_tri;
1266     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
1267     while (mgtri)
1268     {
1269 francois 581 if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2)
1270     {
1271 francois 283 mgtri=maillage->get_suivant_triangle(it_tri);
1272     continue;
1273 francois 581 }
1274     if (get_mg_geometrie()!=NULL)
1275     if (mgtri->get_lien_topologie()==NULL)
1276     if (dimsansgeo!=2)
1277     {
1278     mgtri=maillage->get_suivant_triangle(it_tri);
1279     continue;
1280     }
1281 francois 283 FEM_NOEUD *tabnoeud[3];
1282     tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()];
1283     tabnoeud[1]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()];
1284     tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()];
1285     FEM_TRIANGLE3* tri=new FEM_TRIANGLE3(mgtri,tabnoeud);
1286 francois 309 ajouter_fem_element2(tri);
1287 francois 283 mgtri=maillage->get_suivant_triangle(it_tri);
1288     }
1289 francois 310 LISTE_MG_QUADRANGLE::iterator it_quad;
1290     MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad);
1291     while (mgquad)
1292     {
1293     if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) {
1294     mgquad=maillage->get_suivant_quadrangle(it_quad);
1295     continue;
1296     }
1297 francois 581 if (get_mg_geometrie()!=NULL)
1298     if (mgquad->get_lien_topologie()==NULL)
1299     if (dimsansgeo!=2)
1300     {
1301     mgquad=maillage->get_suivant_quadrangle(it_quad);
1302     continue;
1303     }
1304 francois 310 FEM_NOEUD *tabnoeud[4];
1305     tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()];
1306     tabnoeud[1]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()];
1307     tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()];
1308     tabnoeud[3]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()];
1309     FEM_QUADRANGLE4* quad=new FEM_QUADRANGLE4(mgquad,tabnoeud);
1310     ajouter_fem_element2(quad);
1311     mgquad=maillage->get_suivant_quadrangle(it_quad);
1312     }
1313 francois 283 }
1314     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==3)))
1315     {
1316     LISTE_MG_TETRA::iterator it_tetra;
1317     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
1318     while (mgtetra)
1319     {
1320     FEM_NOEUD *tabnoeud[4];
1321     tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()];
1322     tabnoeud[1]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()];
1323     tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()];
1324     tabnoeud[3]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()];
1325     FEM_TETRA4* tet=new FEM_TETRA4(mgtetra,tabnoeud);
1326 francois 309 ajouter_fem_element3(tet);
1327 francois 283 mgtetra=maillage->get_suivant_tetra(it_tetra);
1328     }
1329 francois 310 LISTE_MG_HEXA::iterator it_hex;
1330     MG_HEXA* mghex=maillage->get_premier_hexa(it_hex);
1331     while (mghex)
1332     {
1333     FEM_NOEUD *tabnoeud[8];
1334     tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()];
1335     tabnoeud[1]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()];
1336     tabnoeud[2]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()];
1337     tabnoeud[3]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()];
1338     tabnoeud[4]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()];
1339     tabnoeud[5]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()];
1340     tabnoeud[6]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()];
1341     tabnoeud[7]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()];
1342     FEM_HEXA8* hex=new FEM_HEXA8(mghex,tabnoeud);
1343     ajouter_fem_element3(hex);
1344     mghex=maillage->get_suivant_hexa(it_hex);
1345     }
1346 francois 283 }
1347     }
1348    
1349    
1350     void FEM_MAILLAGE::construire_quadratique(void)
1351     {
1352     LISTE_MG_NOEUD::iterator it_nd;
1353     MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_nd);
1354 francois 295 std::vector<FEM_NOEUD*> lstnoeuddirect;
1355 francois 283 unsigned int i=0;
1356     while (mgnoeud)
1357     {
1358     mgnoeud->change_nouveau_numero(i);
1359     FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud);
1360     femnoeud->change_numero(i+1);
1361     i++ ;
1362     ajouter_fem_noeud(femnoeud);
1363 francois 605 //mgnoeud=maillage->get_suivant_noeud(it_nd);
1364 francois 283 lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
1365 francois 399 if (mgnoeud->get_lien_topologie()!=NULL)
1366     if (mgnoeud->get_lien_topologie()->get_dimension()==0)
1367     {
1368     FEM_ELEMENT0* femele=new FEM_ELEMENT0(mgnoeud->get_lien_topologie(),mgnoeud,&femnoeud);
1369     ajouter_fem_element0(femele);
1370     }
1371     mgnoeud=maillage->get_suivant_noeud(it_nd);
1372    
1373 francois 283 }
1374     int dimsansgeo=0;
1375     if (get_mg_geometrie()==NULL)
1376     {
1377     if (maillage->get_nb_mg_tetra()!=0) dimsansgeo=3;
1378     else if (maillage->get_nb_mg_triangle()!=0) dimsansgeo=2;
1379     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
1380     }
1381 francois 581 if (get_mg_geometrie()!=NULL)
1382     if (strcmp(get_mg_geometrie()->get_type_geometrie(),"VIRTUEL")==0)
1383     {
1384     if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3;
1385     else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2;
1386     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
1387     }
1388 francois 283 int nbmgnoeud = maillage->get_nb_mg_noeud();
1389    
1390     LISTE_MG_SEGMENT::iterator it_seg;
1391     MG_SEGMENT* mgseg=maillage->get_premier_segment(it_seg);
1392 francois 612 FEM_MAILLAGE_QUADRATIQUE_OUTILS ou ;
1393 francois 283 i=0;
1394     while (mgseg)
1395     {
1396     mgseg->change_nouveau_numero(i++);
1397     MG_NOEUD *noeud1=mgseg->get_noeud1();
1398     MG_NOEUD *noeud2=mgseg->get_noeud2();
1399     double *xyz1=noeud1->get_coord();
1400     double *xyz2=noeud2->get_coord();
1401     FEM_NOEUD* femnoeud;
1402     if (mgseg->get_lien_topologie()!=NULL)
1403     if (mgseg->get_lien_topologie()->get_dimension()==1)
1404     {
1405     MG_ARETE* arete=(MG_ARETE*)(mgseg->get_lien_topologie());
1406 francois 612 double t1,t2,tm;
1407 francois 283 arete->inverser(t1,xyz1);
1408     arete->inverser(t2,xyz2);
1409     if (arete->get_courbe()->est_periodique())
1410     if (t1>t2) t2=t2+arete->get_courbe()->get_periode();
1411     double t=0.5*(t1+t2);
1412 francois 612 double xyz[2],xyz3[2];
1413     arete->evaluer(t,xyz);
1414     double L3=0,L4=0,j=0.0;
1415     double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2);
1416     double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2);
1417    
1418     if (L1/L2 >1.01)
1419     {
1420     do
1421     {
1422     j+=0.0001;
1423     tm=(-t+t1)*j+t;
1424     arete->evaluer(tm,xyz3);
1425     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
1426     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
1427    
1428     }while (0.5-(L4/(L3+L4))>=0.0001);
1429    
1430 francois 626 femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2]);
1431 francois 612 }
1432    
1433     if (L2/L1 >1.01)
1434     {
1435     do
1436     {
1437     j+=0.0001;
1438     tm=(-t+t2)*j+t;
1439     arete->evaluer(tm,xyz3);
1440     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
1441     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
1442    
1443     }while (0.5-(L3/(L3+L4))>=0.0001);
1444    
1445 francois 626 femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2]);
1446 francois 612 }
1447    
1448     if(j == 0)
1449     {
1450 francois 626 femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2]);
1451 francois 612 }
1452    
1453 francois 283 }
1454     if (mgseg->get_lien_topologie()!=NULL)
1455     if (mgseg->get_lien_topologie()->get_dimension()==2)
1456     {
1457     MG_FACE* face=(MG_FACE*)(mgseg->get_lien_topologie());
1458     double uv1[2],uv2[2];
1459     OT_DECALAGE_PARAMETRE decalage(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
1460     face->inverser(uv1,xyz1);
1461     face->inverser(uv2,xyz2);
1462 francois 317 if (face->get_surface()->est_periodique_u()==1)
1463     {
1464     double eps=1e-10*face->get_surface()->get_periode_u();
1465     if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u();
1466     if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u();
1467     if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u();
1468     if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u();
1469     }
1470     if (face->get_surface()->est_periodique_v()==1)
1471     {
1472     double eps=1e-10*face->get_surface()->get_periode_v();
1473     if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v();
1474     if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v();
1475     if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v();
1476     if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v();
1477     }
1478     double du=decalage.calcul_decalage_parametre_u(uv1[0]);
1479 francois 283 double dv=decalage.calcul_decalage_parametre_v(uv1[1]);
1480     double u1=decalage.decalage_parametre_u(uv1[0],du);
1481     double v1=decalage.decalage_parametre_v(uv1[1],dv);
1482     double u2=decalage.decalage_parametre_u(uv2[0],du);
1483     double v2=decalage.decalage_parametre_v(uv2[1],dv);
1484     double ui=0.5*(u1+u2);
1485     double vi=0.5*(v1+v2);
1486     double uii=decalage.decalage_parametre_u(ui,-du);
1487     double vii=decalage.decalage_parametre_v(vi,-dv);
1488 francois 612 double uv[2],uv3[2],xyz[3],xyz3[3];
1489 francois 283 uv[0]=uii;
1490     uv[1]=vii;
1491 francois 612 face->evaluer(uv,xyz);
1492     double L3=0,L4=0,j=0;
1493     double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2);
1494     double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2);
1495     if (L1/L2 >1.01)
1496     {
1497     do
1498     {
1499     j+=0.0001;
1500     if ((uv1[0]<uv[0]) && (uv2[0]<uv[0]) && (uv1[0]<uv2[0])) uv1[0]=uv1[0]+face->get_surface()->get_periode_u();
1501     if ((uv1[1]<uv[1]) && (uv2[1]<uv[1]) && (uv1[1]<uv2[1])) uv1[1]=uv1[1]+face->get_surface()->get_periode_v();
1502    
1503     uv3[0]=(-uv[0]+uv1[0])*j+uv[0];
1504     uv3[1]=(-uv[1]+uv1[1])*j+uv[1];
1505    
1506     face->evaluer(uv3,xyz3);
1507     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
1508     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
1509    
1510     }while ( 0.5-(L4/(L3+L4)) >=0.0001);
1511    
1512 francois 626 femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2]);
1513 francois 612 }
1514    
1515     if (L2/L1 >1.01)
1516     {
1517     do
1518     {
1519     j+=0.0001;
1520     if ((uv1[0]<uv[0]) && (uv2[0]<uv[0]) && (uv2[0]<uv1[0])) uv2[0]=uv2[0]+face->get_surface()->get_periode_u();
1521     if ((uv1[1]<uv[1]) && (uv2[1]<uv[1]) && (uv2[1]<uv1[1])) uv2[1]=uv2[1]+face->get_surface()->get_periode_v();
1522    
1523     uv3[0]=(-uv[0]+uv2[0])*j+uv[0];
1524     uv3[1]=(-uv[1]+uv2[1])*j+uv[1];
1525    
1526     face->evaluer(uv3,xyz3);
1527     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
1528     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
1529    
1530     }while (0.5-(L3/(L3+L4)) >=0.0001);
1531    
1532 francois 626 femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2]);
1533 francois 612 }
1534    
1535     if (j == 0.0)
1536     {
1537 francois 626 femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2]);
1538 francois 612 }
1539    
1540 francois 283 }
1541     if (mgseg->get_lien_topologie()!=NULL)
1542     {
1543     if (mgseg->get_lien_topologie()->get_dimension()==3)
1544     {
1545     double x=0.5*(xyz1[0]+xyz2[0]);
1546     double y=0.5*(xyz1[1]+xyz2[1]);
1547     double z=0.5*(xyz1[2]+xyz2[2]);
1548 francois 626 femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z);
1549 francois 283 }
1550     }
1551     else
1552     {
1553     double x=0.5*(xyz1[0]+xyz2[0]);
1554     double y=0.5*(xyz1[1]+xyz2[1]);
1555     double z=0.5*(xyz1[2]+xyz2[2]);
1556 francois 626 femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z);
1557 francois 283 }
1558     femnoeud->change_numero(i+nbmgnoeud+1);
1559     ajouter_fem_noeud(femnoeud);
1560     mgseg=maillage->get_suivant_segment(it_seg);
1561     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
1562     }
1563    
1564     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==1)))
1565     {
1566    
1567     mgseg=maillage->get_premier_segment(it_seg);
1568     while (mgseg)
1569     {
1570 francois 581 if (mgseg->get_lien_topologie()!=NULL)
1571     if (mgseg->get_lien_topologie()->get_dimension()!=1)
1572     {
1573 francois 283 mgseg=maillage->get_suivant_segment(it_seg);
1574     continue;
1575 francois 581 }
1576     if (get_mg_geometrie()!=NULL)
1577     if (mgseg->get_lien_topologie()==NULL)
1578     if (dimsansgeo!=1)
1579     {
1580     mgseg=maillage->get_suivant_segment(it_seg);
1581     continue;
1582     }
1583 francois 283 FEM_NOEUD *tabnoeud[3];
1584     tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()];
1585     tabnoeud[1]=lstnoeuddirect[mgseg->get_nouveau_numero()+nbmgnoeud];
1586     tabnoeud[2]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()];
1587     FEM_SEGMENT3* seg=new FEM_SEGMENT3(mgseg,tabnoeud);
1588 francois 309 ajouter_fem_element1(seg);
1589 francois 283 mgseg=maillage->get_suivant_segment(it_seg);
1590     }
1591     }
1592     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==2)))
1593     {
1594     LISTE_MG_TRIANGLE::iterator it_tri;
1595     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
1596     while (mgtri)
1597     {
1598 francois 581 if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2)
1599     {
1600 francois 283 mgtri=maillage->get_suivant_triangle(it_tri);
1601     continue;
1602 francois 581 }
1603     if (get_mg_geometrie()!=NULL)
1604     if (mgtri->get_lien_topologie()==NULL)
1605     if (dimsansgeo!=2)
1606     {
1607     mgtri=maillage->get_suivant_triangle(it_tri);
1608     continue;
1609     }
1610 francois 283 FEM_NOEUD *tabnoeud[6];
1611     tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()];
1612     tabnoeud[1]=lstnoeuddirect[mgtri->get_segment1()->get_nouveau_numero()+nbmgnoeud];
1613     tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()];
1614     tabnoeud[3]=lstnoeuddirect[mgtri->get_segment2()->get_nouveau_numero()+nbmgnoeud];
1615     tabnoeud[4]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()];
1616     tabnoeud[5]=lstnoeuddirect[mgtri->get_segment3()->get_nouveau_numero()+nbmgnoeud];
1617     FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(mgtri,tabnoeud);
1618 francois 309 ajouter_fem_element2(tri);
1619 francois 283 mgtri=maillage->get_suivant_triangle(it_tri);
1620     }
1621 francois 310 LISTE_MG_QUADRANGLE::iterator it_quad;
1622     MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad);
1623     while (mgquad)
1624     {
1625     if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) {
1626     mgquad=maillage->get_suivant_quadrangle(it_quad);
1627     continue;
1628     }
1629 francois 581 if (get_mg_geometrie()!=NULL)
1630     if (mgquad->get_lien_topologie()==NULL)
1631     if (dimsansgeo!=2)
1632     {
1633     mgquad=maillage->get_suivant_quadrangle(it_quad);
1634     continue;
1635     }
1636 francois 310 FEM_NOEUD *tabnoeud[8];
1637     tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()];
1638     tabnoeud[1]=lstnoeuddirect[mgquad->get_segment1()->get_nouveau_numero()+nbmgnoeud];
1639     tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()];
1640     tabnoeud[3]=lstnoeuddirect[mgquad->get_segment2()->get_nouveau_numero()+nbmgnoeud];
1641     tabnoeud[4]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()];
1642     tabnoeud[5]=lstnoeuddirect[mgquad->get_segment3()->get_nouveau_numero()+nbmgnoeud];
1643     tabnoeud[6]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()];
1644     tabnoeud[7]=lstnoeuddirect[mgquad->get_segment4()->get_nouveau_numero()+nbmgnoeud];
1645     FEM_QUADRANGLE8* quad=new FEM_QUADRANGLE8(mgquad,tabnoeud);
1646     ajouter_fem_element2(quad);
1647     mgquad=maillage->get_suivant_quadrangle(it_quad);
1648     }
1649 francois 283 }
1650     if ((get_mg_geometrie()!=NULL) || ( (get_mg_geometrie()==NULL) && (dimsansgeo==3)))
1651     {
1652    
1653     LISTE_MG_TETRA::iterator it_tetra;
1654     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
1655     while (mgtetra)
1656     {
1657     FEM_NOEUD *tabnoeud[10];
1658     tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()];
1659     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
1660     tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()];
1661     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
1662     tabnoeud[4]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()];
1663     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
1664     tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
1665     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
1666     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
1667     tabnoeud[9]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()];
1668     FEM_TETRA10* tet=new FEM_TETRA10(mgtetra,tabnoeud);
1669 francois 309 ajouter_fem_element3(tet);
1670 francois 283 mgtetra=maillage->get_suivant_tetra(it_tetra);
1671     }
1672 francois 310 LISTE_MG_HEXA::iterator it_hexa;
1673     MG_HEXA* mghex=maillage->get_premier_hexa(it_hexa);
1674     while (mghex)
1675     {
1676     FEM_NOEUD *tabnoeud[20];
1677     tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()];
1678     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
1679     tabnoeud[2]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()];
1680     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
1681     tabnoeud[4]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()];
1682     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
1683     tabnoeud[6]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()];
1684     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
1685     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
1686     tabnoeud[9]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
1687     tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
1688     tabnoeud[11]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
1689     tabnoeud[12]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()];
1690     tabnoeud[13]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud5()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
1691     tabnoeud[14]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()];
1692     tabnoeud[15]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud6()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
1693     tabnoeud[16]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()];
1694     tabnoeud[17]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud7()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
1695     tabnoeud[18]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()];
1696     tabnoeud[19]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud8()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
1697     FEM_HEXA20* hex=new FEM_HEXA20(mghex,tabnoeud);
1698     ajouter_fem_element3(hex);
1699     mghex=maillage->get_suivant_hexa(it_hexa);
1700     }
1701 francois 283 }
1702     }
1703    
1704    
1705    
1706     void FEM_MAILLAGE::enregistrer(std::ostream& o)
1707     {
1708    
1709 francois 465 if (est_structure==true)
1710     {
1711     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;
1712     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;
1713    
1714     }
1715     else
1716     {
1717     if (mg_geometrie==NULL) o << "%" << get_id() << "=FEM_MAILLAGE(" << degre << ",$" << maillage->get_id() << " );" << std::endl;
1718     else o << "%" << get_id() << "=FEM_MAILLAGE("<< degre << ",$" << maillage->get_id() << ",$" << mg_geometrie->get_id() <<");" << std::endl;
1719     }
1720    
1721    
1722 francois 283 LISTE_ENTITE::const_iterator i;
1723     for (i=lst_entite.begin();i!=lst_entite.end();i++)
1724     (*i)->enregistrer(o);
1725     }
1726    
1727    
1728     void FEM_MAILLAGE::exporter_cosmos(std::string& nomfic)
1729     {
1730     char chaine[500];
1731     sprintf(chaine,"%s.ses",nomfic.c_str());
1732     std::ofstream of1(chaine,std::ios::out|std::ios::trunc);
1733     of1.precision(16);
1734     of1.setf(std::ios::showpoint);
1735     of1 << "TITLE, " << chaine << " : Fichier FEM de maillage MAGiC" << std::endl;
1736     if (degre==1) of1 << "EGROUP,1,TETRA4,0,0,0,0,0,0,0,0;" << std::endl;
1737     if (degre==2) of1 << "EGROUP,1,TETRA10,0,0,0,0,0,0,0,0;" << std::endl;
1738     int nb_volume=mg_geometrie->get_nb_mg_volume();
1739     int nbNoeuds = 0;
1740    
1741    
1742     for (int i=0;i<nb_volume;i++)
1743     {
1744     MG_VOLUME *mgvol=mg_geometrie->get_mg_volume(i);
1745     if (mgvol->get_num_materiau()>=0)
1746     {
1747 francois 296 MC_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1748     MC_MATERIAU* mat=mtgest.get_materiau(mgvol->get_num_materiau());
1749 francois 283 for (int m=0; m<mat->get_nb_propriete();m++)
1750     {
1751 francois 296 MC_PROPRIETE* prop=mat->get_propriete(m);
1752 francois 283 of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
1753     }
1754     /* MT_PROPRIETE* prop=mat->get_propriete("EX");
1755     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", EX, " << prop->get_valeur(2) << ";" << std::endl;
1756     prop=mat->get_propriete("NUXY");
1757     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", NUXY, " << prop->get_valeur(2) << ";" << std::endl;
1758     prop=mat->get_propriete("GXY");
1759     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", GXY, " << prop->get_valeur(2) << ";" << std::endl;
1760     prop=mat->get_propriete("DENS");
1761     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", DENS, " << prop->get_valeur(2) << ";" << std::endl;
1762     prop=mat->get_propriete("SIGXT");
1763     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGXT, " << prop->get_valeur(2) << ";" << std::endl;
1764     prop=mat->get_propriete("SIGYLD");
1765     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", SIGYLD, " << prop->get_valeur(2) << ";" << std::endl;
1766     prop=mat->get_propriete("ALPX");
1767     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", ALPX, " << prop->get_valeur(2) << ";" << std::endl;
1768     prop=mat->get_propriete("KX");
1769     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", KX, " << prop->get_valeur(2) << ";" << std::endl;
1770     prop=mat->get_propriete("C");
1771     of1<< "MPROP, "<< mgvol->get_num_materiau()+1 << ", C , " << prop->get_valeur(2) << ";" << std::endl;*/
1772     }
1773     }
1774     int nb_coques = mg_geometrie->get_nb_mg_coque();
1775     for (int i=0;i<nb_coques;i++)
1776     {
1777     MG_COQUE *mgcoque=mg_geometrie->get_mg_coque(i);
1778     if (mgcoque->get_num_materiau()>=0)
1779     {
1780 francois 296 MC_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1781     MC_MATERIAU* mat=mtgest.get_materiau(mgcoque->get_num_materiau());
1782 francois 283 for (int m=0; m<mat->get_nb_propriete();m++)
1783     {
1784 francois 296 MC_PROPRIETE* prop=mat->get_propriete(m);
1785 francois 283 of1<< "MPROP, "<< mgcoque->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
1786     }
1787     }
1788     }
1789     int nb_poutres = mg_geometrie->get_nb_mg_poutre();
1790     for (int i=0;i<nb_poutres;i++)
1791     {
1792     MG_POUTRE *mgpoutre=mg_geometrie->get_mg_poutre(i);
1793     if (mgpoutre->get_num_materiau()>=0)
1794     {
1795 francois 296 MC_GESTIONNAIRE mtgest(mg_geometrie->get_gest_materiau());
1796     MC_MATERIAU* mat=mtgest.get_materiau(mgpoutre->get_num_materiau());
1797 francois 283
1798     for (int m=0; m<mat->get_nb_propriete();m++)
1799     {
1800 francois 296 MC_PROPRIETE* prop=mat->get_propriete(m);
1801 francois 283 of1<< "MPROP, "<< mgpoutre->get_num_materiau()+1 << ", " << prop->get_nom() <<", " << prop->get_valeur(m) << ";" << std::endl;
1802     }
1803     }
1804     }
1805    
1806    
1807    
1808     of1 << "ACTSET,CS,0;" << std::endl;
1809     of1 << "ACTSET,EG,1;" << std::endl;
1810    
1811     // �riture des noeuds
1812     int ii=0;
1813     double valeurunite=mg_geometrie->get_valeur_unite();
1814     for (LISTE_FEM_NOEUD::iterator i=lst_fem_noeud.begin();i!=lst_fem_noeud.end();i++)
1815     {
1816     FEM_NOEUD* noeud=((*i).second);
1817     of1 << "ND, " << noeud->get_numero() << ", " << noeud->get_x()*valeurunite << ", " << noeud->get_y()*valeurunite << ", " << noeud->get_z()*valeurunite << ";" << std::endl;
1818     char nom[3];
1819     int nb=noeud->get_lien_topologie()->get_nb_ccf();
1820     for (int k=0;k<nb;k++)
1821     {
1822     noeud->get_lien_topologie()->get_type_ccf(k,nom);
1823     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;
1824     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;
1825     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;
1826     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;
1827     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;
1828     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;
1829     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;
1830     }
1831     ii++;
1832     }
1833     nbNoeuds = ii;
1834     ii=0;
1835    
1836     // �criture des t�tra�dres
1837     int nummat=-10; // num�o du mat�iau
1838 francois 309 for (LISTE_FEM_ELEMENT3::iterator i=lst_fem_element3.begin();i!=lst_fem_element3.end();i++)
1839 francois 283 {
1840 francois 309 FEM_ELEMENT3* tetra=((*i).second);
1841 francois 283 MG_VOLUME* vol=(MG_VOLUME*)tetra->get_lien_topologie();
1842     int nummatac=vol->get_num_materiau();
1843     if ((nummatac!=nummat) && (nummatac!=-1))
1844     {
1845     nummat=nummatac;
1846     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1847     }
1848     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() << ", " ;
1849     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() << ", " ;
1850     ii++;
1851     MG_TETRA* tet=(MG_TETRA*)tetra->get_mg_element_maillage();
1852     if (tet->get_triangle1()->get_lien_topologie()->get_dimension()!=3) of1 << "1, ";
1853     else of1 << "0, ";
1854     if (tet->get_triangle2()->get_lien_topologie()->get_dimension()!=3) of1 << "1, ";
1855     else of1 << "0, ";
1856     if (tet->get_triangle3()->get_lien_topologie()->get_dimension()!=3) of1 << "1, ";
1857     else of1 << "0, ";
1858     if (tet->get_triangle4()->get_lien_topologie()->get_dimension()!=3) of1 << "1;" << std::endl ;
1859     else of1 << "0;" << std::endl;
1860     char nom[3];
1861     int nb=tet->get_triangle1()->get_lien_topologie()->get_nb_ccf();
1862     for (int k=0;k<nb;k++)
1863     {
1864     tet->get_triangle1()->get_lien_topologie()->get_type_ccf(k,nom);
1865     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 1;" << std::endl;
1866     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 2;" << std::endl;
1867     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 3;" << std::endl;
1868     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle1()->get_lien_topologie()->get_valeur_ccf(k) << ", 1, " << ii << ", 1, 4;" << std::endl;
1869     }
1870     nb=tet->get_triangle2()->get_lien_topologie()->get_nb_ccf();
1871     for (int k=0;k<nb;k++)
1872     {
1873     tet->get_triangle2()->get_lien_topologie()->get_type_ccf(k,nom);
1874     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 1;" << std::endl;
1875     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 2;" << std::endl;
1876     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 3;" << std::endl;
1877     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle2()->get_lien_topologie()->get_valeur_ccf(k) << ", 2, " << ii << ", 1, 4;" << std::endl;
1878     }
1879     nb=tet->get_triangle3()->get_lien_topologie()->get_nb_ccf();
1880     for (int k=0;k<nb;k++)
1881     {
1882     tet->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1883     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 1;" << std::endl;
1884     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 2;" << std::endl;
1885     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 3;" << std::endl;
1886     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle3()->get_lien_topologie()->get_valeur_ccf(k) << ", 3, " << ii << ", 1, 4;" << std::endl;
1887     }
1888     nb=tet->get_triangle4()->get_lien_topologie()->get_nb_ccf();
1889     for (int k=0;k<nb;k++)
1890     {
1891     tet->get_triangle4()->get_lien_topologie()->get_type_ccf(k,nom);
1892     if (strcmp(nom,"Px")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 1;" << std::endl;
1893     if (strcmp(nom,"Py")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 2;" << std::endl;
1894     if (strcmp(nom,"Pz")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 3;" << std::endl;
1895     if (strcmp(nom,"Pn")==0) of1 << "PEL , " << ii << ", " << tet->get_triangle4()->get_lien_topologie()->get_valeur_ccf(k) << ", 4, " << ii << ", 1, 4;" << std::endl;
1896     }
1897     }
1898    
1899    
1900     //*********************************************************
1901     // Les t�tras sont finis, maintenant le maillage des Coques
1902     //*********************************************************
1903     //nb_coques=mg_geometrie->get_nb_mg_coque(); //variable d��d�lar� plus haut, elle devrait avoir conserv�sa valeur
1904     if (nb_coques>0)
1905     {
1906     if (degre==1) of1 << "EGROUP,2,SHELL3,0,0,0,0,0,0,0,0;" << std::endl; // Formulation coques minces... SHELL3T pout �aisses
1907     if (degre==2) of1 << "EGROUP,2,SHELL6,0,0,0,0,0,0,0,0;" << std::endl;
1908     }
1909    
1910     if (nb_poutres>0 || nb_coques>0 )
1911     {
1912     of1 << "EGROUP,3,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres
1913     of1 << "RCONST,3,3,1,3," << "1, 1 , 1; " << std::endl;
1914     of1 << "EGROUP,4,RBAR;"<< std::endl; // EGroup des RBAR
1915     of1 << "EGROUP,5,BEAM3D,0,0,0,0,0,0,0,0;"<< std::endl; //Egroup des mini-poutres infiniment rigide
1916     of1 << "RCONST,5,5,1,3," << "0.01, 0.01 , 0.01; " << std::endl;
1917     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...)
1918     of1 << "RCONST,6,6,1,3," << "1e-16, 0.01 , 1e-16; " << std::endl;
1919     }
1920    
1921     int RCset =7;
1922    
1923     LISTE_MG_COQUE::iterator ico;
1924     MG_COQUE *mgcoque=mg_geometrie->get_premier_coque(ico);
1925     while (mgcoque)
1926     {
1927     int nummatac=mgcoque->get_num_materiau();
1928     if ((nummatac!=nummat)&&(nummatac!=-1)) // si c'est = 0 alors on place le dernier mat�iau choisi.
1929     {
1930     nummat=nummatac;
1931     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
1932     }
1933    
1934     for (int numcoquille=0;numcoquille<mgcoque->get_nb_mg_coquille();numcoquille++)
1935     {
1936     MG_COQUILLE* mgcoquille = mgcoque->get_mg_coquille(numcoquille);
1937     for (int cf = 0; cf<mgcoquille->get_nb_mg_coface();cf++)
1938     {
1939     MG_COFACE* mgcoface = mgcoquille->get_mg_coface(cf);
1940     MG_FACE* mgface = mgcoface->get_face();
1941    
1942     double epaisseur=-1;
1943     for (int k=0;k<mgface->get_nb_ccf();k++) // aller chercher l'�aisseur de la coque
1944     {
1945     char nomCCF[3];
1946     mgface->get_type_ccf(k,nomCCF);
1947     if (strcmp(nomCCF,"EP")==0)
1948     epaisseur = mgface-> get_valeur_ccf(k);
1949     }
1950     of1 << "ACTSET,EG,2;"<< std::endl;
1951     of1 << "RCONST,2,"<< ++RCset << ",1,1," << epaisseur << ";" << std::endl; // le real constant, s'active automatiquement
1952    
1953     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_maillage = mgface->get_lien_fem_maillage();
1954     int nbelem=lien_maillage->get_nb();
1955     for (int i=0;i<nbelem;i++)
1956     {
1957 francois 309 FEM_ELEMENT2* femtriangle=(FEM_ELEMENT2*)lien_maillage->get(i);
1958 francois 283 if (!contient(femtriangle)) continue;
1959     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;
1960     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;
1961     // dans les noeuds des sommets sont, 1, 2 et 3. les noeuds sur les segments sont 4 5 et 6
1962    
1963     long nbc;
1964     MG_TRIANGLE* mgtri=(MG_TRIANGLE*)femtriangle->get_mg_element_maillage();
1965     char nom[3];
1966    
1967     nbc = mgtri->get_segment1()->get_lien_topologie()->get_nb_ccf();
1968     for (int z =0 ; z< nbc; z++) // le premier segment
1969     { // il y a au moins une CCF "EP" qu'il faut ignorer
1970     mgtri->get_segment1()->get_lien_topologie()->get_type_ccf(z,nom); // ->get_triangle3()->get_lien_topologie()->get_type_ccf(k,nom);
1971     if (strcmp(nom,"EP")==0) continue;
1972     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;
1973     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;
1974     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;
1975     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;
1976     }
1977     nbc = mgtri->get_segment2()->get_lien_topologie()->get_nb_ccf();
1978     for (int z =0 ; z< nbc; z++)
1979     {
1980     mgtri->get_segment2()->get_lien_topologie()->get_type_ccf(z,nom);
1981     if (strcmp(nom,"EP")==0) continue;
1982     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;
1983     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;
1984     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;
1985     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;
1986     }
1987     nbc = mgtri->get_segment3()->get_lien_topologie()->get_nb_ccf();
1988     for (int z =0 ; z< nbc; z++)
1989     {
1990     mgtri->get_segment3()->get_lien_topologie()->get_type_ccf(z,nom);
1991     if (strcmp(nom,"EP")==0) continue;
1992     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;
1993     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;
1994     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;
1995     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;
1996     }
1997    
1998    
1999     nbc = mgtri->get_lien_topologie()->get_nb_ccf(); // et pour la face elle-m�e
2000     for (int z =0 ; z< nbc; z++)
2001     {
2002     mgtri->get_lien_topologie()->get_type_ccf(z,nom);
2003     if (strcmp(nom,"EP")==0) continue;
2004     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;
2005     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;
2006     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;
2007     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;
2008     }
2009    
2010     }
2011    
2012     } // next face
2013     } // next coquille
2014     mgcoque = mg_geometrie->get_suivant_coque(ico);
2015     }// next coque
2016    
2017    
2018     // **************************
2019     // maintenant les poutres
2020     // **************************
2021    
2022    
2023    
2024     //for (int i = 0 ; i<nb_poutres;i++)
2025     LISTE_MG_POUTRE::iterator it_po;
2026     MG_POUTRE* mgpoutre = mg_geometrie->get_premier_poutre(it_po);
2027     while (mgpoutre)
2028     {
2029     //MG_POUTRE* mgpoutre = mg_geometrie->get_mg_poutre(i);
2030     int nummatac=mgpoutre->get_num_materiau();
2031     if ((nummatac!=nummat)&&(nummatac!=-1))
2032     {
2033     nummat=nummatac;
2034     of1 << "ACTSET, MP," << nummat+1 << ";" << std::endl;
2035     }
2036    
2037     for (int j = 0;j<mgpoutre->get_nb_mg_boucle();j++)
2038     {
2039     MG_BOUCLE* mgboucle = mgpoutre->get_mg_boucle(j);
2040    
2041     for (int k = 0 ; k<mgboucle->get_nb_mg_coarete();k++)
2042     {
2043     MG_COARETE* mgcoarete = mgboucle->get_mg_coarete(k);
2044     MG_ARETE* mgarete = mgcoarete->get_arete();
2045    
2046     double IXX = 0;
2047     double IYY = 0;
2048     double Aire = 0;
2049     double x3 = 0;
2050     double y3 = 0;
2051     double z3 = 0;
2052    
2053     for (int k=0;k<mgarete->get_nb_ccf();k++)
2054     {
2055     char nomCCF[3];
2056     mgarete->get_type_ccf(k,nomCCF);
2057     if (strcmp(nomCCF,"As")==0)
2058     Aire = mgarete->get_valeur_ccf(k);
2059     if (strcmp(nomCCF,"IX")==0)
2060     IXX = mgarete->get_valeur_ccf(k);
2061     if (strcmp(nomCCF,"IY")==0)
2062     IYY = mgarete->get_valeur_ccf(k);
2063     if (strcmp(nomCCF,"NX")==0)
2064     x3 = mgarete->get_valeur_ccf(k);
2065     if (strcmp(nomCCF, "NY")==0)
2066     y3 = mgarete->get_valeur_ccf(k);
2067     if (strcmp(nomCCF, "NZ")==0)
2068     z3 = mgarete->get_valeur_ccf(k);
2069     }
2070    
2071     if ( Aire==-7) // -7 est un flag pour diff�rencier les mini-poutres...
2072     { // mini-poutre
2073     of1 << "Actset,EG,5;"<<std::endl;
2074     of1 << "Actset,RC,5;"<<std::endl;
2075     of1 << "C* MINI - POUTRE" << std:: endl;
2076    
2077     for (int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
2078     {
2079 francois 309 FEM_ELEMENT1* femseg = (FEM_ELEMENT1*)mgarete->get_lien_fem_maillage()->get(t);
2080 francois 283 of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
2081     } // next segment
2082     }
2083     else
2084     { // poutre normale
2085     of1 << "Actset,EG,3;"<<std::endl;
2086     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
2087     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
2088    
2089     for (int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
2090     {
2091 francois 309 FEM_ELEMENT1* femseg = (FEM_ELEMENT1*)mgarete->get_lien_fem_maillage()->get(t);
2092 francois 283 if (!contient(femseg)) continue;
2093     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;
2094    
2095     for (int k=0;k<mgarete->get_nb_ccf();k++)
2096     {
2097     char nom[3];
2098     mgarete->get_type_ccf(k,nom);
2099     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;
2100     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;
2101     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;
2102     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!!!
2103     }
2104     } // next segment
2105     }
2106    
2107    
2108     } // next arete
2109     } // next boucle
2110     mgpoutre=mg_geometrie->get_suivant_poutre(it_po);
2111     } // next poutre
2112    
2113     // Cas sp�cial, une ar�te normale est flagg�e comme une mini-poutre (dans coupecot�)
2114     LISTE_MG_ARETE::iterator ita;
2115     MG_ARETE* mgarete = mg_geometrie->get_premier_arete(ita);
2116    
2117     while (mgarete)
2118     {
2119     double Aire = 0;
2120    
2121     for (int k=0;k<mgarete->get_nb_ccf();k++)
2122     {
2123     char nomCCF[3];
2124     mgarete->get_type_ccf(k,nomCCF);
2125     if (strcmp(nomCCF,"As")==0)
2126     Aire = mgarete->get_valeur_ccf(k);
2127     }
2128    
2129     if ( Aire==-7) // -7 est un flag pour diff�rencier les mini-poutres... non orient�e
2130     { // mini-poutre
2131     of1 << "Actset,EG,5;"<<std::endl;
2132     of1 << "Actset,RC,5;"<<std::endl;
2133     of1 << "C* MINI - POUTRE" << std:: endl;
2134    
2135     for (int t = 0; t< mgarete->get_lien_fem_maillage()->get_nb();t++)
2136     {
2137 francois 309 FEM_ELEMENT1* femseg = (FEM_ELEMENT1*)mgarete->get_lien_fem_maillage()->get(t);
2138 francois 283 if (!contient(femseg)) continue;
2139     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<femseg->get_fem_noeud(0)->get_numero()<< ","<< femseg->get_fem_noeud(1)->get_numero()<<";" << std::endl;
2140     }
2141     }
2142     mgarete=mg_geometrie->get_suivant_arete(ita);
2143     }
2144    
2145    
2146    
2147     //************************************************************
2148     // Pour mettre des mini-poutres sur les faces concern�es *****
2149     //*************************************************************
2150     // identifications des faces du qui sont des faces internes.
2151    
2152     LISTE_MG_FACE::iterator itf;
2153     MG_FACE* mgface = mg_geometrie->get_premier_face(itf);
2154    
2155    
2156     while (mgface)
2157     {
2158     for (int k=0;k<mgface->get_nb_ccf();k++)
2159     {
2160     char nomCCF[3];
2161     mgface->get_type_ccf(k,nomCCF);
2162    
2163     if (strcmp(nomCCF,"FI")==0)
2164     {
2165     TPL_LISTE_ENTITE<FEM_ELEMENT_MAILLAGE*> * lien_fem_maillage = mgface->get_lien_fem_maillage();
2166     FEM_ELEMENT_MAILLAGE* element;
2167    
2168     //si on a une faceinterne de poutre alors on a une CCF "Po" = 0
2169     // sinon la CCF Po est �gale � 1 et on a une coque
2170     int Poutre = -1;
2171    
2172     for (int z=0;z<mgface->get_nb_ccf();z++)
2173     {
2174     char nomCCF2[3];
2175     mgface->get_type_ccf(z,nomCCF);
2176     if (strcmp(nomCCF,"Po")==0)
2177     {
2178     Poutre = mgface->get_valeur_ccf(z);
2179     }
2180     }
2181    
2182    
2183     if (Poutre ==0)
2184     { // mini-poutres pour des poutres
2185     of1 << "ACTSET,EG,5; C* Face avec mini-poutres de POUTRE"<<std::endl;
2186     of1 << "ACTSET,RC,5;"<<std::endl;
2187     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
2188     {
2189 francois 309 FEM_ELEMENT2* femtriangle=(FEM_ELEMENT2*)lien_fem_maillage->get(i) ;
2190 francois 283
2191     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
2192     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
2193     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
2194    
2195     // 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 ;
2196     //si on veut orienter les propri�t�s,
2197     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
2198     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
2199     of1 << "EL, " << ++ii << ", CR, 0, 2, " <<nd0->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
2200     }
2201     }
2202     else if (Poutre==1)
2203     { // mini-poutres pour des coques
2204     of1 << "ACTSET,EG,6; C* Face avec mini-poutres de COQUE"<<std::endl;
2205     of1 << "ACTSET,RC,6;"<<std::endl;
2206     for (int i = 0 ; i< lien_fem_maillage->get_nb();i++)
2207     {
2208 francois 309 FEM_ELEMENT2* femtriangle=(FEM_ELEMENT2*)lien_fem_maillage->get(i) ;
2209 francois 283
2210     FEM_NOEUD* nd0 =femtriangle->get_fem_noeud(0);
2211     FEM_NOEUD* nd1 =femtriangle->get_fem_noeud(1);
2212     FEM_NOEUD* nd2= femtriangle->get_fem_noeud(2);
2213    
2214     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd1->get_numero()<< "," << nd2->get_numero()<< ";" << std::endl;
2215     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd1->get_numero()<< "," << nd2->get_numero()<< "," << nd0->get_numero()<< ";" << std::endl;
2216     of1 << "EL, " << ++ii << ", CR, 0, 3, " <<nd0->get_numero()<< "," << nd2->get_numero()<< "," << nd1->get_numero()<< ";" << std::endl;
2217     }
2218     }
2219     } // end if FI
2220     } // next CCF
2221     mgface= mg_geometrie->get_suivant_face(itf);
2222     } // end while face
2223    
2224    
2225    
2226     //of1<< "NMERGE;" <<std::endl;
2227     //of1<< "NCOMPRESS;" <<std::endl;
2228    
2229     //of1<< "SETEPLOT,1,1,0,0;"<<std::endl;
2230     //of1<< "ACTECLR,1,RC,1;"<<std::endl;
2231    
2232     of1<< "EPLOT;"<<std::endl;
2233     of1<< "PSCALE;"<<std::endl;
2234     //lst_FaceInternes.vide();
2235    
2236     }
2237    
2238    
2239     double FEM_MAILLAGE::calcul_coef(void)
2240     {
2241     if (!deforme) return 0.;
2242     LISTE_FEM_NOEUD::iterator it;
2243     double max=0.,dmax=0.;
2244     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
2245     {
2246     double x=noeud->get_x();
2247     double y=noeud->get_y();
2248     double z=noeud->get_z();
2249     double dx=noeud->get_dx();
2250     double dy=noeud->get_dy();
2251     double dz=noeud->get_dz();
2252     if (fabs(x)>max) max=fabs(x);
2253     if (fabs(y)>max) max=fabs(y);
2254     if (fabs(z)>max) max=fabs(z);
2255     if (fabs(dx)>dmax) dmax=fabs(dx);
2256     if (fabs(dy)>dmax) dmax=fabs(dy);
2257     if (fabs(dz)>dmax) dmax=fabs(dz);
2258     }
2259     if (dmax<1e-10) return 0;
2260     double coef=0.1*max/dmax;
2261     return coef;
2262     }
2263    
2264    
2265    
2266    
2267     void FEM_MAILLAGE::calcul_deforme(FEM_SOLUTION* solx,int numx,FEM_SOLUTION* soly,int numy,FEM_SOLUTION* solz,int numz)
2268     {
2269     LISTE_FEM_NOEUD::iterator it;
2270     solx->active_solution(numx);
2271     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
2272    
2273     noeud->change_dx(noeud->get_solution()/get_mg_geometrie()->get_valeur_unite());
2274    
2275     soly->active_solution(numy);
2276     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
2277    
2278     noeud->change_dy(noeud->get_solution()/get_mg_geometrie()->get_valeur_unite());
2279    
2280     solz->active_solution(numz);
2281     for (FEM_NOEUD* noeud=get_premier_noeud(it);noeud;noeud=get_suivant_noeud(it))
2282    
2283     noeud->change_dz(noeud->get_solution()/get_mg_geometrie()->get_valeur_unite());
2284    
2285     deforme=1;
2286     }
2287    
2288    
2289     int FEM_MAILLAGE::existe_deforme(void)
2290     {
2291     return deforme;
2292     }
2293    
2294     void FEM_MAILLAGE::active_deforme(void)
2295     {
2296     deforme=1;
2297     }
2298    
2299 gervaislavoie 304 void FEM_MAILLAGE::desactive_deforme(void)
2300     {
2301     deforme=0;
2302     }
2303 francois 283
2304 francois 339 int FEM_MAILLAGE::existe_reaction(void)
2305     {
2306     return reaction;
2307     }
2308 francois 283
2309 francois 339 void FEM_MAILLAGE::active_reaction(void)
2310     {
2311     reaction=1;
2312     }
2313    
2314     void FEM_MAILLAGE::desactive_reaction(void)
2315     {
2316     reaction=0;
2317     }
2318    
2319 francois 325 void FEM_MAILLAGE::calcul_somme_reaction(double &rx,double &ry,double &rz)
2320     {
2321     rx=0.;
2322     ry=0.;
2323     rz=0.;
2324     LISTE_FEM_NOEUD::iterator it;
2325     for (FEM_NOEUD* no=get_premier_noeud(it);no!=NULL;no=get_suivant_noeud(it))
2326     {
2327     rx=rx+no->get_rx();
2328     ry=ry+no->get_ry();
2329     rz=rz+no->get_rz();
2330     }
2331     }
2332 francois 283
2333    
2334    
2335    
2336    
2337    
2338    
2339     void FEM_MAILLAGE::optimise_numerotation(void)
2340     {
2341     FEM_NOEUD* noeud=get_fem_noeud(0);
2342     FEM_GRAPH_NOEUD *graph;
2343     graph=new FEM_GRAPH_NOEUD(noeud,this);
2344     int e=graph->get_excentricite();
2345     TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau();
2346     int nbdernierniveau=dernierniveau.get_nb();
2347     for (int i=0;i<nbdernierniveau;i++)
2348     {
2349     FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),this);
2350     int etmp=graphtmp->get_excentricite();
2351     if (etmp>e)
2352     {
2353     delete graph;
2354     graph=graphtmp;
2355     dernierniveau=graph->get_dernier_niveau();
2356     nbdernierniveau=dernierniveau.get_nb();
2357     i=-1;
2358     e=etmp;
2359     }
2360     else delete graphtmp;
2361     }
2362     int numero=get_nb_fem_noeud();
2363     for (int i=0;i<e+1;i++)
2364     {
2365     TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i);
2366     int nbnoeud=niveau.get_nb();
2367     for (int j=0;j<nbnoeud;j++)
2368     {
2369     FEM_NOEUD* noeud=niveau.get(j);
2370     noeud->change_numero_opt(numero);
2371     numero--;
2372     }
2373     }
2374    
2375    
2376     delete graph;
2377     }
2378    
2379     void FEM_MAILLAGE::echange_numerotation(void)
2380     {
2381     int nbnoeud=get_nb_fem_noeud();
2382     for (int i=0;i<nbnoeud;i++)
2383     {
2384     FEM_NOEUD* noeud=get_fem_noeud(i);
2385     int num=noeud->get_numero();
2386     noeud->change_numero(noeud->get_numero_opt());
2387     noeud->change_numero_opt(num);
2388     }
2389    
2390     }
2391    
2392    
2393    
2394    
2395     std::ostream& operator << (std::ostream& o,FEM_MAILLAGE& maillage)
2396     {
2397     maillage.enregistrer(o);
2398     return o;
2399     }
2400    
2401    
2402 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)
2403     {
2404     nb_noeud=get_nb_fem_noeud();
2405     LISTE_FEM_ELEMENT1::iterator it1;
2406     for (FEM_ELEMENT1* ele=get_premier_element1(it1);ele!=NULL;ele=get_suivant_element1(it1))
2407     {
2408     int nb=ele->get_nb_fem_noeud();
2409     if (nb==2) nb_seg2++;
2410     if (nb==3) nb_seg3++;
2411     }
2412     LISTE_FEM_ELEMENT2::iterator it2;
2413     for (FEM_ELEMENT2* ele=get_premier_element2(it2);ele!=NULL;ele=get_suivant_element2(it2))
2414     {
2415     int nb=ele->get_nb_fem_noeud();
2416     if (nb==3) nb_tri3++;
2417     if (nb==4) nb_quad4++;
2418     if (nb==6) nb_tri6++;
2419     if (nb==8) nb_quad8++;
2420     }
2421     LISTE_FEM_ELEMENT3::iterator it3;
2422     for (FEM_ELEMENT3* ele=get_premier_element3(it3);ele!=NULL;ele=get_suivant_element3(it3))
2423     {
2424     int nb=ele->get_nb_fem_noeud();
2425     if (nb==4) nb_tet4++;
2426     if (nb==8) nb_hex8++;
2427     if (nb==10) nb_tet10++;
2428     if (nb==20) nb_hex20++;
2429     }
2430     }
2431 francois 283
2432    
2433 francois 465 void FEM_MAILLAGE::change_param_structure(BOITE_3D btmp,int nxtmp,int nytmp,int nztmp)
2434     {
2435     boite_englobante=btmp;
2436     nx=nxtmp;
2437     ny=nytmp;
2438     nz=nztmp;
2439     est_structure=true;
2440     }
2441 francois 283
2442    
2443 francois 465 bool FEM_MAILLAGE::get_param_structure(BOITE_3D &btmp,int &nxtmp,int &nytmp,int &nztmp)
2444     {
2445     if (est_structure==true)
2446     {
2447     btmp=boite_englobante;
2448     nxtmp=nx;
2449     nytmp=ny;
2450     nztmp=nz;
2451     return true;
2452     }
2453     return false;
2454     }
2455 francois 283
2456 francois 465 bool FEM_MAILLAGE::get_est_structure(void)
2457     {
2458     return est_structure;
2459     }
2460