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