23 |
|
#include "write_num.h" |
24 |
|
#include "ecriture_materiau.h" |
25 |
|
#include "affecter_materiau.h" |
26 |
– |
#include "structure.h" |
26 |
|
|
27 |
|
int main(int argc, char **argv ) |
28 |
|
{ |
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] ; |
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) |
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 |
80 |
< |
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) |
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 |
< |
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 ; |
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]); |
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]; |
161 |
|
|
162 |
|
printf( "\nfait.\n" ); |
163 |
|
|
164 |
< |
//Possibilité d'utiliser une seule chaîne Str (à modifier ultérieurement) |
155 |
< |
char str1[80]; |
156 |
< |
char str2[80]; |
157 |
< |
char str3[80]; |
158 |
< |
char str4[80]; |
159 |
< |
char str5[80]; |
160 |
< |
char str6[80]; |
161 |
< |
|
162 |
< |
strcpy(str1,"./"); |
163 |
< |
strcat(str1,m_nom_fic_etude); |
164 |
< |
strcat(str1,".export"); |
165 |
< |
strcpy( &m_nom_fic_export[0], str1); |
166 |
< |
strcpy(str2,"./"); |
167 |
< |
strcat(str2,m_nom_fic_etude); |
168 |
< |
strcat(str2,".mail"); |
169 |
< |
strcpy( &m_nom_fic_mail_init[0], str2); |
170 |
< |
strcpy(str3,"./"); |
171 |
< |
strcat(str3,m_nom_fic_etude); |
172 |
< |
strcat(str3,".mail"); |
173 |
< |
strcpy( &m_nom_fic_mail[0], str3); |
174 |
< |
strcpy(str4,"./"); |
175 |
< |
strcat(str4,m_nom_fic_etude); |
176 |
< |
strcat(str4,"1.mail"); |
177 |
< |
strcpy( &m_nom_fic_mail_iter[0], str4); |
178 |
< |
strcpy(str5,"./"); |
179 |
< |
strcat(str5,m_nom_fic_etude); |
180 |
< |
strcat(str5,".comm"); |
181 |
< |
strcpy( &m_nom_fic_comm[0], str5); |
182 |
< |
strcpy(str6,"./"); |
183 |
< |
strcat(str6,m_nom_fic_etude); |
184 |
< |
strcat(str6,".resu"); |
185 |
< |
strcpy( &m_nom_fic_resu[0], str6); |
186 |
< |
strcpy( &m_nom_fic_groupm[0] , "./groupes.mail" ); |
187 |
< |
strcpy( &m_nom_fic_compliance[0] , "./compliance.txt " ); |
164 |
> |
char str[80]; |
165 |
|
|
166 |
+ |
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 |
+ |
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 |
|
//---------------------------------------------------------------------------- |
201 |
|
//---------------------------------------------------------------------------- |
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)) ; |
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 |
|
{ |
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/// |
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]); |
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 |
|
/////////////////////////////////////// |
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); |
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" ); |
775 |
|
|
776 |
< |
//Libération de la mémoire utilisée |
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 ); |
776 |
> |
//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 |
|
|
791 |
|
finit_etude_com( ) ; |
792 |
|
|