ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 919
Committed: Tue Mar 6 17:51:54 2018 UTC (7 years, 2 months ago) by couturad
Original Path: magic/lib/mailleur_auto/src/mailleur3d_front.cpp
File size: 46590 byte(s)
Log Message:
Correction des bugs lors de l'execution en mode RELWITHDEBINFO.
Ajouts de fichiers pour la librairie MICROSTRUCTURE

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