Cluster ising.py
From Werner KRAUTH
(Difference between revisions)
| Revision as of 22:38, 4 March 2024 Werner (Talk | contribs) ← Previous diff |
Current revision Werner (Talk | contribs) |
||
| Line 1: | Line 1: | ||
| - | This page presents the Python3 program cluster_ising.py, the Wolff cluster algorithm for the Ising model on an LxL square lattice in two dimensions | + | This page presents the Python3 program cluster_ising.py, the Wolff cluster algorithm for the Ising model. |
| __FORCETOC__ | __FORCETOC__ | ||
| =Description= | =Description= | ||
| + | The algorithm is more general: it can be used for the Ising and XY models on lattices of arbitrary shapes in any dimensions, and there are versions for particle systems. Our example code however specializes for an LxL periodic square lattice in two dimensions that is initialized with random spins, and then is updated nsteps times. | ||
| =Program= | =Program= | ||
Current revision
This page presents the Python3 program cluster_ising.py, the Wolff cluster algorithm for the Ising model.
Contents |
[edit]
Description
The algorithm is more general: it can be used for the Ising and XY models on lattices of arbitrary shapes in any dimensions, and there are versions for particle systems. Our example code however specializes for an LxL periodic square lattice in two dimensions that is initialized with random spins, and then is updated nsteps times.
[edit]
Program
import random, math
L = 100
N = L * L
nbr = {i : ((i // L) * L + (i + 1) % L, (i + L) % N,
(i // L) * L + (i - 1) % L, (i - L) % N)
for i in range(N)}
T = 2.5
p = 1.0 - math.exp(-2.0 / T)
nsteps = 10000
S = [random.choice([1, -1]) for k in range(N)]
for step in range(nsteps):
k = random.randint(0, N - 1)
Pocket, Cluster = [k], [k]
while Pocket != []:
j = random.choice(Pocket)
for l in nbr[j]:
if S[l] == S[j] and l not in Cluster \
and random.uniform(0.0, 1.0) < p:
Pocket.append(l)
Cluster.append(l)
Pocket.remove(j)
for j in Cluster:
S[j] *= -1
[edit]
Version
See history for version information.
