ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 91225 byte(s)
Log Message:
Le fichier MAGiC est maintenant versionné. LA version actuelle est 2.0. L'ancienne version est 1.0.
Tout est transparent pour l'utilisateur. Les vieilles versions sont lisibles mais les nouveaux enregistrements sont dans la version la plus récente.
Changement des conditions aux limites : ajout d'un parametre pour dire si la condition numerique est une valeur ou une formule ou un lien vers une autre entité magic.
Les parametres pour saisir sont maintenant -ccf -ccfi -ccff -ccft -ccfit -ccfft

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 francois 763 void FEM_MAILLAGE::enregistrer(std::ostream& o,double version)
1707 francois 283 {
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 francois 763 (*i)->enregistrer(o,version);
1725 francois 283 }
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 francois 763 maillage.enregistrer(o,VERSIONFICHIER);
2398 francois 283 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