ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 1189
Committed: Tue Feb 4 17:26:49 2025 UTC (3 months ago) by francois
File size: 50079 byte(s)
Log Message:
Version 5.0 de MAGIC. Integration de ALGLIB pour faire de l'optimisation. ALGLIB se download automatiquement en executant un script dans le repertoire config update_magic.bash


File Contents

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