program ising
implicit none
real ,allocatable :: is(:,:)
integer, allocatable::km(:),kp(:)
real::de,r,ei,p,M,t,e,cv,e1,e2,a,b,Mtotabs,Mtotsq,khi
integer::i,j,n,itmax,it,k
!write(*,*) "input n"
read(*,*) n
allocate(is(n,n))
allocate(km(n))
allocate(kp(n))
!basse température
itmax=1000
!conditions aux limites périodiques
do i=1,n-1
kp(i)= i+1
end do
do i=2,n
km(i)= i-1
end do
kp(n)=1
km(1)=n
!le remplissage de la matrice
do i=1,n
do j=1,n
is(i,j)=1
end do
end do
!l'affichage de la matrice
!do i=1,n
!write (*,*) (is(i,j) ,j=1,n)
!end do
!étude systématique
do k=50,0,-1
t= k*0.1
!n=64
Mtotabs=0.
Mtotsq=0.
e1=0.
e2=0.
do it=1,itmax
do i=1,n
do j=1,n
ei=-1*is(i,j)*(is(kp(i),j)+is(km(i),j)+is(i,kp(j))+is(i,km(j)))
de=-2*ei
!le test sur delta e
if (de<=0 ) then
is(i,j)=-1*is(i,j)
end if
if (de>0 ) then
p=exp(-de/t)
r=rand()
if (p>r) then
is(i,j)= -1*is(i,j)
else
is(i,j)= is(i,j)
end if
end if
end do
end do
!do i=1,n
!write (*,*) (is(i,j) ,j=1,n)
!end do
!calcul de l'aimentation
M=0.
do i=1,n
do j=1,n
M=M+is(i,j)
end do
enddo
!fin des visites mc
!parmètre d'ordre de la dernière visite
!M= abs(M)
! calcul de l'energie
!e=0.
e=0.
do i= 1,n
do j=1,n
ei=-1*is(i,j)*(is(kp(i),j)+is(km(i),j)+is(i,kp(j))+is(i,km(j)))
e=e+ei
end do
end do
e=e/2
e1=e1+e
e2=e2+e**2
Mtotabs=Mtotabs+abs(M)
Mtotsq=Mtotsq+M*M
enddo
Mtotabs= Mtotabs/itmax
Mtotsq=Mtotsq/itmax
M=M/(n*n)
cv= (e2/itmax-e1*e1/(itmax*itmax))/(t*t)
khi=(Mtotsq/itmax-Mtotabs*Mtotabs/(itmax*itmax))/(t*t)
!write(*,*) t,M,e,cv
write(*,*) t,khi
!write(*,*) t,Mtotabs,(Mtotsq-Mtotabs)/t
end do ! temp
end