ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 767
Committed: Wed Dec 23 20:52:36 2015 UTC (9 years, 4 months ago) by francois
File size: 93498 byte(s)
Log Message:
calcul sur des structures mixtes volume poutre.
cela fonctionne pour l'instant pour des blocages appliquées uniquement aux mailles 3D et pour des résultats aux mailles 3D uniquement aux noeuds

File Contents

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