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 seuil = 0.8 ; //Seuil pour la visualisation des éléments conservés (0.8 par défaut) |
93 |
< |
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 |
+ |
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 |
< |
|
112 |
< |
//Acquisition des param�tres de l'�tude |
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]); |
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]; |
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); |