Program blackhole
Implicit None
Real*8 EPS_BH,EPS_TURN
//各変数、定数の設定
Real*8 fugo,dr,xold,x,y
Real*8 t,x0,x1,x2,h,b,t0,tf
Parameter(t0=0.0D0,tf=10.0D0)
EPS_BH =0.00001D0
EPS_TURN=0.0000001D0
fugo=-1.0D0
b=8.5D0
x0=10.0D0
xold=x0
x1=x0
x2=dasin(b/x0)
do t=t0,tf,h
Do while((x1 .le. x0) .and. (x1 .ge. (1.0D0+EPS_BH)))
//x1がx0以下、ある数値以上の場合のみ、計算する
h=0.1D0*sqrt((x1**3-(x1-1.0D0)*(b**2))/(x1**3))
//ある数値以下になった場合、ブラックホールに落ちたとみなす
Call rk4(t,x1,x2,h,fugo,b) //下のサブルーチンを呼び出す
dr=x1-xold
if(abs(dr).lt.EPS_TURN) fugo=1.0D0
xold=x1
x=x1*cos(x2)
y=x1*sin(x2)
Write(*,*) x1,x2,fugo
end do
end do
End
Subroutine rk4(t,x1,x2,h,fugo,b)
Implicit None
real*8 t,x1,x2,h,fugo,b
real*8 k1,k2,k3,k4
real*8 l1,l2,l3,l4
real*8 diff_eq1,diff_eq2
k1=diff_eq1(t,x1,x2,fugo,b) //ルンゲ・クッタ法
l1=diff_eq2(t,x1,x2,b)
k2=diff_eq1(t+0.5D0*h,x1+0.5D0*h*k1,x2+0.5D0*h*l1,fugo,b)
l2=diff_eq2(t+0.5D0*h,x1+0.5D0*h*k1,x2+0.5D0*h*l1,b)
k3=diff_eq1(t+0.5D0*h,x1+0.5D0*h*k2,x2+0.5D0*h*l2,fugo,b)
l3=diff_eq2(t+0.5D0*h,x1+0.5D0*h*k2,x2+0.5D0*h*l2,b)
k4=diff_eq1(t+h,x1+h*k3,x2+h*l3,fugo,b)
l4=diff_eq2(t+h,x1+h*k3,x2+h*l3,b)
x1 = x1+(1/6.D0)*h*(k1+2.0D0*k2+2.0D0*k3+k4)
x2 = x2+(1/6.D0)*h*(l1+2.0D0*l2+2.0D0*l3+l4)
Return
End
Real*8 function diff_eq1(t,x1,x2,fugo,b)
Implicit None
real*8 t,x1,x2,fugo
real*8 b
diff_eq1=fugo*(1.0D0-(1.0D0/x1))* //微分方程式1
&sqrt(1.0D0-(b**2/x1**2)+(b**2/x1**3))
return
end
Real*8 Function diff_eq2(t,x1,x2,b)
Implicit none
real*8 t,x1,x2
real*8 b
diff_eq2=(1.0D0-(1.0D0/x1))*(b/(x1**2)) //微分方程式2
Return
end