Révision 212 TrouNoir/trou_noir_MyFloat.c
trou_noir_MyFloat.c (revision 212) | ||
---|---|---|
102 | 102 |
MYFLOAT h,MYFLOAT r,MYFLOAT m,MYFLOAT bss) |
103 | 103 |
{ |
104 | 104 |
MYFLOAT flx; |
105 |
int fi; |
|
106 | 105 |
|
107 |
fi=(int)(rf*nbr/bss); |
|
108 | 106 |
flx=exp(q*log(r/m))*pow(rf,4)*b*db*h; |
109 | 107 |
return(flx); |
110 | 108 |
} |
... | ... | |
117 | 115 |
MYFLOAT nu_rec,nu_em,qu,temp_em,flux_int; |
118 | 116 |
int fi,posfreq; |
119 | 117 |
|
120 |
#define planck 6.62e-34
|
|
118 |
#define planck 6.62e-34 |
|
121 | 119 |
#define k 1.38e-23 |
122 | 120 |
#define c2 9.e16 |
123 | 121 |
#define temp 3.e7 |
124 | 122 |
#define m_point 1. |
125 | 123 |
|
124 |
#define lplanck (log(6.62)-34.*log(10.)) |
|
125 |
#define lk (log(1.38)-23.*log(10.)) |
|
126 |
#define lc2 (log(9.)+16.*log(10.)) |
|
127 |
|
|
126 | 128 |
MYFLOAT v=1.-3./r; |
127 | 129 |
|
128 | 130 |
qu=1./sqrt((1.-3./r)*r)*(sqrt(r)-sqrt(6.)+sqrt(3.)/2.*log((sqrt(r)+sqrt(3.))/(sqrt(r)-sqrt(3.))* 0.17157287525380988 )); |
129 | 131 |
|
130 | 132 |
temp_em=temp*sqrt(m)*exp(0.25*log(m_point)-0.75*log(r)-0.125*log(v)+0.25*log(fabs(qu))); |
131 | 133 |
|
132 |
flux_int=0; |
|
133 |
flx=0; |
|
134 |
flux_int=0.;
|
|
135 |
flx=0.;
|
|
134 | 136 |
|
135 | 137 |
for (fi=0;fi<nbr;fi++) |
136 | 138 |
{ |
137 |
nu_em=bss*fi/(MYFLOAT)nbr; |
|
138 |
nu_rec=nu_em*rf;
|
|
139 |
nu_em=bss*(MYFLOAT)fi/(MYFLOAT)nbr;
|
|
140 |
nu_rec=nu_em*rf; |
|
139 | 141 |
posfreq=(int)(nu_rec*(MYFLOAT)nbr/bss); |
140 | 142 |
if ((posfreq>0)&&(posfreq<nbr)) |
141 |
{ |
|
142 |
flux_int=2.*planck/c2*pow(nu_em,3)/(exp(planck*nu_em/(k*temp_em))-1.); |
|
143 |
flux_int*=pow(rf,3)*b*db*h; |
|
144 |
flx+=flux_int; |
|
145 |
} |
|
143 |
{ |
|
144 |
flux_int=2.*planck/c2*pow(nu_em,3)/(exp(planck*nu_em/(k*temp_em))-1.)*exp(3.*log(rf))*b*db*h; |
|
145 |
flx+=flux_int; |
|
146 |
} |
|
146 | 147 |
} |
147 | 148 |
|
148 | 149 |
return((MYFLOAT)flx); |
... | ... | |
166 | 167 |
|
167 | 168 |
if (raie==0) |
168 | 169 |
{ |
170 |
bss=1.e19; |
|
169 | 171 |
flx=spectre_cn(rf,b,db,h,r,m,bss); |
170 | 172 |
} |
171 | 173 |
else |
172 | 174 |
{ |
175 |
bss=2.; |
|
173 | 176 |
flx=spectre(rf,q,b,db,h,r,m,bss); |
174 | 177 |
} |
175 | 178 |
|
... | ... | |
182 | 185 |
{ |
183 | 186 |
fp[xi][yi]=flx; |
184 | 187 |
} |
188 |
|
|
185 | 189 |
} |
186 | 190 |
|
187 | 191 |
void sauvegarde_pgm(char nom[24],unsigned int **image,int dim) |
... | ... | |
206 | 210 |
int main(int argc,char *argv[]) |
207 | 211 |
{ |
208 | 212 |
|
209 |
MYFLOAT m,rs,ri,re,tho,ro;
|
|
213 |
MYFLOAT m,rs,ri,re,tho; |
|
210 | 214 |
int q; |
211 | 215 |
|
212 | 216 |
MYFLOAT bss,stp; |
... | ... | |
229 | 233 |
{ |
230 | 234 |
printf("\nSimulation d'un disque d'accretion autour d'un trou noir\n"); |
231 | 235 |
printf("\nParametres a definir :\n\n"); |
232 |
printf(" 1) Dimension de l'Image\n"); |
|
233 |
printf(" 2) Masse relative du trou noir\n"); |
|
234 |
printf(" 3) Dimension du disque exterieur\n"); |
|
235 |
printf(" 4) Distance de l'observateur\n"); |
|
236 |
printf(" 5) Inclinaison par rapport au disque (en degres)\n"); |
|
237 |
printf(" 6) Observation a distance FINIE ou INFINIE\n"); |
|
238 |
printf(" 7) Rayonnement de disque MONOCHROMATIQUE ou CORPS_NOIR\n"); |
|
239 |
printf(" 8) Normalisation des flux INTERNE ou EXTERNE\n"); |
|
240 |
printf(" 9) Normalisation de z INTERNE ou EXTERNE\n"); |
|
241 |
printf(" 10) Impression des images NEGATIVE ou POSITIVE\n"); |
|
242 |
printf(" 11) Nom de l'image des Flux\n"); |
|
243 |
printf(" 12) Nom de l'image des decalages spectraux\n"); |
|
244 |
printf(" 13) Valeur de normalisation des flux\n"); |
|
245 |
printf(" 14) Valeur de normalisation des decalages spectraux\n"); |
|
236 |
printf(" 1) Dimension de l'Image\n"); |
|
237 |
printf(" 2) Masse relative du trou noir\n"); |
|
238 |
printf(" 3) Dimension du disque exterieur\n"); |
|
239 |
printf(" 4) Inclinaison par rapport au disque (en degres)\n"); |
|
240 |
printf(" 5) Rayonnement de disque MONOCHROMATIQUE ou CORPS_NOIR\n"); |
|
241 |
printf(" 6) Impression des images NEGATIVE ou POSITIVE\n"); |
|
242 |
printf(" 7) Nom de l'image des Flux\n"); |
|
243 |
printf(" 8) Nom de l'image des decalages spectraux\n"); |
|
246 | 244 |
printf("\nSi aucun parametre defini, parametres par defaut :\n\n"); |
247 |
printf(" 1) Dimension de l'image : 1024 pixels de cote\n"); |
|
248 |
printf(" 2) Masse relative du trou noir : 1\n"); |
|
249 |
printf(" 3) Dimension du disque exterieur : 12 \n"); |
|
250 |
printf(" 4) Distance de l'observateur : 100 \n"); |
|
251 |
printf(" 5) Inclinaison par rapport au disque (en degres) : 10\n"); |
|
252 |
printf(" 6) Observation a distance FINIE\n"); |
|
253 |
printf(" 7) Rayonnement de disque CORPS_NOIR\n"); |
|
254 |
printf(" 8) Normalisation des flux INTERNE\n"); |
|
255 |
printf(" 9) Normalisation des z INTERNE\n"); |
|
256 |
printf(" 10) Impression des images NEGATIVE ou POSITIVE\n"); |
|
257 |
printf(" 11) Nom de l'image des flux : flux.pgm\n"); |
|
258 |
printf(" 12) Nom de l'image des z : z.pgm\n"); |
|
259 |
printf(" 13) <non definie>\n"); |
|
260 |
printf(" 14) <non definie>\n"); |
|
245 |
printf(" 1) Dimension de l'image : 1024 pixels de cote\n"); |
|
246 |
printf(" 2) Masse relative du trou noir : 1\n"); |
|
247 |
printf(" 3) Dimension du disque exterieur : 12 \n"); |
|
248 |
printf(" 4) Inclinaison par rapport au disque (en degres) : 10\n"); |
|
249 |
printf(" 5) Rayonnement de disque CORPS_NOIR\n"); |
|
250 |
printf(" 6) Impression des images NEGATIVE ou POSITIVE\n"); |
|
251 |
printf(" 7) Nom de l'image des flux : flux.pgm\n"); |
|
252 |
printf(" 8) Nom de l'image des z : z.pgm\n"); |
|
261 | 253 |
} |
262 | 254 |
} |
263 | 255 |
|
264 |
if ((argc==13)||(argc==15))
|
|
256 |
if (argc==9)
|
|
265 | 257 |
{ |
266 | 258 |
printf("# Utilisation les valeurs definies par l'utilisateur\n"); |
267 | 259 |
|
268 | 260 |
dim=atoi(argv[1]); |
269 | 261 |
m=atof(argv[2]); |
270 | 262 |
re=atof(argv[3]); |
271 |
ro=atof(argv[4]); |
|
272 |
tho=PI/180.*(90-atof(argv[5])); |
|
263 |
tho=PI/180.*(90-atof(argv[4])); |
|
273 | 264 |
|
274 | 265 |
rs=2.*m; |
275 | 266 |
ri=3.*rs; |
276 | 267 |
|
277 |
if (strcmp(argv[6],"FINIE")==0)
|
|
268 |
if (strcmp(argv[5],"CORPS_NOIR")==0)
|
|
278 | 269 |
{ |
279 |
dist=0; |
|
280 |
} |
|
281 |
else |
|
282 |
{ |
|
283 |
dist=1; |
|
284 |
} |
|
285 |
|
|
286 |
if (strcmp(argv[7],"CORPS_NOIR")==0) |
|
287 |
{ |
|
288 | 270 |
raie=0; |
289 | 271 |
} |
290 | 272 |
else |
... | ... | |
292 | 274 |
raie=1; |
293 | 275 |
} |
294 | 276 |
|
295 |
if (strcmp(argv[8],"EXTERNE")==0) |
|
296 |
{ |
|
297 |
fen=atof(argv[14]); |
|
298 |
} |
|
299 |
|
|
300 |
if (strcmp(argv[9],"EXTERNE")==0) |
|
301 |
{ |
|
302 |
zen=atof(argv[15]); |
|
303 |
} |
|
304 |
|
|
305 | 277 |
} |
306 | 278 |
else |
307 | 279 |
{ |
... | ... | |
312 | 284 |
rs=2.*m; |
313 | 285 |
ri=3.*rs; |
314 | 286 |
re=12.; |
315 |
ro=100.; |
|
316 | 287 |
tho=PI/180.*80; |
317 |
// Distance finie |
|
318 |
dist=0; |
|
319 | 288 |
// Corps noir |
320 | 289 |
raie=0; |
321 | 290 |
} |
... | ... | |
327 | 296 |
} |
328 | 297 |
else |
329 | 298 |
{ |
330 |
bss=1e19; |
|
299 |
bss=1.e19;
|
|
331 | 300 |
q=-0.75; |
332 | 301 |
} |
333 | 302 |
|
... | ... | |
336 | 305 |
printf("# Rayon singularite : %f\n",rs); |
337 | 306 |
printf("# Rayon interne : %f\n",ri); |
338 | 307 |
printf("# Rayon externe : %f\n",re); |
339 |
printf("# Distance de l'observateur : %f\n",ro); |
|
340 | 308 |
printf("# Inclinaison a la normale en radian : %f\n",tho); |
341 | 309 |
|
342 | 310 |
zp=(MYFLOAT**)calloc(dim,sizeof(MYFLOAT*)); |
... | ... | |
363 | 331 |
stp=dim/(2.*nmx); |
364 | 332 |
bmx=1.25*re; |
365 | 333 |
b=0.; |
366 |
thx=asin(bmx/ro); |
|
367 | 334 |
pc=0; |
368 | 335 |
|
369 | 336 |
struct timeval tv1,tv2; |
... | ... | |
377 | 344 |
h=4.*PI/(MYFLOAT)TRACKPOINTS; |
378 | 345 |
d=stp*n; |
379 | 346 |
|
380 |
if (dist==1) |
|
381 |
{ |
|
382 |
db=bmx/(MYFLOAT)nmx; |
|
383 |
b=db*(MYFLOAT)n; |
|
384 |
up=0.; |
|
385 |
vp=1.; |
|
386 |
} |
|
387 |
else |
|
388 |
{ |
|
389 |
thi=thx/(MYFLOAT)nmx*(MYFLOAT)n; |
|
390 |
db=ro*sin(thi)-b; |
|
391 |
b=ro*sin(thi); |
|
392 |
up=sin(thi); |
|
393 |
vp=cos(thi); |
|
394 |
} |
|
347 |
db=bmx/(MYFLOAT)nmx; |
|
348 |
b=db*(MYFLOAT)n; |
|
349 |
up=0.; |
|
350 |
vp=1.; |
|
395 | 351 |
|
396 | 352 |
pp=0.; |
397 | 353 |
nh=1; |
... | ... | |
462 | 418 |
fmx=fp[0][0]; |
463 | 419 |
zmx=zp[0][0]; |
464 | 420 |
|
421 |
int zimx=0,zjmx=0,fimx=0,fjmx=0; |
|
422 |
|
|
465 | 423 |
for (i=0;i<dim;i++) for (j=0;j<dim;j++) |
466 | 424 |
{ |
467 | 425 |
if (fmx<fp[i][j]) |
468 | 426 |
{ |
427 |
fimx=i; |
|
428 |
fjmx=j; |
|
469 | 429 |
fmx=fp[i][j]; |
470 | 430 |
} |
471 | 431 |
|
472 | 432 |
if (zmx<zp[i][j]) |
473 | 433 |
{ |
434 |
zimx=i; |
|
435 |
zjmx=j; |
|
474 | 436 |
zmx=zp[i][j]; |
475 | 437 |
} |
476 | 438 |
} |
477 | 439 |
|
478 | 440 |
printf("\nElapsed Time : %lf",(double)elapsed); |
479 |
printf("\nFlux max : %f",fmx);
|
|
480 |
printf("\nZ max : %f\n\n",zmx);
|
|
441 |
printf("\nZ max @(%i,%i) : %f",zimx,zjmx,zmx);
|
|
442 |
printf("\nFlux max @(%i,%i) : %f\n\n",fimx,fjmx,fmx);
|
|
481 | 443 |
|
482 |
if (strcmp(argv[8],"EXTERNE")==0) |
|
483 |
{ |
|
484 |
fmx=fen; |
|
485 |
} |
|
486 |
|
|
487 |
if (strcmp(argv[9],"EXTERNE")==0) |
|
488 |
{ |
|
489 |
zmx=zen; |
|
490 |
} |
|
491 |
|
|
492 | 444 |
for (i=0;i<dim;i++) for (j=0;j<dim;j++) |
493 | 445 |
{ |
494 | 446 |
zcl=(int)(255/zmx*zp[i][dim-1-j]); |
495 | 447 |
fcl=(int)(255/fmx*fp[i][dim-1-j]); |
496 | 448 |
|
497 |
if (strcmp(argv[8],"NEGATIVE")==0)
|
|
449 |
if (strcmp(argv[6],"NEGATIVE")==0)
|
|
498 | 450 |
{ |
499 | 451 |
if (zcl>255) |
500 | 452 |
{ |
... | ... | |
539 | 491 |
|
540 | 492 |
} |
541 | 493 |
|
542 |
if ((argc==14)||(argc==16))
|
|
494 |
if (argc==9)
|
|
543 | 495 |
{ |
544 |
sauvegarde_pgm(argv[11],ifp,dim);
|
|
545 |
sauvegarde_pgm(argv[12],izp,dim);
|
|
496 |
sauvegarde_pgm(argv[7],ifp,dim);
|
|
497 |
sauvegarde_pgm(argv[8],izp,dim);
|
|
546 | 498 |
} |
547 | 499 |
else |
548 | 500 |
{ |
Formats disponibles : Unified diff