ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/fem_maillage.cpp
Revision: 876
Committed: Fri Mar 24 19:40:04 2017 UTC (8 years, 1 month ago) by francois
File size: 97293 byte(s)
Log Message:
ajouts des elements pentaedriques dans le mg_maillage et dans le fem_maillage (6 et 15 noeuds).
+notion sur les coquilles minces (incomplet)
+operations sur les fem_solution

-->a venir reste sur les coquilles minces + mailleur coquille mince

File Contents

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