! Red-black update for Poisson's equation
! =======================================

USE gnuplot   ! prepare for plotting
INTEGER nx,ny   ! declare two INTEGER variables
ASK nx,ny   ! ask array dimensions from the console user
ARRAY(1..nx,1..ny) OF REAL var,rhs   ! variable ARRAY dimensions are allowed

var=0; rhs=0
DO var(i,HI)=1 FOR ALL i   ! assign some boundary condition

LOOP FOR 100 TIMES   ! main iteration loop
  LOOP FOR parity=0 TO 1 AND i=LO+1 TO HI-1 AND j=LO+1 +
    (i+LO+1+parity) MOD 2 TO HI-1 BY 2
    ! this traverses the array in checkerboard fashion
    var(i,j)=[var(i,j+1)+var(i,j-1)+var(i+1,j)+var(i-1,j)+rhs(i,j)]/4
    ! this statement is unchanged from Gauss-Seidel
  REPEAT LOOP
REPEAT   ! "LOOP" is optional here
  
SPLOT var
READ ! keep plot displayed until Enter is pressed

!(
  Variables are allowed as ARRAY dimensions. The bounds OF LOOP indices are
  automatically extracted from arrays the indices are used in, AND made
  available through the predefined LO AND HI variables.
!)