PROGRAM CABZ ! Copyright 2007 Matthew Norton ! ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License, or ! (at your option) any later version. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ! ! NOTE: This is in FORTRAN 90 and you will need a FORTRAN 90 complier to run this code ! ------------------------------------------------------------------------------------ ! ! This program tries to model the B-Z reaction in chemistry using cellular automata ! ! ------------------------------------------------------------------------------------ IMPLICIT NONE INTEGER, PARAMETER :: Nx = 640, Ny = 480, Kappa = 8, R = 4, Theta = 6, NumInts = 100 INTEGER :: I, J, T, ErrorStat, Unit = 9 REAL*8 :: X, Y INTEGER, DIMENSION(Nx,Ny) :: CA = 0, CaUpdate = 0 INTEGER, DIMENSION(8) :: Now OPEN(UNIT = 9, File = "CABZ0.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 10, File = "CABZ1.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 15, File = "CABZ2.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 20, File = "CABZ3.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 25, File = "CABZ4.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 30, File = "CABZ5.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 35, File = "CABZ6.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 40, File = "CABZ7.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 45, File = "CABZ8.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 50, File = "CABZ9.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 55, File = "CABZ10.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 60, File = "CABZ11.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 65, File = "CABZ12.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 70, File = "CABZ13.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 75, File = "CABZ14.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 80, File = "CABZ15.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 85, File = "CABZ16.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 90, File = "CABZ17.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 95, File = "CABZ18.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 100, File = "CABZ19.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" OPEN(UNIT = 105, File = "CABZ20.txt", STATUS = "UNKNOWN", IOSTAT = ErrorStat) IF (ErrorStat /= 0) STOP "*** ERROR IN OPENING FILE ***" CALL Date_and_Time(values = Now) CALL Random_Seed(put = Now) DO J = 1, Ny DO I = 1, Nx DO CALL Random_Number(x) X = X * Kappa CA(I,J) = NINT(x) IF (CA(I,J) == 0) THEN CYCLE ELSE EXIT END IF END DO WRITE(Unit,'(1X, I1)', ADVANCE = 'no') CA(I,J) END DO WRITE(Unit,*) END DO Unit = Unit + 1 DO T = 1, NumInts DO I = 1, Nx DO J = 1, Ny IF (CA(I,J) < Kappa) THEN CaUpdate(I,J) = 1 ELSE CALL EqualKappaUpdate(I, J) END IF END DO END DO DO J = 1, Ny DO I = 1, Nx ! PRINT *, "CA(",I,",",J,") = ", Ca(I,J), "will be updated by", CaUpdate(I,J), "to be", CA(I,J) + CaUpdate(I,J) CA(I,J) = CA(I,J) + CaUpdate(I,J) ! CA(J,I) = CA(J,I) + CaUpdate(J,I) IF (MOD(T,5) == 0) THEN WRITE(Unit,'(1X, I1)', ADVANCE = 'no') CA(I,J) END IF END DO IF (MOD(T,5) == 0) THEN WRITE(Unit,*) ! PRINT *, T, UNIT END IF END DO IF (MOD(T,5) == 0) THEN Unit = Unit + 5 END IF END DO ! ------------------------------------------------------------------------------- CONTAINS ! ------------------------------------------------------------------------------- SUBROUTINE EqualKappaUpdate(InX, InY) INTEGER :: I, J, Count = 0, Ti, Tj, TiE, TjE INTEGER, INTENT(IN) :: InX, InY DO I = -R, R IF (I == 0) CYCLE ! PRINT *, "I= ", I DO J = -R, R IF (J == 0) CYCLE ! PRINT *, "J= ", J Ti = InX + I Tj = InY + J TiE = Ti TjE = Tj ! IF (TiE < 1 .OR. TiE > Nx .OR. TjE < 1 .OR. TjE > Ny) THEN ! WRITE(*,'(2(1X, A2, 1X, I2), " || ")', ADVANCE = 'NO') "Ti", Ti, "Tj", Tj ! END IF IF (Ti < 1) THEN Ti = Nx + Ti END IF IF (Ti > Nx) THEN Ti = Ti - Nx END IF IF (Tj < 1) THEN Tj = Ny + Tj END IF IF (Tj > Ny) THEN Tj = Tj - Ny END IF ! IF (TiE < 1 .OR. TiE > Nx .OR. TjE < 1 .OR. TjE > Ny) THEN ! PRINT *, "Ti N", Ti, "Tj N", Tj, "InX N", InX, "InY N", InY ! END IF IF (CA(Ti,Tj) == 1) THEN Count = Count + 1 END IF END DO END DO IF (Count < Theta) THEN CaUpdate(InX, InY) = 0 ELSE CaUpdate(InX, InY) = -1 * Kappa + 1 END IF END SUBROUTINE END PROGRAM