md2r/dt2 = kqZe2r/r3・・・(1) |
d2R/dT2 = q(kZe2t20/mr30) R/R3・・・(2) |
dVx/dT = qX/R3 ・・・(3) dX / dT = VX ・・・(4) dVy/dT = qY/R3 ・・・(5) dY / dT = Vy ・・・(6) (ただしR=(X2+Y2)1/2・・・(7)) |
E = V2/2 + q/R ・・・(8) L=| R×V|・・・(9) |
program main implicit none integer(kind=4),parameter:: neq=4 ←解く方程式の数 integer(kind=4),parameter:: nmax=10000 real(kind=8),parameter:: eps=1.0d-10 external ex2 common q ←共通のqを用いる real(kind=8),dimension(neq):: y0,yn real(kind=8) x0,xn,dx real(kind=8) x_0,y_0,r0 ←新たな変数の定義 real(kind=8) q,v0,r,E0,E,L0,L ←新たな変数の定義 real(kind=8),dimension(neq,12):: work integer(kind=4) ierr,i,n character(len=12) fname write(*,'(a,$)') ' q,v0 ? ' read(*,*) q,v0 ←電荷、初速度を入力 write(*,'(a,$)') ' x0,y0 ? ' read(*,*) x_0,y_0 ←初期座標を入力 write(*,'(a,$)') 'file name ?' read(*,*) fname ←データを書き込むファイル名を入力 open(10,file=fname) n=0 x0=0.0d0 dx=0.01d0 y0(1) = v0 ←時刻0でのVx y0(2) = x_0 ←時刻0でのX y0(3) = 0. ←時刻0でのVy y0(4) = y_0 ←時刻0でのY r0 = sqrt( x_0*x_0 + y_0*y_0 ) ←時刻0でのRを計算(7)式 E0 = 0.5*v0*v0 + q/r0 ←時刻0でのEを計算(8)式 L0 = y_0*v0 ←時刻0でのLを計算(9)式 write(10,'(i5,1x,f7.3,6d23.15)') n,x0,y0(1),y0(2),y0(3),y0(4),0.0,0.0 do n=1,nmax xn=x0+dx call runge(neq,ex2,x0,xn,y0,yn,eps,ierr,work) x0=xn do i=1,neq y0(i)=yn(i) end do r = sqrt( y0(2)*y0(2) + y0(4)*y0(4) ) ←各々の時刻でのRを計算 E = 0.5*( y0(1)*y0(1) + y0(3)*y0(3) ) + q/r ←各々の時刻でのEを計算 L = abs(y0(2)*y0(3) - y0(4)*y0(1)) ←各々の時刻でのLを計算 if (abs(r)>abs(r0))exit ←原子核から最初の距離よりも離れれば計算終了 write(10,'(i5,1x,f7.3,6d23.15)') n,x0,y0(1),y0(2),y0(3),y0(4),abs((E-E0)/E0),abs((L-L0)/L0) ←E,Lは相対誤差を出力 end do close(10) end program main real(kind=8) function ex2(i,x,y) implicit none integer(kind=4),parameter:: neq=4 ←解く方程式の数 integer(kind=4) i common q ←共通のqを用いる real(kind=8) x real(kind=8),dimension(neq):: y real(kind=8) q ←新たな変数の定義 if (i==1) then ex2= q*y(2)/((y(2)*y(2)+y(4)*y(4))*sqrt(y(2)*y(2)+y(4)*y(4))) ←(3)式 else if (i==2) then ex2= y(1) ←(4)式 else if (i==3) then ex2 = q*y(4)/((y(2)*y(2)+y(4)*y(4))*sqrt(y(2)*y(2)+y(4)*y(4))) ←(5)式 else if (i==4) then ex2 = y(3) ←(6)式 else ex2=0.0d0 end if return end function ex2 |