Statistiques
| Révision :

root / TrouNoir / trou_noir_1997.c @ 306

Historique | Voir | Annoter | Télécharger (11,95 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 258 equemene
        Licence CC BY-NC-SA Emmanuel QUEMENER <emmanuel.quemener@gmail.com>
11 258 equemene

12 207 equemene
        Remerciements a :
13 207 equemene

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

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

26 207 equemene
                                Emmanuel.Quemener@enst-bretagne.fr
27 207 equemene

28 207 equemene
        Compilation sous gcc ( Compilateur GNU sous Linux ) :
29 207 equemene

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