Révision 214

TrouNoir/trou_noir.c (revision 214)
6 6
		par Herve Aussel et Emmanuel Quemener
7 7

  
8 8
	Conversion en C par Emmanuel Quemener en aout 1997
9
        Modification par Emmanuel Quemener en aout 2019
9 10

  
10 11
	Remerciements a :
11 12

  
......
15 16
	- Le Numerical Recipies pour ses recettes de calcul
16 17
	- Luc Blanchet pour sa disponibilite lors de mes interrogations en RG
17 18

  
18
	Mes Coordonnees :	Emmanuel Quemener
19
				Departement Optique
20
				ENST de Bretagne
21
				BP 832
22
				29285 BREST Cedex
23

  
24
				Emmanuel.Quemener@enst-bretagne.fr
25

  
26 19
	Compilation sous gcc ( Compilateur GNU sous Linux ) :
27 20

  
28
		gcc -O6 -m486 -o trou_noir trou_noir.c -lm
21
		gcc -O2 -o trou_noir trou_noir.c -lm
29 22
*/ 
30 23

  
31 24
#include <stdio.h>
32 25
#include <math.h>
33 26
#include <stdlib.h>
34 27
#include <string.h>
28
#include <sys/time.h>
35 29

  
36
#define nbr 200 /* Nombre de colonnes du spectre */
30
#define nbr 256 /* Nombre de colonnes du spectre */
37 31

  
38 32
#define PI 3.14159265359
39 33

  
40
double atanp(double x,double y)
34
#define TRACKPOINTS 2048
35

  
36
#if TYPE == FP32
37
#define MYFLOAT float
38
#else
39
#define MYFLOAT double
40
#endif
41

  
42
MYFLOAT atanp(MYFLOAT x,MYFLOAT y)
41 43
{
42
  double angle;
44
  MYFLOAT angle;
43 45

  
44 46
  angle=atan2(y,x);
45 47

  
......
52 54
}
53 55

  
54 56

  
55
double f(double v)
57
MYFLOAT f(MYFLOAT v)
56 58
{
57 59
  return v;
58 60
}
59 61

  
60
double g(double u,double m,double b)
62
MYFLOAT g(MYFLOAT u,MYFLOAT m,MYFLOAT b)
61 63
{
62
// return (3.*m/b*pow(u,2)-u);
63 64
  return (3.*m/b*pow(u,2)-u);
64 65
}
65 66

  
66 67

  
67
void calcul(double *us,double *vs,double up,double vp,
68
	    double h,double m,double b)
68
void calcul(MYFLOAT *us,MYFLOAT *vs,MYFLOAT up,MYFLOAT vp,
69
	    MYFLOAT h,MYFLOAT m,MYFLOAT b)
69 70
{
70
  double c[4],d[4];
71
  MYFLOAT c[4],d[4];
71 72

  
72 73
  c[0]=h*f(vp);
73 74
  c[1]=h*f(vp+c[0]/2.);
......
82 83
  *vs=vp+(d[0]+2.*d[1]+2.*d[2]+d[3])/6.;
83 84
}
84 85

  
85
void rungekutta(double *ps,double *us,double *vs,
86
		double pp,double up,double vp,
87
		double h,double m,double b)
86
void rungekutta(MYFLOAT *ps,MYFLOAT *us,MYFLOAT *vs,
87
		MYFLOAT pp,MYFLOAT up,MYFLOAT vp,
88
		MYFLOAT h,MYFLOAT m,MYFLOAT b)
88 89
{
89 90
  calcul(us,vs,up,vp,h,m,b);
90 91
  *ps=pp+h;
91 92
}
92 93

  
93 94

  
94
double decalage_spectral(double r,double b,double phi,
95
			 double tho,double m)
95
MYFLOAT decalage_spectral(MYFLOAT r,MYFLOAT b,MYFLOAT phi,
96
			 MYFLOAT tho,MYFLOAT m)
96 97
{
97 98
  return (sqrt(1-3*m/r)/(1+sqrt(m/pow(r,3))*b*sin(tho)*sin(phi)));
98 99
}
99 100

  
100
void spectre(int nt[nbr],double fx[nbr],double rf,int q,double b,double db,
101
	     double h,double r,double m,double bss,double *flx)
101
MYFLOAT spectre(MYFLOAT rf,MYFLOAT q,MYFLOAT b,MYFLOAT db,
102
	     MYFLOAT h,MYFLOAT r,MYFLOAT m,MYFLOAT bss)
102 103
{
103
  int fi;
104
  MYFLOAT flx;
104 105

  
105
  fi=(int)(rf*nbr/bss);
106
  nt[fi]+=1;
107
  *flx=pow(r/m,q)*pow(rf,4)*b*db*h;
108
  fx[fi]=fx[fi]+*flx;
106
  flx=exp(q*log(r/m))*pow(rf,4)*b*db*h;
107
  return(flx);
109 108
}
110 109

  
111
void spectre_cn(int nt[nbr],double fx[nbr],double rf,double b,double db,
112
		double h,double r,double m,double bss,double *flx)
110
MYFLOAT spectre_cn(MYFLOAT rf,MYFLOAT b,MYFLOAT db,
111
		MYFLOAT h,MYFLOAT r,MYFLOAT m,MYFLOAT bss)
113 112
{
114
  double nu_rec,nu_em,qu,v,temp,temp_em,flux_int,m_point,planck,c,k;
113
  
114
  MYFLOAT flx;
115
  MYFLOAT nu_rec,nu_em,qu,temp_em,flux_int;
115 116
  int fi,posfreq;
116 117

  
117
  planck=6.62e-34;
118
  k=1.38e-23;
119
  temp=3.e7;
120
  m_point=1.e14;
121
  v=1.-3./r;
118
#define planck 6.62e-34
119
#define k 1.38e-23
120
#define c2 9.e16
121
#define temp 3.e7
122
#define m_point 1.
122 123

  
123
  qu=1/sqrt(1-3./r)/sqrt(r)*(sqrt(r)-sqrt(6)+sqrt(3)/2*log((sqrt(r)+sqrt(3))/(sqrt(r)-sqrt(3))*(sqrt(6)-sqrt(3))/(sqrt(6)+sqrt(3))));
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
  
128
  MYFLOAT v=1.-3./r;
124 129

  
125
  temp_em=temp*sqrt(m)*exp(0.25*log(m_point))*exp(-0.75*log(r))*
126
    exp(-0.125*log(v))*exp(0.25*log(qu));
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 ));
127 131

  
128
  flux_int=0;
129
  *flx=0;
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)));
130 133

  
131
  for (fi=1;fi<nbr;fi++)
134
  flux_int=0.;
135
  flx=0.;
136

  
137
  for (fi=0;fi<nbr;fi++)
132 138
    {
133
      nu_em=bss*fi/nbr;
134
      nu_rec=nu_em*rf; 
135
      posfreq=1./bss*nu_rec*nbr;
139
      nu_em=bss*(MYFLOAT)fi/(MYFLOAT)nbr;
140
      nu_rec=nu_em*rf;
141
      posfreq=(int)(nu_rec*(MYFLOAT)nbr/bss);
136 142
      if ((posfreq>0)&&(posfreq<nbr))
137
	{
138
	  flux_int=2*planck/9e16*pow(nu_em,3)/(exp(planck*nu_em/k/temp_em)-1.)*pow(rf,3)*b*db*h;
139
	  fx[posfreq]+=flux_int;
140
	  *flx+=flux_int;
141
	  nt[posfreq]+=1;
142
	}
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
  	}
143 147
    }
148

  
149
  return((MYFLOAT)flx);
144 150
}
145 151

  
146
void impact(double d,double phi,int dim,double r,double b,double tho,double m,
147
	    double **zp,double **fp,
148
	    int nt[200],double fx[200],int q,double db,
149
	    double h,double bss,int raie)
152
void impact(MYFLOAT d,MYFLOAT phi,int dim,MYFLOAT r,MYFLOAT b,MYFLOAT tho,MYFLOAT m,
153
	    MYFLOAT **zp,MYFLOAT **fp,
154
	    MYFLOAT q,MYFLOAT db,
155
	    MYFLOAT h,MYFLOAT bss,int raie)
150 156
{
151
  double xe,ye;
157
  MYFLOAT xe,ye;
152 158
  int xi,yi;
153
  double flx,rf;
159
  MYFLOAT flx,rf;
154 160
  xe=d*sin(phi);
155 161
  ye=-d*cos(phi);
156 162

  
......
161 167

  
162 168
  if (raie==0)
163 169
    {
164
      spectre(nt,fx,rf,q,b,db,h,r,m,bss,&flx);
170
      bss=1.e19;
171
      flx=spectre_cn(rf,b,db,h,r,m,bss);
165 172
    }
166 173
  else
167 174
    {
168
      spectre_cn(nt,fx,rf,b,db,h,r,m,bss,&flx);
175
      bss=2.;
176
      flx=spectre(rf,q,b,db,h,r,m,bss);
169 177
    }
170 178
  
171 179
  if (zp[xi][yi]==0.)
......
177 185
    {
178 186
      fp[xi][yi]=flx;
179 187
    }
188

  
180 189
}
181 190

  
182 191
void sauvegarde_pgm(char nom[24],unsigned int **image,int dim)
......
198 207
  fclose(sortie);
199 208
}
200 209

  
201
void sauvegarde_dat(char nom[24],double tableau[3][nbr],int raie)
202
{
203
  FILE            *sortie;
204
  unsigned long   i;
205
  
206
  sortie=fopen(nom,"w");
207

  
208
  fprintf(sortie,"# Trou Noir entoure d'un Disque d'Accretion\n");
209
 
210
  if (raie==0)
211
    {
212
      fprintf(sortie,"# Colonne 1 : Frequence_Recue/Frequence_Emise\n");
213
    }
214
  else
215
    {
216
      fprintf(sortie,"# Colonne 1 : Fr?quence d'Emission en Hertz\n");
217
    }
218

  
219
  fprintf(sortie,"# Colonne 2 : Intensite Normalisee\n");
220
  fprintf(sortie,"# Colonne 3 : Nombre d'Impacts Normalise\n");
221
  
222
  for (i=1;i<nbr;i++)
223
    {
224
      fprintf(sortie,"%f\t%f\t%f\n",tableau[0][i],tableau[1][i],tableau[2][i]);
225
    }
226

  
227
  fclose(sortie);
228
}
229

  
230 210
int main(int argc,char *argv[])
231 211
{
232 212

  
233
  double m,rs,ri,re,tho,ro;
213
  MYFLOAT m,rs,ri,re,tho;
234 214
  int q;
235 215

  
236
  double bss,stp;
216
  MYFLOAT bss,stp;
237 217
  int nmx,dim;
238
  double d,bmx,db,b,h;
239
  double up,vp,pp;
240
  double us,vs,ps;
241
  double rp[2000];
242
  double **zp,**fp;
218
  MYFLOAT d,bmx,db,b,h;
219
  MYFLOAT up,vp,pp;
220
  MYFLOAT us,vs,ps;
221
  MYFLOAT rp[TRACKPOINTS];
222
  MYFLOAT **zp,**fp;
243 223
  unsigned int **izp,**ifp;
244
  double zmx,fmx,zen,fen;
245
  double flux_tot,impc_tot;
246
  double fx[nbr];
247
  int nt[nbr];
248
  double tableau[3][nbr];
249
  double phi,thi,thx,phd,php,nr,r;
224
  MYFLOAT zmx,fmx,zen,fen;
225
  int zimx=0,zjmx=0,fimx=0,fjmx=0;
226
  MYFLOAT flux_tot,impc_tot;
227
  MYFLOAT phi,thi,thx,phd,php,nr,r;
250 228
  int ni,ii,i,imx,j,n,tst,dist,raie,pc,fcl,zcl;
251
  double nh;
252

  
229
  MYFLOAT nh;
230
  struct timeval tv1,tv2;
231
  struct timezone tz;  
232
  double elapsed;
233
  
253 234
  if (argc==2)
254 235
    {
255 236
      if (strcmp(argv[1],"-aide")==0)
256 237
	{
257 238
	  printf("\nSimulation d'un disque d'accretion autour d'un trou noir\n");
258 239
	  printf("\nParametres a definir :\n\n");
259
	  printf("   1) Dimension de l'Image\n");
260
	  printf("   2) Masse relative du trou noir\n");
261
	  printf("   3) Dimension du disque exterieur\n");
262
	  printf("   4) Distance de l'observateur\n");
263
	  printf("   5) Inclinaison par rapport au disque (en degres)\n");
264
	  printf("   6) Observation a distance FINIE ou INFINIE\n");
265
	  printf("   7) Rayonnement de disque MONOCHROMATIQUE ou CORPS_NOIR\n");
266
	  printf("   8) Normalisation des flux INTERNE ou EXTERNE\n");
267
	  printf("   9) Normalisation de z INTERNE ou EXTERNE\n"); 
268
	  printf("  10) Impression des images NEGATIVE ou POSITIVE\n"); 
269
	  printf("  11) Nom de l'image des Flux\n");
270
	  printf("  12) Nom de l'image des decalages spectraux\n");
271
	  printf("  13) Nom du fichier contenant le spectre\n");
272
	  printf("  14) Valeur de normalisation des flux\n");
273
	  printf("  15) Valeur de normalisation des decalages spectraux\n");
240
	  printf("  1) Dimension de l'Image\n");
241
	  printf("  2) Masse relative du trou noir\n");
242
	  printf("  3) Dimension du disque exterieur\n");
243
	  printf("  4) Inclinaison par rapport au disque (en degres)\n");
244
	  printf("  5) Rayonnement de disque MONOCHROMATIQUE ou CORPS_NOIR\n");
245
	  printf("  6) Impression des images NEGATIVE ou POSITIVE\n"); 
246
	  printf("  7) Nom de l'image des Flux\n");
247
	  printf("  8) Nom de l'image des decalages spectraux\n");
274 248
	  printf("\nSi aucun parametre defini, parametres par defaut :\n\n");
275
	  printf("   1) Dimension de l'image : 256 pixels de cote\n");
276
	  printf("   2) Masse relative du trou noir : 1\n");
277
	  printf("   3) Dimension du disque exterieur : 12 \n");
278
	  printf("   4) Distance de l'observateur : 100 \n");
279
	  printf("   5) Inclinaison par rapport au disque (en degres) : 10\n");
280
	  printf("   6) Observation a distance FINIE\n");
281
	  printf("   7) Rayonnement de disque MONOCHROMATIQUE\n");
282
	  printf("   8) Normalisation des flux INTERNE\n");
283
	  printf("   9) Normalisation des z INTERNE\n");
284
	  printf("  10) Impression des images NEGATIVE ou POSITIVE\n"); 
285
       	  printf("  11) Nom de l'image des flux : flux.pgm\n");
286
	  printf("  12) Nom de l'image des z : z.pgm\n");
287
	  printf("  13) Nom du fichier contenant le spectre : spectre.dat\n");
288
	  printf("  14) <non definie>\n");
289
	  printf("  15) <non definie>\n");
249
	  printf("  1) Dimension de l'image : 1024 pixels de cote\n");
250
	  printf("  2) Masse relative du trou noir : 1\n");
251
	  printf("  3) Dimension du disque exterieur : 12 \n");
252
	  printf("  4) Inclinaison par rapport au disque (en degres) : 10\n");
253
	  printf("  5) Rayonnement de disque CORPS_NOIR\n");
254
	  printf("  6) Impression des images NEGATIVE ou POSITIVE\n"); 
255
       	  printf("  7) Nom de l'image des flux : flux.pgm\n");
256
	  printf("  8) Nom de l'image des z : z.pgm\n");
290 257
	}
291 258
    }
292 259
  
293
  if ((argc==14)||(argc==16))
260
  if (argc==9)
294 261
    {
295 262
      printf("# Utilisation les valeurs definies par l'utilisateur\n");
296 263
      
297 264
      dim=atoi(argv[1]);
298 265
      m=atof(argv[2]);
299 266
      re=atof(argv[3]);
300
      ro=atof(argv[4]);
301
      tho=PI/180.*(90-atof(argv[5]));
267
      tho=PI/180.*(90-atof(argv[4]));
302 268
      
303 269
      rs=2.*m;
304 270
      ri=3.*rs;
305
      q=-2;
306 271

  
307
      if (strcmp(argv[6],"FINIE")==0)
272
      if (strcmp(argv[5],"CORPS_NOIR")==0)
308 273
	{
309
	  dist=0;
310
	}
311
      else
312
	{
313
	  dist=1;
314
	}
315

  
316
      if (strcmp(argv[7],"MONOCHROMATIQUE")==0)
317
	{
318 274
	  raie=0;
319 275
	}
320 276
      else
......
322 278
	  raie=1;
323 279
	}
324 280

  
325
      if (strcmp(argv[8],"EXTERNE")==0)
326
	{
327
	  fen=atof(argv[14]);
328
	}
329
      
330
      if (strcmp(argv[9],"EXTERNE")==0)
331
	{
332
	  zen=atof(argv[15]);
333
	}
334
      
335 281
    }
336 282
  else
337 283
    {
338 284
      printf("# Utilisation les valeurs par defaut\n");
339 285
      
340
      dim=256;
286
      dim=1024;
341 287
      m=1.;
342 288
      rs=2.*m;
343 289
      ri=3.*rs;
344 290
      re=12.;
345
      ro=100.;
346 291
      tho=PI/180.*80;
347
      q=-2;
348
      dist=0;
292
      // Corps noir
349 293
      raie=0;
350 294
    }
351
      
295

  
296
  if (raie==1)
297
    {
298
      bss=2.;
299
      q=-2;
300
    }
301
  else
302
    {
303
      bss=1.e19;
304
      q=-0.75;
305
    }
306

  
352 307
      printf("# Dimension de l'image : %i\n",dim);
353 308
      printf("# Masse : %f\n",m);
354 309
      printf("# Rayon singularite : %f\n",rs);
355 310
      printf("# Rayon interne : %f\n",ri);
356 311
      printf("# Rayon externe : %f\n",re);
357
      printf("# Distance de l'observateur : %f\n",ro);
358 312
      printf("# Inclinaison a la normale en radian : %f\n",tho);
359 313
  
360
  for (i=0;i<nbr;i++)
361
    {
362
      fx[i]=0.;
363
      nt[i]=0;
364
    }  
365

  
366
  zp=(double**)calloc(dim,sizeof(double*));
367
  zp[0]=(double*)calloc(dim*dim,sizeof(double));
314
  zp=(MYFLOAT**)calloc(dim,sizeof(MYFLOAT*));
315
  zp[0]=(MYFLOAT*)calloc(dim*dim,sizeof(MYFLOAT));
368 316
  
369
  fp=(double**)calloc(dim,sizeof(double*));
370
  fp[0]=(double*)calloc(dim*dim,sizeof(double));
317
  fp=(MYFLOAT**)calloc(dim,sizeof(MYFLOAT*));
318
  fp[0]=(MYFLOAT*)calloc(dim*dim,sizeof(MYFLOAT));
371 319

  
372 320
  izp=(unsigned int**)calloc(dim,sizeof(unsigned int*));
373 321
  izp[0]=(unsigned int*)calloc(dim*dim,sizeof(unsigned int));
......
381 329
      fp[i]=fp[i-1]+dim;
382 330
      izp[i]=izp[i-1]+dim;
383 331
      ifp[i]=ifp[i-1]+dim;
384
    }      
332
    }
385 333

  
386 334
  nmx=dim;
387 335
  stp=dim/(2.*nmx);
388 336
  bmx=1.25*re;
389 337
  b=0.;
390
  thx=asin(bmx/ro);
391 338
  pc=0;
392 339

  
393
  if (raie==0)
394
    {
395
      bss=2;
396
    }
397
  else
398
    {
399
      bss=3e21;
400
    }
340
  // Set start timer
341
  gettimeofday(&tv1, &tz);
401 342

  
402 343
  for (n=1;n<=nmx;n++)
403 344
    {     
404
      h=PI/500.;
345
      h=4.*PI/(MYFLOAT)TRACKPOINTS;
405 346
      d=stp*n;
406 347

  
407
      if (dist==1)
408
	{
409
	  db=bmx/(double)nmx;
410
	  b=db*(double)n;
411
	  up=0.;
412
	  vp=1.;
413
	}
414
      else
415
	{
416
	  thi=thx/(double)nmx*(double)n;
417
	  db=ro*sin(thi)-b;
418
	  b=ro*sin(thi);
419
	  up=sin(thi);
420
	  vp=cos(thi);
421
	}
348
      db=bmx/(MYFLOAT)nmx;
349
      b=db*(MYFLOAT)n;
350
      up=0.;
351
      vp=1.;
422 352
      
423 353
      pp=0.;
424 354
      nh=1;
......
439 369
	  
440 370
	} while ((rp[(int)nh]>=rs)&&(rp[(int)nh]<=rp[1]));
441 371
      
442
      for (i=nh+1;i<2000;i++)
372
      for (i=nh+1;i<TRACKPOINTS;i++)
443 373
	{
444 374
	  rp[i]=0.; 
445 375
	}
......
448 378
      
449 379
      for (i=0;i<=imx;i++)
450 380
	{
451
	  phi=2.*PI/(double)imx*(double)i;
381
	  phi=2.*PI/(MYFLOAT)imx*(MYFLOAT)i;
452 382
	  phd=atanp(cos(phi)*sin(tho),cos(tho));
453 383
	  phd=fmod(phd,PI);
454 384
	  ii=0;
......
456 386
	  
457 387
	  do
458 388
	    {
459
	      php=phd+(double)ii*PI;
389
	      php=phd+(MYFLOAT)ii*PI;
460 390
	      nr=php/h;
461 391
	      ni=(int)nr;
462 392

  
463
	      if ((double)ni<nh)
393
	      if ((MYFLOAT)ni<nh)
464 394
		{
465 395
		  r=(rp[ni+1]-rp[ni])*(nr-ni*1.)+rp[ni];
466 396
		}
......
472 402
	      if ((r<=re)&&(r>=ri))
473 403
		{
474 404
		  tst=1;
475
		  impact(d,phi,dim,r,b,tho,m,zp,fp,nt,fx,q,db,h,bss,raie);
405
		  impact(d,phi,dim,r,b,tho,m,zp,fp,q,db,h,bss,raie);
476 406
		}
477 407
	      
478 408
	      ii++;
......
480 410
	}
481 411
    }
482 412

  
413
  // Set stop timer
414
  gettimeofday(&tv2, &tz);
415
  
416
  elapsed=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
417
			  (tv2.tv_usec-tv1.tv_usec))/1000000;  
418
  
483 419
  fmx=fp[0][0];
484 420
  zmx=zp[0][0];
485 421
  
......
487 423
    {
488 424
      if (fmx<fp[i][j])
489 425
	{
426
	  fimx=i;
427
	  fjmx=j;
490 428
	  fmx=fp[i][j];
491 429
	}
492 430
      
493 431
      if (zmx<zp[i][j])
494 432
	{
433
	  zimx=i;
434
	  zjmx=j;
495 435
	  zmx=zp[i][j];
496 436
	}
497 437
    }
498 438

  
499
  printf("\nLe flux maximal detecte est de %f",fmx);
500
  printf("\nLe decalage spectral maximal detecte est de %f\n\n",zmx);
439
  printf("\nElapsed Time : %lf",(double)elapsed);
440
  printf("\nZ max @(%i,%i) : %f",zimx,zjmx,zmx);
441
  printf("\nFlux max @(%i,%i) : %f\n\n",fimx,fjmx,fmx);
501 442

  
502
  if (strcmp(argv[8],"EXTERNE")==0)
503
    {
504
      fmx=fen;
505
    }
506

  
507
  if (strcmp(argv[9],"EXTERNE")==0)
508
    {  
509
      zmx=zen;
510
    }
511

  
512 443
  for (i=0;i<dim;i++) for (j=0;j<dim;j++)
513 444
    {
514 445
      zcl=(int)(255/zmx*zp[i][dim-1-j]);
515 446
      fcl=(int)(255/fmx*fp[i][dim-1-j]);
516 447

  
517
      if (strcmp(argv[8],"NEGATIVE")==0)
448
      if (strcmp(argv[6],"NEGATIVE")==0)
518 449
	{
519 450
	  if (zcl>255)
520 451
	    {
......
559 490
	
560 491
    }
561 492

  
562
  flux_tot=0;
563
  impc_tot=0;
564

  
565
  for (i=1;i<nbr;i++)
566
    {
567
      flux_tot+=fx[i];
568
      impc_tot+=nt[i];
569
    }
570

  
571
  for (i=1;i<nbr;i++)
572
    {
573
      tableau[0][i]=bss*i/nbr;
574
      tableau[1][i]=fx[i]/flux_tot;
575
      tableau[2][i]=(double)nt[i]/(double)impc_tot;
576
    }
577

  
578
  if ((argc==14)||(argc==16))
493
  if (argc==9)
579 494
   {
580
     sauvegarde_pgm(argv[11],ifp,dim);
581
     sauvegarde_pgm(argv[12],izp,dim);
582
     sauvegarde_dat(argv[13],tableau,raie);
495
     sauvegarde_pgm(argv[7],ifp,dim);
496
     sauvegarde_pgm(argv[8],izp,dim);
583 497
   }
584 498
  else
585 499
    {
586 500
      sauvegarde_pgm("z.pgm",izp,dim);
587 501
      sauvegarde_pgm("flux.pgm",ifp,dim);
588
      sauvegarde_dat("spectre.dat",tableau,raie);
589 502
    }
590 503

  
591 504
  free(zp[0]);

Formats disponibles : Unified diff