ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/optimisation/src/detection_flottant.cpp
Revision: 219
Committed: Tue Nov 10 19:47:37 2009 UTC (15 years, 6 months ago) by picher
File size: 11433 byte(s)
Log Message:
Resolution d'un bug dans la routine detection_flottant

File Contents

# Content
1 ///////////////////////////////////////////////////////////
2 /////////////Détection des éléments flottants//////////////
3 ///////////////////version 20090915////////////////////////
4 ////Par Jérémy moureaux & Gilles-Philippe P.Martel/////////
5 ///////////////////////////////////////////////////////////
6
7 #include <iostream>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <math.h>
12 #include <ctime>
13
14 #include "bib_0000.h"
15 #include "bib_m000.h"
16 #include "bib_m001.h"
17 #include "element_com.h"
18 #include "etude_com.h"
19 #include "gm_com.h"
20 #include "gn_com.h"
21 #include "maillage_com.h"
22 #include "noeuds_com.h"
23 #include "structure.h"
24
25 using namespace std;
26
27 int main(int argc, char **argv )
28 {
29
30 ///////////////////////////////////////////////
31 //////////Variables, constantes et/////////////
32 /////////param�tres n�cessaires pour///////////
33 /////////la routine d'optimisation/////////////
34 ///////////////////////////////////////////////
35
36 o_etude_com *m_ptr_etude ;
37 ptr_o_element_com m_element ;
38 ptr_o_gm_com m_gm ;
39
40 char m_nom_fic_parametre[co_lcc_max_nom_fic] ;
41 char m_nom_fic_etude[co_lcc_max_nom_fic] ;
42 char m_nom_fic_densite[co_lcc_max_nom_fic] ;
43 char m_nom_fic_flottant[co_lcc_max_nom_fic] ;
44 char m_nom_gm[co_lcc_max_nom_gm] ;
45 char m_nom_fic_mail[co_lcc_max_nom_fic] ;
46
47 ulong _premier_element ; //Num�ro du premier �l�ment 3D du mod�le
48 ulong _dernier_element ; //nombre d'�l�ments du mod�le
49 ulong m_nbr_gm ; //Nombre de groupes de mailles du mod�le
50 ulong m_no_gm ; //Num�ro d'un groupe de maille
51 ulong _type ; //Entier correspondant au type d'�l�ment
52 ulong no_temp ;
53 ulong no_element_face[5] ;
54 ulong *no_element_f ;
55 vifl seuil = 0.8 ; //Seuil pour la visualisation des éléments conservés (0.8 par défaut)
56
57 ulong temporaire;
58 ulong nbr_voi_type_f;
59 ulong b;
60 ulong c;
61 ulong e;
62 ulong g;
63 ulong i;
64 ulong l;
65 ulong n;
66 ulong t;
67 ulong y;
68 ulong _no;
69
70 bool verifier;
71 bool fini;
72
73 ptr_o_maillage_com m_maillage;
74
75 //Acquisition des param�tres de l'�tude
76 for (i=0;i<argc;i++)
77 {
78 if (strcmp(argv[i],"-fichier")==0) strcpy(m_nom_fic_parametre,argv[i+1]);
79 if (strcmp(argv[i],"-seuil")==0) seuil=atof(argv[i+1]);
80 }
81
82 FILE* parametres=fopen(m_nom_fic_parametre,"rt");
83 char message[100];
84 fgets(message,100,parametres);
85 sscanf(message,"%s",&m_nom_fic_etude);
86
87 //----------------------------------------------------------------------------
88 //----------------------------------------------------------------------------
89 //-- initialisation de modules et allocation de l'�tude ----------------------
90
91 printf( "\n\n-------------------------------------------------------\n" );
92 printf( "-- initialisation des modules -------------------------\n" );
93
94 init_etude_com( ) ;
95
96 printf( "\nfait.\n" );
97
98 printf( "\n-------------------------------------------------------\n" );
99 printf( "-- allocation de l'�tude ------------------------------\n" );
100
101 m_ptr_etude = (o_etude_com *) NULL;
102
103 m_ptr_etude = new o_etude_com;
104
105 if( m_ptr_etude == (o_etude_com *) NULL ) {
106
107 printf( "\nbobo\n" );
108
109 return( co_probleme );
110
111 }
112
113 printf( "\nfait.\n" );
114
115 char str[80];
116
117 strcpy(str,"./");
118 strcat(str,m_nom_fic_etude);
119 strcat(str,"1.mail");
120 strcpy( &m_nom_fic_mail[0], str);
121 strcpy(str,"./");
122 strcat(str,m_nom_fic_etude);
123 strcat(str,"_densite.txt");
124 strcpy( &m_nom_fic_densite[0], str);
125 strcpy(str,"./");
126 strcat(str,m_nom_fic_etude);
127 strcat(str,"_flottant.txt");
128 strcpy( &m_nom_fic_flottant[0], str);
129
130 //----------------------------------------------------------------------------
131 //----------------------------------------------------------------------------
132 //-- d�finition des noms des fichiers maillage et r�sultats ------------------
133
134 printf( "\n-------------------------------------------------------\n" );
135 printf( "--d�finition du nom du fichier .mail\n" );
136
137
138 if( m_ptr_etude->def_nom_fic( (char *) &m_nom_fic_mail[0] )
139 != co_nom_fic_mail ) {
140
141 printf( "\nbobo\n" );
142
143 delete m_ptr_etude;
144
145 return( co_probleme ); // bobo
146
147 }
148
149
150 printf( "\nfait.\n" );
151
152 //----------------------------------------------------------------------------
153 //----------------------------------------------------------------------------
154
155 printf( "\n-------------------------------------------------------\n" );
156 printf( "-- r�cup�ration du maillage ---------------------------\n" );
157
158 if( m_ptr_etude->recup_mail( ) != co_pas_de_probleme ) {
159
160 delete m_ptr_etude;
161
162 return( co_probleme ); // bobo
163
164 }
165
166 printf( "\nfait.\n" );
167
168
169 //D�termination du num�ro du dernier �l�ment du maillage
170 m_ptr_etude->ren_nbr_elements(&_dernier_element);
171
172 //D�termination du num�ro du premier �l�ment du maillage 3D
173 for (i=1;i<=_dernier_element;i++)
174 {
175 m_ptr_etude->ren_element( (ulong) i ,
176 (ptr_o_element_com *) &m_element );
177 m_element->ren_type ( &_type );
178
179 if (_type == co_type_el_aster_TETRA4)
180 {
181 _premier_element = i;
182 break;
183 }
184 else if (_type == co_type_el_aster_TETRA10)
185 {
186 _premier_element = i;
187 break;
188 }
189 }
190
191 //D�termination du nombre de groupes de mailles du maillage
192 m_ptr_etude->ren_nbr_gm((ulong *) &m_nbr_gm);
193
194
195 //Allocation de la m�moire n�cessaire dans les tableaux
196 vifl *densite = (vifl*) malloc (sizeof(vifl)*(_dernier_element+1)) ; //vecteur des variables densit�s pour chaque �l�ment
197
198 printf("Acquisition du vecteur densite à partir du fichier texte correspondant\n");
199
200 FILE* densite_final=fopen(m_nom_fic_densite,"rt");
201 fgets(message,100,densite_final);
202 for (i=_premier_element ; i <= _dernier_element ; i++)
203 {
204 fgets(message,100,densite_final);
205 sscanf(message,"%lu %lf",&no_temp,&densite[i]);
206 }
207
208
209 printf("Debut de la détection des éléments flottants\n");
210
211 struct conserver_element *element = (struct conserver_element*) malloc(sizeof(struct conserver_element)*(_dernier_element+1));
212 ulong t_etudier[_dernier_element+1];
213
214 for (i=1 ; i <= _dernier_element ; i++) //initialisation de la structure
215 {
216 element[i].numero=i;
217 element[i].conserver= false;
218 element[i].etudier = false;
219 }
220
221 for (m_no_gm = 1;m_no_gm<=m_nbr_gm;m_no_gm++) // on vient pointer sur le groupe non design
222 {
223 m_ptr_etude->ren_gm((ulong) m_no_gm, (ptr_o_gm_com *) &m_gm);
224 m_gm->ren_nom((char *) &m_nom_gm);
225 if (strcmp(m_nom_gm,"GMN2 ")==0)
226 {
227 break;
228 }
229 }
230
231 for (i=_premier_element ; i <= _dernier_element ; i++) // on conserve les elements de la partie non-design
232 {
233 if (m_gm -> element_dans_gm(i) == co_oui)
234 {
235 element[i].conserver = true;
236 }
237 }
238
239 FILE* fichier = fopen ("non-design.txt","wt");
240 for (i=_premier_element ; i <= _dernier_element ; i++)
241 {
242 if (element[i].conserver == true)
243 {
244 fprintf(fichier,"%lu\n",i);
245 }
246 }
247
248 fclose(fichier);
249
250
251 for (i=_premier_element ; i <= _dernier_element ; i++) //on prend le premier element de la partie non design au hasard
252 {
253 if(element[i].conserver == true)
254 {
255 temporaire = i;
256 break;
257 }
258 }
259
260 for (i=1 ; i <= _dernier_element ; i++) // on initialise le tableau qui verifie si on a etudier l element
261 {
262 t_etudier[i] = 0;
263 }
264
265 m_ptr_etude -> ren_maillage( (ptr_o_maillage_com *) &m_maillage );
266 printf("Recherche des voisins de face commune\n");
267 m_maillage -> trouve_voisins_sg2();
268 t_etudier[temporaire] = temporaire ;
269
270 fini = false;
271
272
273 do {
274
275 m_ptr_etude -> ren_element (temporaire , &m_element);
276 m_element->ren_no((ulong*) &_no);
277 m_element -> ren_nbr_voi_type_f (&nbr_voi_type_f);
278 amem ((ulong **) &no_element_f , (ulong) nbr_voi_type_f);
279 m_element -> ren_voi_type_f (&no_element_f[1]); //on stocke dans un tableau les numeros des voisins avec face commune
280 t_etudier[temporaire]=0; // l element temporaire a été étudié , donc on met a 0 pour ne pas le reetudier plus tard
281 element[temporaire].etudier = true;
282
283 for (c=1 ; c <= nbr_voi_type_f ; c++) /* on va chercher les voisins ayant une face commune dans le tableau no_element afin de les conserver*/
284 {
285 g = no_element_f[c];
286 if ( densite[g] >= seuil )
287 {
288 element[g].conserver = true;
289 }
290 if (element[g].etudier == false && densite[g] >= seuil)
291 {
292 t_etudier[g] = g; // si l element n a pas deja été étudié, on stocke son numero ds le tableau.
293 }
294 }
295
296
297 y = nbr_voi_type_f;
298
299 for (l=1 ; l <= y ; l++) // maintenant on etudie tous les voisins a faces communes de l element temporaire
300 {
301 e = no_element_f[l];
302 if ( element[e].etudier == false )
303 {
304 if ( densite[e] >= seuil )
305 {
306 element[e].etudier = true;
307 t_etudier[e] = 0;
308 m_ptr_etude -> ren_element (e , &m_element);
309 m_element -> ren_nbr_voi_type_f (&nbr_voi_type_f);
310 m_element -> ren_voi_type_f (&no_element_face[1]);
311
312 for (n=1 ; n <= nbr_voi_type_f ; n++)
313 {
314 t = no_element_face[n];
315 if ( densite[t] >= seuil )
316 {
317 element[t].conserver = true; // on conserve les voisins des voisins de temporaire
318 }
319 if ( element[t].etudier == false && densite[t] >= seuil )
320 {
321 t_etudier[t] = t; // si l element n a pas deja été étudié, on stocke son numero ds le tableau.
322 }
323 }
324 }
325 }
326 }
327 free(no_element_f);
328
329
330 verifier = false;
331
332 b=_premier_element;
333
334 do {
335
336 if(t_etudier[b] != 0)
337 {
338 temporaire = t_etudier[b]; // on prend le premier element non etudié sous la main et on lui donne la valeur temporaire pour l etudier
339 verifier = true;
340 }
341 else if ((t_etudier[b] == 0) && (b == _dernier_element)) // si tous les elements du tableau sont nuls
342 {
343 verifier = true;
344 fini = true; // tous les elements on été étudiés (puisque tous nuls dans le tableau) donc on on sort de la grosse boucle
345 }
346 b=b+1;
347 } while (verifier == false);
348
349 }while (fini == false);
350
351 //ecriture des résultats dans un fichier texte/
352 FILE* fichier_final = fopen (m_nom_fic_flottant,"wt");
353 for (i=_premier_element ; i <= _dernier_element ; i++)
354 {
355 if ((element[i].conserver == true) && (densite[i] >= seuil))
356 {
357 fprintf(fichier_final,"%lu 1\n",i);
358 }
359 else
360 {
361 fprintf(fichier_final,"%lu 0\n",i);
362 }
363 }
364 fclose(fichier_final);
365
366
367 printf("Fin de la détection des éléments flottant");
368
369 printf( "\n\n-------------------------------------------------------\n" );
370 printf( "-- finitialisation des modules ------------------------\n" );
371
372 //Libération de la mémoire utilisée dans les tableaux
373
374 free( densite );
375
376 finit_etude_com( ) ;
377
378 printf( "\nfait.\n" );
379
380 printf( "\nfin.\n\n\n\n\n" );
381
382 return (co_pas_de_probleme);
383
384 }
385
386 //* [ FreSOP - base ] ********************************* optimisation_topo.cpp * <

Properties

Name Value
svn:executable *