ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 425
Committed: Tue Sep 24 22:01:46 2013 UTC (11 years, 7 months ago) by francois
File size: 46678 byte(s)
Log Message:
ajout d'une procedure d'analyse de qualité de maillage + amelioration de la sortie sur terminal des informations dans les mailleurs

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