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