C----------------------------------------------------------------------C
C C
C Parallel Metropolis algorithm for 2-dimensional Ising model. C
C CMFortran version. C
C----------------------------------------------------------------------C
SUBROUTINE metupdate( black, spin )
LOGICAL black(,)
INTEGER spin(,) new_spin(,)
INTEGER newE(,), oldE(,), deltaE(,)
INTEGER checkerboard
REAL rand(,)
C
C Generate random numbers
C
CALL RANDOM(rand)
C
C New trial spin (= - old spin)
C
new_spin = -spin
C
C Red/black checkerboard update
C
DO checkerboard = 1,2
C
C Calculate old and new energy (new energy = - old energy)
C by summing over neighboring spins.
C
WHERE (black)
oldE = - spin * ( CSHIFT(spin,1,1) + CSHIFT(spin,1,-1) +
& CSHIFT(spin,2,1) + CSHIFT(spin,2,-1) )
newE = -oldE
deltaE = newE - oldE
END WHERE
C
C Metropolis accept/reject
C
WHERE (black.AND.((deltaE.LE.0).OR.(EXP(-beta*deltaE).GT.rand)))
spin = new_spin
END WHERE
C
C Change from black to red sites in checkerboard update
C
black = .NOT.black
END DO
RETURN
END