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