ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 632
Committed: Thu Jan 15 18:40:00 2015 UTC (10 years, 5 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_front.cpp
File size: 46309 byte(s)
Log Message:
Changement de l'espace de voisinage dans le mailleur 2D et 3D. On utilise un ntree (octree "anisotrope" qui ne se divise pas necessairement en 8). En 2D l'espace de voisinage est maintenant sur l'espace reelle au lieu d'être sur l'espace parametrique.
+Mise sous forme de parametres de certains choix stratégiques du mailleur

File Contents

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