1 |
picher |
199 |
/////////////////////////////////////////////////////////// |
2 |
|
|
//M�thodes d'optimisation topologique par homog�n�isation// |
3 |
|
|
///////////////////version 20090708//////////////////////// |
4 |
|
|
//////////////Par Gilles-Philippe P.Martel///////////////// |
5 |
|
|
/////////////////////////////////////////////////////////// |
6 |
|
|
|
7 |
|
|
#include <stdio.h> |
8 |
|
|
#include <stdlib.h> |
9 |
|
|
#include <string.h> |
10 |
|
|
#include <math.h> |
11 |
|
|
#include <ctime> |
12 |
|
|
|
13 |
|
|
#include "bib_0000.h" |
14 |
|
|
#include "bib_m000.h" |
15 |
|
|
#include "bib_m001.h" |
16 |
|
|
#include "element_com.h" |
17 |
|
|
#include "etude_com.h" |
18 |
|
|
#include "gm_com.h" |
19 |
|
|
#include "gn_com.h" |
20 |
|
|
#include "maillage_com.h" |
21 |
|
|
#include "noeuds_com.h" |
22 |
|
|
|
23 |
|
|
#include "write_num.h" |
24 |
|
|
#include "ecriture_materiau.h" |
25 |
|
|
#include "affecter_materiau.h" |
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 |
picher |
218 |
char m_nom_fic_densite[co_lcc_max_nom_fic] ; |
43 |
picher |
199 |
char m_nom_gm[co_lcc_max_nom_gm] ; |
44 |
|
|
char m_nom_champ[co_lcc_max_nom_champ_resu] ; |
45 |
|
|
char m_nom_fic_export[co_lcc_max_nom_fic] ; |
46 |
|
|
char m_nom_fic_mail[co_lcc_max_nom_fic] ; |
47 |
|
|
char m_nom_fic_mail_init[co_lcc_max_nom_fic] ; |
48 |
|
|
char m_nom_fic_mail_iter[co_lcc_max_nom_fic] ; |
49 |
|
|
char m_nom_fic_comm1[co_lcc_max_nom_fic] ; |
50 |
|
|
char m_nom_fic_comm2[co_lcc_max_nom_fic] ; |
51 |
|
|
char m_nom_fic_comm[co_lcc_max_nom_fic] ; |
52 |
|
|
char m_nom_fic_resu[co_lcc_max_nom_fic] ; |
53 |
|
|
char m_nom_fic_groupm[co_lcc_max_nom_fic] ; |
54 |
|
|
char m_nom_fic_compliance[co_lcc_max_nom_fic]; |
55 |
|
|
char m_nom_symbolique[co_lcc_max_nom_symbo] ; |
56 |
|
|
char *buffer1 ; |
57 |
|
|
char *buffer2 ; |
58 |
|
|
char *buffer3 ; |
59 |
|
|
char *buffer4 ; |
60 |
|
|
|
61 |
|
|
ulong _premier_element ; //Num�ro du premier �l�ment 3D du mod�le |
62 |
|
|
ulong _dernier_element ; //nombre d'�l�ments du mod�le |
63 |
|
|
ulong m_nbr_gm ; //Nombre de groupes de mailles du mod�le |
64 |
|
|
ulong m_no_gm ; //Num�ro d'un groupe de maille |
65 |
|
|
ulong *m_nbr_voisins ; //Nombre de voisins pour chaque éléments |
66 |
|
|
ulong m_no_voisin ; |
67 |
|
|
ulong **m_V_nos_voisins ; //Tableau de pointeur vers les voisins de chaque éléments |
68 |
|
|
ulong i ; |
69 |
|
|
ulong j ; |
70 |
|
|
ulong l ; |
71 |
|
|
ulong iter = 1 ; |
72 |
|
|
ulong iter_max = 50 ; //On sp�cifit le nombre d'it�ration maximum permit (par défaut 50) |
73 |
|
|
ulong _type ; //Entier correspondant au type d'�l�ment |
74 |
|
|
ulong fic_size1; |
75 |
|
|
ulong fic_size2; |
76 |
|
|
ulong fic_size3; |
77 |
|
|
ulong fic_size4; |
78 |
|
|
|
79 |
|
|
vifl l1; vifl l2 ; //Variables pour la dichotomie |
80 |
|
|
vifl m= 0.18; vifl lmid ; |
81 |
|
|
vifl critere_densite = 0.0 ; |
82 |
|
|
vifl E = 210e9 ; //module de young (par d�faut acier) |
83 |
|
|
vifl nu = 0.3 ; //coefficient de poisson (par d�faut acier) |
84 |
|
|
vifl rho = 7850. ; //masse volumique (par d�faut acier) |
85 |
|
|
vifl Vx = 0. ; //volume de mati�re � optimiser (design) |
86 |
|
|
vifl V1 = 0. ; //volume de mati�re fixe (non-design) |
87 |
|
|
vifl frac_vol = 0.6 ; //fraction volumique de la zone active (valeur par défaut) |
88 |
|
|
vifl penal = 3.0 ; //coefficient de p�nalisation (par défaut 3) |
89 |
|
|
vifl k = 3.0 ; //Coefficient k pour le calcul des poids Hv |
90 |
|
|
vifl niveau = 150. ; //Nombre de niveaux de densit�s (par défaut 150) |
91 |
|
|
vifl change = 1. ; |
92 |
picher |
218 |
vifl seuil = 0.8 ; //Seuil pour la visualisation des éléments conservés (0.8 par défaut) |
93 |
picher |
199 |
vifl densite_min = 1e-3 ; //Densit� minimale de 0.001 |
94 |
|
|
vifl densite_max = 1.0 ; |
95 |
|
|
vifl m_item ; |
96 |
|
|
vifl _volume ; |
97 |
|
|
vifl m_distance ; |
98 |
|
|
vifl **m_V_distance ; //Tableau de pointeur vers les distances aux voisins de chaque éléments |
99 |
|
|
vifl x1 ; |
100 |
|
|
vifl x2 ; |
101 |
|
|
vifl x3 ; |
102 |
|
|
vifl x4 ; |
103 |
|
|
vifl x5 ; |
104 |
|
|
vifl x6 ; |
105 |
|
|
vifl x7 ; |
106 |
|
|
vifl x8 ; |
107 |
|
|
|
108 |
|
|
ty_RSLT m_design ; |
109 |
|
|
|
110 |
picher |
218 |
|
111 |
|
|
|
112 |
picher |
199 |
//Acquisition des param�tres de l'�tude |
113 |
|
|
for (int i=0;i<argc;i++) |
114 |
|
|
{ |
115 |
|
|
if (strcmp(argv[i],"-fichier")==0) strcpy(m_nom_fic_parametre,argv[i+1]); |
116 |
|
|
if (strcmp(argv[i],"-fraction")==0) frac_vol=atof(argv[i+1]); |
117 |
|
|
if (strcmp(argv[i],"-penal")==0) penal=atof(argv[i+1]); |
118 |
|
|
if (strcmp(argv[i],"-niveau")==0) niveau=atof(argv[i+1]); |
119 |
|
|
if (strcmp(argv[i],"-nbiter")==0) iter_max=atoi(argv[i+1]); |
120 |
picher |
218 |
if (strcmp(argv[i],"-seuil")==0) seuil=atoi(argv[i+1]); |
121 |
picher |
199 |
} |
122 |
|
|
FILE* parametres=fopen(m_nom_fic_parametre,"rt"); |
123 |
|
|
char message[100]; |
124 |
|
|
fgets(message,100,parametres); |
125 |
|
|
sscanf(message,"%s",&m_nom_fic_etude); |
126 |
|
|
sscanf(message,"%le %lf %le",&E,&nu,&rho); |
127 |
|
|
char* path=(char*)getenv("PATHASTER"); |
128 |
|
|
strcat(path,"/as_run"); |
129 |
|
|
|
130 |
|
|
//---------------------------------------------------------------------------- |
131 |
|
|
//---------------------------------------------------------------------------- |
132 |
|
|
//-- initialisation de modules et allocation de l'�tude ---------------------- |
133 |
|
|
|
134 |
|
|
printf( "\n\n-------------------------------------------------------\n" ); |
135 |
|
|
printf( "-- initialisation des modules -------------------------\n" ); |
136 |
|
|
|
137 |
|
|
init_etude_com( ) ; |
138 |
|
|
|
139 |
|
|
printf( "\nfait.\n" ); |
140 |
|
|
|
141 |
|
|
printf( "\n-------------------------------------------------------\n" ); |
142 |
|
|
printf( "-- allocation de l'�tude ------------------------------\n" ); |
143 |
|
|
|
144 |
|
|
m_ptr_etude = (o_etude_com *) NULL; |
145 |
|
|
|
146 |
|
|
m_ptr_etude = new o_etude_com; |
147 |
|
|
|
148 |
|
|
if( m_ptr_etude == (o_etude_com *) NULL ) { |
149 |
|
|
|
150 |
|
|
printf( "\nbobo\n" ); |
151 |
|
|
|
152 |
|
|
return( co_probleme ); |
153 |
|
|
|
154 |
|
|
} |
155 |
|
|
|
156 |
|
|
printf( "\nfait.\n" ); |
157 |
|
|
|
158 |
picher |
209 |
char str[80]; |
159 |
picher |
199 |
|
160 |
picher |
209 |
strcpy(str,"./"); |
161 |
|
|
strcat(str,m_nom_fic_etude); |
162 |
|
|
strcat(str,".export"); |
163 |
|
|
strcpy( &m_nom_fic_export[0], str); |
164 |
|
|
strcpy(str,"./"); |
165 |
|
|
strcat(str,m_nom_fic_etude); |
166 |
|
|
strcat(str,".mail"); |
167 |
|
|
strcpy( &m_nom_fic_mail_init[0], str); |
168 |
|
|
strcpy(str,"./"); |
169 |
|
|
strcat(str,m_nom_fic_etude); |
170 |
|
|
strcat(str,".mail"); |
171 |
|
|
strcpy( &m_nom_fic_mail[0], str); |
172 |
|
|
strcpy(str,"./"); |
173 |
|
|
strcat(str,m_nom_fic_etude); |
174 |
|
|
strcat(str,"1.mail"); |
175 |
|
|
strcpy( &m_nom_fic_mail_iter[0], str); |
176 |
|
|
strcpy(str,"./"); |
177 |
|
|
strcat(str,m_nom_fic_etude); |
178 |
|
|
strcat(str,".comm"); |
179 |
|
|
strcpy( &m_nom_fic_comm[0], str); |
180 |
|
|
strcpy(str,"./"); |
181 |
|
|
strcat(str,m_nom_fic_etude); |
182 |
|
|
strcat(str,".resu"); |
183 |
|
|
strcpy( &m_nom_fic_resu[0], str); |
184 |
|
|
strcpy(str,"./"); |
185 |
|
|
strcat(str,m_nom_fic_etude); |
186 |
|
|
strcat(str,"_evol.txt"); |
187 |
|
|
strcpy( &m_nom_fic_compliance[0], str); |
188 |
picher |
218 |
strcpy(str,"./"); |
189 |
|
|
strcat(str,m_nom_fic_etude); |
190 |
|
|
strcat(str,"_densite.txt"); |
191 |
|
|
strcpy( &m_nom_fic_densite[0], str); |
192 |
picher |
199 |
strcpy( &m_nom_fic_groupm[0] , "./groupes.mail" ); |
193 |
|
|
|
194 |
|
|
//---------------------------------------------------------------------------- |
195 |
|
|
//---------------------------------------------------------------------------- |
196 |
|
|
//-- d�finition des noms des fichiers maillage et r�sultats ------------------ |
197 |
|
|
|
198 |
|
|
printf( "\n-------------------------------------------------------\n" ); |
199 |
|
|
printf( "--d�finition des noms des fichiers export, mail et resu\n" ); |
200 |
|
|
|
201 |
|
|
if( m_ptr_etude->def_nom_fic( (char *) &m_nom_fic_export[0] ) |
202 |
|
|
!= co_nom_fic_export ) { |
203 |
|
|
|
204 |
|
|
printf( "\nbobo\n" ); |
205 |
|
|
|
206 |
|
|
delete m_ptr_etude; |
207 |
|
|
|
208 |
|
|
return( co_probleme ); // bobo |
209 |
|
|
|
210 |
|
|
} |
211 |
|
|
|
212 |
|
|
if( m_ptr_etude->def_nom_fic( (char *) &m_nom_fic_mail[0] ) |
213 |
|
|
!= co_nom_fic_mail ) { |
214 |
|
|
|
215 |
|
|
printf( "\nbobo\n" ); |
216 |
|
|
|
217 |
|
|
delete m_ptr_etude; |
218 |
|
|
|
219 |
|
|
return( co_probleme ); // bobo |
220 |
|
|
|
221 |
|
|
} |
222 |
|
|
|
223 |
|
|
if( m_ptr_etude->def_nom_fic( (char *) &m_nom_fic_resu[0] ) |
224 |
|
|
!= co_nom_fic_resu ) { |
225 |
|
|
|
226 |
|
|
printf( "\nbobo\n" ); |
227 |
|
|
|
228 |
|
|
delete m_ptr_etude; |
229 |
|
|
|
230 |
|
|
return( co_probleme ); // bobo |
231 |
|
|
|
232 |
|
|
} |
233 |
|
|
|
234 |
|
|
printf( "\nfait.\n" ); |
235 |
|
|
|
236 |
|
|
//---------------------------------------------------------------------------- |
237 |
|
|
//---------------------------------------------------------------------------- |
238 |
|
|
|
239 |
|
|
printf( "\n-------------------------------------------------------\n" ); |
240 |
|
|
printf( "-- r�cup�ration du maillage ---------------------------\n" ); |
241 |
|
|
|
242 |
|
|
if( m_ptr_etude->recup_mail( ) != co_pas_de_probleme ) { |
243 |
|
|
|
244 |
|
|
delete m_ptr_etude; |
245 |
|
|
|
246 |
|
|
return( co_probleme ); // bobo |
247 |
|
|
|
248 |
|
|
} |
249 |
|
|
|
250 |
|
|
printf( "\nfait.\n" ); |
251 |
|
|
|
252 |
|
|
|
253 |
|
|
//D�termination du num�ro du dernier �l�ment du maillage |
254 |
|
|
m_ptr_etude->ren_nbr_elements(&_dernier_element); |
255 |
|
|
|
256 |
|
|
//D�termination du num�ro du premier �l�ment du maillage 3D |
257 |
|
|
for (i=1;i<=_dernier_element;i++) |
258 |
|
|
{ |
259 |
|
|
m_ptr_etude->ren_element( (ulong) i , |
260 |
|
|
(ptr_o_element_com *) &m_element ); |
261 |
|
|
m_element->ren_type ( &_type ); |
262 |
|
|
|
263 |
|
|
if (_type == co_type_el_aster_TETRA4) |
264 |
|
|
{ |
265 |
|
|
_premier_element = i; |
266 |
|
|
break; |
267 |
|
|
} |
268 |
|
|
else if (_type == co_type_el_aster_TETRA10) |
269 |
|
|
{ |
270 |
|
|
_premier_element = i; |
271 |
|
|
break; |
272 |
|
|
} |
273 |
|
|
} |
274 |
|
|
|
275 |
|
|
//D�termination du nombre de groupes de mailles du maillage |
276 |
|
|
m_ptr_etude->ren_nbr_gm((ulong *) &m_nbr_gm); |
277 |
|
|
|
278 |
|
|
/////////////////////////////////// |
279 |
|
|
////Initialisation du domaine////// |
280 |
|
|
////////d'optimisation///////////// |
281 |
|
|
/////////////////////////////////// |
282 |
|
|
|
283 |
|
|
//On pointe d'abord sur le groupe de maille design |
284 |
|
|
for (m_no_gm = 1;m_no_gm<=m_nbr_gm;m_no_gm++) |
285 |
|
|
{ |
286 |
|
|
m_ptr_etude->ren_gm((ulong) m_no_gm, (ptr_o_gm_com *) &m_gm); |
287 |
|
|
m_gm->ren_nom((char *) &m_nom_gm); |
288 |
|
|
if (strcmp(m_nom_gm,"GMD2 ")==0) |
289 |
|
|
{ |
290 |
|
|
break; |
291 |
|
|
} |
292 |
|
|
} |
293 |
|
|
|
294 |
|
|
//Allocation de la m�moire n�cessaire dans les tableaux |
295 |
|
|
ulong *compteur = (ulong*) malloc (sizeof(ulong)*(_dernier_element+1)) ; |
296 |
|
|
vifl *densite = (vifl*) malloc (sizeof(vifl)*(_dernier_element+1)) ; //vecteur des variables densit�s pour chaque �l�ment |
297 |
|
|
ulong *densite_active = (ulong*) malloc (sizeof(ulong)*(_dernier_element+1)); //vecteur qui d�termine si la densit� est active |
298 |
|
|
vifl *densite_new = (vifl*) malloc (sizeof(vifl)*(_dernier_element+1)) ; //vecteur des variables densit�s pour la nouvelle it�ration |
299 |
|
|
vifl *volume = (vifl*) malloc (sizeof(vifl)*(_dernier_element+1)) ; //vecteur des volumes pour chaque �l�ment |
300 |
|
|
vifl *Denergie = (vifl*) malloc (sizeof(vifl)*(_dernier_element+1)) ; |
301 |
|
|
vifl *distance_ref = (vifl*) malloc (sizeof(vifl)*(_dernier_element+1)) ; //distance de r�f�rence pour l'ind�pendance des mailles |
302 |
|
|
vifl *Ctot = (vifl*) malloc (sizeof(vifl)*(iter_max)) ; //Vecteur du travail global par it�ration |
303 |
|
|
vifl Hv ; //Poids correspondant aux voisins |
304 |
|
|
vifl somme_Hv_fois_densite ; |
305 |
|
|
vifl somme_Hv ; |
306 |
|
|
vifl *nmailleniv = (vifl*) malloc (sizeof(vifl)*(niveau+1)) ; |
307 |
|
|
vifl *maille_niveau = (vifl*) malloc (sizeof(vifl)*(_dernier_element+1)); |
308 |
|
|
|
309 |
|
|
// Initialisation des vecteurs volume, densite et compteur |
310 |
|
|
for (i=_premier_element;i<=_dernier_element;i++) |
311 |
|
|
{ |
312 |
|
|
volume[i] = 0.; |
313 |
|
|
densite[i] = 1.*frac_vol; |
314 |
|
|
densite_active[i] = 0; |
315 |
|
|
compteur[i] = 1; |
316 |
|
|
maille_niveau[i]=0.; |
317 |
|
|
} |
318 |
|
|
|
319 |
|
|
//Calcul du volume de design et du volume total du maillage 3D |
320 |
|
|
for (i=_premier_element;i<=_dernier_element;i++) |
321 |
|
|
{ |
322 |
|
|
m_ptr_etude->ren_element ((ulong) i , |
323 |
|
|
(ptr_o_element_com *) &m_element ); |
324 |
|
|
m_element->ren_volume ( &_volume ); |
325 |
|
|
m_design = m_gm->element_dans_gm((ulong) i ); |
326 |
|
|
if(m_design == co_oui) |
327 |
|
|
{ |
328 |
|
|
Vx = Vx + _volume; |
329 |
|
|
} |
330 |
|
|
else |
331 |
|
|
{ |
332 |
|
|
densite_active[i] = 1; |
333 |
|
|
densite[i] = 1.; |
334 |
|
|
V1 = V1 + _volume; |
335 |
|
|
} |
336 |
|
|
|
337 |
|
|
} |
338 |
|
|
|
339 |
|
|
/////////////////////////////////////// |
340 |
|
|
///////Calcul du voisinage et////////// |
341 |
|
|
//des pond�rations de r�gulation/// |
342 |
|
|
/////////////////////////////////////// |
343 |
|
|
|
344 |
|
|
printf( "\n-------------------------------------------------------\n" ); |
345 |
|
|
printf( "-- Calcul du voisinage --------------------------------\n" ); |
346 |
|
|
|
347 |
|
|
//Allocation de la mémoire pour le nombre de pointeurs des tableaux de pointeurs |
348 |
|
|
amem( (vifl **) &m_V_distance , (ulong) _dernier_element ); |
349 |
|
|
amem( (vifl **) &m_V_nos_voisins, (ulong) _dernier_element ); |
350 |
|
|
amem( (ulong **) &m_nbr_voisins , (ulong) _dernier_element ); |
351 |
|
|
clock_t temps_initial = clock (); |
352 |
|
|
for (i = _premier_element ; i <= _dernier_element; i++) |
353 |
|
|
{ |
354 |
|
|
if(densite_active[i] == 0) |
355 |
|
|
{ |
356 |
|
|
m_ptr_etude->ren_element ( (ulong) i , |
357 |
|
|
(ptr_o_element_com *) &m_element ); |
358 |
|
|
m_element->ren_volume ( &_volume ); |
359 |
|
|
volume[i] = _volume ; |
360 |
|
|
distance_ref[i] = 2.5*pow((12.*_volume/co_rc_2),co_1_3) ; |
361 |
|
|
m_ptr_etude->ren_nbr_voisins_sphere( (ulong) i , |
362 |
|
|
(vifl *) &distance_ref[i] , |
363 |
|
|
(ulong *) &m_nbr_voisins[i]); |
364 |
|
|
amem( (vifl **) &m_V_distance[i] ,(ulong) m_nbr_voisins[i]); |
365 |
|
|
amem( (ulong **) &m_V_nos_voisins[i] ,(ulong) m_nbr_voisins[i]); |
366 |
|
|
m_ptr_etude->ren_voisins_sphere_v2( (ulong) i , |
367 |
|
|
(vifl *) &distance_ref[i] , |
368 |
|
|
(ulong *) m_V_nos_voisins[i] , |
369 |
|
|
(vifl *) m_V_distance[i] ); |
370 |
|
|
} |
371 |
|
|
} |
372 |
|
|
clock_t temps_final = clock (); |
373 |
|
|
ulong temps_calcul_voisins = (temps_final - temps_initial) / CLOCKS_PER_SEC; |
374 |
|
|
|
375 |
|
|
//�criture du nombre de voisins dans un fichier texte |
376 |
|
|
FILE *Nb_voisin = fopen ( "Nb_voisin.txt" , "wt" ); |
377 |
|
|
fprintf(Nb_voisin,"# d'�l�ments Nb de voisins\n"); |
378 |
|
|
for (i = _premier_element ; i <= _dernier_element; i++) |
379 |
|
|
{ |
380 |
|
|
fprintf(Nb_voisin," %lu %lu \n",i,m_nbr_voisins[i]); |
381 |
|
|
} |
382 |
|
|
fclose(Nb_voisin); |
383 |
|
|
|
384 |
|
|
////////////////////////////////////////// |
385 |
|
|
////D�but de la boucle d'optimisation///// |
386 |
|
|
////////////////////////////////////////// |
387 |
|
|
depart_chrono(); |
388 |
|
|
//Initialisation |
389 |
|
|
for (i = 0 ; i <= iter_max; i++) |
390 |
|
|
{ |
391 |
|
|
Ctot[i] = 0.0; |
392 |
|
|
} |
393 |
|
|
|
394 |
|
|
while ((fabs(change) > 0.1) && (iter <= iter_max)) |
395 |
|
|
{ |
396 |
|
|
|
397 |
|
|
/////////////////////////////////////// |
398 |
|
|
///////�criture du fichier .mail/////// |
399 |
|
|
///////pour l'it�ration en cours/////// |
400 |
|
|
/////////////////////////////////////// |
401 |
|
|
|
402 |
|
|
//On remet les niveaux des mailles � z�ro pour �viter de conserver les niveaux des it�rations pr�c�dentes ind�sirablement |
403 |
|
|
for (i=1;i<=niveau;i++) |
404 |
|
|
{ |
405 |
|
|
nmailleniv[i] = 0.; |
406 |
|
|
} |
407 |
|
|
|
408 |
|
|
//Cr�ation des groupes de mailles |
409 |
|
|
for (i = _premier_element; i<= _dernier_element; i++) |
410 |
|
|
{ |
411 |
|
|
j = 2; |
412 |
|
|
while (densite[i] >= j/niveau) |
413 |
|
|
{ |
414 |
|
|
j = j + 1; |
415 |
|
|
} |
416 |
|
|
maille_niveau[i] = j - 1; |
417 |
|
|
nmailleniv[j - 1] = nmailleniv[j - 1] + 1; |
418 |
|
|
} |
419 |
|
|
|
420 |
|
|
//On �crit la liste des groupes de mailles dans un fichier |
421 |
|
|
FILE *fic_groupm =fopen(m_nom_fic_groupm,"wt"); |
422 |
|
|
ulong n_niv = 0; |
423 |
|
|
char num_str[10]; |
424 |
|
|
|
425 |
|
|
for (i = 1;i<=niveau;i++) |
426 |
|
|
{ |
427 |
|
|
if (nmailleniv[i] != 0.) |
428 |
|
|
{ |
429 |
|
|
n_niv = n_niv + 1; //Compteur du nombre de niveaux de densit� cr�e pour l'it�ration en cours |
430 |
|
|
write_num(i, num_str); |
431 |
|
|
fprintf(fic_groupm,"GROUP_MA NOM=GM_%s\n",num_str); |
432 |
|
|
//On �crit les groupes de mailles dans le fichier groupes.mail |
433 |
|
|
l = 0; |
434 |
|
|
|
435 |
|
|
for (j = _premier_element;j<= _dernier_element;j++) |
436 |
|
|
{ |
437 |
|
|
if (maille_niveau[j] == i) |
438 |
|
|
{ |
439 |
|
|
write_num(j, num_str); |
440 |
|
|
fprintf(fic_groupm," M%s",num_str); |
441 |
|
|
l = l + 1; |
442 |
|
|
} |
443 |
|
|
if (l == 8) //Param�tre qui ajuste le nombre d'�l�ments par ligne que l'on �crit |
444 |
|
|
{ |
445 |
|
|
fprintf(fic_groupm,"\n"); |
446 |
|
|
l=0; |
447 |
|
|
} |
448 |
|
|
} |
449 |
|
|
|
450 |
|
|
if (l != 0) |
451 |
|
|
{ |
452 |
|
|
fprintf(fic_groupm,"\n"); |
453 |
|
|
} |
454 |
|
|
fprintf(fic_groupm,"FINSF\n"); |
455 |
|
|
} |
456 |
|
|
} |
457 |
|
|
fclose(fic_groupm); |
458 |
|
|
|
459 |
|
|
//On ajoute finalement la liste des groupes de mailles au fichier .mail global |
460 |
|
|
FILE * fic_temp1 = fopen (m_nom_fic_mail_init, "rb" ); |
461 |
|
|
fseek (fic_temp1 , 0 , SEEK_END); |
462 |
|
|
fic_size1 = ftell (fic_temp1); |
463 |
|
|
rewind (fic_temp1); |
464 |
|
|
|
465 |
|
|
FILE * fic_temp2 = fopen (m_nom_fic_groupm, "rb" ); |
466 |
|
|
fseek (fic_temp2 , 0 , SEEK_END); |
467 |
|
|
fic_size2 = ftell (fic_temp2); |
468 |
|
|
rewind (fic_temp2); |
469 |
|
|
|
470 |
|
|
buffer1 = (char*) malloc (sizeof(char)*fic_size1); |
471 |
|
|
buffer2 = (char*) malloc (sizeof(char)*fic_size2); |
472 |
|
|
|
473 |
|
|
fread (buffer1,1,fic_size1,fic_temp1); |
474 |
|
|
fread (buffer2,1,fic_size2,fic_temp2); |
475 |
|
|
|
476 |
|
|
FILE * fic_temp3 = fopen ( m_nom_fic_mail_iter, "wb" ); |
477 |
|
|
fwrite (buffer1,1,fic_size1,fic_temp3 ); |
478 |
|
|
fwrite (buffer2,1,fic_size2,fic_temp3 ); |
479 |
|
|
|
480 |
|
|
//On finalise le fichier .mail global avec la commande FIN |
481 |
|
|
FILE * fic_temp4 = fopen(m_nom_fic_mail_iter, "at" ); |
482 |
|
|
fprintf(fic_temp4,"%%\n"); |
483 |
|
|
fprintf(fic_temp4," FIN\n"); |
484 |
|
|
|
485 |
|
|
fclose (fic_temp1); |
486 |
|
|
fclose (fic_temp2); |
487 |
|
|
fclose (fic_temp3); |
488 |
|
|
fclose (fic_temp4); |
489 |
|
|
free (buffer1); |
490 |
|
|
free (buffer2); |
491 |
|
|
|
492 |
|
|
|
493 |
|
|
/////////////////////////////////////// |
494 |
|
|
///////�criture du fichier .comm/////// |
495 |
|
|
///////pour l'it�ration en cours/////// |
496 |
|
|
/////////////////////////////////////// |
497 |
|
|
|
498 |
|
|
//�criture des mat�riaux dans un fichier .comm interm�diaire |
499 |
|
|
char materiau[100]; |
500 |
|
|
FILE *fic_materiau =fopen("./materiau1.comm","wt"); |
501 |
|
|
|
502 |
|
|
for (i=1; i<=niveau; i++) |
503 |
|
|
{ |
504 |
|
|
if (nmailleniv[i] != 0.) |
505 |
|
|
{ |
506 |
|
|
ecriture_materiau(i,E*pow((i/niveau),penal),nu,(i/niveau)*rho,materiau); |
507 |
|
|
fprintf(fic_materiau,"%s\n",materiau); |
508 |
|
|
} |
509 |
|
|
} |
510 |
|
|
|
511 |
|
|
fclose(fic_materiau); |
512 |
|
|
|
513 |
|
|
//Affectation des mat�riaux aux diff�rents groupes de mailles dans un fichier .comm interm�diaire |
514 |
|
|
affecter_materiau(niveau,nmailleniv); |
515 |
|
|
|
516 |
|
|
//On lit d'abord les fichiers statique (commande1.comm,commande2.comm et commande3.comm) |
517 |
|
|
strcpy(m_nom_fic_comm1,m_nom_fic_etude); |
518 |
|
|
strcat(m_nom_fic_comm1,"_1.comm"); |
519 |
|
|
FILE *fic_commande1 = fopen (m_nom_fic_comm1, "rb" ); |
520 |
|
|
fseek (fic_commande1 , 0 , SEEK_END); |
521 |
|
|
fic_size1 = ftell (fic_commande1); |
522 |
|
|
rewind (fic_commande1); |
523 |
|
|
|
524 |
|
|
//On alloue la m�moire n�cessaire au contenu du fichier |
525 |
|
|
buffer1 = (char*) malloc (sizeof(char)*fic_size1); |
526 |
|
|
|
527 |
|
|
//On copie l'ensemble du fichier commande1.comm dans le buffer 1 |
528 |
|
|
fread (buffer1,1,fic_size1,fic_commande1); |
529 |
|
|
|
530 |
|
|
strcpy(m_nom_fic_comm2,m_nom_fic_etude); |
531 |
|
|
strcat(m_nom_fic_comm2,"_2.comm"); |
532 |
|
|
FILE *fic_commande2 = fopen (m_nom_fic_comm2, "rb" ); |
533 |
|
|
fseek (fic_commande2 , 0 , SEEK_END); |
534 |
|
|
fic_size2 = ftell (fic_commande2); |
535 |
|
|
rewind (fic_commande2); |
536 |
|
|
|
537 |
|
|
//On alloue la m�moire n�cessaire au contenu du fichier |
538 |
|
|
buffer2 = (char*) malloc (sizeof(char)*fic_size2); |
539 |
|
|
|
540 |
|
|
//On copie l'ensemble du fichier commande2.comm dans le buffer2 |
541 |
|
|
fread (buffer2,1,fic_size2,fic_commande2); |
542 |
|
|
|
543 |
|
|
//On lit ensuite les fichiers materiau1.comm et materiau2.comm que l'on a cr�e |
544 |
|
|
FILE *fic_materiau1 = fopen ( "materiau1.comm" , "rb" ); |
545 |
|
|
fseek (fic_materiau1 , 0 , SEEK_END); |
546 |
|
|
fic_size3 = ftell (fic_materiau1); |
547 |
|
|
rewind (fic_materiau1); |
548 |
|
|
|
549 |
|
|
//On alloue la m�moire n�cessaire au contenu du fichier |
550 |
|
|
buffer3 = (char*) malloc (sizeof(char)*fic_size3); |
551 |
|
|
|
552 |
|
|
//On copie l'ensemble du fichier materiau1.comm dans le buffer 3 |
553 |
|
|
fread (buffer3,1,fic_size3,fic_materiau1); |
554 |
|
|
|
555 |
|
|
FILE *fic_materiau2 = fopen ( "materiau2.comm" , "rb" ); |
556 |
|
|
fseek (fic_materiau2 , 0 , SEEK_END); |
557 |
|
|
fic_size4 = ftell (fic_materiau2); |
558 |
|
|
rewind (fic_materiau2); |
559 |
|
|
|
560 |
|
|
//On alloue la m�moire n�cessaire au contenu du fichier |
561 |
|
|
buffer4 = (char*) malloc (sizeof(char)*fic_size4); |
562 |
|
|
|
563 |
|
|
//On copie l'ensemble du fichier materiau2.comm dans le buffer 4 |
564 |
|
|
fread (buffer4,1,fic_size4,fic_materiau2); |
565 |
|
|
|
566 |
|
|
//On �crit finalement le fichier .comm global pour l'it�ration en cours |
567 |
|
|
FILE * fic_commande = fopen ( m_nom_fic_comm , "wb" ); |
568 |
|
|
fwrite (buffer1,1,fic_size1,fic_commande ); |
569 |
|
|
fwrite (buffer3,1,fic_size3,fic_commande );; |
570 |
|
|
fwrite (buffer4,1,fic_size4,fic_commande ); |
571 |
|
|
fwrite (buffer2,1,fic_size2,fic_commande ); |
572 |
|
|
|
573 |
|
|
fclose (fic_commande ); |
574 |
|
|
fclose (fic_commande1); |
575 |
|
|
fclose (fic_commande2); |
576 |
|
|
fclose (fic_materiau1); |
577 |
|
|
fclose (fic_materiau2); |
578 |
|
|
free (buffer1); |
579 |
|
|
free (buffer2); |
580 |
|
|
free (buffer3); |
581 |
|
|
free (buffer4); |
582 |
|
|
|
583 |
|
|
|
584 |
|
|
/////////////////////////////////// |
585 |
|
|
////Ex�cution de Code-ASTER//////// |
586 |
|
|
/////////////////////////////////// |
587 |
|
|
|
588 |
|
|
//On d�finit un nom de fichier pour l'it�ration en cours |
589 |
|
|
strcpy( &m_nom_fic_mail[0] , m_nom_fic_mail_iter ); |
590 |
|
|
if( m_ptr_etude->def_nom_fic( (char *) &m_nom_fic_mail[0] ) |
591 |
|
|
!= co_nom_fic_mail ) |
592 |
|
|
{ |
593 |
|
|
|
594 |
|
|
printf( "\nbobo\n" ); |
595 |
|
|
|
596 |
|
|
delete m_ptr_etude; |
597 |
|
|
|
598 |
|
|
return( co_probleme ); // bobo |
599 |
|
|
|
600 |
|
|
} |
601 |
|
|
|
602 |
|
|
printf( "\n-------------------------------------------------------\n" ); |
603 |
|
|
printf( "-- Ex�cution de code-aster ----------------------------\n" ); |
604 |
|
|
|
605 |
|
|
m_ptr_etude->def_solveur("ASTER",path); |
606 |
|
|
|
607 |
|
|
m_ptr_etude->lance_solveur( ); |
608 |
|
|
|
609 |
|
|
|
610 |
|
|
printf( "\n-----------------------------------------------------------\n" ); |
611 |
|
|
printf( "-- r�cup�ration des r�sultats -----------------------------\n" ); |
612 |
|
|
|
613 |
|
|
|
614 |
|
|
strcpy( &m_nom_symbolique[0], "EPOT_ELEM_DEPL" ); |
615 |
|
|
|
616 |
|
|
if( m_ptr_etude->recup_resu( &m_nom_symbolique[0] ) != co_pas_de_probleme ) { |
617 |
|
|
|
618 |
|
|
delete m_ptr_etude; |
619 |
|
|
|
620 |
|
|
return( co_probleme ); // bobo |
621 |
|
|
|
622 |
|
|
} |
623 |
|
|
|
624 |
|
|
printf( "\nfait.\n" ); |
625 |
|
|
|
626 |
|
|
/////////////////////////////////////// |
627 |
|
|
///////Calcul de l'�nergie///////////// |
628 |
|
|
//totale de d�formation (Compliance)/// |
629 |
|
|
//et de la d�riv�e de l'�nergie//////// |
630 |
|
|
/////////////////////////////////////// |
631 |
|
|
|
632 |
|
|
strcpy( &m_nom_symbolique[0] , "EPOT_ELEM_DEPL" ); |
633 |
|
|
strcpy( &m_nom_champ[0] , "TOTALE" ); |
634 |
|
|
|
635 |
|
|
for (i=_premier_element;i<=_dernier_element;i++) |
636 |
|
|
{ |
637 |
|
|
m_ptr_etude->ren_element( (ulong) i , |
638 |
|
|
(ptr_o_element_com *) &m_element ); |
639 |
|
|
m_element->ren_item_CR(m_nom_symbolique , |
640 |
|
|
m_nom_champ, |
641 |
|
|
1, |
642 |
|
|
&m_item); |
643 |
|
|
Ctot[iter] = Ctot[iter] + m_item ; |
644 |
|
|
Denergie[i] = -penal*m_item/densite[i]; |
645 |
|
|
} |
646 |
|
|
|
647 |
|
|
printf( "�nergie de d�formation totale pour l'it�ration en cours : %11.6e\n", Ctot[iter] ); |
648 |
|
|
|
649 |
|
|
/////////////////////////////////////// |
650 |
|
|
///////Calcul des crit�res///////////// |
651 |
|
|
/////////d'optimalit�////////////////// |
652 |
|
|
/////////////////////////////////////// |
653 |
|
|
|
654 |
|
|
//D�termination des multiplicateurs de Lagrange par dichotomie |
655 |
|
|
l1= 0. ; |
656 |
|
|
l2= 1e8 ; |
657 |
|
|
while ((l2-l1) > 1e-12) |
658 |
|
|
{ |
659 |
|
|
lmid = 0.5*(l2+l1); |
660 |
|
|
critere_densite = 0.0; |
661 |
|
|
for (i=_premier_element;i<=_dernier_element;i++) |
662 |
|
|
{ |
663 |
|
|
if(densite_active[i]== 0) |
664 |
|
|
{ |
665 |
|
|
x1 = densite[i]+m; |
666 |
|
|
x2 = densite[i]*sqrt(-Denergie[i]/lmid); |
667 |
|
|
x3 = densite_max; |
668 |
|
|
x4 = mini(&x1,&x2); |
669 |
|
|
x5 = densite[i]-m; |
670 |
|
|
x6 = mini(&x3,&x4); |
671 |
|
|
x7 = densite_min; |
672 |
|
|
x8 = maxi(&x5,&x6); |
673 |
|
|
densite_new[i] = maxi(&x7,&x8); |
674 |
|
|
critere_densite = critere_densite + densite_new[i]*volume[i]; |
675 |
|
|
} |
676 |
|
|
else |
677 |
|
|
{ |
678 |
|
|
densite_new[i]=1.; |
679 |
|
|
critere_densite = critere_densite + densite_new[i]*volume[i]; |
680 |
|
|
} |
681 |
|
|
} |
682 |
|
|
if (critere_densite - (frac_vol*Vx + V1) > 0) |
683 |
|
|
{ |
684 |
|
|
l1=lmid; |
685 |
|
|
} |
686 |
|
|
else |
687 |
|
|
{ |
688 |
|
|
l2=lmid; |
689 |
|
|
} |
690 |
|
|
} |
691 |
|
|
|
692 |
|
|
|
693 |
|
|
/////////////////////////////////////// |
694 |
|
|
///////Adaptation de la /////////////// |
695 |
|
|
/////////sensibilit�/////////////////// |
696 |
|
|
/////////////////////////////////////// |
697 |
|
|
|
698 |
|
|
for (i=_premier_element;i<=_dernier_element;i++) |
699 |
|
|
{ |
700 |
|
|
if (densite_active[i] == 1) |
701 |
|
|
{ |
702 |
|
|
densite[i] = 1.; |
703 |
|
|
} |
704 |
|
|
else |
705 |
|
|
{ |
706 |
|
|
somme_Hv_fois_densite = 0.; |
707 |
|
|
somme_Hv = 0.; |
708 |
|
|
for (j = 1 ; j<=(m_nbr_voisins[i]) ; j++) |
709 |
|
|
{ |
710 |
|
|
lct_mem( (vifl *) m_V_distance[i] , (ulong) j, (vifl *) &m_distance ); |
711 |
|
|
lct_mem( (ulong *) m_V_nos_voisins[i] , (ulong) j,(ulong *) &m_no_voisin); |
712 |
|
|
if (densite_active[m_no_voisin] == 0) |
713 |
|
|
{ |
714 |
|
|
Hv = volume[m_no_voisin]*pow((distance_ref[i] - m_distance),k); |
715 |
|
|
somme_Hv_fois_densite = somme_Hv_fois_densite + Hv*densite_new[m_no_voisin]; |
716 |
|
|
somme_Hv = somme_Hv + Hv; |
717 |
|
|
} |
718 |
|
|
} |
719 |
|
|
densite[i] = somme_Hv_fois_densite/somme_Hv; |
720 |
|
|
} |
721 |
|
|
} |
722 |
|
|
|
723 |
|
|
|
724 |
|
|
/////////////////////////////////////// |
725 |
|
|
///////V�rification de la////////////// |
726 |
|
|
////convergence, ou de l'avancement//// |
727 |
|
|
///////de l'optimisation/////////////// |
728 |
|
|
/////////////////////////////////////// |
729 |
|
|
|
730 |
|
|
//On calcule le pourcentage d'�cart relatif entre Ctot[iter] et Ctot[iter-1] |
731 |
|
|
change = ecart_rel( &Ctot[iter], &Ctot[iter-1]); |
732 |
|
|
|
733 |
|
|
printf("Fin de l'it�ration #%lu\n",iter); |
734 |
|
|
iter = iter + 1; |
735 |
|
|
|
736 |
|
|
} |
737 |
|
|
arret_chrono(); |
738 |
|
|
|
739 |
|
|
/////////////////////////////////////// |
740 |
|
|
///////Impression et visualisation///// |
741 |
|
|
/////////////des r�sultats///////////// |
742 |
|
|
/////////////////////////////////////// |
743 |
|
|
|
744 |
|
|
//On imprime l'�volution de la compliance en fonction des it�rations dans un fichier texte |
745 |
|
|
FILE *compliance_iter = fopen (m_nom_fic_compliance, "wt" ); |
746 |
|
|
fprintf(compliance_iter,"It�rations Compliance\n"); |
747 |
|
|
for (i = 1 ; i <= iter-1; i++) |
748 |
|
|
{ |
749 |
|
|
fprintf(compliance_iter,"%lu %.12lf\n",i,Ctot[i]); |
750 |
|
|
} |
751 |
|
|
fclose(compliance_iter); |
752 |
|
|
|
753 |
picher |
218 |
//On imprime aussi le vecteur densite final dans un fichier texte pour usage ultérieur |
754 |
|
|
FILE *densite_final = fopen (m_nom_fic_densite, "wt" ); |
755 |
|
|
fprintf(densite_final,"Vecteur Densite\n"); |
756 |
|
|
for (i=_premier_element;i<=_dernier_element;i++) |
757 |
|
|
{ |
758 |
|
|
fprintf(densite_final,"%lu %.12lf\n",i,densite[i]); |
759 |
|
|
} |
760 |
|
|
fclose(densite_final); |
761 |
|
|
|
762 |
picher |
199 |
//Impression des temps de calcul |
763 |
|
|
printf("Temps de calcul pour le voisinage : %lu secondes\n",temps_calcul_voisins); |
764 |
|
|
affiche_chrono(); |
765 |
picher |
218 |
printf("\n"); |
766 |
picher |
199 |
|
767 |
|
|
printf( "\n\n-------------------------------------------------------\n" ); |
768 |
|
|
printf( "-- finitialisation des modules ------------------------\n" ); |
769 |
|
|
|
770 |
picher |
209 |
//Libération de la mémoire utilisée dans les tableaux |
771 |
|
|
free( compteur ); |
772 |
|
|
free( densite ); |
773 |
|
|
free( densite_active ); |
774 |
|
|
free( densite_new ); |
775 |
|
|
free( volume ); |
776 |
|
|
free( Denergie ); |
777 |
|
|
free( distance_ref ); |
778 |
|
|
free( Ctot ); |
779 |
|
|
free( nmailleniv ); |
780 |
|
|
free( maille_niveau ); |
781 |
|
|
free( m_V_distance ); |
782 |
|
|
free( m_nbr_voisins ); |
783 |
|
|
free( m_V_nos_voisins ); |
784 |
picher |
199 |
|
785 |
|
|
finit_etude_com( ) ; |
786 |
|
|
|
787 |
|
|
printf( "\nfait.\n" ); |
788 |
|
|
|
789 |
|
|
printf( "\nfin.\n\n\n\n\n" ); |
790 |
|
|
|
791 |
|
|
return (co_pas_de_probleme); |
792 |
|
|
|
793 |
|
|
} |
794 |
|
|
|
795 |
|
|
//* [ FreSOP - base ] ********************************* optimisation_topo.cpp * < |