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

# 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    
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 picher 209 char str[80];
154 picher 199
155 picher 209 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 picher 199 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 picher 209 //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 picher 199
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