ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/optimisation/src/optimisation_topo.cpp
Revision: 235
Committed: Wed Mar 3 14:42:23 2010 UTC (15 years, 2 months ago) by picher
File size: 28996 byte(s)
Log Message:
Mise a jour de la methode d'optimisation topologique SIMP avec tous les parametres de la methode remonte en argument

File Contents

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

Properties

Name Value
svn:executable