Computational Physics - Department of Physics

(Axel Boer) #1

13.8 The Potts’ model 451


13.8 The Potts’ model


The Potts model has been, in addition to the Ising model, widely used in studies of phase
transitions in statistical physics. The so-called two-dimensionalq-state Potts model has an
energy given by


E=−J

N

<kl>

δsl,sk,

where the spinsk at lattice positionkcan take the values 1 , 2 ,...,q. The Kronecker delta
functionδsl,skequals unity if the spins are equal and is zero otherwise. ThevariableNis the
total number of spins.
Forq= 2 the Potts model corresponds to the Ising model. To see that wecan rewrite the
last equation as


E=−

J

2

N

<kl>

2 (δsl,sk−

1

2

)−

N

<kl>

J

2

.

Now, 2 (δsl,sk−^12 )is +1 whensl=skand− 1 when they are different. This model is thus equiv-
alent to the Ising model except a trivial difference in the energy minimum given by a an
additional constant and a factorJ→J/ 2. One of the many applications of the Potts model is
to helium absorbed on the surface of graphite.
For references on the Potts Models see Refs. [89–92]
Compared with the two-dimensional Ising model, the Potts model can take only four possi-
ble values for∆E, as shown in the following part of code


voidEnergy(doubleT,double Boltzmann){
Boltzmann[0] = exp(-J/T) ;
Boltzmann[1] = exp(-2
J/T);
Boltzmann[2] = exp(-3J/T);
Boltzmann[3] = exp(-4
J/T);
}//Energy


However, when we run the Potts model we must choose the new value ofqrandomly. The
following functions encodes the Metropolis algorithm for the Potts model.


voidMetropolis(intq,double*Boltzmann,int**Spin,long& seed,double& E){


intSpinFlip, LocalEnergy0, LocalEnergy, x, y, dE;
for(inti = 0; i < N; i++){
for(intj = 0; j < N; j++){
x = (int) (ran1(&seed)*N);
y = (int) (ran1(&seed)*N);
LocalEnergy0 = 0;
LocalEnergy = 0;
dE = 0;
if(Spin[x][y] == Spin[x][periodic(y,N,-1)])
LocalEnergy0 --;
if(Spin[x][y] == Spin[periodic(x,N,-1)][y])
LocalEnergy0 --;
if(Spin[x][y] == Spin[x][periodic(y,N,1)])
LocalEnergy0 --;
if(Spin[x][y] == Spin[periodic(x,N,1)][y])
LocalEnergy0 --;
do{
SpinFlip = (int)(ran1(&seed)*(q)+1);
}while(SpinFlip == Spin[x][y]);
if(SpinFlip == Spin[x][periodic(y,N,-1)])
Free download pdf