ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 605
Committed: Wed Nov 26 22:20:52 2014 UTC (10 years, 5 months ago) by francois
File size: 88033 byte(s)
Log Message:
bug maillage quadratique avec les elment_noeud resolu

File Contents

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