ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 532
Committed: Fri Jul 4 14:39:20 2014 UTC (10 years, 10 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_front.cpp
File size: 45516 byte(s)
Log Message:
Resolution de bug avec le mailleur3D et la nouvelle formulation de carte de taille + parametrisation du pas d'integration dans le calcul des longueurs dans une metrique

File Contents

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