1 |
picher |
217 |
/////////////////////////////////////////////////////////// |
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 |
picher |
219 |
|
57 |
picher |
217 |
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 |
picher |
219 |
|
70 |
picher |
217 |
bool verifier; |
71 |
|
|
bool fini; |
72 |
picher |
219 |
|
73 |
picher |
217 |
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 |
picher |
219 |
struct conserver_element *element = (struct conserver_element*) malloc(sizeof(struct conserver_element)*(_dernier_element+1)); |
212 |
|
|
ulong t_etudier[_dernier_element+1]; |
213 |
|
|
|
214 |
picher |
217 |
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 * < |