ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/optimisation/src/optimisation_topo.cpp
Revision: 199
Committed: Tue Jul 21 15:00:12 2009 UTC (15 years, 9 months ago) by picher
File size: 27898 byte(s)
Log Message:
Projet d'optimisation

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

Properties

Name Value
svn:executable