Advertisement
Guest User

Untitled

a guest
Jun 7th, 2018
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.        program LennardJonesLiquid
  2.        implicit none
  3.        integer L,N,MCS,i,j,k,d, sim_time, check_time, m
  4.        parameter (L=35, MCS=230000, sim_time = 30000, check_time = 100)
  5.        real r_c, x_step, y_step,r_step, ran1, P, dr, ro, PI, T
  6.        parameter (r_c = 2.5, x_step = 0.01,y_step = 0.01,r_step = 0.01,
  7.      &                  dr = 0.1 ,PI = 3.141592653, ro = 0.82, T = 0.7)
  8.        ! 0.8 - liquid & 0.93 - solid
  9.        real xnew, ynew, dx, dy, r_ij2, Rnew2, dU, r, Probability, Rmax
  10.        real dx_new, dy_new
  11.        integer counter, r_size, mcs_size
  12.        real, allocatable:: x(:), y(:), Prob(:,:)
  13.        d =-1
  14.        Rmax = L/2.0 - 1.0
  15.        !--------
  16.        r_size = int( Rmax/r_step + 1.0 )
  17.        mcs_size = int( (mcs-sim_time)/check_time + 1.0)
  18.        !---------- matrix places
  19.        N = int( ro*L**2 + 0.0)
  20.        write(*,*) 'N = ', N
  21.        allocate (x(N), y(N), Prob(r_size,mcs_size) )
  22.        call Liquid(L,N,x,y)
  23.        do i=1, r_size
  24.          do j=1, mcs_size
  25.             Prob(i,j) = 0.0
  26.          enddo
  27.        enddo
  28.        write(*,*) '----------------------------------'
  29.        write(*,*) 'Probability', '     ', 'r'
  30.         counter = 1
  31.         P = 0
  32.         do k=1, MCS
  33.           do i=1, N
  34.              dU = 0
  35.              xnew = x(i) + (ran1(d)-0.5)*x_step
  36.              ynew = y(i) + (ran1(d)-0.5)*y_step
  37.              if(xnew.gt.L-0.5) xnew = xnew - L + 0.5
  38.              if(ynew.gt.L-0.5) ynew = ynew - L + 0.5
  39.              if(xnew.lt.0.5) xnew = xnew + L-1.0
  40.              if(ynew.lt.0.5) ynew = ynew + L-1.0
  41.               do j=1, N
  42.                if(j.ne.i) then
  43.                   dx = abs( x(i) - x(j) )
  44.                   dy = abs( y(i) - y(j) )
  45.                   if(dx.gt.L/2.) dx = L - dx
  46.                   if(dy.gt.L/2.) dy = L - dy
  47.                   r_ij2 = dx**2 + dy**2
  48.                  
  49.                   dx_new = abs( xnew-x(j) )
  50.                   dy_new = abs( ynew-y(j) )
  51.                   if(dx_new.gt.L/2.) dx_new = L - dx_new
  52.                   if(dy_new.gt.L/2.) dy_new = L - dy_new
  53.                   Rnew2 = dx_new**2 + dy_new**2
  54.                   if(Rnew2.le.1.0) goto 7
  55.                   !r^2<=1 then r<=1, sqrt() not needed
  56.                  
  57.                   if(r_ij2.le.r_c.and.Rnew2.le.r_c) then
  58.                      dU = dU + 4.0*(1/Rnew2**6 - 1/r_ij2**6)
  59.                   endif
  60.                endif
  61.               enddo
  62.               if(ran1(d).le.min(1.0,exp(-dU/T))) then
  63.                   x(i) = xnew
  64.                   y(i) = ynew
  65.               endif
  66. 7           continue
  67.           enddo
  68.           if(k.ge.sim_time.and.mod(k,check_time).eq.0) then
  69.              r = 0.0
  70.              m = 1
  71. 33           continue
  72.                 Prob(m,counter) = Prob(m,counter) +
  73.      &                   Probability(r,dr,N,ro,x,y) !probabilistic matrix
  74.                 r = r + r_step
  75.                 m = m + 1
  76.              if(r.le.Rmax) goto 33
  77.              counter = counter + 1
  78.           endif
  79.           write(*,*) k
  80.         enddo
  81.         call save_prob(Prob,r_size,mcs_size,r_step)
  82.         pause
  83.         !call showmatrix(N,x,y)
  84.        
  85.        end program
  86.  
  87.        function Probability(r,dr,N,ro,x,y)
  88.         integer i, N, j, M
  89.         real dr, deltaR2, r, x(N), y(N)
  90.         real P, Probability, PI, ro
  91.         PI = 3.141592653
  92.         P = 0
  93.         Probability = P
  94.         if(r.le.dr) return
  95.         do j=1, N
  96.           M = 0
  97.           do i=j+1, N
  98.            deltaR2 = sqrt( (x(i)-x(j))**2 + (y(i)-y(j))**2 )
  99.            if(deltaR2.ge.r-dr.and.deltaR2.le.r) then
  100.                 M = M + 1
  101.            endif
  102.           enddo
  103.           P = P + M/(2.0*PI*r*dr*ro)
  104.           !ring width: r-dr to r
  105.         enddo
  106.         Probability = P/(2*N+0.0)
  107.         return
  108.         end
  109.        
  110.        subroutine Liquid(L,N,x,y)
  111.         integer L, N, M, k
  112.         real x(N), y(N), d
  113.         x(1) = 0.5
  114.         y(1) = 0.5
  115.         M = (L-1)*(L-1)
  116.         k = int(N/2.)
  117.         if(N.ge.M) then
  118.            d = 1.0
  119.         else
  120.            d = 1.0 + 1./L
  121.         endif
  122.         write (*,*) 'd = ',d
  123.         do i=2, k
  124.           y(i) = y(i-1)
  125.           x(i) = x(i-1) + d
  126.           if(x(i).gt.L-0.5) then
  127.              y(i) = y(i) + d
  128.              x(i) = 0.5
  129.           endif
  130.         enddo
  131.         y(k) = L - 0.5
  132.         x(k) = L - 0.5
  133.         do i=k+1, N
  134.           y(i) = y(i-1)
  135.           x(i) = x(i-1) - d
  136.           if(x(i).lt.0.5) then
  137.              y(i) = y(i) - d
  138.              x(i) = L - 0.5
  139.           endif
  140.         enddo
  141.        end
  142.        
  143.        subroutine save_prob(Prob, A, B, dr)
  144.         integer A,B, i, j
  145.         real Prob(A,B), P
  146.         open(13,file='prob-gas.txt')
  147.         do i=1, A
  148.            P = 0.0
  149.            do j=1, B
  150.               P = P + Prob(i,j)
  151.            enddo
  152.            P = P/B
  153.            write(13,*) i*dr, P
  154.            write(*,*) i*dr, P
  155.         enddo
  156.         close(13)
  157.        end
  158.        
  159.        FUNCTION ran1(idum)
  160.       INTEGER idum,IA,IM,IQ,IR,NTAB,NDIV
  161.       REAL ran1,AM,EPS,RNMX
  162.       PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836,
  163.      *NTAB=32,NDIV=1+(IM-1)/NTAB,EPS=1.2e-7,RNMX=1.-EPS)
  164.       INTEGER j,k,iv(NTAB),iy
  165.       SAVE iv,iy
  166.       DATA iv /NTAB*0/, iy /0/
  167.       if (idum.le.0.or.iy.eq.0) then
  168.         idum=max(-idum,1)
  169.         do 11 j=NTAB+8,1,-1
  170.           k=idum/IQ
  171.           idum=IA*(idum-k*IQ)-IR*k
  172.           if (idum.lt.0) idum=idum+IM
  173.           if (j.le.NTAB) iv(j)=idum
  174. 11      continue
  175.         iy=iv(1)
  176.       endif
  177.       k=idum/IQ
  178.       idum=IA*(idum-k*IQ)-IR*k
  179.       if (idum.lt.0) idum=idum+IM
  180.  
  181.       j=1+iy/NDIV
  182.       iy=iv(j)
  183.       iv(j)=idum
  184.       ran1=min(AM*iy,RNMX)
  185.       return
  186.       END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement