Statistiques
| Révision :

root / TrouNoir / trou_noir.f @ 257

Historique | Voir | Annoter | Télécharger (15,45 ko)

1 197 equemene
      PROGRAM MODELISATION_NUMERIQUE
2 197 equemene
3 197 equemene
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
4 197 equemene
c                                                                            c
5 197 equemene
c MODELISATION NUMERIQUE D'UN DISQUE D'ACCRETION AUTOUR D'UN TROU NOIR :     c
6 197 equemene
c                                                                            c
7 197 equemene
c APPARENCE & SPECTRE                                                        c
8 197 equemene
c                                                                            c
9 197 equemene
c Programme realise par : Herve AUSSEL                                       c
10 197 equemene
c                         Emmanuel QUEMENER                                  c
11 197 equemene
c                                                                            c
12 197 equemene
c Dans le cadre de l'unite de modelisation numerique du DEA                  c
13 197 equemene
c d'Astrophysique & Techniques Spatiales (Paris 7 & 11)                      c
14 197 equemene
c                                                                            c
15 197 equemene
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
16 197 equemene
17 197 equemene
      IMPLICIT NONE
18 197 equemene
      REAL*8 pi
19 197 equemene
      PARAMETER (pi=3.141592654)
20 197 equemene
21 197 equemene
c
22 197 equemene
c PARAMETRES PHYSIQUES DU SYSTEME DISQUE, TROU-NOIR, OBSERVATEUR
23 197 equemene
c
24 197 equemene
25 197 equemene
      REAL*8 m                  ! masse reduite du trou noir
26 197 equemene
      REAL*8 rs,ri,re           ! rayons de Schwarzschild,interieur et exterieur
27 197 equemene
      REAL*8 tho                ! angle normale-disque & direction-observateur
28 197 equemene
      REAL*8 ro                 ! distance entre l'observateur et le trou noir
29 205 equemene
      REAL*8 q               ! parametre de spectre
30 197 equemene
      REAL*4 bss                ! borne superieure du spectre
31 197 equemene
32 197 equemene
c
33 197 equemene
c PARAMETRES DE LA PLAQUE PHOTOGRAPHIQUE
34 197 equemene
c
35 197 equemene
36 197 equemene
      INTEGER*4 dim             ! dimension de la plaque photographique (en pixels)
37 205 equemene
      PARAMETER (dim=1024)
38 197 equemene
      REAL*4 stp                ! pas d'iteration en pixels sur la plaque
39 197 equemene
      INTEGER*4 nmx             ! nombre total d'iterations
40 197 equemene
      REAL*8 d                  ! distance exploree du centre de la plaque
41 197 equemene
      REAL*8 bmx                ! parametre d'impact maximal
42 197 equemene
43 197 equemene
c
44 197 equemene
c PARAMETRES INITIAUX D' INTEGRATION
45 197 equemene
c
46 197 equemene
47 197 equemene
      REAL*8 db                 ! avancement du parametre d'impact
48 197 equemene
      REAL*8 b                  ! parametre d'impact du photon
49 197 equemene
      REAL*8 h                  ! avancement angulaire initial
50 197 equemene
51 197 equemene
c
52 197 equemene
c PARAMETRES D'INTEGRATION DU SYSTEME DIFFERENTIEL
53 197 equemene
c
54 197 equemene
55 197 equemene
      REAL*8 up,vp,pp           ! parametres du SED , precedents
56 197 equemene
      REAL*8 us,vs,ps           ! parametres du SED , suivants
57 197 equemene
58 197 equemene
c
59 197 equemene
c RESULTATS DE L'INTEGRATION DE L'EQUATION DIFFERENTIELLE
60 197 equemene
c
61 197 equemene
62 205 equemene
      REAL*8 rp(2048)    ! vecteur polaire
63 205 equemene
      INTEGER*4 nh              ! nombre d'avancements angulaires
64 197 equemene
65 197 equemene
c
66 197 equemene
c RESULTATS DE LA SIMULATION
67 197 equemene
c
68 197 equemene
69 197 equemene
      REAL*4 zp(dim,dim) 	! image en decalage spectral
70 197 equemene
      REAL*4 fp(dim,dim) 	! image en flux
71 197 equemene
72 197 equemene
c
73 197 equemene
c AUTRES VARIABLES...
74 197 equemene
c
75 197 equemene
76 197 equemene
      INTEGER*4 pc              ! pourcentage du balayage realise
77 197 equemene
      REAL*8 phi                ! angle de la plaque photographique
78 197 equemene
      REAL*8 thi                ! angle trou noir-observateur & direction emission
79 197 equemene
      REAL*8 thx                ! angle thi maximal
80 197 equemene
      REAL*8 phd                ! angle donnant l'intersection des plans
81 197 equemene
      REAL*8 php                ! angle d'intersection intermediaire
82 197 equemene
      REAL*8 nr                 ! indice d'intersection reel du vecteur
83 197 equemene
      INTEGER*4 ni              ! indice d'intersection entier du vecteur
84 197 equemene
      INTEGER*4 ii              ! indice de 1' image (primaire, secondaire, ...)
85 197 equemene
      REAL*8 r                  ! rayon moyen d'impact sur le disque
86 197 equemene
      INTEGER*4 nbr             ! nombre de bandes de rapport de frequence
87 197 equemene
      INTEGER*4 i,imx,j,n
88 197 equemene
      LOGICAL tst
89 197 equemene
      REAL*8 atanp              ! fonction arctangente : resultat entre 0 et 2*pi
90 197 equemene
      LOGICAL raie            ! variable interactive de type de spectre
91 197 equemene
      LOGICAL dist            ! variable interactive de distance
92 197 equemene
93 205 equemene
      REAL*4 t_start,t_stop
94 197 equemene
c
95 197 equemene
c TYPE DE SPECTRE
96 197 equemene
c
97 197 equemene
98 205 equemene
c      raie=.TRUE.               ! TRUE -> raie infiniment fine
99 205 equemene
      raie=.FALSE.               ! FALSE -> corps noir
100 197 equemene
101 197 equemene
c
102 197 equemene
c TYPE DE DISTANCE
103 197 equemene
c
104 197 equemene
105 205 equemene
c      dist=.TRUE.               ! TRUE -> distance infinie
106 205 equemene
      dist=.FALSE.               ! FALSE -> distance finie
107 197 equemene
108 197 equemene
c
109 197 equemene
c INITIALISATION DES TABLEAUX
110 197 equemene
c
111 197 equemene
112 197 equemene
      DO i=1,dim
113 197 equemene
         DO j=1,dim
114 197 equemene
            zp(i,j)=0.
115 197 equemene
            fp(i,j)=0.
116 197 equemene
         END DO
117 197 equemene
      END DO
118 197 equemene
119 197 equemene
c
120 197 equemene
c DEFINITION DES PARAMETRES PHYSIQUES
121 197 equemene
c
122 197 equemene
123 197 equemene
      m=1.
124 197 equemene
      rs=2.*m
125 197 equemene
      ri=3.*rs
126 197 equemene
      re=12.
127 197 equemene
      ro=100.
128 197 equemene
      tho=pi/180.*80.
129 197 equemene
      IF (raie .EQV. .TRUE.) THEN
130 197 equemene
         q=-2
131 197 equemene
      ELSE
132 197 equemene
         q=-3/4
133 197 equemene
      ENDIF
134 197 equemene
135 197 equemene
c
136 197 equemene
c DEFINITION DES PARAMETRES NUMERIQUES
137 197 equemene
c
138 197 equemene
139 197 equemene
      nmx=dim
140 197 equemene
      stp=dim/(2.*nmx)
141 197 equemene
      bmx=1.25*re
142 197 equemene
      b=0.
143 197 equemene
      thx=asin(bmx/ro)
144 197 equemene
      pc=0
145 205 equemene
      nbr=256
146 197 equemene
      IF (raie .EQV. .TRUE.) THEN
147 197 equemene
         bss=2.
148 197 equemene
      ELSE
149 197 equemene
         bss=1.e19
150 197 equemene
      ENDIF
151 197 equemene
152 197 equemene
c
153 197 equemene
c BOUCLE PRINCIPALE DE LA SIMULATION
154 197 equemene
c
155 197 equemene
156 205 equemene
      CALL TIMER(t_start)
157 205 equemene
158 197 equemene
      DO n=1,nmx
159 197 equemene
160 197 equemene
c
161 197 equemene
c Affectation des conditions initiales de la resolution Runge-Kutta
162 197 equemene
c ( Premier etage d'imbrication -> n )
163 197 equemene
c
164 205 equemene
         h=4*pi/2048.
165 197 equemene
         d=stp*n
166 197 equemene
         IF (dist .EQV. .TRUE.) THEN
167 197 equemene
            db=bmx/nmx
168 197 equemene
            b=db*n
169 197 equemene
            up=0.
170 197 equemene
            vp=1.
171 197 equemene
         ELSE
172 197 equemene
            thi=thx/nmx*n
173 197 equemene
            db=ro*DSIN(thi)-b
174 197 equemene
            b=ro*DSIN(thi)
175 197 equemene
            up=DSIN(thi)
176 197 equemene
            vp=DCOS(thi)
177 197 equemene
         ENDIF
178 197 equemene
         pp=0.
179 197 equemene
         nh=1
180 197 equemene
         CALL rungekutta(ps,us,vs,pp,up,vp,h,m,b)
181 197 equemene
         rp(nh)=ABS(b/us)
182 197 equemene
183 197 equemene
c
184 197 equemene
c Resolution de l'equation differentielle pour un parametre b donne
185 197 equemene
c Les resultats sont stockes dans le vecteur polaire rp(n)
186 197 equemene
c ( Deuxieme etage d'imbrication -> n & nh )
187 197 equemene
c
188 197 equemene
189 197 equemene
         DO WHILE ((rp(nh).GE.rs).AND.(rp(nh).LE.rp(1)))
190 197 equemene
            nh=nh+1
191 197 equemene
            pp=ps
192 197 equemene
            up=us
193 197 equemene
            vp=vs
194 197 equemene
            CALL rungekutta(ps,us,vs,pp,up,vp,h,m,b)
195 197 equemene
            rp(nh)=b/us
196 197 equemene
         END DO
197 197 equemene
198 197 equemene
c
199 197 equemene
c Mise a zero de tous les termes non redefinis du vecteur polaire
200 197 equemene
c ( Deuxieme etage d'imbrication -> n & 1 )
201 197 equemene
c
202 197 equemene
203 205 equemene
         DO i=nh+1,2048
204 197 equemene
            rp(i)=0.
205 197 equemene
         END DO
206 197 equemene
207 197 equemene
c
208 197 equemene
c Determination des points de la trajectoire coupant le plan du disque
209 197 equemene
c par echantillonnage de 1' angle phi sur un cercle, a pas radial constant
210 197 equemene
c ( Deuxieme etage d'imbrication -> n & 1 )
211 197 equemene
c
212 197 equemene
213 197 equemene
         imx=INT(8*d)
214 197 equemene
         DO i=0,imx
215 197 equemene
            phi=2*pi/imx*i
216 197 equemene
217 197 equemene
c Calcul de l'angle "brut" d'intersection dans la base polaire
218 197 equemene
219 197 equemene
            phd=atanp(DCOS(phi)*DSIN(tho),DCOS(tho))
220 197 equemene
            phd=phd-INT(phd/pi)*pi
221 197 equemene
            ii=0
222 197 equemene
            tst=.FALSE.
223 197 equemene
224 197 equemene
c
225 197 equemene
c Boucle tant que - que l'image tertiaire n'a pas ete teste
226 197 equemene
c - le rayon n'est pas dans le domaine du disque
227 197 equemene
c ( Troisieme etage d'imbrication -> n , 1 , (ii, tst) , r )
228 197 equemene
c
229 197 equemene
230 197 equemene
            DO WHILE((ii.LE.2).AND.(tst.EQV..FALSE.))
231 197 equemene
232 197 equemene
c Calcul de l'angle d'intersection pour chacune des images
233 197 equemene
234 197 equemene
               php=phd+ii*pi
235 197 equemene
               nr=php/h
236 197 equemene
               ni=INT(nr)
237 197 equemene
238 197 equemene
c Interpolation lineaire de la distance photon-trou noir
239 197 equemene
240 197 equemene
               IF (ni.LT.nh) THEN
241 197 equemene
                  r=(rp(ni+1)-rp(ni))*(nr-ni*1.)+rp(ni)
242 197 equemene
               ELSE
243 197 equemene
                  r=rp(ni)
244 197 equemene
               ENDIF
245 197 equemene
246 197 equemene
247 197 equemene
c
248 197 equemene
c Test d'impact sur le disque
249 197 equemene
c ( Quatrieme etage d'imbrication -> n , i , (ii,tst) , r )
250 197 equemene
c
251 197 equemene
252 197 equemene
               IF ((r.LE.re).AND.(r.GE.ri)) then
253 197 equemene
                  tst=.TRUE.
254 197 equemene
255 197 equemene
c S'il y a impact calcul - du rapport de frequence
256 197 equemene
c - du spectre de photons et de flux
257 197 equemene
258 205 equemene
                  CALL impact(raie,d,phi,dim,r,b,tho,m,zp,fp,
259 205 equemene
     & q,db,h,nbr,bss)
260 197 equemene
261 197 equemene
               END IF
262 197 equemene
263 197 equemene
               ii=ii+1
264 197 equemene
            END DO
265 197 equemene
         END DO
266 197 equemene
      END DO
267 197 equemene
268 205 equemene
269 205 equemene
      CALL TIMER(t_stop)
270 205 equemene
271 205 equemene
      WRITE (*,*) 'Elapsed time = ', t_stop - t_start
272 205 equemene
273 197 equemene
c Appel de la routine d'affichage
274 197 equemene
275 205 equemene
      CALL affichage(zp,fp,dim,nbr,bss,bmx,m,ri,re,tho,pi)
276 197 equemene
277 197 equemene
      WRITE(*,*)
278 197 equemene
      WRITE(*,*) 'C''est TERMINE ! '
279 197 equemene
      WRITE(*,*)
280 197 equemene
281 197 equemene
      STOP
282 205 equemene
      END PROGRAM
283 197 equemene
284 197 equemene
c
285 197 equemene
c Cette fonction permet de trouver un arctangente entre 0 et 2*pi
286 197 equemene
c
287 197 equemene
288 197 equemene
      REAL*8 function atanp(x,y)
289 197 equemene
      REAL*8 x,y,pi,eps
290 197 equemene
      pi=3.141592654
291 197 equemene
      eps=1.e-20
292 197 equemene
      IF (ABS(x).LE.eps) then
293 197 equemene
         IF (ABS(y).EQ.Y) then
294 197 equemene
            atanp=pi/2.
295 197 equemene
         ELSE
296 197 equemene
            atanp=3.*pi/2.
297 197 equemene
         END IF
298 197 equemene
      ELSE
299 197 equemene
         IF (ABS(x).EQ.x) then
300 197 equemene
            IF (ABS(y).EQ.Y) then
301 197 equemene
               atanp=DATAN(y/x)
302 197 equemene
            ELSE
303 197 equemene
               atanp=DATAN(y/x)+2.*pi
304 197 equemene
            END IF
305 197 equemene
         ELSE
306 197 equemene
            atanp=DATAN(y/x)+pi
307 197 equemene
         END IF
308 197 equemene
      END IF
309 197 equemene
      RETURN
310 197 equemene
      END
311 197 equemene
312 197 equemene
c
313 205 equemene
c
314 205 equemene
c
315 205 equemene
      SUBROUTINE timer(ytime)
316 205 equemene
      REAL*4 ytime
317 205 equemene
      INTEGER*4 clk_max,clk_rate,clk_read
318 205 equemene
319 205 equemene
      CALL SYSTEM_CLOCK(clk_read,clk_rate,clk_max)
320 205 equemene
321 205 equemene
      ytime=FLOAT(clk_read)/FLOAT(clk_rate)
322 205 equemene
323 205 equemene
      RETURN
324 205 equemene
      END
325 205 equemene
c
326 197 equemene
c Premiere fonction du systeme -> ( d(u)/d(phi)=f(phi,u,v) )
327 197 equemene
c
328 197 equemene
329 197 equemene
      REAL*8 function f(v)
330 197 equemene
      REAL*8 v
331 197 equemene
      f=v
332 197 equemene
      RETURN
333 197 equemene
      END
334 197 equemene
335 197 equemene
c
336 197 equemene
c Deuxieme fonction du systeme -> ( d(v)/d(phi)=g(phi,u,v) )
337 197 equemene
c
338 197 equemene
339 197 equemene
      REAL*8 function g(u,m,b)
340 197 equemene
      REAL*8 u, m, b
341 197 equemene
      g=3.*m/b*u**2-u
342 197 equemene
      RETURN
343 197 equemene
      END
344 197 equemene
345 197 equemene
c
346 197 equemene
c Routine de d'intergration par la methode de Runge-Kutta
347 197 equemene
c
348 197 equemene
349 197 equemene
      SUBROUTINE rungekutta(ps,us,vs,pp,up,vp,h,m,b)
350 197 equemene
      REAL*8 ps,us,vs,pp,up,vp,h,m,b
351 197 equemene
      CALL calcul(us,vs,up,vp,h,m,b)
352 197 equemene
      ps=pp+h
353 197 equemene
      RETURN
354 197 equemene
      END
355 197 equemene
356 197 equemene
      SUBROUTINE calcul(us,vs,up,vp,h,m,b)
357 197 equemene
      REAL*8 us,vs,up,vp,h,m,b
358 197 equemene
      REAL*8 c(4),d(4),f,g
359 197 equemene
      c(1)=h*f(vp)
360 197 equemene
      c(2)=h* f(vp+c(1)/2.)
361 197 equemene
      c(3)=h*f(vp+c(2)/2.)
362 197 equemene
      c(4)=h*f(vp+c(3))
363 197 equemene
      d(1)=h*g(up,m,b)
364 197 equemene
      d(2)=h*g(up+d(1)/2.,m,b)
365 197 equemene
      d(3)=h*g(up+d(2)/2.,m,b)
366 197 equemene
      d(4)=h*g(up+d(3),m,b)
367 197 equemene
      us=up+(c(1)+2.*c(2)+2.*c(3)+c(4))/6.
368 197 equemene
      vs=vp+(d(1)+2.*d(2)+2.*d(3)+d(4))/6.
369 197 equemene
      RETURN
370 197 equemene
      END
371 197 equemene
372 197 equemene
c
373 197 equemene
c En cas d'impact, cette procedure :
374 197 equemene
c - etablit la position du pixel consisdere sur les images
375 197 equemene
c - appelle la routine de calcul de decalage spectral
376 197 equemene
c - appelle la routine de calcul du flux et du spectre
377 197 equemene
c - affecte a chacun des pixels sa valeur calculee
378 197 equemene
c
379 197 equemene
380 197 equemene
      SUBROUTINE impact(raie,d,phi,dim,r,b,tho,m,zp,fp,
381 205 equemene
     & q,db,h,nbr,bss)
382 205 equemene
      REAL*8 d,phi,r,b,tho,m,db,h,q
383 205 equemene
      INTEGER*4 dim
384 197 equemene
      REAL*4 zp(dim,dim),fp(dim,dim),bss
385 197 equemene
      REAL*4 xe,ye
386 197 equemene
      INTEGER*4 xi,yi
387 197 equemene
      REAL*8 flx,rf
388 197 equemene
      LOGICAL raie
389 197 equemene
      xe=d*DSIN(phi)
390 197 equemene
      ye=-d*DCOS(phi)
391 197 equemene
392 197 equemene
c Calcul des coordonnees (x,y) du pixel sur chacune des images
393 197 equemene
394 197 equemene
      xi=INT(xe)+INT(dim/2.)
395 197 equemene
      yi=INT(ye)+INT(dim/2.)
396 197 equemene
397 197 equemene
c Appel de la routine de decalage spectral
398 197 equemene
399 197 equemene
      CALL decalage_spectral(rf,r,b,phi,tho,m)
400 197 equemene
401 197 equemene
c Appel de la routine de calcul de flux et de modification de spectre
402 197 equemene
c pour le cas d'une raie infiniment fine ou un corps noir
403 197 equemene
404 197 equemene
      IF (raie .EQV. .TRUE.) THEN
405 205 equemene
         CALL spectre(rf,q,b,db,h,r,m,bss,flx)
406 197 equemene
      ELSE
407 205 equemene
         CALL spectre_bb(rf,b,db,h,r,m,nbr,bss,flx)
408 197 equemene
      END IF
409 197 equemene
410 197 equemene
c Affectation sur chacune des images du decalage spectral et du flux
411 197 equemene
412 197 equemene
      IF(zp(xi,yi).EQ.0.) zp(xi,yi)=1./rf
413 197 equemene
      IF(fp(xi,yi).EQ.0.) fp(xi,yi)=flx
414 197 equemene
415 197 equemene
      RETURN
416 197 equemene
      END
417 197 equemene
418 197 equemene
c Calcul du rapport entre la frequence recue et la frequence emise
419 197 equemene
420 197 equemene
      SUBROUTINE decalage_spectral(rf,r,b,phi,tho,m)
421 197 equemene
      REAL*8 rf,r,b,phi,tho,m
422 197 equemene
      rf=sqrt(1-3*m/r)/(1+sqrt(m/r**3)*b*sin(tho)*sin(phi))
423 197 equemene
      RETURN
424 197 equemene
      END
425 197 equemene
426 197 equemene
c Calcul du flux puis du spectre pour une raie infiniment fine
427 197 equemene
428 205 equemene
      SUBROUTINE spectre(rf,q,b,db,h,r,m,bss,flx)
429 205 equemene
      REAL*8 rf,b,db,h,r,m,flx,q
430 197 equemene
      REAL*4 bss
431 197 equemene
      flx=(r/m)**q*rf**4*b*db*h
432 197 equemene
      RETURN
433 197 equemene
      END
434 197 equemene
435 197 equemene
c Calcul du flux puis du spectre pour un corps noir
436 197 equemene
437 205 equemene
      SUBROUTINE spectre_bb(rf,b,db,h,r,m,nbr,bss,flx)
438 205 equemene
      REAL*8 nu_rec,nu_em,qu,v
439 197 equemene
      REAL*8 rf,b,db,h,r,m,flx,temp,temp_em,flux_int
440 197 equemene
      REAL*8 m_point
441 197 equemene
      REAL*4 bss
442 205 equemene
      INTEGER*4 nbr
443 197 equemene
      INTEGER*4 fi,posfreq
444 205 equemene
      REAL*8, PARAMETER :: planck=6.62e-34 ! definition des constantes
445 205 equemene
      REAL*8, PARAMETER :: c=3.e8
446 205 equemene
      REAL*8, PARAMETER :: k=1.38e-23
447 197 equemene
448 197 equemene
c
449 197 equemene
c Definition des parametres pour le calcul de la temperature d'emission
450 197 equemene
c puis calcul
451 197 equemene
c
452 197 equemene
453 197 equemene
      temp=3.e7
454 197 equemene
      m_point=1.
455 197 equemene
456 197 equemene
c v -> C du rapport
457 197 equemene
458 197 equemene
      v=1.-3./r
459 197 equemene
460 197 equemene
c qu -> Q du rapport
461 197 equemene
462 205 equemene
      qu=((1-3./r)**-0.5)*(r**-0.5)*(r**0.5-6.**0.5+
463 205 equemene
     & (3.**0.5/2.)*log((r**0.5+3.**0.5)/(r**0.5-3**0.5)*0.1715728752))
464 197 equemene
      qu=abs(qu)
465 205 equemene
      temp_em=temp*m**0.5
466 205 equemene
      temp_em=temp_em*m_point**0.25
467 205 equemene
      temp_em=temp_em*r**(-0.75)
468 205 equemene
      temp_em=temp_em*v**(-0.125)
469 205 equemene
      temp_em=temp_em*qu**0.25
470 197 equemene
471 197 equemene
c
472 197 equemene
c initialisation des compteurs de flux
473 197 equemene
c flux int : flux recu pour le pixel dans la tranque posfreq
474 197 equemene
c flx : flux "bolometrique", integre de 0. a bss
475 197 equemene
c
476 197 equemene
477 197 equemene
      flux_int=0.
478 197 equemene
      flx=0.
479 197 equemene
480 197 equemene
c
481 197 equemene
c Balayage en frequence du spectre
482 197 equemene
c
483 197 equemene
484 197 equemene
      DO fi=1,nbr
485 197 equemene
         nu_em=bss*fi/nbr 	!frequence d' emission
486 197 equemene
         nu_rec=nu_em*rf 	!frequence de reception
487 205 equemene
         posfreq=INT(nu_rec*FLOAT(nbr)/bss) !case ou se trouve nu rec
488 197 equemene
489 197 equemene
c
490 197 equemene
c test pour savoir si la frequence de reception est bien dans le
491 197 equemene
c domaine du spectre calcule
492 197 equemene
c
493 197 equemene
494 197 equemene
         if ((posfreq.GE.1).AND.(posfreq.LE.nbr)) THEN
495 197 equemene
496 197 equemene
c Loi du corps noir
497 197 equemene
498 205 equemene
            flux_int=2.*nu_em**3/c**2*planck/
499 205 equemene
     & (exp(planck*nu_em/(k*temp_em))-1.)
500 197 equemene
501 197 equemene
c Integration sur le pixel
502 197 equemene
503 197 equemene
            flux_int=flux_int*rf**3*b*db*h
504 197 equemene
505 205 equemene
c Integration bolometrique
506 197 equemene
507 197 equemene
            flx=flx+flux_int
508 197 equemene
         ENDIF
509 197 equemene
      END DO
510 205 equemene
511 197 equemene
      RETURN
512 197 equemene
      END
513 197 equemene
514 197 equemene
c
515 197 equemene
c AFFICHAGE DES RESULTATS : 6 fenetres de sortie
516 197 equemene
c
517 197 equemene
c - Image en decalage spectral
518 197 equemene
c - Image en flux
519 197 equemene
c - Dessin de parametres physiques interessants
520 197 equemene
c - Dessin des limites du disque a l'infini
521 197 equemene
c - Dessin du spectre en flux
522 197 equemene
c - Dessin du spectre en nombre de photons
523 197 equemene
c
524 197 equemene
525 205 equemene
      SUBROUTINE affichage(zp,fp,dim,nbr,bss,bmx,m,ri,re,tho,pi)
526 205 equemene
      INTEGER*4 dim
527 197 equemene
      REAL*4 zp(dim,dim),fp(dim,dim),bss
528 205 equemene
      REAL*8 bmx,m,ri,re,tho,pi
529 197 equemene
      INTEGER*4 np,i,j
530 197 equemene
      REAL*8 fm,nm
531 205 equemene
      REAL*4 fmx,zmx,x(1024),y(1024),tr(6),c(20),bmp
532 197 equemene
      LOGICAL tg
533 197 equemene
      LOGICAL ps
534 197 equemene
535 197 equemene
      tg=.TRUE.                 ! TRUE : affichage en tons de gris
536 197 equemene
c                               ! FALSE : affichage en contours
537 197 equemene
538 205 equemene
      ps=.TRUE.                ! TRUE : affichage postscript
539 197 equemene
c                               ! FALSE : affichage fenetre Xwindow
540 197 equemene
541 197 equemene
542 197 equemene
c
543 197 equemene
c TRANSFORMATION DE L'IMAGE DES FLUX : FLUX -> FLUX RELATIFS
544 197 equemene
c
545 197 equemene
546 197 equemene
c
547 197 equemene
c DETERMINATION DU DECALAGE SPECTRAL MAXIMUM ET DU FLUX MAXIMUM
548 197 equemene
c
549 197 equemene
550 197 equemene
      fmx=0.
551 197 equemene
      zmx=0.
552 197 equemene
      DO i=1,dim
553 197 equemene
         DO j=1,dim
554 197 equemene
            IF (fmx.LT.fp(i,j)) fmx=fp(i,j)
555 197 equemene
            IF (zmx.LT.zp(i,j)) zmx=zp(i,j)
556 197 equemene
         END DO
557 197 equemene
      END DO
558 197 equemene
559 205 equemene
      write(*,*) 'Flux max :',fmx
560 205 equemene
      write(*,*) 'Z max :',zmx
561 205 equemene
562 205 equemene
563 197 equemene
      DATA tr/0.,1.,0.,0.,0.,1./
564 197 equemene
565 197 equemene
c
566 197 equemene
c AFFICHAGE DE L'IMAGE DES DECALAGES SPECTRAUX
567 197 equemene
c
568 197 equemene
569 197 equemene
      if (ps .EQV. .TRUE.) THEN
570 205 equemene
         CALL PGBEGIN (0,'z.ps/ps',1,1)
571 197 equemene
      ELSE
572 197 equemene
         CALL PGBEGIN (0,'/xwindow',1,1)
573 197 equemene
      END IF
574 197 equemene
      CALL PGENV (1.,dim/1.,1.,dim/1.,1,-1)
575 197 equemene
      CALL PGLABEL('Image des decalages spectraux','',
576 197 equemene
     &'DISQUE D''ACCRETION AUTOUR D''UN TROU NOIR')
577 197 equemene
      IF (tg .EQV. .TRUE.) THEN
578 197 equemene
         DO i=0,25
579 197 equemene
            DO j=0,25
580 197 equemene
               zp(i+25,j+25)=1.
581 197 equemene
            END DO
582 197 equemene
         END DO
583 197 equemene
         CALL PGGRAY(zp,dim,dim,2,dim-1,2,dim-1,zmx,0.,tr)
584 197 equemene
      ELSE
585 197 equemene
         DO i=1,20
586 197 equemene
            c(i)=0.2*(i-1)
587 197 equemene
         END DO
588 205 equemene
         CALL PGCONS(zp,dim,dim,1,dim,1,dim,c,20,tr)
589 197 equemene
      END IF
590 197 equemene
      CALL PGEND
591 197 equemene
592 197 equemene
c
593 197 equemene
c AFFICHAGE DE L'IMAGE DES FLUX
594 197 equemene
c
595 197 equemene
596 197 equemene
      if (ps .EQV. .TRUE.) THEN
597 205 equemene
         CALL PGBEGIN (0,'flux.ps/ps',1,1)
598 197 equemene
      ELSE
599 197 equemene
         CALL PGBEGIN (0,'/xwindow',1,1)
600 197 equemene
      END IF
601 197 equemene
      CALL PGENV(1.,dim/1.,1.,dim/1.,1,-1)
602 197 equemene
      CALL PGLABEL(' Image des flux','',
603 197 equemene
     &'DISQUE D''ACCRETION AUTOUR D''UN TROU NOIR')
604 197 equemene
      if (tg) THEN
605 197 equemene
         DO i=0,25
606 197 equemene
            DO j=0,25
607 197 equemene
               fp(i+25,j+25)=1.
608 197 equemene
            END DO
609 197 equemene
         END DO
610 197 equemene
         CALL PGGRAY(fp,dim,dim,2,dim-1,2,dim-1,fmx,0.,tr)
611 197 equemene
      ELSE
612 197 equemene
         DO i=1,8
613 197 equemene
            c(i)=0.0625*2.**(i-1)
614 197 equemene
         END DO
615 197 equemene
         CALL PGCONS(fp,dim,dim,1,dim,1,dim,c,8,tr)
616 197 equemene
      END IF
617 197 equemene
      CALL PGEND
618 197 equemene
619 197 equemene
      END
620 197 equemene
c compilation :
621 197 equemene
c gfortran --std=gnu -o trou_noir_Fortran trou_noir.f -lpgplot
622 197 equemene
c SORTIE GRAPHIQUE : -> Envoi sur l'ecran : /xwindow
623 197 equemene
c ( dans PGBEGIN ) -> Envoi en format postscript : nom image.ps/ps
624 197 equemene
625 197 equemene
626 197 equemene
627 197 equemene