program prog06 c c Kepler Motion in the x and y coordinate system c by using the improved Euler method c subroutines: c onestep(x,y,vx,vy,dt) c force(x,y,fx,fy) c engang(x,y,vx,vy,eng,ang) c implicit real*8 (a-h,o-z) c c Default Parameters n = 2000 ti = 0.0d0 tf = 50.0d0 dt = (tf-ti)/n xi = 4.0d0 yi = 0.0d0 vxi = 0.0d0 vyi = 0.4d0 c Initial Condition t = ti x = xi y = yi vx = vxi vy = vyi c call engang(x,y,vx,vy,eng,ang) write(*,800) x,y,t,eng,ang do i = 1,n call onestep(x,y,vx,vy,dt) t = t + dt call engang(x,y,vx,vy,eng,ang) write(*,800) x,y,t,eng,ang end do c 800 format(5(1x,f15.7)) end c ********************************************************************** subroutine onestep(x,y,vx,vy,dt) c ********************************************************************** implicit real*8 (a-h,o-z) c c Force at x,y call force(x,y,fx,fy) c Trial Propagation and Force at x,y x1 = x + vx*dt y1 = y + vy*dt vx1 = vx + fx*dt vy1 = vy + fy*dt call force(x1,y1,fx1,fy1) c Calculate the shifts of x,y,vx,vy in Improved Euler method dx = (vx + vx1)*dt/2 ! Improved Euler dy = (vy + vy1)*dt/2 ! Improved Euler dvx = (fx + fx1)*dt/2 ! Improved Euler dvy = (fy + fy1)*dt/2 ! Improved Euler c Real Propagation in Improved Euler method x = x + dx y = y + dy vx = vx + dvx vy = vy + dvy c end c ********************************************************************** subroutine force(x,y,fx,fy) c ********************************************************************** implicit real*8 (a-h,o-z) c r = sqrt(x*x+y*y) fx = -x/r/r/r fy = -y/r/r/r c end c ********************************************************************** subroutine engang(x,y,vx,vy,eng,ang) c ********************************************************************** implicit real*8 (a-h,o-z) eng=(vx*vx+vy*vy)/2-1.0d0/sqrt(x**2+y**2) ang=x*vy-y*vx end