Advertisement
Guest User

Untitled

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