ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 494
Committed: Thu Mar 6 20:39:09 2014 UTC (11 years, 2 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_front.cpp
File size: 46833 byte(s)
Log Message:
Possibilité d'enregistrement des mailleurs en cours de maillage pour voir ce qui se passe si il y a un bug

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