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

# User Rev Content
1 picher 199 ///////////////////////////////////////////////////////////
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