fortran66のブログ

fortran について書きます。

Intel Visual Fortran 用の OpenGL モジュールを用いてロジスティック方程式によるカオス図形を描きます。
DEC/Compaq Visual Fortran でも実行可能だと思います。

支那の王朝末期には、飢饉・戦乱で人口が大きく減るようですが、歴代支那の人口をプロットすると、野生動物に見られるようなロジスティック方程式に従う人口変動が見られるかもしれません。

なお WinMain 関数を実行ルーチンに用いているので、リンカーの Subsystem を WinMain にする必要があります。

MODULE mod_draw
USE dfopngl
CONTAINS
 INTEGER (KIND=4) FUNCTION drawit()
 IMPLICIT NONE
 INTEGER :: i, j
 REAL (KIND = 4) :: point
 CALL fglClearColor(0.0, 0.0, 0.0, 0.0)
 CALL fglClear(GL_COLOR_BUFFER_BIT)
 point = 1.0
 CALL fglPointSize(point) 
 CALL fglColor3f(1.0, 1.0, 0.0)
 DO i = 0, 500
  CALL fglBegin(GL_POINTS)
  CALL chaos(i)
  CALL fglEnd
 END DO
 CALL fglFlush
 drawit = 0 ! to suppress warning
 END FUNCTION drawit
!----------------------------------------------------------------
 SUBROUTINE chaos(ix) 
 IMPLICIT NONE
 INTEGER, INTENT(IN) :: ix
 REAL (KIND = 8), PARAMETER :: rmin = 1.5d0, rmax = 3.0d0, pmin = 0.0d0, pmax = 1.5d0 
 INTEGER :: i
 REAL (KIND = 8) :: p, r, x, y
 x = REAL(ix, KIND = 8)
 r = (rmax - rmin) * x / 500.0d0 + rmin! windowsize = 500
 p = 0.3d0
 DO i = 1, 50
  p = p + r * p * (1.0d0 - p)
 END DO
 DO i = 51, 100
  IF (p > pmin .AND. p < pmax) THEN
   y = ( p - pmin ) * 500.0d0 / ( pmax - pmin )
   CALL fglVertex2f(REAL(x, KIND = 4), REAL(y, KIND = 4))
  END IF
  p = p + r * p * (1.0d0 - p)
 END DO
 RETURN
 END SUBROUTINE chaos 
END MODULE mod_draw
!==============================================================
INTEGER (KIND = 4) FUNCTION WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow )
!DEC$ ATTRIBUTES STDCALL, DECORATE, ALIAS : 'WinMain' :: WinMain
USE dfwin
USE mod_draw
IMPLICIT NONE
INTEGER (KIND = 4) :: hInstance, hPrevInstance,lpszCmdLine, nCmdShow
INTEGER (KIND = 4) :: iret
! OpenGL
CALL fauxInitDisplayMode(IOR(AUX_SINGLE, AUX_RGBA))
CALL fauxInitPosition(0, 0, 500, 500)
iret = fauxInitWindow("OpenGL DEC FORTRAN Chaos"C)
CALL fauxMainLoop(loc(drawit))
WinMain = 0
RETURN
END FUNCTION WinMain