ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_fem.cpp
Revision: 1152
Committed: Mon Jun 3 20:21:02 2024 UTC (11 months, 1 week ago) by ghazal
File size: 38010 byte(s)
Log Message:
Optimisateur3D pour geometrie virtuelle
quadratisation pour geometrie virtuelle

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 francois 1006 for (int i=1;i<9;i++)
349 francois 915 {
350 francois 1006 if ((i==2) || (i==4)) continue;
351 couturad 933 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 francois 1006 for (int i=1;i<9;i++)
364 couturad 933 {
365 francois 1006 if ((i==2) || (i==4)) continue;
366 couturad 933 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 francois 1006 /* if(pas>nbpas)
375 couturad 968 {
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 francois 1006 }*/
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 ghazal 1152 bool virtuel =false;
435 francois 883 if (mg_geometrie!=NULL)
436 ghazal 1152 if (strcmp(mg_geometrie->get_type_geometrie(),"VIRTUEL")==0) virtuel=true;
437     if (virtuel)
438 francois 883 {
439     if (maillage->get_nb_mg_tetra()+maillage->get_nb_mg_hexa()!=0) dimsansgeo=3;
440     else if (maillage->get_nb_mg_triangle()+maillage->get_nb_mg_quadrangle()!=0) dimsansgeo=2;
441     else if (maillage->get_nb_mg_segment()!=0) dimsansgeo=1;
442     }
443     int nbmgnoeud = maillage->get_nb_mg_noeud();
444    
445     LISTE_MG_SEGMENT::iterator it_seg;
446     MG_SEGMENT* mgseg=maillage->get_premier_segment(it_seg);
447     FEM_MAILLAGE_QUADRATIQUE_OUTILS ou ;
448     i=0;
449     while (mgseg)
450     {
451     mgseg->change_nouveau_numero(i++);
452     MG_NOEUD *noeud1=mgseg->get_noeud1();
453     MG_NOEUD *noeud2=mgseg->get_noeud2();
454     double *xyz1=noeud1->get_coord();
455     double *xyz2=noeud2->get_coord();
456     double xori=0.5*(xyz1[0]+xyz2[0]);
457     double yori=0.5*(xyz1[1]+xyz2[1]);
458     double zori=0.5*(xyz1[2]+xyz2[2]);
459 ghazal 1152 FEM_NOEUD* femnoeud;
460 francois 883 if (mgseg->get_lien_topologie()!=NULL)
461     if (mgseg->get_lien_topologie()->get_dimension()==1)
462     {
463 ghazal 1152 double L3=0,L4=0,j=0.0;
464     double xyz[3]={xori,yori,zori};
465     if (!virtuel)
466     {
467     MG_ARETE* arete=(MG_ARETE*)(mgseg->get_lien_topologie());
468 francois 883 double t1,t2,tm;
469     arete->inverser(t1,xyz1);
470     arete->inverser(t2,xyz2);
471     if (arete->get_courbe()->est_periodique())
472     if (t1>t2) t2=t2+arete->get_courbe()->get_periode();
473     double t=0.5*(t1+t2);
474 ghazal 1152 double xyz3[3];
475 francois 883 arete->evaluer(t,xyz);
476     double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2);
477     double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2);
478     if (L1/L2 >1.01)
479     {
480     do
481     {
482     j+=0.0001;
483     tm=(-t+t1)*j+t;
484     arete->evaluer(tm,xyz3);
485     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
486     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
487    
488     }while (0.5-(L4/(L3+L4))>=0.0001);
489    
490     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori);
491     }
492    
493 ghazal 1152 if (L2/L1 >1.01)
494 francois 883 {
495     do
496     {
497     j+=0.0001;
498     tm=(-t+t2)*j+t;
499     arete->evaluer(tm,xyz3);
500     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
501     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
502    
503     }while (0.5-(L3/(L3+L4))>=0.0001);
504    
505     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori);
506     }
507 ghazal 1152 }
508     if(j == 0)
509 francois 883 {
510     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2],xori,yori,zori);
511     }
512    
513     }
514     if (mgseg->get_lien_topologie()!=NULL)
515     if (mgseg->get_lien_topologie()->get_dimension()==2)
516 ghazal 1152 {
517     double L3=0,L4=0,j=0;
518     double xyz[3]={xori,yori,zori};
519     if (!virtuel)
520     {
521 francois 883 MG_FACE* face=(MG_FACE*)(mgseg->get_lien_topologie());
522     double uv1[2],uv2[2];
523     OT_DECALAGE_PARAMETRE decalage(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
524     face->inverser(uv1,xyz1);
525     face->inverser(uv2,xyz2);
526     if (face->get_surface()->est_periodique_u()==1)
527     {
528     double eps=1e-10*face->get_surface()->get_periode_u();
529     if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u();
530     if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u();
531     if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u();
532     if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u();
533     }
534     if (face->get_surface()->est_periodique_v()==1)
535     {
536     double eps=1e-10*face->get_surface()->get_periode_v();
537     if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v();
538     if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v();
539     if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v();
540     if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v();
541     }
542 francois 1095 double du=decalage.calcul_decalage_parametre_u(uv1[0]);
543 francois 883 double dv=decalage.calcul_decalage_parametre_v(uv1[1]);
544     double u1=decalage.decalage_parametre_u(uv1[0],du);
545     double v1=decalage.decalage_parametre_v(uv1[1],dv);
546     double u2=decalage.decalage_parametre_u(uv2[0],du);
547     double v2=decalage.decalage_parametre_v(uv2[1],dv);
548 ghazal 1152 double uv[2],uv3[2],xyz3[3];
549 francois 883 double milieu[3];
550     milieu[0]=0.5*(xyz1[0]+xyz2[0]);
551     milieu[1]=0.5*(xyz1[1]+xyz2[1]);
552     milieu[2]=0.5*(xyz1[2]+xyz2[2]);
553 francois 1095 OT_VECTEUR_3D vec(xyz1,xyz2);
554     face->inverser(uv,milieu,0.25*vec.get_longueur());
555     face->evaluer(uv,xyz);
556     double u=decalage.decalage_parametre_u(uv[0],du);
557     double v=decalage.decalage_parametre_v(uv[1],dv);
558    
559 francois 883 double L1= ou.get_distance_curviligne(0,0.5,xyz1,xyz,xyz2);
560     double L2= ou.get_distance_curviligne(0.5,1,xyz1,xyz,xyz2);
561     if (L1/L2 >1.01)
562     {
563     do
564     {
565     j+=0.0001;
566 francois 1095 if ((u1<u) && (u2<u) && (u1<u2)) u1=u1+face->get_surface()->get_periode_u();
567     if ((v1<v) && (v2<v) && (v1<v2)) v1=v1+face->get_surface()->get_periode_v();
568 francois 883
569 francois 1095 double u3=(-u+u1)*j+u;
570     double v3=(-v+v1)*j+v;
571     uv3[0]=decalage.decalage_parametre_u(u3,-du);
572     uv3[1]=decalage.decalage_parametre_v(v3,-dv);
573 francois 883 face->evaluer(uv3,xyz3);
574     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
575     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
576    
577     }while ( 0.5-(L4/(L3+L4)) >=0.0001);
578    
579     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori);
580     }
581    
582     if (L2/L1 >1.01)
583     {
584     do
585     {
586     j+=0.0001;
587 francois 1095 if ((u1<u) && (u2<u) && (u2<u1)) u2=u2+face->get_surface()->get_periode_u();
588     if ((v1<v) && (v2<v) && (v2<v1)) v2=v2+face->get_surface()->get_periode_v();
589 francois 883
590 francois 1095 double u3=(-u+u2)*j+u;
591     double v3=(-v+v2)*j+v;
592     uv3[0]=decalage.decalage_parametre_u(u3,-du);
593     uv3[1]=decalage.decalage_parametre_v(v3,-dv);
594    
595 francois 883 face->evaluer(uv3,xyz3);
596     L3= ou.get_distance_curviligne(0,0.5,xyz1,xyz3,xyz2);
597     L4= ou.get_distance_curviligne(0.5,1,xyz1,xyz3,xyz2);
598    
599     }while (0.5-(L3/(L3+L4)) >=0.0001);
600    
601     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz3[0],xyz3[1],xyz3[2],xori,yori,zori);
602     }
603 ghazal 1152 }
604 francois 883 if (j == 0.0)
605     {
606     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),xyz[0],xyz[1],xyz[2],xori,yori,zori);
607     }
608    
609     }
610     if (mgseg->get_lien_topologie()!=NULL)
611     {
612     if (mgseg->get_lien_topologie()->get_dimension()==3)
613     {
614     double x=0.5*(xyz1[0]+xyz2[0]);
615     double y=0.5*(xyz1[1]+xyz2[1]);
616     double z=0.5*(xyz1[2]+xyz2[2]);
617     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z,x,y,z);
618     }
619     }
620     else
621     {
622     double x=0.5*(xyz1[0]+xyz2[0]);
623     double y=0.5*(xyz1[1]+xyz2[1]);
624     double z=0.5*(xyz1[2]+xyz2[2]);
625     femnoeud= new FEM_NOEUD(mgseg->get_lien_topologie(),x,y,z,x,y,z);
626     }
627     femnoeud->change_numero(i+nbmgnoeud+1);
628     fem->ajouter_fem_noeud(femnoeud);
629     mgseg=maillage->get_suivant_segment(it_seg);
630     lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
631     }
632    
633     if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==1)))
634     {
635    
636     mgseg=maillage->get_premier_segment(it_seg);
637     while (mgseg)
638     {
639     if (mgseg->get_lien_topologie()!=NULL)
640     if (mgseg->get_lien_topologie()->get_dimension()!=1)
641     {
642     mgseg=maillage->get_suivant_segment(it_seg);
643     continue;
644     }
645     if (mg_geometrie!=NULL)
646     if (mgseg->get_lien_topologie()==NULL)
647     if (dimsansgeo!=1)
648     {
649     mgseg=maillage->get_suivant_segment(it_seg);
650     continue;
651     }
652     FEM_NOEUD *tabnoeud[3];
653     tabnoeud[0]=lstnoeuddirect[mgseg->get_noeud1()->get_nouveau_numero()];
654     tabnoeud[1]=lstnoeuddirect[mgseg->get_nouveau_numero()+nbmgnoeud];
655     tabnoeud[2]=lstnoeuddirect[mgseg->get_noeud2()->get_nouveau_numero()];
656     FEM_SEGMENT3* seg=new FEM_SEGMENT3(mgseg,tabnoeud);
657     fem->ajouter_fem_element1(seg);
658     mgseg=maillage->get_suivant_segment(it_seg);
659     }
660     }
661     if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==2)))
662     {
663     LISTE_MG_TRIANGLE::iterator it_tri;
664     MG_TRIANGLE* mgtri=maillage->get_premier_triangle(it_tri);
665     while (mgtri)
666     {
667     if (mgtri->get_lien_topologie()!=NULL) if (mgtri->get_lien_topologie()->get_dimension()!=2)
668     {
669     mgtri=maillage->get_suivant_triangle(it_tri);
670     continue;
671     }
672     if (mg_geometrie!=NULL)
673     if (mgtri->get_lien_topologie()==NULL)
674     if (dimsansgeo!=2)
675     {
676     mgtri=maillage->get_suivant_triangle(it_tri);
677     continue;
678     }
679     FEM_NOEUD *tabnoeud[6];
680     tabnoeud[0]=lstnoeuddirect[mgtri->get_noeud1()->get_nouveau_numero()];
681     tabnoeud[1]=lstnoeuddirect[mgtri->get_segment1()->get_nouveau_numero()+nbmgnoeud];
682     tabnoeud[2]=lstnoeuddirect[mgtri->get_noeud2()->get_nouveau_numero()];
683     tabnoeud[3]=lstnoeuddirect[mgtri->get_segment2()->get_nouveau_numero()+nbmgnoeud];
684     tabnoeud[4]=lstnoeuddirect[mgtri->get_noeud3()->get_nouveau_numero()];
685     tabnoeud[5]=lstnoeuddirect[mgtri->get_segment3()->get_nouveau_numero()+nbmgnoeud];
686     FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(mgtri,tabnoeud);
687     fem->ajouter_fem_element2(tri);
688     mgtri=maillage->get_suivant_triangle(it_tri);
689     }
690     LISTE_MG_QUADRANGLE::iterator it_quad;
691     MG_QUADRANGLE* mgquad=maillage->get_premier_quadrangle(it_quad);
692     while (mgquad)
693     {
694     if (mgquad->get_lien_topologie()!=NULL) if (mgquad->get_lien_topologie()->get_dimension()!=2) {
695     mgquad=maillage->get_suivant_quadrangle(it_quad);
696     continue;
697     }
698     if (mg_geometrie!=NULL)
699     if (mgquad->get_lien_topologie()==NULL)
700     if (dimsansgeo!=2)
701     {
702     mgquad=maillage->get_suivant_quadrangle(it_quad);
703     continue;
704     }
705     FEM_NOEUD *tabnoeud[8];
706     tabnoeud[0]=lstnoeuddirect[mgquad->get_noeud1()->get_nouveau_numero()];
707     tabnoeud[1]=lstnoeuddirect[mgquad->get_segment1()->get_nouveau_numero()+nbmgnoeud];
708     tabnoeud[2]=lstnoeuddirect[mgquad->get_noeud2()->get_nouveau_numero()];
709     tabnoeud[3]=lstnoeuddirect[mgquad->get_segment2()->get_nouveau_numero()+nbmgnoeud];
710     tabnoeud[4]=lstnoeuddirect[mgquad->get_noeud3()->get_nouveau_numero()];
711     tabnoeud[5]=lstnoeuddirect[mgquad->get_segment3()->get_nouveau_numero()+nbmgnoeud];
712     tabnoeud[6]=lstnoeuddirect[mgquad->get_noeud4()->get_nouveau_numero()];
713     tabnoeud[7]=lstnoeuddirect[mgquad->get_segment4()->get_nouveau_numero()+nbmgnoeud];
714     FEM_QUADRANGLE8* quad=new FEM_QUADRANGLE8(mgquad,tabnoeud);
715     fem->ajouter_fem_element2(quad);
716     mgquad=maillage->get_suivant_quadrangle(it_quad);
717     }
718     }
719     if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==3)))
720     {
721    
722 francois 915 LISTE_MG_TETRA::iterator it_tetra;
723 francois 883 MG_TETRA* mgtetra=maillage->get_premier_tetra(it_tetra);
724     while (mgtetra)
725     {
726     FEM_NOEUD *tabnoeud[10];
727     tabnoeud[0]=lstnoeuddirect[mgtetra->get_noeud1()->get_nouveau_numero()];
728     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
729     tabnoeud[2]=lstnoeuddirect[mgtetra->get_noeud2()->get_nouveau_numero()];
730     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
731     tabnoeud[4]=lstnoeuddirect[mgtetra->get_noeud3()->get_nouveau_numero()];
732     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
733     tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud1()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
734     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud2()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
735     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgtetra->get_noeud3()->get_id(),mgtetra->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
736     tabnoeud[9]=lstnoeuddirect[mgtetra->get_noeud4()->get_nouveau_numero()];
737     FEM_TETRA10* tet=new FEM_TETRA10(mgtetra,tabnoeud);
738     fem->ajouter_fem_element3(tet);
739 francois 915 mgtetra=maillage->get_suivant_tetra(it_tetra);
740     }
741 couturad 968 if (recal==1) if(recal_element_quadratique(fem)==FAIL) return FAIL;
742 francois 915
743 francois 883
744 francois 915
745 francois 883 LISTE_MG_HEXA::iterator it_hexa;
746     MG_HEXA* mghex=maillage->get_premier_hexa(it_hexa);
747     while (mghex)
748     {
749     FEM_NOEUD *tabnoeud[20];
750     tabnoeud[0]=lstnoeuddirect[mghex->get_noeud1()->get_nouveau_numero()];
751     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
752     tabnoeud[2]=lstnoeuddirect[mghex->get_noeud2()->get_nouveau_numero()];
753     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
754     tabnoeud[4]=lstnoeuddirect[mghex->get_noeud3()->get_nouveau_numero()];
755     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
756     tabnoeud[6]=lstnoeuddirect[mghex->get_noeud4()->get_nouveau_numero()];
757     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
758     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud1()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
759     tabnoeud[9]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud2()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
760     tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud3()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
761     tabnoeud[11]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud4()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
762     tabnoeud[12]=lstnoeuddirect[mghex->get_noeud5()->get_nouveau_numero()];
763     tabnoeud[13]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud5()->get_id(),mghex->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
764     tabnoeud[14]=lstnoeuddirect[mghex->get_noeud6()->get_nouveau_numero()];
765     tabnoeud[15]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud6()->get_id(),mghex->get_noeud7()->get_id())->get_nouveau_numero()+nbmgnoeud];
766     tabnoeud[16]=lstnoeuddirect[mghex->get_noeud7()->get_nouveau_numero()];
767     tabnoeud[17]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud7()->get_id(),mghex->get_noeud8()->get_id())->get_nouveau_numero()+nbmgnoeud];
768     tabnoeud[18]=lstnoeuddirect[mghex->get_noeud8()->get_nouveau_numero()];
769     tabnoeud[19]=lstnoeuddirect[maillage->get_mg_segment(mghex->get_noeud8()->get_id(),mghex->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
770     FEM_HEXA20* hex=new FEM_HEXA20(mghex,tabnoeud);
771     fem->ajouter_fem_element3(hex);
772     mghex=maillage->get_suivant_hexa(it_hexa);
773     }
774     LISTE_MG_PENTA::iterator it_pen;
775     MG_PENTA* mgpen=maillage->get_premier_penta(it_pen);
776     while (mgpen)
777     {
778     FEM_NOEUD *tabnoeud[15];
779     tabnoeud[0]=lstnoeuddirect[mgpen->get_noeud1()->get_nouveau_numero()];
780     tabnoeud[1]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud1()->get_id(),mgpen->get_noeud2()->get_id())->get_nouveau_numero()+nbmgnoeud];
781     tabnoeud[2]=lstnoeuddirect[mgpen->get_noeud2()->get_nouveau_numero()];
782     tabnoeud[3]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud2()->get_id(),mgpen->get_noeud3()->get_id())->get_nouveau_numero()+nbmgnoeud];
783     tabnoeud[4]=lstnoeuddirect[mgpen->get_noeud3()->get_nouveau_numero()];
784     tabnoeud[5]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud3()->get_id(),mgpen->get_noeud1()->get_id())->get_nouveau_numero()+nbmgnoeud];
785     tabnoeud[6]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud1()->get_id(),mgpen->get_noeud4()->get_id())->get_nouveau_numero()+nbmgnoeud];
786     tabnoeud[7]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud2()->get_id(),mgpen->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
787     tabnoeud[8]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud3()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
788     tabnoeud[9]=lstnoeuddirect[mgpen->get_noeud4()->get_nouveau_numero()];
789     tabnoeud[10]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud4()->get_id(),mgpen->get_noeud5()->get_id())->get_nouveau_numero()+nbmgnoeud];
790     tabnoeud[11]=lstnoeuddirect[mgpen->get_noeud5()->get_nouveau_numero()];
791     tabnoeud[12]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud5()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
792     tabnoeud[13]=lstnoeuddirect[mgpen->get_noeud6()->get_nouveau_numero()];
793     tabnoeud[14]=lstnoeuddirect[maillage->get_mg_segment(mgpen->get_noeud4()->get_id(),mgpen->get_noeud6()->get_id())->get_nouveau_numero()+nbmgnoeud];
794     FEM_PENTA15* pen=new FEM_PENTA15(mgpen,tabnoeud);
795     fem->ajouter_fem_element3(pen);
796     mgpen=maillage->get_suivant_penta(it_pen);
797     }
798     }
799 couturad 968 return OK;
800 francois 883 }
801    
802    
803    
804    
805     void MAILLEUR_FEM::optimise_numerotation(FEM_MAILLAGE* fem)
806     {
807     FEM_NOEUD* noeud=fem->get_fem_noeud(0);
808     FEM_GRAPH_NOEUD *graph;
809     graph=new FEM_GRAPH_NOEUD(noeud,fem);
810     int e=graph->get_excentricite();
811     TPL_MAP_ENTITE<FEM_NOEUD*> dernierniveau=graph->get_dernier_niveau();
812     int nbdernierniveau=dernierniveau.get_nb();
813     for (int i=0;i<nbdernierniveau;i++)
814     {
815     FEM_GRAPH_NOEUD* graphtmp=new FEM_GRAPH_NOEUD(dernierniveau.get(i),fem);
816     int etmp=graphtmp->get_excentricite();
817     if (etmp>e)
818     {
819     delete graph;
820     graph=graphtmp;
821     dernierniveau=graph->get_dernier_niveau();
822     nbdernierniveau=dernierniveau.get_nb();
823     i=-1;
824     e=etmp;
825     }
826     else delete graphtmp;
827     }
828     int numero=fem->get_nb_fem_noeud();
829     for (int i=0;i<e+1;i++)
830     {
831     TPL_MAP_ENTITE<FEM_NOEUD*> niveau=graph->get_niveau(i);
832     int nbnoeud=niveau.get_nb();
833     for (int j=0;j<nbnoeud;j++)
834     {
835     FEM_NOEUD* noeud=niveau.get(j);
836     noeud->change_numero_opt(numero);
837     numero--;
838     }
839     }
840    
841    
842     delete graph;
843     }
844    
845    
846     void MAILLEUR_FEM::copie_numerotation_opt(FEM_MAILLAGE* fem)
847     {
848     int nbnoeud=fem->get_nb_fem_noeud();
849     for (int i=0;i<nbnoeud;i++)
850     {
851     FEM_NOEUD* noeud=fem->get_fem_noeud(i);
852     noeud->change_numero(noeud->get_numero_opt());
853     }
854    
855     }
856