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