PROGRAM shot DIMENSION r(2),v(2),a(2) CALL init(t,r,v,a,dt,ncalc,g,c) CALL prtout(t,r,v,a,0) CALL euler(t,r,v,a,0.0,1,g,c) CALL prtout(t,r,v,a,1) DO 10 i = 1,100 CALL euler(t,r,v,a,dt,ncalc,g,c) CALL prtout(t,r,v,a,1) IF(r(2) .LE. 0.0) GOTO 999 10 CONTINUE 999 END C SUBROUTINE init(t,r,v,a,dt,ncalc,g,c) DIMENSION r(2),v(2),a(2) g = 9.81 t = 0 prper = 0.2 dt = 0.001 * WRITE(*,*) 'プリントの間隔(s), 時間の刻み巾(s) = ' * READ(*,*) prper,dt ncalc = prper/dt + 0.5 height = 10 v0 = 20 th = 40 * WRITE(*,*) '初期条件: 高さ(m), 速さ(m/s), 角度(degree) = ' * READ(*,*) height,v0,th th = th/180*3.141592 WRITE(*,*) '空気抵抗の係数 (1/m) = ' READ(*,*) c v(1) = v0*cos(th) v(2) = v0*sin(th) r(1) = 0 r(2) = height END C SUBROUTINE prtout(t,r,v,a,n) DIMENSION r(2),v(2),a(2) IF(n.EQ.0) THEN WRITE(*,'(/2(1X,2A/))') + ' t x y v a ', + ' vx vy ax ay ', + ' (s) (m) (m) (m/s) (m/s^2)', + ' (m/s) (m/s) (m/s^2) (m/s^2)' ELSE va = sqrt(v(1)**2+v(2)**2) aa = sqrt(a(1)**2+a(2)**2) WRITE(*,'(1X,F5.2,8F8.2)') t,r,va,aa,v,a ENDIF END C SUBROUTINE euler(t,r,v,a,dt,ncalc,g,c) DIMENSION r(2),v(2),a(2) DO 10 i = 1, ncalc r(1) = r(1) + v(1)*dt r(2) = r(2) + v(2)*dt vv = sqrt(v(1)**2 + v(2)**2) a(1) = - c*vv*v(1) a(2) = - g -c*vv*v(2) v(1) = v(1) + a(1)*dt v(2) = v(2) + a(2)*dt t = t + dt IF(r(2) .LE. 0.0) RETURN 10 CONTINUE END