--- optimisation/src/optimisation_topo.cpp 2009/07/21 15:00:12 199 +++ optimisation/src/optimisation_topo.cpp 2010/03/03 14:42:23 235 @@ -23,7 +23,6 @@ #include "write_num.h" #include "ecriture_materiau.h" #include "affecter_materiau.h" -#include "structure.h" int main(int argc, char **argv ) { @@ -40,6 +39,7 @@ int main(int argc, char **argv ) char m_nom_fic_parametre[co_lcc_max_nom_fic] ; char m_nom_fic_etude[co_lcc_max_nom_fic] ; + char m_nom_fic_densite[co_lcc_max_nom_fic] ; char m_nom_gm[co_lcc_max_nom_gm] ; char m_nom_champ[co_lcc_max_nom_champ_resu] ; char m_nom_fic_export[co_lcc_max_nom_fic] ; @@ -69,32 +69,25 @@ int main(int argc, char **argv ) ulong j ; ulong l ; ulong iter = 1 ; - ulong iter_max = 50 ; //On sp�cifit le nombre d'it�ration maximum permit (par défaut 50) ulong _type ; //Entier correspondant au type d'�l�ment ulong fic_size1; ulong fic_size2; ulong fic_size3; ulong fic_size4; - vifl l1; vifl l2 ; //Variables pour la dichotomie - vifl m= 0.18; vifl lmid ; + vifl l1; vifl l2; vifl lmid; //Variables pour la dichotomie vifl critere_densite = 0.0 ; - vifl E = 210e9 ; //module de young (par d�faut acier) - vifl nu = 0.3 ; //coefficient de poisson (par d�faut acier) - vifl rho = 7850. ; //masse volumique (par d�faut acier) - vifl Vx = 0. ; //volume de mati�re � optimiser (design) - vifl V1 = 0. ; //volume de mati�re fixe (non-design) - vifl frac_vol = 0.6 ; //fraction volumique de la zone active (valeur par défaut) - vifl penal = 3.0 ; //coefficient de p�nalisation (par défaut 3) - vifl k = 3.0 ; //Coefficient k pour le calcul des poids Hv - vifl niveau = 150. ; //Nombre de niveaux de densit�s (par défaut 150) - vifl change = 1. ; - vifl densite_min = 1e-3 ; //Densit� minimale de 0.001 + vifl E = 210e9 ; //module de young (par defaut acier) + vifl nu = 0.3 ; //coefficient de poisson (par defaut acier) + vifl rho = 7850. ; //masse volumique (par defaut acier) + vifl Vx = 0. ; //volume de matiere fixe optimiser (design) + vifl V1 = 0. ; //volume de matiere fixe (non-design) vifl densite_max = 1.0 ; + vifl change = 1. ; vifl m_item ; vifl _volume ; vifl m_distance ; - vifl **m_V_distance ; //Tableau de pointeur vers les distances aux voisins de chaque éléments + vifl **m_V_distance ; //Tableau de pointeur vers les distances aux voisins de chaque elements vifl x1 ; vifl x2 ; vifl x3 ; @@ -106,7 +99,18 @@ int main(int argc, char **argv ) ty_RSLT m_design ; - //Acquisition des param�tres de l'�tude + ulong iter_max = 50 ; //Nombre d'iteration maximum permit + vifl critere_convergence = 0.1; //Critère de convergence par défaut + vifl coeff_voisins = 2.5 ; //Valeur par défaut du coefficient multipliant pour le calcul des voisins + vifl m = 0.2 ; //Limite supérieure m pour la dichotomie + vifl frac_vol = 0.6 ; //fraction volumique de la zone active f + vifl penal = 3.0 ; //coefficient de penalisation p + vifl k = 3.0 ; //Coefficient k pour le calcul des poids Hv + vifl niveau = 150. ; //Nombre de niveaux de densites + vifl seuil = 0.8 ; //Seuil pour la visualisation des éléments conservés + vifl densite_min = 1e-3 ; //Densite minimale (par défaut 0.001) + + //Acquisition des parametres de l'etude for (int i=0;iren_volume ( &_volume ); volume[i] = _volume ; - distance_ref[i] = 2.5*pow((12.*_volume/co_rc_2),co_1_3) ; + distance_ref[i] = coeff_voisins*pow((12.*_volume/co_rc_2),co_1_3); m_ptr_etude->ren_nbr_voisins_sphere( (ulong) i , (vifl *) &distance_ref[i] , (ulong *) &m_nbr_voisins[i]); @@ -387,7 +397,7 @@ int main(int argc, char **argv ) Ctot[i] = 0.0; } - while ((fabs(change) > 0.1) && (iter <= iter_max)) + while ((fabs(change) > critere_convergence) && (iter <= iter_max)) { /////////////////////////////////////// @@ -649,7 +659,7 @@ int main(int argc, char **argv ) //D�termination des multiplicateurs de Lagrange par dichotomie l1= 0. ; - l2= 1e8 ; + l2= 1e8; while ((l2-l1) > 1e-12) { lmid = 0.5*(l2+l1); @@ -746,27 +756,37 @@ int main(int argc, char **argv ) } fclose(compliance_iter); + //On imprime aussi le vecteur densite final dans un fichier texte pour usage ultérieur + FILE *densite_final = fopen (m_nom_fic_densite, "wt" ); + fprintf(densite_final,"Vecteur Densite\n"); + for (i=_premier_element;i<=_dernier_element;i++) + { + fprintf(densite_final,"%lu %.12lf\n",i,densite[i]); + } + fclose(densite_final); + //Impression des temps de calcul printf("Temps de calcul pour le voisinage : %lu secondes\n",temps_calcul_voisins); affiche_chrono(); + printf("\n"); printf( "\n\n-------------------------------------------------------\n" ); printf( "-- finitialisation des modules ------------------------\n" ); - //Libération de la mémoire utilisée -// free( compteur ); -// free( densite ); -// free( densite_active ); -// free( densite_new ); -// free( volume ); -// free( Denergie ); -// free( distance_ref ); -// free( Ctot ); -// free( nmailleniv ); -// free( maille_niveau ); -// free( m_V_distance ); -// free( m_nbr_voisins ); -// free( m_V_nos_voisins ); + //Libération de la mémoire utilisée dans les tableaux + free( compteur ); + free( densite ); + free( densite_active ); + free( densite_new ); + free( volume ); + free( Denergie ); + free( distance_ref ); + free( Ctot ); + free( nmailleniv ); + free( maille_niveau ); + free( m_V_distance ); + free( m_nbr_voisins ); + free( m_V_nos_voisins ); finit_etude_com( ) ;