program ising
integer, parameter :: n = 8
character (len=2), parameter :: anx=' X', ano=' O', anp=' +',anm=' -',dsp=' '
integer :: i,j,k,l,delt,up,dn,lf,rt, un, rsd
integer, allocatable :: seed(:)
integer, dimension(n,n) :: s, ju, jl, sn
real, dimension(n,n) :: ss, si, id
id = 1
call random_seed(size=rsd)
allocate(seed(rsd))
open(newunit=un, file="/dev/urandom", access="stream",form="unformatted", action="read", status="old",iostat=istat)
read(un) seed
close(un)
call random_seed(put=seed)
call random_number(ss)
si = sign(id,ss - 0.5)
s = int(si)
call random_number(ss)
si = sign(id,ss - 0.5)
ju = int(si)
call random_number(ss)
si = sign(id,ss - 0.5)
jl = int(si)
sn = s
do 20 k=1,n
do 10 l=1,n
if (k-1 < 1) then
up = s(n,l)*ju(k,l)
else
up = s(k-1,l)*ju(k,l)
end if
if (k+1 > n) then
dn = s(1,l)*ju(1,l)
else
dn = s(k+1,l)*ju(k+1,l)
end if
if (l-1 < 1) then
lf = s(k,n)*jl(k,l)
else
lf = s(k,l-1)*jl(k,l)
end if
if (l+1 > n) then
rt = s(k,1)*jl(k,1)
else
rt = s(k,l+1)*jl(k,l+1)
end if
delt = up + dn + lf +rt
if (delt > 0) then
sn(k,l) = 1
else if (delt < 0) then
sn(k,l) = -1
else
sn(k,l) = s(k,l)
end if
10 continue
20 continue
do i = 1,n
print *, (pnm(jl(i,j))//xno(s(i,j)), j=1,n)
print *, (dsp//pnm(ju(i,j)), j=1,n)
end do
print *, 'function first H= ', hamiltonian(s,ju,jl)
do i = 1,n
print *, (pnm(jl(i,j))//xno(sn(i,j)), j=1,n)
print *, (dsp//pnm(ju(i,j)), j=1,n)
end do
print *, 'function new H= ', hamiltonian(sn,ju,jl)
contains
integer function hamiltonian(hs,hu,hl)
implicit none
integer, dimension(n,n), intent(in) :: hs,hu,hl
integer :: p,q, hh
hh = 0
do 120 p=1,n
do 110 q=1,n
if (p==1) then
hh = hh - hs(n,q)*hu(p,q)*hs(p,q)
else
hh = hh - hs(p-1,q)*hu(p,q)*hs(p,q)
end if
110 continue
120 continue
do 140 p=1,n
do 130 q=1,n
if (q==1) then
hh = hh - hs(p,n)*hl(p,q)*hs(p,q)
else
hh = hh - hs(p,q-1)*hl(p,q)*hs(p,q)
end if
130 continue
140 continue
hamiltonian = hh
end function hamiltonian
character (len=2) function xno(a)
implicit none
integer, intent(in) :: a
character (len=2) :: xnov
if (a == 1) then
xnov = ano
else
xnov = anx
end if
xno = xnov
end function xno
character (len=2) function pnm(a)
implicit none
integer, intent(in) :: a
character (len=2) :: pnmv
if (a == 1) then
pnmv = anp
else
pnmv = anm
end if
pnm = pnmv
end function pnm
end program