ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/optimisation/src/optimisation_topo.cpp
(Generate patch)

Comparing optimisation/src/optimisation_topo.cpp (file contents):
Revision 209 by picher, Mon Jul 27 13:53:35 2009 UTC vs.
Revision 235 by picher, Wed Mar 3 14:42:23 2010 UTC

# Line 39 | Line 39 | int main(int argc, char **argv )
39  
40    char              m_nom_fic_parametre[co_lcc_max_nom_fic] ;
41    char              m_nom_fic_etude[co_lcc_max_nom_fic]     ;
42 +  char              m_nom_fic_densite[co_lcc_max_nom_fic]   ;
43    char              m_nom_gm[co_lcc_max_nom_gm]             ;
44    char              m_nom_champ[co_lcc_max_nom_champ_resu]  ;
45    char              m_nom_fic_export[co_lcc_max_nom_fic]    ;
# Line 68 | Line 69 | int main(int argc, char **argv )
69    ulong j                  ;
70    ulong l                  ;
71    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    ;
78 >  vifl l1; vifl l2; vifl lmid;  //Variables pour la dichotomie
79    vifl critere_densite = 0.0 ;
80 <  vifl E = 210e9             ;          //module de young (par d�faut acier)
81 <  vifl nu = 0.3              ;          //coefficient de poisson (par d�faut acier)
82 <  vifl rho = 7850.           ;          //masse volumique (par d�faut acier)
83 <  vifl Vx = 0.               ;          //volume de mati�re � optimiser (design)
84 <  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
80 >  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 +  vifl change = 1.           ;
87    vifl m_item                ;
88    vifl _volume               ;
89    vifl m_distance            ;
90 <  vifl **m_V_distance        ;          //Tableau de pointeur vers les distances aux voisins de chaque éléments
90 >  vifl **m_V_distance        ;  //Tableau de pointeur vers les distances aux voisins de chaque elements
91    vifl x1                    ;
92    vifl x2                    ;
93    vifl x3                    ;
# Line 105 | Line 99 | int main(int argc, char **argv )
99  
100    ty_RSLT m_design           ;
101  
102 <  //Acquisition des param�tres de l'�tude
102 >  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 >
113 >  //Acquisition des parametres de l'etude
114    for (int i=0;i<argc;i++)
115            {
116            if (strcmp(argv[i],"-fichier")==0) strcpy(m_nom_fic_parametre,argv[i+1]);
# Line 113 | Line 118 | int main(int argc, char **argv )
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 +          if (strcmp(argv[i],"-seuil")==0) seuil=atoi(argv[i+1]);
122 +          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            }
128    FILE* parametres=fopen(m_nom_fic_parametre,"rt");
129    char message[100];
# Line 180 | Line 191 | int main(int argc, char **argv )
191    strcat(str,m_nom_fic_etude);
192    strcat(str,"_evol.txt");
193    strcpy( &m_nom_fic_compliance[0], str);
194 +  strcpy(str,"./");
195 +  strcat(str,m_nom_fic_etude);
196 +  strcat(str,"_densite.txt");
197 +  strcpy( &m_nom_fic_densite[0], str);
198    strcpy( &m_nom_fic_groupm[0]     , "./groupes.mail"      );
199  
200    //----------------------------------------------------------------------------
# Line 285 | Line 300 | int main(int argc, char **argv )
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 <  ulong *densite_active = (ulong*) malloc (sizeof(ulong)*(_dernier_element+1));  //vecteur qui d�termine si la densit� est active
303 >  ulong *densite_active = (ulong*) malloc (sizeof(ulong)*(_dernier_element+1)); //vecteur qui d�termine si la densit� est active
304    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))     ;
# Line 306 | Line 321 | int main(int argc, char **argv )
321          compteur[i] = 1;
322          maille_niveau[i]=0.;
323          }
324 <
324 >  vifl volume_total = 0.;
325    //Calcul du volume de design et du volume total du maillage 3D
326    for (i=_premier_element;i<=_dernier_element;i++)
327          {
# Line 324 | Line 339 | int main(int argc, char **argv )
339                  densite[i] = 1.;
340                  V1 = V1 + _volume;
341                  }              
342 <        
342 >        volume_total = volume_total + _volume;
343          }
344 <
344 >  printf( "Volume total : %lf\n",volume_total);
345    ///////////////////////////////////////
346    ///////Calcul du voisinage et//////////
347    //des pond�rations de r�gulation///
# Line 348 | Line 363 | int main(int argc, char **argv )
363                                            (ptr_o_element_com *) &m_element    );
364                  m_element->ren_volume   (                        &_volume     );
365                  volume[i] = _volume                                            ;
366 <                distance_ref[i] = 2.5*pow((12.*_volume/co_rc_2),co_1_3)        ;
366 >                distance_ref[i] = coeff_voisins*pow((12.*_volume/co_rc_2),co_1_3);
367                  m_ptr_etude->ren_nbr_voisins_sphere( (ulong)      i            ,
368                                                      (vifl *) &distance_ref[i]  ,
369                                                     (ulong *) &m_nbr_voisins[i]);
# Line 382 | Line 397 | int main(int argc, char **argv )
397          Ctot[i] = 0.0;
398          }
399  
400 <  while ((fabs(change) > 0.1) && (iter <= iter_max))
400 >  while ((fabs(change) > critere_convergence) && (iter <= iter_max))
401    {
402  
403          ///////////////////////////////////////
# Line 644 | Line 659 | int main(int argc, char **argv )
659  
660          //D�termination des multiplicateurs de Lagrange par dichotomie
661          l1= 0. ;
662 <        l2= 1e8 ;
662 >        l2= 1e8;
663          while ((l2-l1) > 1e-12)
664          {
665          lmid = 0.5*(l2+l1);
# Line 741 | Line 756 | int main(int argc, char **argv )
756    }
757    fclose(compliance_iter);
758  
759 +  //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    //Impression des temps de calcul
769    printf("Temps de calcul pour le voisinage : %lu secondes\n",temps_calcul_voisins);
770    affiche_chrono();
771 +  printf("\n");
772  
773    printf( "\n\n-------------------------------------------------------\n" );
774    printf(     "-- finitialisation des modules ------------------------\n" );

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines