Statistiques
| Révision :

root / TrouNoir / trou_noir_1997.c @ 238

Historique | Voir | Annoter | Télécharger (11,87 ko)

1 207 equemene
/*
2 207 equemene
        Programme original realise en Fortran 77 en mars 1994
3 207 equemene
        pour les Travaux Pratiques de Modelisation Numerique
4 207 equemene
        DEA d'astrophysique et techniques spatiales de Meudon
5 207 equemene

6 207 equemene
                par Herve Aussel et Emmanuel Quemener
7 207 equemene

8 207 equemene
        Conversion en C par Emmanuel Quemener en aout 1997
9 207 equemene

10 207 equemene
        Remerciements a :
11 207 equemene

12 207 equemene
        - Herve Aussel pour sa procedure sur le spectre de corps noir
13 207 equemene
        - Didier Pelat pour l'aide lors de ce travail
14 207 equemene
        - Jean-Pierre Luminet pour son article de 1979
15 207 equemene
        - Le Numerical Recipies pour ses recettes de calcul
16 207 equemene
        - Luc Blanchet pour sa disponibilite lors de mes interrogations en RG
17 207 equemene

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

24 207 equemene
                                Emmanuel.Quemener@enst-bretagne.fr
25 207 equemene

26 207 equemene
        Compilation sous gcc ( Compilateur GNU sous Linux ) :
27 207 equemene

28 207 equemene
                gcc -O6 -m486 -o trou_noir trou_noir.c -lm
29 207 equemene
*/
30 207 equemene
31 207 equemene
#include <stdio.h>
32 207 equemene
#include <math.h>
33 207 equemene
#include <stdlib.h>
34 207 equemene
#include <string.h>
35 207 equemene
36 207 equemene
#define nbr 200 /* Nombre de colonnes du spectre */
37 207 equemene
38 207 equemene
#define PI 3.14159265359
39 207 equemene
40 207 equemene
double atanp(double x,double y)
41 207 equemene
{
42 207 equemene
  double angle;
43 207 equemene
44 207 equemene
  angle=atan2(y,x);
45 207 equemene
46 207 equemene
  if (angle<0)
47 207 equemene
    {
48 207 equemene
      angle+=2*PI;
49 207 equemene
    }
50 207 equemene
51 207 equemene
  return angle;
52 207 equemene
}
53 207 equemene
54 207 equemene
55 207 equemene
double f(double v)
56 207 equemene
{
57 207 equemene
  return v;
58 207 equemene
}
59 207 equemene
60 207 equemene
double g(double u,double m,double b)
61 207 equemene
{
62 207 equemene
// return (3.*m/b*pow(u,2)-u);
63 207 equemene
  return (3.*m/b*pow(u,2)-u);
64 207 equemene
}
65 207 equemene
66 207 equemene
67 207 equemene
void calcul(double *us,double *vs,double up,double vp,
68 207 equemene
            double h,double m,double b)
69 207 equemene
{
70 207 equemene
  double c[4],d[4];
71 207 equemene
72 207 equemene
  c[0]=h*f(vp);
73 207 equemene
  c[1]=h*f(vp+c[0]/2.);
74 207 equemene
  c[2]=h*f(vp+c[1]/2.);
75 207 equemene
  c[3]=h*f(vp+c[2]);
76 207 equemene
  d[0]=h*g(up,m,b);
77 207 equemene
  d[1]=h*g(up+d[0]/2.,m,b);
78 207 equemene
  d[2]=h*g(up+d[1]/2.,m,b);
79 207 equemene
  d[3]=h*g(up+d[2],m,b);
80 207 equemene
81 207 equemene
  *us=up+(c[0]+2.*c[1]+2.*c[2]+c[3])/6.;
82 207 equemene
  *vs=vp+(d[0]+2.*d[1]+2.*d[2]+d[3])/6.;
83 207 equemene
}
84 207 equemene
85 207 equemene
void rungekutta(double *ps,double *us,double *vs,
86 207 equemene
                double pp,double up,double vp,
87 207 equemene
                double h,double m,double b)
88 207 equemene
{
89 207 equemene
  calcul(us,vs,up,vp,h,m,b);
90 207 equemene
  *ps=pp+h;
91 207 equemene
}
92 207 equemene
93 207 equemene
94 207 equemene
double decalage_spectral(double r,double b,double phi,
95 207 equemene
                         double tho,double m)
96 207 equemene
{
97 207 equemene
  return (sqrt(1-3*m/r)/(1+sqrt(m/pow(r,3))*b*sin(tho)*sin(phi)));
98 207 equemene
}
99 207 equemene
100 207 equemene
void spectre(int nt[nbr],double fx[nbr],double rf,int q,double b,double db,
101 207 equemene
             double h,double r,double m,double bss,double *flx)
102 207 equemene
{
103 207 equemene
  int fi;
104 207 equemene
105 207 equemene
  fi=(int)(rf*nbr/bss);
106 207 equemene
  nt[fi]+=1;
107 207 equemene
  *flx=pow(r/m,q)*pow(rf,4)*b*db*h;
108 207 equemene
  fx[fi]=fx[fi]+*flx;
109 207 equemene
}
110 207 equemene
111 207 equemene
void spectre_cn(int nt[nbr],double fx[nbr],double rf,double b,double db,
112 207 equemene
                double h,double r,double m,double bss,double *flx)
113 207 equemene
{
114 207 equemene
  double nu_rec,nu_em,qu,v,temp,temp_em,flux_int,m_point,planck,c,k;
115 207 equemene
  int fi,posfreq;
116 207 equemene
117 207 equemene
  planck=6.62e-34;
118 207 equemene
  k=1.38e-23;
119 207 equemene
  temp=3.e7;
120 207 equemene
  // m_point=1.e14;
121 207 equemene
  m_point=10.;
122 207 equemene
  v=1.-3./r;
123 207 equemene
124 207 equemene
  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))));
125 207 equemene
126 207 equemene
  temp_em=temp*sqrt(m)*exp(0.25*log(m_point))*exp(-0.75*log(r))*
127 207 equemene
    exp(-0.125*log(v))*exp(0.25*log(qu));
128 207 equemene
129 207 equemene
  flux_int=0;
130 207 equemene
  *flx=0;
131 207 equemene
132 207 equemene
  for (fi=1;fi<nbr;fi++)
133 207 equemene
    {
134 207 equemene
      nu_em=bss*fi/nbr;
135 207 equemene
      nu_rec=nu_em*rf;
136 207 equemene
      posfreq=1./bss*nu_rec*nbr;
137 207 equemene
      if ((posfreq>0)&&(posfreq<nbr))
138 207 equemene
        {
139 207 equemene
          flux_int=2*planck/9e16*pow(nu_em,3)/(exp(planck*nu_em/k/temp_em)-1.)*pow(rf,3)*b*db*h;
140 207 equemene
          fx[posfreq]+=flux_int;
141 207 equemene
          *flx+=flux_int;
142 207 equemene
          nt[posfreq]+=1;
143 207 equemene
        }
144 207 equemene
    }
145 207 equemene
146 207 equemene
  printf("%f %f %f %f\n",b,db,r,*flx);
147 207 equemene
}
148 207 equemene
149 207 equemene
void impact(double d,double phi,int dim,double r,double b,double tho,double m,
150 207 equemene
            double **zp,double **fp,
151 207 equemene
            int nt[200],double fx[200],int q,double db,
152 207 equemene
            double h,double bss,int raie)
153 207 equemene
{
154 207 equemene
  double xe,ye;
155 207 equemene
  int xi,yi;
156 207 equemene
  double flx,rf;
157 207 equemene
  xe=d*sin(phi);
158 207 equemene
  ye=-d*cos(phi);
159 207 equemene
160 207 equemene
  xi=(int)xe+dim/2;
161 207 equemene
  yi=(int)ye+dim/2;
162 207 equemene
163 207 equemene
  rf=decalage_spectral(r,b,phi,tho,m);
164 207 equemene
165 207 equemene
  if (raie==0)
166 207 equemene
    {
167 207 equemene
      spectre(nt,fx,rf,q,b,db,h,r,m,bss,&flx);
168 207 equemene
    }
169 207 equemene
  else
170 207 equemene
    {
171 207 equemene
      spectre_cn(nt,fx,rf,b,db,h,r,m,bss,&flx);
172 207 equemene
    }
173 207 equemene
174 207 equemene
  if (zp[xi][yi]==0.)
175 207 equemene
    {
176 207 equemene
      zp[xi][yi]=1./rf;
177 207 equemene
    }
178 207 equemene
179 207 equemene
  if (fp[xi][yi]==0.)
180 207 equemene
    {
181 207 equemene
      fp[xi][yi]=flx;
182 207 equemene
    }
183 207 equemene
}
184 207 equemene
185 207 equemene
void sauvegarde_pgm(char nom[24],unsigned int **image,int dim)
186 207 equemene
{
187 207 equemene
  FILE            *sortie;
188 207 equemene
  unsigned long   i,j;
189 207 equemene
190 207 equemene
  sortie=fopen(nom,"w");
191 207 equemene
192 207 equemene
  fprintf(sortie,"P5\n");
193 207 equemene
  fprintf(sortie,"%i %i\n",dim,dim);
194 207 equemene
  fprintf(sortie,"255\n");
195 207 equemene
196 207 equemene
  for (j=0;j<dim;j++) for (i=0;i<dim;i++)
197 207 equemene
    {
198 207 equemene
      fputc(image[i][j],sortie);
199 207 equemene
    }
200 207 equemene
201 207 equemene
  fclose(sortie);
202 207 equemene
}
203 207 equemene
204 207 equemene
void sauvegarde_dat(char nom[24],double tableau[3][nbr],int raie)
205 207 equemene
{
206 207 equemene
  FILE            *sortie;
207 207 equemene
  unsigned long   i;
208 207 equemene
209 207 equemene
  sortie=fopen(nom,"w");
210 207 equemene
211 207 equemene
  fprintf(sortie,"# Trou Noir entoure d'un Disque d'Accretion\n");
212 207 equemene
213 207 equemene
  if (raie==0)
214 207 equemene
    {
215 207 equemene
      fprintf(sortie,"# Colonne 1 : Frequence_Recue/Frequence_Emise\n");
216 207 equemene
    }
217 207 equemene
  else
218 207 equemene
    {
219 207 equemene
      fprintf(sortie,"# Colonne 1 : Fr?quence d'Emission en Hertz\n");
220 207 equemene
    }
221 207 equemene
222 207 equemene
  fprintf(sortie,"# Colonne 2 : Intensite Normalisee\n");
223 207 equemene
  fprintf(sortie,"# Colonne 3 : Nombre d'Impacts Normalise\n");
224 207 equemene
225 207 equemene
  for (i=1;i<nbr;i++)
226 207 equemene
    {
227 207 equemene
      fprintf(sortie,"%f\t%f\t%f\n",tableau[0][i],tableau[1][i],tableau[2][i]);
228 207 equemene
    }
229 207 equemene
230 207 equemene
  fclose(sortie);
231 207 equemene
}
232 207 equemene
233 207 equemene
int main(int argc,char *argv[])
234 207 equemene
{
235 207 equemene
236 207 equemene
  double m,rs,ri,re,tho,ro;
237 207 equemene
  int q;
238 207 equemene
239 207 equemene
  double bss,stp;
240 207 equemene
  int nmx,dim;
241 207 equemene
  double d,bmx,db,b,h;
242 207 equemene
  double up,vp,pp;
243 207 equemene
  double us,vs,ps;
244 207 equemene
  double rp[2000];
245 207 equemene
  double **zp,**fp;
246 207 equemene
  unsigned int **izp,**ifp;
247 207 equemene
  double zmx,fmx,zen,fen;
248 207 equemene
  double flux_tot,impc_tot;
249 207 equemene
  double fx[nbr];
250 207 equemene
  int nt[nbr];
251 207 equemene
  double tableau[3][nbr];
252 207 equemene
  double phi,thi,thx,phd,php,nr,r;
253 207 equemene
  int ni,ii,i,imx,j,n,tst,dist,raie,pc,fcl,zcl;
254 207 equemene
  double nh;
255 207 equemene
256 207 equemene
  if (argc==2)
257 207 equemene
    {
258 207 equemene
      if (strcmp(argv[1],"-aide")==0)
259 207 equemene
        {
260 207 equemene
          printf("\nSimulation d'un disque d'accretion autour d'un trou noir\n");
261 207 equemene
          printf("\nParametres a definir :\n\n");
262 207 equemene
          printf("   1) Dimension de l'Image\n");
263 207 equemene
          printf("   2) Masse relative du trou noir\n");
264 207 equemene
          printf("   3) Dimension du disque exterieur\n");
265 207 equemene
          printf("   4) Distance de l'observateur\n");
266 207 equemene
          printf("   5) Inclinaison par rapport au disque (en degres)\n");
267 207 equemene
          printf("   6) Observation a distance FINIE ou INFINIE\n");
268 207 equemene
          printf("   7) Rayonnement de disque MONOCHROMATIQUE ou CORPS_NOIR\n");
269 207 equemene
          printf("   8) Normalisation des flux INTERNE ou EXTERNE\n");
270 207 equemene
          printf("   9) Normalisation de z INTERNE ou EXTERNE\n");
271 207 equemene
          printf("  10) Impression des images NEGATIVE ou POSITIVE\n");
272 207 equemene
          printf("  11) Nom de l'image des Flux\n");
273 207 equemene
          printf("  12) Nom de l'image des decalages spectraux\n");
274 207 equemene
          printf("  13) Nom du fichier contenant le spectre\n");
275 207 equemene
          printf("  14) Valeur de normalisation des flux\n");
276 207 equemene
          printf("  15) Valeur de normalisation des decalages spectraux\n");
277 207 equemene
          printf("\nSi aucun parametre defini, parametres par defaut :\n\n");
278 207 equemene
          printf("   1) Dimension de l'image : 256 pixels de cote\n");
279 207 equemene
          printf("   2) Masse relative du trou noir : 1\n");
280 207 equemene
          printf("   3) Dimension du disque exterieur : 12 \n");
281 207 equemene
          printf("   4) Distance de l'observateur : 100 \n");
282 207 equemene
          printf("   5) Inclinaison par rapport au disque (en degres) : 10\n");
283 207 equemene
          printf("   6) Observation a distance FINIE\n");
284 207 equemene
          printf("   7) Rayonnement de disque MONOCHROMATIQUE\n");
285 207 equemene
          printf("   8) Normalisation des flux INTERNE\n");
286 207 equemene
          printf("   9) Normalisation des z INTERNE\n");
287 207 equemene
          printf("  10) Impression des images NEGATIVE ou POSITIVE\n");
288 207 equemene
                 printf("  11) Nom de l'image des flux : flux.pgm\n");
289 207 equemene
          printf("  12) Nom de l'image des z : z.pgm\n");
290 207 equemene
          printf("  13) Nom du fichier contenant le spectre : spectre.dat\n");
291 207 equemene
          printf("  14) <non definie>\n");
292 207 equemene
          printf("  15) <non definie>\n");
293 207 equemene
        }
294 207 equemene
    }
295 207 equemene
296 207 equemene
  if ((argc==14)||(argc==16))
297 207 equemene
    {
298 207 equemene
      printf("# Utilisation les valeurs definies par l'utilisateur\n");
299 207 equemene
300 207 equemene
      dim=atoi(argv[1]);
301 207 equemene
      m=atof(argv[2]);
302 207 equemene
      re=atof(argv[3]);
303 207 equemene
      ro=atof(argv[4]);
304 207 equemene
      tho=PI/180.*(90-atof(argv[5]));
305 207 equemene
306 207 equemene
      rs=2.*m;
307 207 equemene
      ri=3.*rs;
308 207 equemene
      q=-2;
309 207 equemene
310 207 equemene
      if (strcmp(argv[6],"FINIE")==0)
311 207 equemene
        {
312 207 equemene
          dist=0;
313 207 equemene
        }
314 207 equemene
      else
315 207 equemene
        {
316 207 equemene
          dist=1;
317 207 equemene
        }
318 207 equemene
319 207 equemene
      if (strcmp(argv[7],"MONOCHROMATIQUE")==0)
320 207 equemene
        {
321 207 equemene
          raie=0;
322 207 equemene
        }
323 207 equemene
      else
324 207 equemene
        {
325 207 equemene
          raie=1;
326 207 equemene
        }
327 207 equemene
328 207 equemene
      if (strcmp(argv[8],"EXTERNE")==0)
329 207 equemene
        {
330 207 equemene
          fen=atof(argv[14]);
331 207 equemene
        }
332 207 equemene
333 207 equemene
      if (strcmp(argv[9],"EXTERNE")==0)
334 207 equemene
        {
335 207 equemene
          zen=atof(argv[15]);
336 207 equemene
        }
337 207 equemene
338 207 equemene
    }
339 207 equemene
  else
340 207 equemene
    {
341 207 equemene
      printf("# Utilisation les valeurs par defaut\n");
342 207 equemene
343 207 equemene
      dim=256;
344 207 equemene
      m=1.;
345 207 equemene
      rs=2.*m;
346 207 equemene
      ri=3.*rs;
347 207 equemene
      re=12.;
348 207 equemene
      ro=100.;
349 207 equemene
      tho=PI/180.*80;
350 207 equemene
      q=-2;
351 207 equemene
      dist=0;
352 207 equemene
      raie=0;
353 207 equemene
    }
354 207 equemene
355 207 equemene
      printf("# Dimension de l'image : %i\n",dim);
356 207 equemene
      printf("# Masse : %f\n",m);
357 207 equemene
      printf("# Rayon singularite : %f\n",rs);
358 207 equemene
      printf("# Rayon interne : %f\n",ri);
359 207 equemene
      printf("# Rayon externe : %f\n",re);
360 207 equemene
      printf("# Distance de l'observateur : %f\n",ro);
361 207 equemene
      printf("# Inclinaison a la normale en radian : %f\n",tho);
362 207 equemene
363 207 equemene
  for (i=0;i<nbr;i++)
364 207 equemene
    {
365 207 equemene
      fx[i]=0.;
366 207 equemene
      nt[i]=0;
367 207 equemene
    }
368 207 equemene
369 207 equemene
  zp=(double**)calloc(dim,sizeof(double*));
370 207 equemene
  zp[0]=(double*)calloc(dim*dim,sizeof(double));
371 207 equemene
372 207 equemene
  fp=(double**)calloc(dim,sizeof(double*));
373 207 equemene
  fp[0]=(double*)calloc(dim*dim,sizeof(double));
374 207 equemene
375 207 equemene
  izp=(unsigned int**)calloc(dim,sizeof(unsigned int*));
376 207 equemene
  izp[0]=(unsigned int*)calloc(dim*dim,sizeof(unsigned int));
377 207 equemene
378 207 equemene
  ifp=(unsigned int**)calloc(dim,sizeof(unsigned int*));
379 207 equemene
  ifp[0]=(unsigned int*)calloc(dim*dim,sizeof(unsigned int));
380 207 equemene
381 207 equemene
  for (i=1;i<dim;i++)
382 207 equemene
    {
383 207 equemene
      zp[i]=zp[i-1]+dim;
384 207 equemene
      fp[i]=fp[i-1]+dim;
385 207 equemene
      izp[i]=izp[i-1]+dim;
386 207 equemene
      ifp[i]=ifp[i-1]+dim;
387 207 equemene
    }
388 207 equemene
389 207 equemene
  nmx=dim;
390 207 equemene
  stp=dim/(2.*nmx);
391 207 equemene
  bmx=1.25*re;
392 207 equemene
  b=0.;
393 207 equemene
  thx=asin(bmx/ro);
394 207 equemene
  pc=0;
395 207 equemene
396 207 equemene
  if (raie==0)
397 207 equemene
    {
398 207 equemene
      bss=2;
399 207 equemene
    }
400 207 equemene
  else
401 207 equemene
    {
402 207 equemene
      bss=3e21;
403 207 equemene
    }
404 207 equemene
405 207 equemene
  for (n=1;n<=nmx;n++)
406 207 equemene
    {
407 207 equemene
      h=PI/500.;
408 207 equemene
      d=stp*n;
409 207 equemene
410 207 equemene
      if (dist==1)
411 207 equemene
        {
412 207 equemene
          db=bmx/(double)nmx;
413 207 equemene
          b=db*(double)n;
414 207 equemene
          up=0.;
415 207 equemene
          vp=1.;
416 207 equemene
        }
417 207 equemene
      else
418 207 equemene
        {
419 207 equemene
          thi=thx/(double)nmx*(double)n;
420 207 equemene
          db=ro*sin(thi)-b;
421 207 equemene
          b=ro*sin(thi);
422 207 equemene
          up=sin(thi);
423 207 equemene
          vp=cos(thi);
424 207 equemene
        }
425 207 equemene
426 207 equemene
      pp=0.;
427 207 equemene
      nh=1;
428 207 equemene
429 207 equemene
      rungekutta(&ps,&us,&vs,pp,up,vp,h,m,b);
430 207 equemene
431 207 equemene
      rp[(int)nh]=fabs(b/us);
432 207 equemene
433 207 equemene
      do
434 207 equemene
        {
435 207 equemene
          nh++;
436 207 equemene
          pp=ps;
437 207 equemene
          up=us;
438 207 equemene
          vp=vs;
439 207 equemene
          rungekutta(&ps,&us,&vs,pp,up,vp,h,m,b);
440 207 equemene
441 207 equemene
          rp[(int)nh]=b/us;
442 207 equemene
443 207 equemene
        } while ((rp[(int)nh]>=rs)&&(rp[(int)nh]<=rp[1]));
444 207 equemene
445 207 equemene
      for (i=nh+1;i<2000;i++)
446 207 equemene
        {
447 207 equemene
          rp[i]=0.;
448 207 equemene
        }
449 207 equemene
450 207 equemene
      imx=(int)(8*d);
451 207 equemene
452 207 equemene
      for (i=0;i<=imx;i++)
453 207 equemene
        {
454 207 equemene
          phi=2.*PI/(double)imx*(double)i;
455 207 equemene
          phd=atanp(cos(phi)*sin(tho),cos(tho));
456 207 equemene
          phd=fmod(phd,PI);
457 207 equemene
          ii=0;
458 207 equemene
          tst=0;
459 207 equemene
460 207 equemene
          do
461 207 equemene
            {
462 207 equemene
              php=phd+(double)ii*PI;
463 207 equemene
              nr=php/h;
464 207 equemene
              ni=(int)nr;
465 207 equemene
466 207 equemene
              if ((double)ni<nh)
467 207 equemene
                {
468 207 equemene
                  r=(rp[ni+1]-rp[ni])*(nr-ni*1.)+rp[ni];
469 207 equemene
                }
470 207 equemene
              else
471 207 equemene
                {
472 207 equemene
                  r=rp[ni];
473 207 equemene
                }
474 207 equemene
475 207 equemene
              if ((r<=re)&&(r>=ri))
476 207 equemene
                {
477 207 equemene
                  tst=1;
478 207 equemene
                  impact(d,phi,dim,r,b,tho,m,zp,fp,nt,fx,q,db,h,bss,raie);
479 207 equemene
                }
480 207 equemene
481 207 equemene
              ii++;
482 207 equemene
            } while ((ii<=2)&&(tst==0));
483 207 equemene
        }
484 207 equemene
    }
485 207 equemene
486 207 equemene
  fmx=fp[0][0];
487 207 equemene
  zmx=zp[0][0];
488 207 equemene
489 207 equemene
  for (i=0;i<dim;i++) for (j=0;j<dim;j++)
490 207 equemene
    {
491 207 equemene
      if (fmx<fp[i][j])
492 207 equemene
        {
493 207 equemene
          fmx=fp[i][j];
494 207 equemene
        }
495 207 equemene
496 207 equemene
      if (zmx<zp[i][j])
497 207 equemene
        {
498 207 equemene
          zmx=zp[i][j];
499 207 equemene
        }
500 207 equemene
    }
501 207 equemene
502 207 equemene
  printf("\nLe flux maximal detecte est de %f",fmx);
503 207 equemene
  printf("\nLe decalage spectral maximal detecte est de %f\n\n",zmx);
504 207 equemene
505 207 equemene
  if (strcmp(argv[8],"EXTERNE")==0)
506 207 equemene
    {
507 207 equemene
      fmx=fen;
508 207 equemene
    }
509 207 equemene
510 207 equemene
  if (strcmp(argv[9],"EXTERNE")==0)
511 207 equemene
    {
512 207 equemene
      zmx=zen;
513 207 equemene
    }
514 207 equemene
515 207 equemene
  for (i=0;i<dim;i++) for (j=0;j<dim;j++)
516 207 equemene
    {
517 207 equemene
      zcl=(int)(255/zmx*zp[i][dim-1-j]);
518 207 equemene
      fcl=(int)(255/fmx*fp[i][dim-1-j]);
519 207 equemene
520 207 equemene
      if (strcmp(argv[8],"NEGATIVE")==0)
521 207 equemene
        {
522 207 equemene
          if (zcl>255)
523 207 equemene
            {
524 207 equemene
              izp[i][j]=0;
525 207 equemene
            }
526 207 equemene
          else
527 207 equemene
            {
528 207 equemene
              izp[i][j]=255-zcl;
529 207 equemene
            }
530 207 equemene
531 207 equemene
          if (fcl>255)
532 207 equemene
            {
533 207 equemene
              ifp[i][j]=0;
534 207 equemene
            }
535 207 equemene
          else
536 207 equemene
            {
537 207 equemene
              ifp[i][j]=255-fcl;
538 207 equemene
            }
539 207 equemene
540 207 equemene
        }
541 207 equemene
      else
542 207 equemene
        {
543 207 equemene
          if (zcl>255)
544 207 equemene
            {
545 207 equemene
              izp[i][j]=255;
546 207 equemene
            }
547 207 equemene
          else
548 207 equemene
            {
549 207 equemene
              izp[i][j]=zcl;
550 207 equemene
            }
551 207 equemene
552 207 equemene
          if (fcl>255)
553 207 equemene
            {
554 207 equemene
              ifp[i][j]=255;
555 207 equemene
            }
556 207 equemene
          else
557 207 equemene
            {
558 207 equemene
              ifp[i][j]=fcl;
559 207 equemene
            }
560 207 equemene
561 207 equemene
        }
562 207 equemene
563 207 equemene
    }
564 207 equemene
565 207 equemene
  flux_tot=0;
566 207 equemene
  impc_tot=0;
567 207 equemene
568 207 equemene
  for (i=1;i<nbr;i++)
569 207 equemene
    {
570 207 equemene
      flux_tot+=fx[i];
571 207 equemene
      impc_tot+=nt[i];
572 207 equemene
    }
573 207 equemene
574 207 equemene
  for (i=1;i<nbr;i++)
575 207 equemene
    {
576 207 equemene
      tableau[0][i]=bss*i/nbr;
577 207 equemene
      tableau[1][i]=fx[i]/flux_tot;
578 207 equemene
      tableau[2][i]=(double)nt[i]/(double)impc_tot;
579 207 equemene
    }
580 207 equemene
581 207 equemene
  if ((argc==14)||(argc==16))
582 207 equemene
   {
583 207 equemene
     sauvegarde_pgm(argv[11],ifp,dim);
584 207 equemene
     sauvegarde_pgm(argv[12],izp,dim);
585 207 equemene
     sauvegarde_dat(argv[13],tableau,raie);
586 207 equemene
   }
587 207 equemene
  else
588 207 equemene
    {
589 207 equemene
      sauvegarde_pgm("z.pgm",izp,dim);
590 207 equemene
      sauvegarde_pgm("flux.pgm",ifp,dim);
591 207 equemene
      sauvegarde_dat("spectre.dat",tableau,raie);
592 207 equemene
    }
593 207 equemene
594 207 equemene
  free(zp[0]);
595 207 equemene
  free(zp);
596 207 equemene
  free(fp[0]);
597 207 equemene
  free(fp);
598 207 equemene
599 207 equemene
  free(izp[0]);
600 207 equemene
  free(izp);
601 207 equemene
  free(ifp[0]);
602 207 equemene
  free(ifp);
603 207 equemene
604 207 equemene
}
605 207 equemene