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