root / TrouNoir / trou_noir.f @ 223
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 |