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