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 * < |