ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/optimisation/src/detection_flottant.cpp
Revision: 217
Committed: Tue Nov 10 18:24:50 2009 UTC (15 years, 6 months ago) by picher
File size: 11427 byte(s)
Log Message:
Ajout d'une procedure de detection et suppression des elements flottants pour les resultats d'optimisation topologique

File Contents

# User Rev Content
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 * <

Properties

Name Value
svn:executable *