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

# 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 picher 218 char m_nom_fic_densite[co_lcc_max_nom_fic] ;
43 picher 199 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 picher 218 vifl seuil = 0.8 ; //Seuil pour la visualisation des éléments conservés (0.8 par défaut)
93 picher 199 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 picher 218
111    
112 picher 199 //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 picher 218 if (strcmp(argv[i],"-seuil")==0) seuil=atoi(argv[i+1]);
121 picher 199 }
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 picher 209 char str[80];
159 picher 199
160 picher 209 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 picher 218 strcpy(str,"./");
189     strcat(str,m_nom_fic_etude);
190     strcat(str,"_densite.txt");
191     strcpy( &m_nom_fic_densite[0], str);
192 picher 199 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 picher 218 //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 picher 199 //Impression des temps de calcul
763     printf("Temps de calcul pour le voisinage : %lu secondes\n",temps_calcul_voisins);
764     affiche_chrono();
765 picher 218 printf("\n");
766 picher 199
767     printf( "\n\n-------------------------------------------------------\n" );
768     printf( "-- finitialisation des modules ------------------------\n" );
769    
770 picher 209 //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 picher 199
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