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