ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 47103 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

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