ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 54
Committed: Fri Sep 28 19:43:11 2007 UTC (17 years, 7 months ago) by francois
Original Path: magic/lib/mailleur/mailleur/src/mailleur3d_front.cpp
File size: 45478 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
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     // mailleur3d_front.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 à 11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27    
28     //#pragma hdrstop
29    
30     #include <math.h>
31     #include <time.h>
32     #include "ot_mathematique.h"
33     #include "mailleur3d_front.h"
34     #include "m3d_noeud.h"
35     #include "m3d_triangle.h"
36     #include "m3d_tetra.h"
37     #include "const.h"
38 francois 35 #include "mg_gestionnaire.h"
39 5
40     //---------------------------------------------------------------------------
41    
42     //#pragma package(smart_init)
43    
44    
45    
46     #include <fstream>
47    
48     CAS_FRONT::CAS_FRONT(int type_cas,MG_NOEUD* noeud,int numero_cote)
49     {
50     type=type_cas;
51     degre=0;
52     mgnoeud=noeud;
53     liaison[0]=0;
54     liaison[1]=0;
55     liaison[2]=0;
56     angle[0]=0.;
57     angle[1]=0.;
58     angle[2]=0.;
59     traite=PASTRAITE;
60     }
61    
62     CAS_FRONT::~CAS_FRONT()
63     {
64     }
65    
66    
67    
68     void MAILLEUR3D::progresse_front(MG_VOLUME* mgvol)
69     {
70     char mess[255];
71 francois 35 if (affichageactif==1)
72     {
73     char mess[500];
74     sprintf(mess," Initialisation du front. Reste %d fronts ",get_nb_front(front_attente)+get_nb_front_courant());
75     (*affiche)(mess);
76     }
77    
78 5 while (get_nb_front(front_attente)+get_nb_front_courant()!=0)
79     {
80     if (activelog) genere_log(nomlog);
81     std::vector<CAS_FRONT*> liste_cas;
82     static int passe=0;
83     passe++;
84     /*int ierr=test_front();
85     if (ierr!=0)
86     {
87     char message[255];
88     if (ierr>0) sprintf(message,"erreur debut pas %d: tetra %d inverse",passe,ierr);
89     if (ierr<0) sprintf(message,"erreur debut pas %d: integrite voisinage cote %d perdue",passe,-ierr-1);
90 francois 35 if (affichageactif==1) (*affiche)(message);
91    
92     }*/
93 5 int numfront=premier_front_courant();
94     if (numfront==(-1))
95     {
96 francois 35 // mg_maillage->get_gestionnaire()->enregistrer("C:\debug.magic");
97 5 clock_t cpu11=clock(); //debug
98     int nb=get_nb_front(front_attente);
99     for (int i=0;i<nb;i++)
100     {
101     MG_FRONT_3D* fttmp=get_front(front_attente,0);
102     echange_de_front(fttmp,NONFORCE);
103     }
104     numfront=premier_front_courant();
105 francois 35 static int couche;
106     couche++;
107     if (affichageactif==1)
108     {
109     char mess[500];
110     sprintf(mess," Couche numero %d terminée. Reste %d fronts ",couche,nb);
111     (*affiche)(mess);
112     }
113 5 clock_t cpu22=clock(); //debug
114     cpu[3]=cpu[3]+(cpu22-cpu11)/CLK_TCK; //debug
115     nbfois[3]++; //debug
116 francois 35 // mg_maillage->get_gestionnaire()->enregistrer("C:\debug.magic");
117 5 }
118     if (numfront==(-1)) continue;
119     MG_FRONT_3D* ft=get_front(front_courant[numfront],0);
120    
121     int bouclebis;
122     do
123     {
124     // recherche des cas de front
125     //ADJACENCE
126     bouclebis=false;
127     MG_NOEUD* noeudtmp;
128     MG_FRONT_3D* fttmp=ft->get_front_voisin(0);
129     if ((fttmp->get_noeud1()!=ft->get_noeud1()) && (fttmp->get_noeud1()!=ft->get_noeud2())) noeudtmp=fttmp->get_noeud1();
130     else if ((fttmp->get_noeud2()!=ft->get_noeud1()) && (fttmp->get_noeud2()!=ft->get_noeud2())) noeudtmp=fttmp->get_noeud2();
131     else if ((fttmp->get_noeud3()!=ft->get_noeud1()) && (fttmp->get_noeud3()!=ft->get_noeud2())) noeudtmp=fttmp->get_noeud3();
132     insere_cas_front(ADJACENT,noeudtmp,0,ft->get_angle_voisin(0),liste_cas);
133     fttmp=ft->get_front_voisin(1);
134     if ((fttmp->get_noeud1()!=ft->get_noeud1()) && (fttmp->get_noeud1()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud1();
135     else if ((fttmp->get_noeud2()!=ft->get_noeud1()) && (fttmp->get_noeud2()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud2();
136     else if ((fttmp->get_noeud3()!=ft->get_noeud1()) && (fttmp->get_noeud3()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud3();
137     insere_cas_front(ADJACENT,noeudtmp,1,ft->get_angle_voisin(1),liste_cas);
138     fttmp=ft->get_front_voisin(2);
139     if ((fttmp->get_noeud1()!=ft->get_noeud2()) && (fttmp->get_noeud1()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud1();
140     else if ((fttmp->get_noeud2()!=ft->get_noeud2()) && (fttmp->get_noeud2()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud2();
141     else if ((fttmp->get_noeud3()!=ft->get_noeud2()) && (fttmp->get_noeud3()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud3();
142     insere_cas_front(ADJACENT,noeudtmp,2,ft->get_angle_voisin(2),liste_cas);
143     //LIE
144     clock_t cpu1=clock(); //debug
145     MG_NOEUD* mgnoeud1=ft->get_noeud1();
146     MG_NOEUD* mgnoeud2=ft->get_noeud2();
147     MG_NOEUD* mgnoeud3=ft->get_noeud3();
148     int nb_seg=mgnoeud1->get_lien_segment()->get_nb();
149     for (int i=0;i<nb_seg;i++)
150     {
151     MG_SEGMENT* seg=mgnoeud1->get_lien_segment()->get(i);
152     MG_NOEUD* noeudtmp;
153     if (seg->get_noeud1()==mgnoeud1) noeudtmp=seg->get_noeud2(); else noeudtmp=seg->get_noeud1();
154     int etat=ACTIF;
155     if (noeudtmp->get_type_entite()==IDM3D_NOEUD)
156     {
157     M3D_NOEUD* m3dno=(M3D_NOEUD*)noeudtmp;
158     etat=m3dno->get_etat();
159     }
160     if (etat==ACTIF)
161     if (noeudtmp!=mgnoeud2)
162     if (noeudtmp!=mgnoeud3)
163     {
164     double angle=angle_front(ft,seg);
165     insere_cas_front(LIE,noeudtmp,0,angle,liste_cas);
166     }
167    
168     }
169     nb_seg=mgnoeud2->get_lien_segment()->get_nb();
170     for (int i=0;i<nb_seg;i++)
171     {
172     MG_SEGMENT* seg=mgnoeud2->get_lien_segment()->get(i);
173     MG_NOEUD* noeudtmp;
174     if (seg->get_noeud1()==mgnoeud2) noeudtmp=seg->get_noeud2(); else noeudtmp=seg->get_noeud1();
175     int etat=ACTIF;
176     if (noeudtmp->get_type_entite()==IDM3D_NOEUD)
177     {
178     M3D_NOEUD* m3dno=(M3D_NOEUD*)noeudtmp;
179     etat=m3dno->get_etat();
180     }
181     if (etat==ACTIF)
182     if (noeudtmp!=mgnoeud1)
183     if (noeudtmp!=mgnoeud3)
184     {
185     double angle=angle_front(ft,seg);
186     insere_cas_front(LIE,noeudtmp,1,angle,liste_cas);
187     }
188    
189     }
190     nb_seg=mgnoeud3->get_lien_segment()->get_nb();
191     for (int i=0;i<nb_seg;i++)
192     {
193     MG_SEGMENT* seg=mgnoeud3->get_lien_segment()->get(i);
194     MG_NOEUD* noeudtmp;
195     if (seg->get_noeud1()==mgnoeud3) noeudtmp=seg->get_noeud2(); else noeudtmp=seg->get_noeud1();
196     int etat=ACTIF;
197     if (noeudtmp->get_type_entite()==IDM3D_NOEUD)
198     {
199     M3D_NOEUD* m3dno=(M3D_NOEUD*)noeudtmp;
200     etat=m3dno->get_etat();
201     }
202     if (etat==ACTIF)
203     if (noeudtmp!=mgnoeud1)
204     if (noeudtmp!=mgnoeud2)
205     {
206     double angle=angle_front(ft,seg);
207     insere_cas_front(LIE,noeudtmp,0,angle,liste_cas);
208     }
209    
210     }
211     clock_t cpu2=clock(); //debug
212     cpu[4]=cpu[4]+(cpu2-cpu1)/CLK_TCK;
213     nbfois[4]++;
214     // classement des différents cas
215     int nb_cas=liste_cas.size();
216     std::vector<CAS_FRONT*> liste_classe_cas[8];
217     // insertion du cas general
218     liste_classe_cas[GENERAL].insert(liste_classe_cas[GENERAL].end(),NULL);
219     for (int j=0;j<nb_cas;j++)
220     {
221     CAS_FRONT* cas=liste_cas[j];
222     if ((cas->type==ADJACENT) && (cas->degre==3))
223     {
224     cas->type=ADJACENT3;
225     double angle=4*M_PI;
226     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
227     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
228     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
229     if (angle<M_PI) liste_classe_cas[ADJACENT3].insert(liste_classe_cas[ADJACENT3].end(),cas);
230     }
231     if ((cas->type==ADJACENT) && (cas->degre==2))
232     {
233     cas->type=ADJACENT2;
234     double angle=4*M_PI;
235     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
236     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
237     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
238     if (angle<M_PI) liste_classe_cas[ADJACENT2].insert(liste_classe_cas[ADJACENT2].end(),cas);
239     }
240     if ((cas->type==ADJACENT) && (cas->degre==1))
241     {
242     cas->type=ADJACENT1;
243     double angle=4*M_PI;
244     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
245     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
246     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
247     if (angle<1.396263401) liste_classe_cas[ADJACENT1].insert(liste_classe_cas[ADJACENT1].end(),cas);
248     else liste_classe_cas[AUTRECAS].insert(liste_classe_cas[AUTRECAS].end(),cas);
249     }
250     if ((cas->type==LIE) && (cas->degre==3))
251     {
252     cas->type=LIE3;
253     double angle=4*M_PI;
254     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
255     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
256     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
257     if (angle<M_PI) liste_classe_cas[LIE3].insert(liste_classe_cas[LIE3].end(),cas);
258    
259     }
260     if ((cas->type==LIE) && (cas->degre==2))
261     {
262     cas->type=LIE2;
263     double angle=4*M_PI;
264     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
265     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
266     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
267     if (angle<1.396263401) liste_classe_cas[LIE2].insert(liste_classe_cas[LIE2].end(),cas);
268     else liste_classe_cas[AUTRECAS].insert(liste_classe_cas[AUTRECAS].end(),cas);
269     }
270     if ((cas->type==LIE) && (cas->degre==1))
271     {
272     cas->type=LIE1;
273     double angle=4*M_PI;
274     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
275     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
276     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
277     if (angle<1.396263401) liste_classe_cas[LIE1].insert(liste_classe_cas[LIE1].end(),cas);
278     else liste_classe_cas[AUTRECAS].insert(liste_classe_cas[AUTRECAS].end(),cas);
279     }
280    
281     }
282     //traitement des differemts cas de fronts
283     int solution=PASTROUVE;
284     CAS_FRONT *cas=NULL;
285     if ((liste_classe_cas[ADJACENT3].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,ADJACENT3,ft,liste_cas,liste_classe_cas[ADJACENT3],&cas);
286     if ((liste_classe_cas[ADJACENT2].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,ADJACENT2,ft,liste_cas,liste_classe_cas[ADJACENT2],&cas);
287     if ((liste_classe_cas[ADJACENT1].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,ADJACENT1,ft,liste_cas,liste_classe_cas[ADJACENT1],&cas);
288     if ((liste_classe_cas[LIE3].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,LIE3,ft,liste_cas,liste_classe_cas[LIE3],&cas);
289     if ((liste_classe_cas[LIE2].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,LIE2,ft,liste_cas,liste_classe_cas[LIE2],&cas);
290     if ((liste_classe_cas[LIE1].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,LIE1,ft,liste_cas,liste_classe_cas[LIE1],&cas);
291     if ((liste_classe_cas[GENERAL].size()>0)&&(solution==PASTROUVE))
292     {
293     solution=traite_front(mgvol,GENERAL,ft,liste_cas,liste_classe_cas[GENERAL],&cas);
294     if (solution==AUTRECASATRAITER)
295     {
296     int type=cas->type;
297     std::vector<CAS_FRONT*> liste_classe_cas_temp;
298     liste_classe_cas_temp.insert(liste_classe_cas_temp.end(),cas);
299     solution=traite_front(mgvol,type,ft,liste_cas,liste_classe_cas_temp,&cas); // pb icitte a compte=531
300     }
301     if (solution==PASTROUVE)
302     {
303     ft->incremente_ifail();
304     echange_de_front(ft,ft->get_numero_front()+1);
305     }
306     if (solution==DESTRUCTION)
307     bouclebis=true;
308     }
309    
310     efface_cas_front(liste_cas,liste_classe_cas);
311     /*int ierr=test_front();
312     if (ierr!=0)
313     {
314     std::string nomfile="c:\\home\\dessin\\step\\void";
315     mg_maillage->exporter_mesh(nomfile);
316     char message[255];
317     if (ierr>0) sprintf(message,"erreur fin pas %d: tetra %d inverse",passe,ierr);
318     if (ierr<0) sprintf(message,"erreur fin pas %d: integrite voisinage cote %d perdue",passe,-ierr-1);
319     MessageBox(Application->Handle,message,"ERREUR",MB_OK);
320     TerminateProcess(GetCurrentProcess(),0);
321     }*/
322     }
323     while (bouclebis==true);
324     refresh();
325     }
326    
327    
328     }
329    
330     int MAILLEUR3D::traite_front(MG_VOLUME* mgvol,int type,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
331     {
332     int num;
333     switch (type)
334     {
335     case ADJACENT3:num=traite_front_adjacent3(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
336     case ADJACENT2:num=traite_front_adjacent2(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
337     case ADJACENT1:num=traite_front_adjacent1(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
338     case LIE3:
339     case LIE2:
340     case LIE1:num=traite_front_lie(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
341     case GENERAL:num=traite_front_general(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
342     }
343     return num;
344     }
345    
346    
347    
348     int MAILLEUR3D::traite_front_adjacent3(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
349     {
350     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
351     MG_NOEUD* noeud=liste_classe_cas[0]->mgnoeud;
352     MG_TETRA* tet=insere_tetra(mgvol,ft,noeud,NOEUD_EXISTANT,liste_intersection);
353     liste_classe_cas[0]->traite=TRAITE;
354     if (tet==NULL) return PASTROUVE;
355     MG_FRONT_3D* ft1=ft->get_front_voisin(0);
356     MG_FRONT_3D* ft2=ft->get_front_voisin(1);
357     MG_FRONT_3D* ft3=ft->get_front_voisin(2);
358     supprimer_front_en_avancant(ft1);
359     supprimer_front_en_avancant(ft2);
360     supprimer_front_en_avancant(ft3);
361     supprimer_front_en_avancant(ft);
362     return TROUVE;
363     }
364    
365     int MAILLEUR3D::traite_front_adjacent2(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
366     {
367     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
368     MG_NOEUD* noeud=liste_classe_cas[0]->mgnoeud;
369     MG_TETRA* tet=insere_tetra(mgvol,ft,noeud,NOEUD_EXISTANT,liste_intersection);
370     liste_classe_cas[0]->traite=TRAITE;
371     if (tet==NULL) return PASTROUVE;
372     MG_FRONT_3D* ft1;
373     MG_FRONT_3D* ft2;
374     MG_FRONT_3D* ft3;
375     MG_FRONT_3D* ftn1;
376     if (liste_classe_cas[0]->liaison[0]==0)
377     {
378     ft1=ft->get_front_voisin(1);
379     ft2=ft->get_front_voisin(2);
380     ft3=ft->get_front_voisin(0);
381     ftn1=mise_a_jour_front(tet,1);
382     }
383     if (liste_classe_cas[0]->liaison[1]==0)
384     {
385     ft1=ft->get_front_voisin(0);
386     ft2=ft->get_front_voisin(2);
387     ft3=ft->get_front_voisin(1);
388     ftn1=mise_a_jour_front(tet,3);
389     }
390     if (liste_classe_cas[0]->liaison[2]==0)
391     {
392     ft1=ft->get_front_voisin(0);
393     ft2=ft->get_front_voisin(1);
394     ft3=ft->get_front_voisin(2);
395     ftn1=mise_a_jour_front(tet,2);
396     }
397     supprimer_front_en_avancant(ft1);
398     supprimer_front_en_avancant(ft2);
399     supprimer_front_en_avancant(ft);
400     mise_a_jour_voisin_front(ft3);
401     mise_a_jour_voisin_front(ftn1);
402     mise_a_jour_voisin_front(ftn1->get_front_voisin(0));
403     mise_a_jour_voisin_front(ftn1->get_front_voisin(1));
404     mise_a_jour_voisin_front(ftn1->get_front_voisin(2));
405     return TROUVE;
406     }
407    
408     int MAILLEUR3D::traite_front_adjacent1(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
409     {
410     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
411     int nb_cas=liste_classe_cas.size();
412     double *qual;
413     liste_classe_cas[0]->traite=TRAITE;
414     qual=new double[nb_cas];
415     double xyz1[3]={ft->get_noeud1()->get_x(),ft->get_noeud1()->get_y(),ft->get_noeud1()->get_z()};
416     double xyz2[3]={ft->get_noeud2()->get_x(),ft->get_noeud2()->get_y(),ft->get_noeud2()->get_z()};
417     double xyz3[3]={ft->get_noeud3()->get_x(),ft->get_noeud3()->get_y(),ft->get_noeud3()->get_z()};
418     for (int i=0;i<nb_cas;i++)
419     {
420     MG_NOEUD* noeud=liste_classe_cas[i]->mgnoeud;
421     double xyz[3]={noeud->get_x(),noeud->get_y(),noeud->get_z()};
422     qual[i]=OPERATEUR::qualite_tetra(xyz1,xyz2,xyz3,xyz);
423     }
424     int fin=0;
425     MG_TETRA* tet;
426 francois 35 int num;
427 5 while (fin==0)
428     {
429 francois 35 double* pos_max=std::max_element(qual,qual+nb_cas);
430 5 if (*pos_max==0.0) {delete [] qual;return PASTROUVE;}
431 francois 35 num=pos_max-qual;
432 5 MG_NOEUD* noeud=liste_classe_cas[num]->mgnoeud;
433     tet=insere_tetra(mgvol,ft,noeud,NOEUD_EXISTANT,liste_intersection);
434     if (tet!=NULL) fin=1;
435     qual[num]=0.;
436     }
437     MG_FRONT_3D* ft1;
438     MG_FRONT_3D* ft2;
439     MG_FRONT_3D* ft3;
440     MG_FRONT_3D* ftn1;
441     MG_FRONT_3D* ftn2;
442 francois 35 if (liste_classe_cas[num]->liaison[0]==1)
443 5 {
444     ft1=ft->get_front_voisin(0);
445     ft2=ft->get_front_voisin(1);
446     ft3=ft->get_front_voisin(2);
447     ftn1=mise_a_jour_front(tet,2);
448     ftn2=mise_a_jour_front(tet,3);
449     }
450 francois 35 if (liste_classe_cas[num]->liaison[1]==1)
451 5 {
452     ft1=ft->get_front_voisin(1);
453     ft2=ft->get_front_voisin(0);
454     ft3=ft->get_front_voisin(2);
455     ftn1=mise_a_jour_front(tet,1);
456     ftn2=mise_a_jour_front(tet,2);
457     }
458 francois 35 if (liste_classe_cas[num]->liaison[2]==1)
459 5 {
460     ft1=ft->get_front_voisin(2);
461     ft2=ft->get_front_voisin(0);
462     ft3=ft->get_front_voisin(1);
463     ftn1=mise_a_jour_front(tet,1);
464     ftn2=mise_a_jour_front(tet,3);
465     }
466     supprimer_front_en_avancant(ft);
467     supprimer_front_en_avancant(ft1);
468     mise_a_jour_voisin_front(ft2);
469     mise_a_jour_voisin_front(ft3);
470     mise_a_jour_voisin_front(ftn1);
471     mise_a_jour_voisin_front(ftn2);
472     mise_a_jour_voisin_front(ftn1->get_front_voisin(0));
473     mise_a_jour_voisin_front(ftn1->get_front_voisin(1));
474     mise_a_jour_voisin_front(ftn1->get_front_voisin(2));
475     mise_a_jour_voisin_front(ftn2->get_front_voisin(0));
476     mise_a_jour_voisin_front(ftn2->get_front_voisin(1));
477     mise_a_jour_voisin_front(ftn2->get_front_voisin(2));
478     delete [] qual;
479     return TROUVE;
480     }
481    
482     int MAILLEUR3D::traite_front_lie(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
483     {
484     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
485     int nb_cas=liste_classe_cas.size();
486     double *qual;
487     liste_classe_cas[0]->traite=TRAITE;
488     qual=new double[nb_cas];
489     double xyz1[3]={ft->get_noeud1()->get_x(),ft->get_noeud1()->get_y(),ft->get_noeud1()->get_z()};
490     double xyz2[3]={ft->get_noeud2()->get_x(),ft->get_noeud2()->get_y(),ft->get_noeud2()->get_z()};
491     double xyz3[3]={ft->get_noeud3()->get_x(),ft->get_noeud3()->get_y(),ft->get_noeud3()->get_z()};
492     for (int i=0;i<nb_cas;i++)
493     {
494     MG_NOEUD* noeud=liste_classe_cas[i]->mgnoeud;
495     double xyz[3]={noeud->get_x(),noeud->get_y(),noeud->get_z()};
496     qual[i]=OPERATEUR::qualite_tetra(xyz1,xyz2,xyz3,xyz);
497     }
498     int fin=0;
499     MG_TETRA* tet;
500     while (fin==0)
501     {
502 francois 35 double* pos_max=std::max_element(qual,qual+nb_cas);
503 5 if (*pos_max==0.0) {delete [] qual;return PASTROUVE;}
504     int num=pos_max-qual;
505     MG_NOEUD* noeud=liste_classe_cas[num]->mgnoeud;
506     tet=insere_tetra(mgvol,ft,noeud,NOEUD_EXISTANT,liste_intersection);
507     if (tet!=NULL) fin=1;
508     qual[num]=0.;
509     }
510     MG_FRONT_3D* ft1=ft->get_front_voisin(0);
511     MG_FRONT_3D* ft2=ft->get_front_voisin(1);
512     MG_FRONT_3D* ft3=ft->get_front_voisin(2);
513     MG_FRONT_3D* ftn1=mise_a_jour_front(tet,1);
514     MG_FRONT_3D* ftn2=mise_a_jour_front(tet,2);
515     MG_FRONT_3D* ftn3=mise_a_jour_front(tet,3);
516     supprimer_front_en_avancant(ft);
517     mise_a_jour_voisin_front(ft1);
518     mise_a_jour_voisin_front(ft2);
519     mise_a_jour_voisin_front(ft3);
520     mise_a_jour_voisin_front(ftn1);
521     mise_a_jour_voisin_front(ftn2);
522     mise_a_jour_voisin_front(ftn3);
523     mise_a_jour_voisin_front(ftn1->get_front_voisin(0));
524     mise_a_jour_voisin_front(ftn1->get_front_voisin(1));
525     mise_a_jour_voisin_front(ftn1->get_front_voisin(2));
526     mise_a_jour_voisin_front(ftn2->get_front_voisin(0));
527     mise_a_jour_voisin_front(ftn2->get_front_voisin(1));
528     mise_a_jour_voisin_front(ftn2->get_front_voisin(2));
529     mise_a_jour_voisin_front(ftn3->get_front_voisin(0));
530     mise_a_jour_voisin_front(ftn3->get_front_voisin(1));
531     mise_a_jour_voisin_front(ftn3->get_front_voisin(2));
532     delete [] qual;
533     return TROUVE;
534     }
535    
536     int MAILLEUR3D::traite_front_general(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
537     {
538     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
539     TPL_MAP_ENTITE<class MG_NOEUD*> liste_noeud;
540    
541     MG_NOEUD* noeud_candidat;
542 francois 35 int mode=genere_noeud(mgvol,ft,liste_noeud,liste_cas);
543 5 if (mode==CREATION) noeud_candidat=liste_noeud.get(0);
544     if (mode==EXISTE)
545     {
546     noeud_candidat=liste_noeud.get(0);
547     int nb_cas=liste_cas.size();
548     for (int i=0;i<nb_cas;i++)
549     if (liste_cas[i]->mgnoeud==noeud_candidat)
550     if (liste_cas[i]->traite==PASTRAITE)
551     {
552     *cas=liste_cas[i];
553     return AUTRECASATRAITER;
554     }
555     else return PASTROUVE;
556     }
557     MG_TETRA* tet=NULL;
558     if (mode==MULTIEXISTE)
559     {
560     double *qual;
561     int nb_noeud_candidat=liste_noeud.get_nb();
562     qual=new double[nb_noeud_candidat];
563 francois 35 //int nb_cas=liste_cas.size();
564 5 for (int i=0;i<nb_noeud_candidat;i++)
565     {
566 francois 35 //qual[i]=-1.;
567     /*for (int j=0;j<nb_cas;j++)
568 5 {
569 francois 35 MG_NOEUD* casnoeud=liste_cas[j]->mgnoeud;
570     if (liste_noeud.get(i)==casnoeud) qual[i]=-100.;
571     }*/
572     //if (qual[i]!=-100.)
573     // {
574 5 double xyz1[3]={ft->get_noeud1()->get_x(),ft->get_noeud1()->get_y(),ft->get_noeud1()->get_z()};
575     double xyz2[3]={ft->get_noeud2()->get_x(),ft->get_noeud2()->get_y(),ft->get_noeud2()->get_z()};
576     double xyz3[3]={ft->get_noeud3()->get_x(),ft->get_noeud3()->get_y(),ft->get_noeud3()->get_z()};
577     MG_NOEUD* noeud=liste_noeud.get(i);
578     double xyz[3]={noeud->get_x(),noeud->get_y(),noeud->get_z()};
579     qual[i]=OPERATEUR::qualite_tetra(xyz1,xyz2,xyz3,xyz);
580 francois 35 // }
581 5 }
582     for (int i=0;i<nb_noeud_candidat;i++)
583     {
584     if (tet==NULL)
585     {
586 francois 35 double* max_i=std::max_element(qual,qual+nb_noeud_candidat);
587 5 if (*max_i>0.)
588     {
589 francois 35 int pos_max=max_i-qual;
590 5 qual[pos_max]=-100.;
591     MG_NOEUD* noeud=liste_noeud.get(pos_max);
592     liste_intersection.vide();
593     tet=insere_tetra(mgvol,ft,noeud,mode,liste_intersection);
594     if ((tet==NULL) && (liste_intersection.get_nb()>0))
595     {
596     int traite_reussi=traite_destruction(ft,liste_intersection);
597     if (noeud->get_type_entite()==IDM3D_NOEUD)
598     {
599     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
600     mnoeud->etat_actif();
601     }
602     if (traite_reussi==true)
603     {
604     delete [] qual;
605     return DESTRUCTION;
606     }
607     }
608     }
609     }
610     }
611     if (tet==NULL)
612     {
613     delete [] qual;
614     return PASTROUVE;
615     }
616     }
617     else tet=insere_tetra(mgvol,ft,noeud_candidat,mode,liste_intersection);
618     if ((tet==NULL) && (liste_intersection.get_nb()>0))
619     {
620     int traite_reussi=traite_destruction(ft,liste_intersection);
621     if (noeud_candidat->get_type_entite()==IDM3D_NOEUD)
622     {
623     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud_candidat;
624     mnoeud->etat_actif();
625     }
626     if (traite_reussi==true)
627     {
628     if (mode==CREATION)
629     tet=insere_tetra(mgvol,ft,noeud_candidat,mode,liste_intersection);
630     else
631     return DESTRUCTION;
632     }
633     }
634    
635     if (tet!=NULL)
636     {
637     MG_FRONT_3D* ft1=ft->get_front_voisin(0);
638     MG_FRONT_3D* ft2=ft->get_front_voisin(1);
639     MG_FRONT_3D* ft3=ft->get_front_voisin(2);
640     MG_FRONT_3D* ftn1=mise_a_jour_front(tet,1);
641     MG_FRONT_3D* ftn2=mise_a_jour_front(tet,2);
642     MG_FRONT_3D* ftn3=mise_a_jour_front(tet,3);
643     supprimer_front_en_avancant(ft);
644     mise_a_jour_voisin_front(ft1);
645     mise_a_jour_voisin_front(ft2);
646     mise_a_jour_voisin_front(ft3);
647     mise_a_jour_voisin_front(ftn1);
648     mise_a_jour_voisin_front(ftn2);
649     mise_a_jour_voisin_front(ftn3);
650     mise_a_jour_voisin_front(ftn1->get_front_voisin(0));
651     mise_a_jour_voisin_front(ftn1->get_front_voisin(1));
652     mise_a_jour_voisin_front(ftn1->get_front_voisin(2));
653     mise_a_jour_voisin_front(ftn2->get_front_voisin(0));
654     mise_a_jour_voisin_front(ftn2->get_front_voisin(1));
655     mise_a_jour_voisin_front(ftn2->get_front_voisin(2));
656     mise_a_jour_voisin_front(ftn3->get_front_voisin(0));
657     mise_a_jour_voisin_front(ftn3->get_front_voisin(1));
658     mise_a_jour_voisin_front(ftn3->get_front_voisin(2));
659     if (mode==CREATION) mg_maillage->ajouter_mg_noeud(noeud_candidat);
660     }
661     else
662     {
663 francois 35 if (mode==CREATION) mg_maillage->supprimer_mg_noeudid(noeud_candidat->get_id());
664 5 return PASTROUVE;
665     }
666    
667     return TROUVE;
668     }
669    
670    
671    
672    
673    
674    
675     void MAILLEUR3D::insere_cas_front(int type,MG_NOEUD* noeud,int numero_cote,double angle,std::vector<CAS_FRONT*>& liste_cas)
676     {
677    
678     std::vector<CAS_FRONT*>::iterator i;
679     std::vector<CAS_FRONT*>::iterator nouveau = liste_cas.end();
680    
681     for (i=liste_cas.begin();i!=liste_cas.end();i++)
682     {
683     if ((*i)->mgnoeud==noeud) nouveau=i;
684     }
685    
686     CAS_FRONT* cas;
687     if (nouveau==liste_cas.end()) // etait nouveau==NULL
688     {
689     cas=new CAS_FRONT(type,noeud,numero_cote);
690     liste_cas.insert(liste_cas.end(),cas);
691     }
692     else
693     {
694     cas=(*nouveau);
695     if ((cas->type==ADJACENT) && (type==LIE)) return;
696     }
697    
698     cas->liaison[numero_cote]=1;
699     cas->angle[numero_cote]=angle;
700     cas->degre=cas->liaison[0]+cas->liaison[1]+cas->liaison[2];
701     }
702    
703    
704    
705     void MAILLEUR3D::efface_cas_front(std::vector<CAS_FRONT*>& liste_cas,std::vector<CAS_FRONT*> liste_classe_cas[8])
706     {
707     for (std::vector<CAS_FRONT*>::iterator i=liste_cas.begin();i!=liste_cas.end();i++)
708     {
709     delete *i;
710     }
711     liste_cas.clear();
712    
713     }
714    
715    
716    
717 francois 54 MG_FRONT_3D* MAILLEUR3D::mise_a_jour_front(MG_TETRA* tet,int cote, int numfront)
718 5 {
719     MG_FRONT_3D* ft;
720    
721 francois 54 if (cote==0) ft=ajouter_front_courant(numfront,tet->get_noeud1(),tet->get_noeud3(),tet->get_noeud2(),tet->get_triangle1());
722     if (cote==1) ft=ajouter_front_courant(numfront,tet->get_noeud1(),tet->get_noeud2(),tet->get_noeud4(),tet->get_triangle2());
723     if (cote==2) ft=ajouter_front_courant(numfront,tet->get_noeud2(),tet->get_noeud3(),tet->get_noeud4(),tet->get_triangle3());
724     if (cote==3) ft=ajouter_front_courant(numfront,tet->get_noeud1(),tet->get_noeud4(),tet->get_noeud3(),tet->get_triangle4());
725 5
726     return ft;
727     }
728    
729    
730     void MAILLEUR3D::mise_a_jour_voisin_front(MG_FRONT_3D* ft)
731     {
732     clock_t cpu1=clock(); //debug
733     MG_NOEUD* mgnoeud1=ft->get_noeud1();
734     MG_NOEUD* mgnoeud2=ft->get_noeud2();
735     MG_NOEUD* mgnoeud3=ft->get_noeud3();
736     static int nbpasse=0;
737     nbpasse++;
738     ft->changer_front_voisin(NULL,0);
739     ft->changer_front_voisin(NULL,1);
740     ft->changer_front_voisin(NULL,2);
741     for (int j=0;j<mgnoeud1->get_lien_triangle()->get_nb();j++)
742     for (int k=0;k<mgnoeud2->get_lien_triangle()->get_nb();k++)
743     {
744     M3D_TRIANGLE* tri1=(M3D_TRIANGLE*)mgnoeud1->get_lien_triangle()->get(j);
745     M3D_TRIANGLE* tri2=(M3D_TRIANGLE*)mgnoeud2->get_lien_triangle()->get(k);
746     if (tri1==tri2)
747     if (tri1->get_etat_front()==FRONT_ACTIF)
748     if (tri1->get_mgfront()!=ft)
749     {
750     MG_FRONT_3D* ft2=tri1->get_mgfront();
751     if (ft->get_front_voisin(0)==NULL)
752     {
753     ft->changer_front_voisin(ft2,0);
754     ft->changer_angle_voisin(angle_front(ft,ft2),0);
755     }
756     else
757     {
758     double angle=angle_front(ft,ft2);
759     if (angle<ft->get_angle_voisin(0))
760     {
761     ft->changer_front_voisin(ft2,0);
762     ft->changer_angle_voisin(angle,0);
763     }
764     }
765     }
766     }
767     for (int j=0;j<mgnoeud1->get_lien_triangle()->get_nb();j++)
768     for (int k=0;k<mgnoeud3->get_lien_triangle()->get_nb();k++)
769     {
770     M3D_TRIANGLE* tri1=(M3D_TRIANGLE*)mgnoeud1->get_lien_triangle()->get(j);
771     M3D_TRIANGLE* tri2=(M3D_TRIANGLE*)mgnoeud3->get_lien_triangle()->get(k);
772     if (tri1==tri2)
773     if (tri1->get_etat_front()==FRONT_ACTIF)
774     if (tri1->get_mgfront()!=ft)
775     {
776     MG_FRONT_3D* ft2=tri1->get_mgfront();
777     if (ft->get_front_voisin(1)==NULL)
778     {
779     ft->changer_front_voisin(ft2,1);
780     ft->changer_angle_voisin(angle_front(ft,ft2),1);
781     }
782     else
783     {
784     double angle=angle_front(ft,ft2);
785     if (angle<ft->get_angle_voisin(1))
786     {
787     ft->changer_front_voisin(ft2,1);
788     ft->changer_angle_voisin(angle,1);
789     }
790     }
791     }
792     }
793     for (int j=0;j<mgnoeud2->get_lien_triangle()->get_nb();j++)
794     for (int k=0;k<mgnoeud3->get_lien_triangle()->get_nb();k++)
795     {
796     M3D_TRIANGLE* tri1=(M3D_TRIANGLE*)mgnoeud2->get_lien_triangle()->get(j);
797     M3D_TRIANGLE* tri2=(M3D_TRIANGLE*)mgnoeud3->get_lien_triangle()->get(k);
798     if (tri1==tri2)
799     if (tri1->get_etat_front()==FRONT_ACTIF)
800     if (tri1->get_mgfront()!=ft)
801     {
802     MG_FRONT_3D* ft2=tri1->get_mgfront();
803     if (ft->get_front_voisin(2)==NULL)
804     {
805     ft->changer_front_voisin(ft2,2);
806     ft->changer_angle_voisin(angle_front(ft,ft2),2);
807     }
808     else
809     {
810     double angle=angle_front(ft,ft2);
811     if (angle<ft->get_angle_voisin(2))
812     {
813     ft->changer_front_voisin(ft2,2);
814     ft->changer_angle_voisin(angle,2);
815     }
816     }
817     }
818     }
819     if ( (ft->get_front_voisin(0)==NULL) || (ft->get_front_voisin(1)==NULL)|| (ft->get_front_voisin(2)==NULL))
820     refresh();
821     clock_t cpu2=clock(); //debug
822     cpu[5]=cpu[5]+(cpu2-cpu1)/CLK_TCK; //debug
823     nbfois[5]++; //debug
824     }
825    
826    
827    
828    
829     int MAILLEUR3D::traite_destruction(MG_FRONT_3D* ft,TPL_MAP_ENTITE<class MG_TRIANGLE*>& liste_intersection)
830     {
831    
832     int nb_inter=liste_intersection.get_nb();
833     for (int i=0;i<nb_inter;i++)
834     {
835     MG_TRIANGLE* tri=liste_intersection.get(i);
836     if (tri->get_lien_topologie()->get_dimension()==2) return false;
837 francois 54 if (tri->get_origine()!=MAILLEUR_AUTO) return false;
838 5 }
839     for (int i=0;i<nb_inter;i++)
840     {
841     M3D_TRIANGLE* mtri=(M3D_TRIANGLE*)liste_intersection.get(i);
842     if (mtri->get_nb_voisin()==1)
843     detruit_tetra(liste_intersection.get(i));
844     }
845     return true;
846     }
847    
848     void MAILLEUR3D::genere_log(std::string nomfile)
849     {
850     int nbnoeud=mg_maillage->get_nb_mg_noeud();
851     //int nbfront=get_nb_front(front_attente)+get_nb_front_courant();
852     int nbtriangle=mg_maillage->get_nb_mg_triangle();
853     mg_maillage->exporter_mesh(nomfile);
854     char chaine[500];
855     sprintf(chaine,"%s.pfj",nomfile.c_str());
856     FILE* in=fopen(chaine,"wt");
857     fclose(in);
858     sprintf(chaine,"%s.frt1",nomfile.c_str());
859     in=fopen(chaine,"wt");
860     fprintf(in,"%d %d\n",nbnoeud,nbtriangle);
861     for (int i=0;i<nbnoeud;i++)
862     {
863     MG_NOEUD* noeud=mg_maillage->get_mg_noeud(i);
864     fprintf(in,"%f %f %f\n",noeud->get_x(),noeud->get_y(),noeud->get_z());
865     noeud->change_nouveau_numero(i);
866     }
867     for (int i=0;i<nbtriangle;i++)
868     {
869     MG_TRIANGLE* tri=mg_maillage->get_mg_triangle(i);
870     fprintf(in,"3 %d %d %d\n",tri->get_noeud1()->get_nouveau_numero(),tri->get_noeud2()->get_nouveau_numero(),tri->get_noeud3()->get_nouveau_numero());
871     tri->change_nouveau_numero(i);
872     }
873     fclose(in);
874     static int passe=0;
875     sprintf(chaine,"%s.frt2",nomfile.c_str());
876     if (passe!=0) in=fopen(chaine,"a+t");
877     else in=fopen(chaine,"wt");
878     passe=1;
879     for (int i=0;i<12;i++)
880     {
881     int nb_front;
882     if (i!=11) nb_front=get_nb_front(front_courant[i]);
883     else nb_front=get_nb_front(front_attente);
884     for (int j=0;j<nb_front;j++)
885     {
886     MG_FRONT_3D* ft;
887     if (i!=11) ft=get_front(front_courant[i],j);
888     else ft=get_front(front_attente,j);
889     fprintf(in,"%d ",ft->get_triangle()->get_nouveau_numero());
890     }
891    
892     }
893     fprintf(in,"\n");
894     fclose(in);
895    
896     }
897    
898     int MAILLEUR3D::test_front(void)
899     {
900     int erreur=0;
901     int nbnoeud=mg_maillage->get_nb_mg_noeud();
902     //int nbfront=get_nb_front(front_attente)+get_nb_front_courant();
903     //int nbtriangle=mg_maillage->get_nb_mg_triangle();
904    
905    
906     /*ofstream o("c:\\home\\dessin\\step\\voidf_2D.mai",ios::out|ios::trunc);
907     o.precision(16);
908     o.setf(ios::showpoint);
909     o << nbnoeud << " " << nbfront << endl;*/
910     for (int i=0;i<nbnoeud;i++)
911     {
912     MG_NOEUD* noeud=mg_maillage->get_mg_noeud(i);
913     // o << i+1 << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << endl;
914     noeud->change_nouveau_numero(i+1);
915     }
916     for (int i=0;i<12;i++)
917     {
918     int nb_front;
919     if (i!=11) nb_front=get_nb_front(front_courant[i]);
920     else nb_front=get_nb_front(front_attente);
921     for (int j=0;j<nb_front;j++)
922     {
923     MG_FRONT_3D* ft;
924     if (i!=11) ft=get_front(front_courant[i],j);
925     else ft=get_front(front_attente,j);
926     MG_NOEUD* noeud1=ft->get_noeud1();
927     MG_NOEUD* noeud2=ft->get_noeud2();
928     MG_NOEUD* noeud3=ft->get_noeud3();
929     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
930     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
931     OT_VECTEUR_3D n=n1n2&n1n3;
932     n.norme();
933     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)ft->get_triangle();
934     if (tri->get_nb_voisin()==1)
935     {
936     MG_TETRA* tet=tri->get_voisin(0);
937     MG_NOEUD* noeud4;
938     if (tet->get_noeud1()!=ft->get_noeud1())
939     if (tet->get_noeud1()!=ft->get_noeud2())
940     if (tet->get_noeud1()!=ft->get_noeud3())
941     noeud4=tet->get_noeud1();
942    
943     if (tet->get_noeud2()!=ft->get_noeud1())
944     if (tet->get_noeud2()!=ft->get_noeud2())
945     if (tet->get_noeud2()!=ft->get_noeud3())
946     noeud4=tet->get_noeud2();
947     if (tet->get_noeud3()!=ft->get_noeud1())
948     if (tet->get_noeud3()!=ft->get_noeud2())
949     if (tet->get_noeud3()!=ft->get_noeud3())
950     noeud4=tet->get_noeud3();
951    
952     if (tet->get_noeud4()!=ft->get_noeud1())
953     if (tet->get_noeud4()!=ft->get_noeud2())
954     if (tet->get_noeud4()!=ft->get_noeud3())
955     noeud4=tet->get_noeud4();
956     OT_VECTEUR_3D n1n4(noeud4->get_x()-noeud1->get_x(),noeud4->get_y()-noeud1->get_y(),noeud4->get_z()-noeud1->get_z());
957     n1n4.norme();
958     double ps=n1n4*n;
959     if (ps>0.0001)
960     erreur=tet->get_id();
961     }
962     MG_FRONT_3D* ft1=ft->get_front_voisin(0);
963     MG_FRONT_3D* ft2=ft->get_front_voisin(1);
964     MG_FRONT_3D* ft3=ft->get_front_voisin(2);
965     MG_FRONT_3D* ft11=ft1->get_front_voisin(0);
966     MG_FRONT_3D* ft12=ft1->get_front_voisin(1);
967     MG_FRONT_3D* ft13=ft1->get_front_voisin(2);
968     MG_FRONT_3D* ft21=ft2->get_front_voisin(0);
969     MG_FRONT_3D* ft22=ft2->get_front_voisin(1);
970     MG_FRONT_3D* ft23=ft2->get_front_voisin(2);
971     MG_FRONT_3D* ft31=ft3->get_front_voisin(0);
972     MG_FRONT_3D* ft32=ft3->get_front_voisin(1);
973     MG_FRONT_3D* ft33=ft3->get_front_voisin(2);
974     if ((ft11!=ft) && (ft12!=ft) && (ft13!=ft) )
975     erreur=-1;
976     if ((ft21!=ft) && (ft22!=ft) && (ft23!=ft) )
977     erreur=-2;
978     if ((ft31!=ft) && (ft32!=ft) && (ft33!=ft) )
979     erreur=-3;
980     // o << "3 " << noeud1->get_nouveau_numero() << " " << noeud2->get_nouveau_numero() << " " << noeud3->get_nouveau_numero() << endl;
981     }
982     }
983    
984     return erreur;
985     }