ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/optimisation/src/optimisation_topo.cpp
Revision: 209
Committed: Mon Jul 27 13:53:35 2009 UTC (15 years, 9 months ago) by picher
File size: 27738 byte(s)
Log Message:
Mise a jour mineure de la methode 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
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 * <

Properties

Name Value
svn:executable