program Photon Trajectory around Kerr Black Hole

ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c        astrophysics laboratory                          c
c        Wataru Yoshida                                   c
c                                 2001/2/16               c
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

      real    h
      real*8  r,v,t
      real*8  x,y,Q,P,b,vx,vy,vv
      real*8  E,L,M,a,dP,c,d,w
      real*8  k,k1,k2,k3,k4
      real*8  j,j1,j2,j3,j4
      real*8  g,g1,g2,f3,g4
      integer i

   
      c(M,r,a)=(r**4+r**2*a**2+2.0*M*r*a**2)
      d(M,r,a)=(r**2-2.0*M*r+a**2)

c     r方向の常微分方程式
      w(M,r,a,L,E)=(0.5)*
     x      ((((-2.0*r*a**2-6.0*M*a**2)/r**4)*E**2)+
     x      ((12.0*M*a*L*E)/r**4)+
     x      (((2.0*r-6.0*M)/r**4)*L**2))

c     θ方向の常微分方程式
      dP(M,r,a,L,E)=(2.0*M*r*a*E+(r**2-2.0*M*r)*L)/
     x      (r**2*(r**2-2.0*M*r+a**2))

      open(10,file='t-r.txt',status='unknown')
      open(20,file='t-P.txt',status='unknown')
      open(30,file='x-y.txt',status='unknown')
      open(40,file='jisyou.txt',status='unknown')
      open(50,file='ergo.txt',status='unknown')

c     初期値の入力
      write(*,*) 'input first value!'
      write(*,*) 'M:mass of B.H.'
      write(*,*) 'M='
      read(*,*)  M
      write(*,*) 'x,y:first position'
      write(*,*) 'x='
      read(*,*) x
      write(*,*) 'y='
      read(*,*) y
      write(*,*) 'a:rotary parameter (-1<a<1)'
      write(*,*) 'a='
      read(*,*) a
      write(*,*) 'Q:discharge direction '
      write(*,*) 'Q='
      read(*,*) Q

      h=0.001
      t=0

      vx=cos(3.1415*Q/180.0)
      vy=sin(3.1415*Q/180.0)
      a=a*M
      b=y
      r=x**2+y**2
      P=asin(b/r)
      v=vx*cos(P)+vy*sin(P)
      vv=(-vx*sin(P)+vy*cos(P))/r
      E=(r**2*d(M,r,a)*vv)/
     x  (b*(r**2-2.0*M*r)+2.0*M*r*a)
      L=E*b

      write(10,100) t,r
      write(20,100) t,P
      write(30,100) x,y

c     ルンゲクッタ
      do i=1,1000000

         k1=h*v
         j1=h*w(M,r,a,L,E)
         g1=h*dP(M,r,a,L,E)

         k2=h*(v+j1/2.0)
         j2=h*w(M,r+k1/2.0,a,L,E)
         g2=h*dP(M,r+k1/2.0,a,L,E)

         k3=h*(v+j2/2.0)
         j3=h*w(M,r+k2/2.0,a,L,E)
         g3=h*dP(M,r+k2/2.0,a,L,E)

         k4=h*(v+j3)
         j4=h*w(M,r+k3,a,L,E)
         g4=h*dP(M,r+k3,a,L,E)
     
         k=(k1+2.0*k2+2.0*k3+k4)/6
         j=(j1+2.0*j2+2.0*j3+j4)/6
         g=(g1+2.0*g2+2.0*g3+g4)/6

         t=t+h
         r=r+k
         v=v+j

         P=P+g

         x=r*cos(P)
         y=r*sin(P)

         write(10,100) t,r
         write(20,100) t,P
         write(30,100) x,y

         if (r .lt. 2*M) then
           go to 10

         end if

         if (r .lt. M+(M**2-a**2)**0.5) then
           go to 50

         end if

      end do

c     エルゴ球内のルンゲクッタ
 10   h=0.0001

      do i=1,20000

         k1=h*v
         j1=h*w(M,r,a,L,E)
         g1=h*dP(M,r,a,L,E)

         k2=h*(v+j1/2.0)
         j2=h*w(M,r+k1/2.0,a,L,E)
         g2=h*dP(M,r+k1/2.0,a,L,E)

         k3=h*(v+j2/2.0)
         j3=h*w(M,r+k2/2.0,a,L,E)
         g3=h*dP(M,r+k2/2.0,a,L,E)

         k4=h*(v+j3)
         j4=h*w(M,r+k3,a,L,E)
         g4=h*dP(M,r+k3,a,L,E)
     
         k=(k1+2.0*k2+2.0*k3+k4)/6
         j=(j1+2.0*j2+2.0*j3+j4)/6
         g=(g1+2.0*g2+2.0*g3+g4)/6

         t=t+h
         r=r+k
         v=v+j

         P=P+g

         x=r*cos(P)
         y=r*sin(P)

         write(10,100) t,r
         write(20,100) t,P
         write(30,100) x,y

         if ((x**2+y**2)**0.5 .lt. M+(M**2-a**2)**0.5) then
           go to 50

         end if

      end do

c     事象の地平面
 50   r=M+(M**2-a**2)**0.5
      x=r
      y=0
     
      write(40,100) x,y

      h=5
  
      do i=1,72
         x=r*cos(3.14*h/180)
         y=r*sin(3.14*h/180)

         write(40,100) x,y

         h=h+5
      end do

c     エルゴ球
      r=2*M
      x=r
      y=0

      write(50,100) x,y

      h=5

      do i=1,72
         x=r*cos(3.14*h/180)
         y=r*sin(3.14*h/180)

         write(50,100) x,y

         h=h+5
      end do
     
 100  format(f8.2,2x,f14.4)

      close(10)
      close(20)
      close(30)
      close(40)
      close(50)

      end


玄関へ