ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_fem.cpp
Revision: 968
Committed: Sun Sep 16 15:27:49 2018 UTC (6 years, 7 months ago) by couturad
File size: 37492 byte(s)
Log Message:
Ajout d'une condition de sortie et d'un renvoi d'erreur pour le mailleur FEM.
Subdivision des fichiers mstruct_analyse.h/.cpp en sous fichiers pour une meilleure lisibilite.
Ajout d'une analyse des modules d'elasticite.
Ajout d'une analyse de l'energie.
Reconfiguration du main de microstructure.exe (suppression d'actions obsolètes).
Reconfiguration des fichiers generer_nb_ves, post_process.

File Contents

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