ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/optimisation/src/optimisation_topo.cpp
Revision: 218
Committed: Tue Nov 10 19:01:30 2009 UTC (15 years, 6 months ago) by picher
File size: 28427 byte(s)
Log Message:
Oubli de 2 fichiers lors de la derniere mise a jour

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

Properties

Name Value
svn:executable