ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 966
Committed: Thu Sep 6 16:46:34 2018 UTC (6 years, 8 months ago) by couturad
Original Path: magic/lib/mailleur_auto/src/mailleur3d_front.cpp
File size: 46661 byte(s)
Log Message:
Ajout de l'histogramme a MAGIC_PLOT
Ajout d'une sortie OK ou FAIL (int) au MAILLEUR afin de gerer certaines exceptions
Ajout d'une phase RSA a la fin du generateur DCR

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