ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_fem.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (10 months, 4 weeks ago) by francois
File size: 38073 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

# User Rev Content
1 francois 1158 //####//------------------------------------------------------------
2     //####//------------------------------------------------------------
3     //####// MAGiC
4     //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5     //####// Departement de Genie Mecanique - UQTR
6     //####//------------------------------------------------------------
7     //####// MAGIC est un projet de recherche de l equipe ERICCA
8     //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9     //####// http://www.uqtr.ca/ericca
10     //####// http://www.uqtr.ca/
11     //####//------------------------------------------------------------
12     //####//------------------------------------------------------------
13     //####//
14     //####// mailleur_fem.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:58:55 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 883
23    
24     #include "gestionversion.h"
25     #include "mailleur_fem.h"
26     #include "mg_gestionnaire.h"
27     #include "fem_segment2.h"
28     #include "fem_mini_segment2.h"
29     #include "fem_segment3.h"
30     #include "fem_triangle3.h"
31     #include "fem_triangle6.h"
32     #include "fem_quadrangle4.h"
33     #include "fem_quadrangle8.h"
34     #include "fem_tetra4.h"
35     #include "fem_tetra10.h"
36     #include "fem_hexa8.h"
37     #include "fem_hexa20.h"
38     #include "fem_penta6.h"
39     #include "fem_penta15.h"
40     #include "fem_graph_noeud.h"
41     #include "fem_maillage_quadratique_outils.h"
42     #include "ot_decalage_parametre.h"
43    
44    
45    
46     MAILLEUR_FEM::MAILLEUR_FEM(OT_CPU* comp):MAILLEUR(false,comp)
47     {
48    
49     }
50    
51     MAILLEUR_FEM::MAILLEUR_FEM(MAILLEUR_FEM &mdd):MAILLEUR(mdd)
52     {
53     ini_param();
54     }
55    
56    
57     MAILLEUR_FEM::~MAILLEUR_FEM()
58     {
59     }
60    
61    
62 couturad 966 int MAILLEUR_FEM::maille(FEM_MAILLAGE* fem,int num)
63 francois 883 {
64     int degre=fem->get_degre();
65     MG_MAILLAGE* maillage=fem->get_mg_maillage();
66     MG_GEOMETRIE* mg_geometrie=maillage->get_mg_geometrie();
67     TPL_MAP_ENTITE<MG_SEGMENT*> mini;
68     if (mg_geometrie!=NULL)
69     if (mg_geometrie->get_nb_mg_poutre()!=0)
70     if (mg_geometrie->get_nb_mg_volume()!=0)
71     recherche_connexion_multidimension(mini,maillage,mg_geometrie);
72     if (degre==1) construire_lineaire(fem,mini,maillage,mg_geometrie);
73     if (degre==2) construire_quadratique(fem,mini,maillage,mg_geometrie);
74     if (num>0) optimise_numerotation(fem);
75     if (num>1) copie_numerotation_opt(fem);
76     BOITE_3D b;
77     int nx,ny,nz;
78     bool structure=maillage->get_param_structure(b,nx,ny,nz);
79     if (structure==true)
80     fem->change_param_structure(b,nx,ny,nz);
81 couturad 966 return OK;
82 francois 883 }
83    
84    
85     void MAILLEUR_FEM::recherche_connexion_multidimension(TPL_MAP_ENTITE<MG_SEGMENT*> &mini,MG_MAILLAGE* maillage,MG_GEOMETRIE* mg_geometrie)
86     {
87     LISTE_MG_NOEUD::iterator it;
88     for (MG_NOEUD* no=maillage->get_premier_noeud(it);no!=NULL;no=maillage->get_suivant_noeud(it))
89     {
90     if ((no->get_lien_hexa()->get_nb()>0) || (no->get_lien_tetra()->get_nb()))
91     if (no->get_lien_segment()->get_nb()>0)
92     {
93     bool estjoint=false;
94     for (int i=0;i<no->get_lien_segment()->get_nb();i++)
95     {
96     LISTE_MG_POUTRE::iterator itp;
97     for (MG_POUTRE* pou=mg_geometrie->get_premier_poutre(itp);pou!=NULL;pou=mg_geometrie->get_suivant_poutre(itp))
98     if (pou->contient_element(no->get_lien_segment()->get(i))) {estjoint=true;}
99     }
100     if (estjoint)
101     {
102     for (int i=0;i<no->get_lien_segment()->get_nb();i++)
103     {
104     bool bord=false;
105     LISTE_MG_POUTRE::iterator itp;
106     int nbele2=no->get_lien_segment()->get(i)->get_lien_triangle()->get_nb();
107     for (int j=0;j<nbele2;j++)
108     if (no->get_lien_segment()->get(i)->get_lien_triangle()->get(j)->get_lien_tetra()->get_nb()>0)
109     if (no->get_lien_segment()->get(i)->get_lien_triangle()->get(j)->get_lien_tetra()->get_nb()<2) bord=true;
110     nbele2=no->get_lien_segment()->get(i)->get_lien_quadrangle()->get_nb();
111     for (int j=0;j<nbele2;j++)
112     if (no->get_lien_segment()->get(i)->get_lien_quadrangle()->get(j)->get_lien_hexa()->get_nb()>0)
113     if (no->get_lien_segment()->get(i)->get_lien_quadrangle()->get(j)->get_lien_hexa()->get_nb()<2) bord=true;
114     if (bord==true) mini.ajouter(no->get_lien_segment()->get(i));
115     }
116     //std::cout << no->get_id() << " est un joint 1D-3D : " << mini.get_nb() << " mini " << std::endl;
117    
118     }
119     }
120    
121     }
122     LISTE_MG_TRIANGLE::iterator itt;
123     for (MG_TRIANGLE* tri=maillage->get_premier_triangle(itt);tri!=NULL;tri=maillage->get_suivant_triangle(itt))
124     if (tri->get_origine()==MAGIC::ORIGINE::SECTION)
125     {
126     mini.ajouter(tri->get_segment1());
127     mini.ajouter(tri->get_segment2());
128     mini.ajouter(tri->get_segment3());
129     }
130    
131     LISTE_MG_QUADRANGLE::iterator itq;
132     for (MG_QUADRANGLE* qua=maillage->get_premier_quadrangle(itq);qua!=NULL;qua=maillage->get_suivant_quadrangle(itq))
133     if (qua->get_origine()==MAGIC::ORIGINE::SECTION)
134     {
135     mini.ajouter(qua->get_segment1());
136     mini.ajouter(qua->get_segment2());
137     mini.ajouter(qua->get_segment3());
138     mini.ajouter(qua->get_segment4());
139     }
140    
141    
142     }
143    
144    
145    
146    
147 couturad 968 int MAILLEUR_FEM::construire_lineaire(FEM_MAILLAGE* fem,TPL_MAP_ENTITE<MG_SEGMENT*> &mini,MG_MAILLAGE* maillage,MG_GEOMETRIE* mg_geometrie)
148 francois 883 {
149     LISTE_MG_NOEUD::iterator it_noeud;
150     MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_noeud);
151     std::vector<FEM_NOEUD*> lstnoeuddirect;
152     unsigned int i=0;
153     while (mgnoeud)
154     {
155     mgnoeud->change_nouveau_numero(i);
156     FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud);
157     femnoeud->change_numero(i+1);
158     i++;
159     fem->ajouter_fem_noeud(femnoeud);
160     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
161     if (mgnoeud->get_lien_topologie()!=NULL)
162     if (mgnoeud->get_lien_topologie()->get_dimension()==0)
163     {
164     FEM_ELEMENT0* femele=new FEM_ELEMENT0(mgnoeud->get_lien_topologie(),mgnoeud,&femnoeud);
165     fem-> ajouter_fem_element0(femele);
166     }
167     mgnoeud=maillage->get_suivant_noeud(it_noeud);
168    
169     }
170     int dimsansgeo=0;
171     if (mg_geometrie==NULL)
172     {
173     if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3;
174     else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2;
175     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
176     }
177     if (mg_geometrie!=NULL)
178     if (strcmp(mg_geometrie->get_type_geometrie(),"VIRTUEL")==0)
179     {
180     if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3;
181     else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2;
182     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
183     }
184    
185     if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==1)))
186     {
187     LISTE_MG_SEGMENT::iterator it_seg;
188     MG_SEGMENT * mgseg = maillage->get_premier_segment(it_seg);
189     while (mgseg)
190     {
191     if (mgseg->get_lien_topologie()!=NULL)
192     if (mgseg->get_lien_topologie()->get_dimension()!=1)
193     {
194     mgseg=maillage->get_suivant_segment(it_seg);
195     continue;
196     }
197     if (mg_geometrie!=NULL)
198     if (mgseg->get_lien_topologie()==NULL)
199     if (dimsansgeo!=1)
200     {
201     mgseg=maillage->get_suivant_segment(it_seg);
202     continue;
203     }
204     FEM_NOEUD *tabnoeud[2];
205     tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()];
206     tabnoeud[1]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()];
207     FEM_SEGMENT2* seg=new FEM_SEGMENT2(mgseg,tabnoeud);
208     fem->ajouter_fem_element1(seg);
209     mgseg=maillage->get_suivant_segment(it_seg);
210     }
211     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itm;
212     for (MG_SEGMENT* mgseg=mini.get_premier(itm);mgseg!=NULL;mgseg=mini.get_suivant(itm))
213     {
214     FEM_NOEUD *tabnoeud[2];
215     tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()];
216     tabnoeud[1]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()];
217     FEM_SEGMENT2* seg=new FEM_MINI_SEGMENT2(mgseg,tabnoeud);
218     fem->ajouter_fem_element1(seg);
219     }
220     }
221     if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==2)))
222     {
223     LISTE_MG_TRIANGLE::iterator it_tri;
224     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
225     while (mgtri)
226     {
227     if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2)
228     {
229     mgtri=maillage->get_suivant_triangle(it_tri);
230     continue;
231     }
232     if (mg_geometrie!=NULL)
233     if (mgtri->get_lien_topologie()==NULL)
234     if (dimsansgeo!=2)
235     {
236     mgtri=maillage->get_suivant_triangle(it_tri);
237     continue;
238     }
239     FEM_NOEUD *tabnoeud[3];
240     tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()];
241     tabnoeud[1]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()];
242     tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()];
243     FEM_TRIANGLE3* tri=new FEM_TRIANGLE3(mgtri,tabnoeud);
244     fem->ajouter_fem_element2(tri);
245     mgtri=maillage->get_suivant_triangle(it_tri);
246     }
247     LISTE_MG_QUADRANGLE::iterator it_quad;
248     MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad);
249     while (mgquad)
250     {
251     if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) {
252     mgquad=maillage->get_suivant_quadrangle(it_quad);
253     continue;
254     }
255     if (mg_geometrie!=NULL)
256     if (mgquad->get_lien_topologie()==NULL)
257     if (dimsansgeo!=2)
258     {
259     mgquad=maillage->get_suivant_quadrangle(it_quad);
260     continue;
261     }
262     FEM_NOEUD *tabnoeud[4];
263     tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()];
264     tabnoeud[1]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()];
265     tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()];
266     tabnoeud[3]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()];
267     FEM_QUADRANGLE4* quad=new FEM_QUADRANGLE4(mgquad,tabnoeud);
268     fem->ajouter_fem_element2(quad);
269     mgquad=maillage->get_suivant_quadrangle(it_quad);
270     }
271     }
272     if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==3)))
273     {
274     LISTE_MG_TETRA::iterator it_tetra;
275     MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
276     while (mgtetra)
277     {
278     FEM_NOEUD *tabnoeud[4];
279     tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()];
280     tabnoeud[1]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()];
281     tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()];
282     tabnoeud[3]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()];
283     FEM_TETRA4* tet=new FEM_TETRA4(mgtetra,tabnoeud);
284     fem->ajouter_fem_element3(tet);
285     mgtetra=maillage->get_suivant_tetra(it_tetra);
286     }
287     LISTE_MG_HEXA::iterator it_hex;
288     MG_HEXA* mghex=maillage->get_premier_hexa(it_hex);
289     while (mghex)
290     {
291     FEM_NOEUD *tabnoeud[8];
292     tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()];
293     tabnoeud[1]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()];
294     tabnoeud[2]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()];
295     tabnoeud[3]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()];
296     tabnoeud[4]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()];
297     tabnoeud[5]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()];
298     tabnoeud[6]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()];
299     tabnoeud[7]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()];
300     FEM_HEXA8* hex=new FEM_HEXA8(mghex,tabnoeud);
301     fem->ajouter_fem_element3(hex);
302     mghex=maillage->get_suivant_hexa(it_hex);
303     }
304     LISTE_MG_PENTA::iterator it_pen;
305     MG_PENTA* mgpen=maillage->get_premier_penta(it_pen);
306     while (mgpen)
307     {
308     FEM_NOEUD *tabnoeud[8];
309     tabnoeud[0]=lstnoeuddirect[mgpen->get_noeud1()->get_nouveau_numero()];
310     tabnoeud[1]=lstnoeuddirect[mgpen->get_noeud2()->get_nouveau_numero()];
311     tabnoeud[2]=lstnoeuddirect[mgpen->get_noeud3()->get_nouveau_numero()];
312     tabnoeud[3]=lstnoeuddirect[mgpen->get_noeud4()->get_nouveau_numero()];
313     tabnoeud[4]=lstnoeuddirect[mgpen->get_noeud5()->get_nouveau_numero()];
314     tabnoeud[5]=lstnoeuddirect[mgpen->get_noeud6()->get_nouveau_numero()];
315     FEM_PENTA6* pen=new FEM_PENTA6(mgpen,tabnoeud);
316     fem->ajouter_fem_element3(pen);
317     mgpen=maillage->get_suivant_penta(it_pen);
318     }
319     }
320 couturad 968 return OK;
321 francois 883 }
322    
323    
324 couturad 968 int MAILLEUR_FEM::recal_element_quadratique(FEM_MAILLAGE* fem)
325 francois 915 {
326 couturad 933 std::map<long,FEM_ELEMENT3*> map_tet_replace;
327     int nbpas=(int)param.get_valeur("Quadratisation_pas");
328     double dismin=param.get_valeur("Quadratisation_dis");
329     int nbpassemax=(int)param.get_valeur("Quadratisation_nbpassemax");
330     int nbpasse=1;
331     for (int passe=0;passe<nbpasse;passe++)
332     {
333     char mess[255];
334     sprintf(mess," Passe %d",passe+1);
335     affiche(mess);
336     LISTE_FEM_ELEMENT3::iterator itele3;
337     bool recale=false;
338     for (FEM_ELEMENT3* tet=fem->get_premier_element3(itele3);tet;tet=fem->get_suivant_element3(itele3))
339     {
340     FEM_MAILLAGE_QUADRATIQUE_OUTILS ou;
341     double dis=ou.get_distorsion2(tet);
342     double jmin=ou.get_jmin(tet);;
343     if ((dis<dismin-1e-12) || (jmin<0.))
344     {
345     OT_VECTEUR_3D vec[10];
346     OT_VECTEUR_3D depart[10];
347 francois 1006 for (int i=1;i<9;i++)
348 francois 915 {
349 francois 1006 if ((i==2) || (i==4)) continue;
350 couturad 933 double* xyzori=tet->get_fem_noeud(i)->get_coord_ori();
351     double* xyz=tet->get_fem_noeud(i)->get_coord();
352     vec[i].change_x(xyz[0]-xyzori[0]);
353     vec[i].change_y(xyz[1]-xyzori[1]);
354     vec[i].change_z(xyz[2]-xyzori[2]);
355     depart[i].change_x(xyz[0]);
356     depart[i].change_y(xyz[1]);
357     depart[i].change_z(xyz[2]);
358     }
359     int pas=0;
360     while ((dis<dismin-1e-12)||(jmin<0.))
361     {
362 francois 1006 for (int i=1;i<9;i++)
363 couturad 933 {
364 francois 1006 if ((i==2) || (i==4)) continue;
365 couturad 933 double* xyz=tet->get_fem_noeud(i)->get_coord();
366     tet->get_fem_noeud(i)->change_x(depart[i].get_x()-pas*1./1./nbpas*vec[i].get_x());
367     tet->get_fem_noeud(i)->change_y(depart[i].get_y()-pas*1./1./nbpas*vec[i].get_y());
368     tet->get_fem_noeud(i)->change_z(depart[i].get_z()-pas*1./1./nbpas*vec[i].get_z());
369     }
370     dis=ou.get_distorsion2(tet);
371     jmin=ou.get_jmin(tet);
372     pas++;
373 francois 1006 /* if(pas>nbpas)
374 couturad 968 {
375     std::cerr << "*** MAILLEUR_FEM::recal_element_quadratique : pas>nbpas ! ***" << std::endl;
376     fem->get_mg_maillage()->get_gestionnaire()->enregistrer("void.magic");
377     return FAIL;
378 francois 1006 }*/
379 couturad 933 }
380     map_tet_replace.insert(std::pair<long,FEM_ELEMENT3*>(tet->get_id(),tet));
381     if (passe==0) sprintf(mess," Tetra %lu replacé à %.2lf%% de sa position optimale\t jmin=%le distorsion=%le",tet->get_id(),(pas-1.)*1./nbpas*100.,jmin,dis);
382     else sprintf(mess," Tetra %lu replacé à %.2lf%% de sa position precedente\t jmin=%le distorsion=%le",tet->get_id(),(pas-1.)*1./nbpas*100.,jmin,dis);
383     affiche(mess);
384     recale=true;
385     }
386     }
387     nbpasse++;
388     if (nbpasse>nbpassemax) nbpasse=nbpassemax;
389     }
390 francois 963 if (fem->get_nb_fem_element3()!=0)
391     {
392 couturad 933 long nb_tetra_replace = map_tet_replace.size();
393     char mess[255];
394     sprintf(mess," Nb tetra replace : %li (%lf%%)",nb_tetra_replace,((double)nb_tetra_replace/fem->get_nb_fem_element3())*(double)100.0);
395     affiche(mess);
396 francois 963 }
397 couturad 968 return OK;
398 francois 915 }
399 francois 883
400    
401 couturad 968 int MAILLEUR_FEM::construire_quadratique(FEM_MAILLAGE* fem,TPL_MAP_ENTITE<MG_SEGMENT*> &mini,MG_MAILLAGE* maillage,MG_GEOMETRIE* mg_geometrie)
402 francois 883 {
403 francois 915 int recal=(int)param.get_valeur("Quadratisation_jmin");
404 francois 883 LISTE_MG_NOEUD::iterator it_nd;
405     MG_NOEUD* mgnoeud=maillage->get_premier_noeud(it_nd);
406     std::vector<FEM_NOEUD*> lstnoeuddirect;
407     unsigned int i=0;
408     while (mgnoeud)
409     {
410     mgnoeud->change_nouveau_numero(i);
411     FEM_NOEUD* femnoeud=new FEM_NOEUD(mgnoeud);
412     femnoeud->change_numero(i+1);
413     i++ ;
414     fem->ajouter_fem_noeud(femnoeud);
415     //mgnoeud=maillage->get_suivant_noeud(it_nd);
416     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
417     if (mgnoeud->get_lien_topologie()!=NULL)
418     if (mgnoeud->get_lien_topologie()->get_dimension()==0)
419     {
420     FEM_ELEMENT0* femele=new FEM_ELEMENT0(mgnoeud->get_lien_topologie(),mgnoeud,&femnoeud);
421     fem->ajouter_fem_element0(femele);
422     }
423     mgnoeud=maillage->get_suivant_noeud(it_nd);
424    
425     }
426     int dimsansgeo=0;
427     if (mg_geometrie==NULL)
428     {
429     if (maillage->get_nb_mg_tetra()!=0) dimsansgeo=3;
430     else if (maillage->get_nb_mg_triangle()!=0) dimsansgeo=2;
431     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
432     }
433 ghazal 1152 bool virtuel =false;
434 francois 883 if (mg_geometrie!=NULL)
435 ghazal 1152 if (strcmp(mg_geometrie->get_type_geometrie(),"VIRTUEL")==0) virtuel=true;
436     if (virtuel)
437 francois 883 {
438     if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3;
439     else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2;
440     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
441     }
442     int nbmgnoeud = maillage->get_nb_mg_noeud();
443    
444     LISTE_MG_SEGMENT::iterator it_seg;
445     MG_SEGMENT* mgseg=maillage->get_premier_segment(it_seg);
446     FEM_MAILLAGE_QUADRATIQUE_OUTILS ou ;
447     i=0;
448     while (mgseg)
449     {
450     mgseg->change_nouveau_numero(i++);
451     MG_NOEUD *noeud1=mgseg->get_noeud1();
452     MG_NOEUD *noeud2=mgseg->get_noeud2();
453     double *xyz1=noeud1->get_coord();
454     double *xyz2=noeud2->get_coord();
455     double xori=0.5*(xyz1[0]+xyz2[0]);
456     double yori=0.5*(xyz1[1]+xyz2[1]);
457     double zori=0.5*(xyz1[2]+xyz2[2]);
458 ghazal 1152 FEM_NOEUD* femnoeud;
459 francois 883 if (mgseg->get_lien_topologie()!=NULL)
460     if (mgseg->get_lien_topologie()->get_dimension()==1)
461     {
462 ghazal 1152 double L3=0,L4=0,j=0.0;
463     double xyz[3]={xori,yori,zori};
464     if (!virtuel)
465     {
466     MG_ARETE* arete=(MG_ARETE*)(mgseg->get_lien_topologie());
467 francois 883 double t1,t2,tm;
468     arete->inverser(t1,xyz1);
469     arete->inverser(t2,xyz2);
470     if (arete->get_courbe()->est_periodique())
471     if (t1>t2) t2=t2+arete->get_courbe()->get_periode();
472     double t=0.5*(t1+t2);
473 ghazal 1152 double xyz3[3];
474 francois 883 arete->evaluer(t,xyz);
475     double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2);
476     double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2);
477     if (L1/L2 >1.01)
478     {
479     do
480     {
481     j+=0.0001;
482     tm=(-t+t1)*j+t;
483     arete->evaluer(tm,xyz3);
484     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
485     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
486    
487     }while (0.5-(L4/(L3+L4))>=0.0001);
488    
489     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori);
490     }
491    
492 ghazal 1152 if (L2/L1 >1.01)
493 francois 883 {
494     do
495     {
496     j+=0.0001;
497     tm=(-t+t2)*j+t;
498     arete->evaluer(tm,xyz3);
499     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
500     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
501    
502     }while (0.5-(L3/(L3+L4))>=0.0001);
503    
504     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori);
505     }
506 ghazal 1152 }
507     if(j == 0)
508 francois 883 {
509     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2],xori,yori,zori);
510     }
511    
512     }
513     if (mgseg->get_lien_topologie()!=NULL)
514     if (mgseg->get_lien_topologie()->get_dimension()==2)
515 ghazal 1152 {
516     double L3=0,L4=0,j=0;
517     double xyz[3]={xori,yori,zori};
518     if (!virtuel)
519     {
520 francois 883 MG_FACE* face=(MG_FACE*)(mgseg->get_lien_topologie());
521     double uv1[2],uv2[2];
522     OT_DECALAGE_PARAMETRE decalage(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
523     face->inverser(uv1,xyz1);
524     face->inverser(uv2,xyz2);
525     if (face->get_surface()->est_periodique_u()==1)
526     {
527     double eps=1e-10*face->get_surface()->get_periode_u();
528     if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u();
529     if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u();
530     if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u();
531     if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u();
532     }
533     if (face->get_surface()->est_periodique_v()==1)
534     {
535     double eps=1e-10*face->get_surface()->get_periode_v();
536     if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v();
537     if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v();
538     if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v();
539     if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v();
540     }
541 francois 1095 double du=decalage.calcul_decalage_parametre_u(uv1[0]);
542 francois 883 double dv=decalage.calcul_decalage_parametre_v(uv1[1]);
543     double u1=decalage.decalage_parametre_u(uv1[0],du);
544     double v1=decalage.decalage_parametre_v(uv1[1],dv);
545     double u2=decalage.decalage_parametre_u(uv2[0],du);
546     double v2=decalage.decalage_parametre_v(uv2[1],dv);
547 ghazal 1152 double uv[2],uv3[2],xyz3[3];
548 francois 883 double milieu[3];
549     milieu[0]=0.5*(xyz1[0]+xyz2[0]);
550     milieu[1]=0.5*(xyz1[1]+xyz2[1]);
551     milieu[2]=0.5*(xyz1[2]+xyz2[2]);
552 francois 1095 OT_VECTEUR_3D vec(xyz1,xyz2);
553     face->inverser(uv,milieu,0.25*vec.get_longueur());
554     face->evaluer(uv,xyz);
555     double u=decalage.decalage_parametre_u(uv[0],du);
556     double v=decalage.decalage_parametre_v(uv[1],dv);
557    
558 francois 883 double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2);
559     double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2);
560     if (L1/L2 >1.01)
561     {
562     do
563     {
564     j+=0.0001;
565 francois 1095 if ((u1<u) && (u2<u) && (u1<u2)) u1=u1+face->get_surface()->get_periode_u();
566     if ((v1<v) && (v2<v) && (v1<v2)) v1=v1+face->get_surface()->get_periode_v();
567 francois 883
568 francois 1095 double u3=(-u+u1)*j+u;
569     double v3=(-v+v1)*j+v;
570     uv3[0]=decalage.decalage_parametre_u(u3,-du);
571     uv3[1]=decalage.decalage_parametre_v(v3,-dv);
572 francois 883 face->evaluer(uv3,xyz3);
573     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
574     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
575    
576     }while ( 0.5-(L4/(L3+L4)) >=0.0001);
577    
578     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori);
579     }
580    
581     if (L2/L1 >1.01)
582     {
583     do
584     {
585     j+=0.0001;
586 francois 1095 if ((u1<u) && (u2<u) && (u2<u1)) u2=u2+face->get_surface()->get_periode_u();
587     if ((v1<v) && (v2<v) && (v2<v1)) v2=v2+face->get_surface()->get_periode_v();
588 francois 883
589 francois 1095 double u3=(-u+u2)*j+u;
590     double v3=(-v+v2)*j+v;
591     uv3[0]=decalage.decalage_parametre_u(u3,-du);
592     uv3[1]=decalage.decalage_parametre_v(v3,-dv);
593    
594 francois 883 face->evaluer(uv3,xyz3);
595     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
596     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
597    
598     }while (0.5-(L3/(L3+L4)) >=0.0001);
599    
600     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori);
601     }
602 ghazal 1152 }
603 francois 883 if (j == 0.0)
604     {
605     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2],xori,yori,zori);
606     }
607    
608     }
609     if (mgseg->get_lien_topologie()!=NULL)
610     {
611     if (mgseg->get_lien_topologie()->get_dimension()==3)
612     {
613     double x=0.5*(xyz1[0]+xyz2[0]);
614     double y=0.5*(xyz1[1]+xyz2[1]);
615     double z=0.5*(xyz1[2]+xyz2[2]);
616     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z,x,y,z);
617     }
618     }
619     else
620     {
621     double x=0.5*(xyz1[0]+xyz2[0]);
622     double y=0.5*(xyz1[1]+xyz2[1]);
623     double z=0.5*(xyz1[2]+xyz2[2]);
624     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z,x,y,z);
625     }
626     femnoeud->change_numero(i+nbmgnoeud+1);
627     fem->ajouter_fem_noeud(femnoeud);
628     mgseg=maillage->get_suivant_segment(it_seg);
629     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
630     }
631    
632     if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==1)))
633     {
634    
635     mgseg=maillage->get_premier_segment(it_seg);
636     while (mgseg)
637     {
638     if (mgseg->get_lien_topologie()!=NULL)
639     if (mgseg->get_lien_topologie()->get_dimension()!=1)
640     {
641     mgseg=maillage->get_suivant_segment(it_seg);
642     continue;
643     }
644     if (mg_geometrie!=NULL)
645     if (mgseg->get_lien_topologie()==NULL)
646     if (dimsansgeo!=1)
647     {
648     mgseg=maillage->get_suivant_segment(it_seg);
649     continue;
650     }
651     FEM_NOEUD *tabnoeud[3];
652     tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()];
653     tabnoeud[1]=lstnoeuddirect[mgseg->get_nouveau_numero()+nbmgnoeud];
654     tabnoeud[2]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()];
655     FEM_SEGMENT3* seg=new FEM_SEGMENT3(mgseg,tabnoeud);
656     fem->ajouter_fem_element1(seg);
657     mgseg=maillage->get_suivant_segment(it_seg);
658     }
659     }
660     if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==2)))
661     {
662     LISTE_MG_TRIANGLE::iterator it_tri;
663     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
664     while (mgtri)
665     {
666     if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2)
667     {
668     mgtri=maillage->get_suivant_triangle(it_tri);
669     continue;
670     }
671     if (mg_geometrie!=NULL)
672     if (mgtri->get_lien_topologie()==NULL)
673     if (dimsansgeo!=2)
674     {
675     mgtri=maillage->get_suivant_triangle(it_tri);
676     continue;
677     }
678     FEM_NOEUD *tabnoeud[6];
679     tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()];
680     tabnoeud[1]=lstnoeuddirect[mgtri->get_segment1()->get_nouveau_numero()+nbmgnoeud];
681     tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()];
682     tabnoeud[3]=lstnoeuddirect[mgtri->get_segment2()->get_nouveau_numero()+nbmgnoeud];
683     tabnoeud[4]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()];
684     tabnoeud[5]=lstnoeuddirect[mgtri->get_segment3()->get_nouveau_numero()+nbmgnoeud];
685     FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(mgtri,tabnoeud);
686     fem->ajouter_fem_element2(tri);
687     mgtri=maillage->get_suivant_triangle(it_tri);
688     }
689     LISTE_MG_QUADRANGLE::iterator it_quad;
690     MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad);
691     while (mgquad)
692     {
693     if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) {
694     mgquad=maillage->get_suivant_quadrangle(it_quad);
695     continue;
696     }
697     if (mg_geometrie!=NULL)
698     if (mgquad->get_lien_topologie()==NULL)
699     if (dimsansgeo!=2)
700     {
701     mgquad=maillage->get_suivant_quadrangle(it_quad);
702     continue;
703     }
704     FEM_NOEUD *tabnoeud[8];
705     tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()];
706     tabnoeud[1]=lstnoeuddirect[mgquad->get_segment1()->get_nouveau_numero()+nbmgnoeud];
707     tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()];
708     tabnoeud[3]=lstnoeuddirect[mgquad->get_segment2()->get_nouveau_numero()+nbmgnoeud];
709     tabnoeud[4]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()];
710     tabnoeud[5]=lstnoeuddirect[mgquad->get_segment3()->get_nouveau_numero()+nbmgnoeud];
711     tabnoeud[6]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()];
712     tabnoeud[7]=lstnoeuddirect[mgquad->get_segment4()->get_nouveau_numero()+nbmgnoeud];
713     FEM_QUADRANGLE8* quad=new FEM_QUADRANGLE8(mgquad,tabnoeud);
714     fem->ajouter_fem_element2(quad);
715     mgquad=maillage->get_suivant_quadrangle(it_quad);
716     }
717     }
718     if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==3)))
719     {
720    
721 francois 915 LISTE_MG_TETRA::iterator it_tetra;
722 francois 883 MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
723     while (mgtetra)
724     {
725     FEM_NOEUD *tabnoeud[10];
726     tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()];
727     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
728     tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()];
729     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
730     tabnoeud[4]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()];
731     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
732     tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
733     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
734     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
735     tabnoeud[9]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()];
736     FEM_TETRA10* tet=new FEM_TETRA10(mgtetra,tabnoeud);
737     fem->ajouter_fem_element3(tet);
738 francois 915 mgtetra=maillage->get_suivant_tetra(it_tetra);
739     }
740 couturad 968 if (recal==1) if(recal_element_quadratique(fem)==FAIL) return FAIL;
741 francois 915
742 francois 883
743 francois 915
744 francois 883 LISTE_MG_HEXA::iterator it_hexa;
745     MG_HEXA* mghex=maillage->get_premier_hexa(it_hexa);
746     while (mghex)
747     {
748     FEM_NOEUD *tabnoeud[20];
749     tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()];
750     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
751     tabnoeud[2]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()];
752     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
753     tabnoeud[4]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()];
754     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
755     tabnoeud[6]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()];
756     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
757     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
758     tabnoeud[9]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
759     tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
760     tabnoeud[11]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
761     tabnoeud[12]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()];
762     tabnoeud[13]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud5()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
763     tabnoeud[14]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()];
764     tabnoeud[15]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud6()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
765     tabnoeud[16]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()];
766     tabnoeud[17]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud7()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
767     tabnoeud[18]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()];
768     tabnoeud[19]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud8()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
769     FEM_HEXA20* hex=new FEM_HEXA20(mghex,tabnoeud);
770     fem->ajouter_fem_element3(hex);
771     mghex=maillage->get_suivant_hexa(it_hexa);
772     }
773     LISTE_MG_PENTA::iterator it_pen;
774     MG_PENTA* mgpen=maillage->get_premier_penta(it_pen);
775     while (mgpen)
776     {
777     FEM_NOEUD *tabnoeud[15];
778     tabnoeud[0]=lstnoeuddirect[mgpen->get_noeud1()->get_nouveau_numero()];
779     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud1()->get_id(),mgpen->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
780     tabnoeud[2]=lstnoeuddirect[mgpen->get_noeud2()->get_nouveau_numero()];
781     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud2()->get_id(),mgpen->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
782     tabnoeud[4]=lstnoeuddirect[mgpen->get_noeud3()->get_nouveau_numero()];
783     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud3()->get_id(),mgpen->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
784     tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud1()->get_id(),mgpen->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
785     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud2()->get_id(),mgpen->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
786     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud3()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
787     tabnoeud[9]=lstnoeuddirect[mgpen->get_noeud4()->get_nouveau_numero()];
788     tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud4()->get_id(),mgpen->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
789     tabnoeud[11]=lstnoeuddirect[mgpen->get_noeud5()->get_nouveau_numero()];
790     tabnoeud[12]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud5()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
791     tabnoeud[13]=lstnoeuddirect[mgpen->get_noeud6()->get_nouveau_numero()];
792     tabnoeud[14]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud4()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
793     FEM_PENTA15* pen=new FEM_PENTA15(mgpen,tabnoeud);
794     fem->ajouter_fem_element3(pen);
795     mgpen=maillage->get_suivant_penta(it_pen);
796     }
797     }
798 couturad 968 return OK;
799 francois 883 }
800    
801    
802    
803    
804     void MAILLEUR_FEM::optimise_numerotation(FEM_MAILLAGE* fem)
805     {
806     FEM_NOEUD* noeud=fem->get_fem_noeud(0);
807     FEM_GRAPH_NOEUD *graph;
808     graph=new FEM_GRAPH_NOEUD(noeud,fem);
809     int e=graph->get_excentricite();
810     TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau();
811     int nbdernierniveau=dernierniveau.get_nb();
812     for (int i=0;i<nbdernierniveau;i++)
813     {
814     FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),fem);
815     int etmp=graphtmp->get_excentricite();
816     if (etmp>e)
817     {
818     delete graph;
819     graph=graphtmp;
820     dernierniveau=graph->get_dernier_niveau();
821     nbdernierniveau=dernierniveau.get_nb();
822     i=-1;
823     e=etmp;
824     }
825     else delete graphtmp;
826     }
827     int numero=fem->get_nb_fem_noeud();
828     for (int i=0;i<e+1;i++)
829     {
830     TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i);
831     int nbnoeud=niveau.get_nb();
832     for (int j=0;j<nbnoeud;j++)
833     {
834     FEM_NOEUD* noeud=niveau.get(j);
835     noeud->change_numero_opt(numero);
836     numero--;
837     }
838     }
839    
840    
841     delete graph;
842     }
843    
844    
845     void MAILLEUR_FEM::copie_numerotation_opt(FEM_MAILLAGE* fem)
846     {
847     int nbnoeud=fem->get_nb_fem_noeud();
848     for (int i=0;i<nbnoeud;i++)
849     {
850     FEM_NOEUD* noeud=fem->get_fem_noeud(i);
851     noeud->change_numero(noeud->get_numero_opt());
852     }
853    
854     }
855