ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/optimisation/src/optimisation_topo.cpp
Revision: 235
Committed: Wed Mar 3 14:42:23 2010 UTC (15 years, 2 months ago) by picher
File size: 28996 byte(s)
Log Message:
Mise a jour de la methode d'optimisation topologique SIMP avec tous les parametres de la methode remonte en argument

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

Properties

Name Value
svn:executable