Advertisement
Guest User

Untitled

a guest
Jun 7th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Program stany
  2.     implicit none
  3.     real dr, dU,dr2,dx,dy,dxp,dyp,drp2
  4.     real T,q,rad,drp
  5.     integer d,i,j,k,o,m,licznik,z,licznik2
  6.     integer N,L,Mcs,Rmax
  7.     integer check,time,ale
  8.     parameter (T=0.7,L=35, Mcs=230000,dr=0.01,drp=0.01,q=0.81,rad=0.5,N=L*L*q,Rmax = int(L/2.0 - 1.0),check=30000,time=100,ale=(Rmax/drp))!dr-ruch atomu,drp-szerokosc pierscienia,q-gestosc,rad-radiusczast,Rmax-sprawdzamy dotad pierscien
  9.     real x(0:N),y(0:N),xp(0:N),yp(0:N),ra!ra odleglosc do prawdo
  10.     real*8 ran1,w,r
  11.     real start, finish !time count
  12.     real fun(ale)
  13.     real a,dra
  14.     !----------------------------------------------------
  15.     d=-1
  16.     licznik=0
  17.     licznik2=0
  18.     open(10,file="co.dat")
  19.     open(12,file="prob.dat")
  20.     !------------Polozenia-------------------------------
  21.     do i=1,(Rmax/drp)
  22.         fun(i)=0
  23.     enddo    
  24.     do i=1,N
  25. 100     continue  
  26.         xp(i)=ran1(d)*L
  27. 200     continue  
  28.         yp(i)=ran1(d)*L
  29.         do j=1,N
  30.             if(xp(i).eq.x(j))then
  31.                 goto 100
  32.             endif
  33.             if(yp(i).eq.y(j))then
  34.                 goto 200
  35.             endif
  36.             dy=yp(i)-y(j)
  37.             dx=xp(i)-x(j)
  38.             if(sqrt(dy**2+dx**2).le.rad)then
  39.                 goto 100
  40.             endif
  41.         enddo
  42.     y(i)=yp(i)
  43.     x(i)=xp(i)
  44.     enddo        
  45.     !------------algorytm MC----------------------------
  46.         licznik=0
  47.     do k=1, Mcs
  48.         !call cpu_time(start)
  49.         licznik2=licznik2+1
  50.         write(*,*)licznik2
  51.         do o=1,N
  52.             write(10,*)x(o),y(o)
  53.         enddo
  54.         rewind(10)
  55.         do i=1,N
  56.             dU=0
  57.             r=ran1(d)
  58. 300         continue
  59.             xp(i)=x(i)+(r-0.5)*dr! nowa wartosc
  60. 400         continue
  61.             r=ran1(d)
  62.             yp(i)=y(i)+(r-0.5)*dr
  63.             if(xp(i).gt.L)then!tak, aby nie wyszlo za przedzial L
  64.                 xp(i)=xp(i)-L
  65.             endif
  66.             if(yp(i).gt.L)then
  67.                 yp(i)=yp(i)-L
  68.             endif
  69.             if(xp(i).lt.0)then
  70.                 xp(i)=xp(i)+L
  71.             endif
  72.             if(yp(i).lt.0)then
  73.                 yp(i)=yp(i)+L
  74.             endif
  75.             !do m=1,N!sprawdzenie, czy wartosci nie powtarzaja sie
  76.             !    if(x(m).eq.xp(i))then
  77.             !        goto 300
  78.             !    endif
  79.             !    if(y(m).eq.yp(i))then
  80.             !        goto 400
  81.             !    endif
  82.             !enddo
  83.             do j=1,N
  84.                  if(i.ne.j) then
  85.                     dxp=abs(x(j)-xp(i))                    
  86.                     dyp=abs(y(j)-yp(i))
  87.                     if(dxp.lt.2.5.and.dyp.lt.2.5)then
  88.                         dy=abs(y(j)-y(i))
  89.                         dx=abs(x(j)-x(i))
  90.                         if(dx.gt.L/2) then
  91.                             dx=L-dx
  92.                         endif
  93.                         if(dxp.gt.L/2) then
  94.                             dxp=L-dxp
  95.                         endif
  96.                         if(dy.gt.L/2) then
  97.                             dy=L-dy
  98.                         endif
  99.                         if(dyp.gt.L/2) then
  100.                             dyp=L-dyp
  101.                         endif  
  102.                         dr2=dx**2+dy**2
  103.                         drp2=dxp**2+dyp**2
  104.                         if(sqrt(drp2).le.rad)then
  105.                             goto 500
  106.                         endif
  107.                         !(drp2**(-6)-drp2**(-3))-(dr2**(-6)-dr2**(-3))
  108.                         dU=dU+4*((drp2**(-6)-dr2**(-6)))
  109.                         endif
  110.                     endif    
  111.                 enddo    
  112.             w=min(1.0,exp(-dU/T))
  113.             if(r.le.w) then!akceptacja
  114.                 x(i)=xp(i)
  115.                 y(i)=yp(i)
  116.             else
  117. 500             continue
  118.             endif
  119.             !call cpu_time(finish)
  120.             !write(11,*)(finish-start)
  121.         enddo!koniec algorytmu Metropolisa
  122.         if(k.gt.check .and. mod(k,time)==0) then
  123.             do z=1,ale
  124.                 ra=z*drp
  125.                 call Prob(ra,drp,N,Rmax,x(:),y(:),q,a)
  126.                 fun(z)=a+fun(z)
  127.             enddo
  128. !            do z=90,ale,1
  129. !                ra=z*drp
  130. !                call Prob(ra,drp,N,Rmax,x(:),y(:),q,a)
  131. !                fun(z)=a+fun(z)
  132. !            enddo            
  133.             licznik=licznik+1
  134.         endif
  135.     enddo
  136.     do z=1,ale
  137.         fun(z)=fun(z)/licznik
  138.         write(12,*)z*drp,fun(z)
  139.     enddo
  140. end
  141.    
  142.    
  143. FUNCTION ran1(idum)
  144.       INTEGER idum,IA,IM,IQ,IR,NTAB,NDIV
  145.       REAL*8 ran1,AM,EPS,RNMX
  146.       PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836,NTAB=32,NDIV=1+(IM-1)/NTAB,EPS=1.2e-7,RNMX=1.-EPS)
  147.       INTEGER j,k,iv(NTAB),iy
  148.       SAVE iv,iy
  149.       DATA iv /NTAB*0/, iy /0/
  150.       if (idum.le.0.or.iy.eq.0) then
  151.         idum=max(-idum,1)
  152.         do 11 j=NTAB+8,1,-1
  153.           k=idum/IQ
  154.           idum=IA*(idum-k*IQ)-IR*k
  155.           if (idum.lt.0) idum=idum+IM
  156.           if (j.le.NTAB) iv(j)=idum
  157. 11      continue
  158.         iy=iv(1)
  159.       endif
  160.       k=idum/IQ
  161.       idum=IA*(idum-k*IQ)-IR*k
  162.       if (idum.lt.0) then
  163.           idum=idum+IM
  164.       endif
  165.       j=1+iy/NDIV
  166.       iy=iv(j)
  167.       iv(j)=idum
  168.       ran1=min(AM*iy,RNMX)
  169.       return
  170.     end
  171. subroutine Prob(r,da,N,Rmax,x,y,q,probability)
  172.     implicit none
  173.     real probability,P
  174.     integer N,i,j,m,rmax
  175.     real r,da,x(N),y(N),q,deltaR
  176.     real pi,dr
  177.     parameter (pi=3.141592653)
  178.     P=0
  179.     dr=da*10
  180.     probability=P
  181.     if(r.le.dr) return
  182.     do j=1, N
  183.         M = 0
  184.         do i=j+1, N
  185.         deltaR = sqrt( (x(i)-x(j))**2 + (y(i)-y(j))**2 )
  186.            if(deltaR.ge.r-dr.and.deltaR.le.r) then
  187.                 M = M + 1
  188.            endif
  189.         enddo
  190.           P = P + M/(2.0*PI*r*dr*q)
  191.           !ring width: r-dr to r
  192.     enddo
  193.     Probability = P/(2*N+0.0)
  194.     return
  195. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement