Advertisement
Guest User

Untitled

a guest
Jun 7th, 2018
62
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, m, sim_time, check_time
  4.        parameter (L=60, 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
  10.        real dx_new, dy_new
  11.        real, allocatable:: x(:), y(:)
  12.        d =-1
  13.        N = int( ro*L**2 + 0.0)
  14.        write(*,*) 'N = ', N
  15.        allocate (x(N), y(N))
  16.        call Liquid(L,N,x,y,ro)
  17.        call showmatrix(N,x,y)
  18.         do k=1, MCS
  19.           do i=1, N
  20.              dU = 0
  21.              xnew = x(i) + (ran1(d)-0.5)*x_step
  22.              ynew = y(i) + (ran1(d)-0.5)*y_step
  23.              if(xnew.gt.L) xnew = xnew - L
  24.              if(ynew.gt.L) ynew = ynew - L
  25.              if(xnew.lt.0.) xnew = xnew + L
  26.              if(ynew.lt.0.) ynew = ynew + L
  27.               do j=1, N
  28.                if(j.ne.i) then
  29.                   dx = abs( x(i) - x(j) )
  30.                   dy = abs( y(i) - y(j) )
  31.                   if(dx.gt.L/2.) dx = L - dx
  32.                   if(dy.gt.L/2.) dy = L - dy
  33.                   r_ij2 = dx**2 + dy**2
  34.  
  35.                   dx_new = abs( xnew-x(j) )
  36.                   dy_new = abs( ynew-y(j) )
  37.                   if(dx_new.gt.L/2.) dx_new = L - dx_new
  38.                   if(dy_new.gt.L/2.) dy_new = L - dy_new
  39.                   Rnew2 = dx_new**2 + dy_new**2
  40.                   if(Rnew2.le.1.0) goto 7
  41.                   !r^2<=1 then r<=1, sqrt() not needed
  42.  
  43.                   if(r_ij2.le.r_c.and.Rnew2.le.r_c) then
  44.                      dU = dU + 4.0*(1/Rnew2**6 - 1/r_ij2**6)
  45.                   endif
  46.                endif
  47.               enddo
  48.               if(ran1(d).le.min(1.0,exp(-dU/T))) then
  49.                   x(i) = xnew
  50.                   y(i) = ynew
  51.               endif
  52. 7           continue
  53.           enddo
  54.           write(*,*) k
  55.         enddo
  56.         call showmatrix(N,x,y)
  57.         write(*,*) 'Done'
  58.         pause
  59.  
  60.        end program
  61.  
  62.        subroutine Liquid(L,N,x,y,ro)
  63.         integer L, N, M, k
  64.         real x(N), y(N), d, ro
  65.         x(1) = 0.5
  66.         y(1) = 0.5
  67.         M = (L-1)*(L-1)
  68.         k = int(N/2.)
  69.         if(N.ge.M) then
  70.            d = 1.0
  71.         else
  72.            d = 1.0 + 1./(ro*L)
  73.         endif
  74.         write (*,*) 'd = ',d
  75.         do i=2, k
  76.           y(i) = y(i-1)
  77.           x(i) = x(i-1) + d
  78.           if(x(i).gt.L-0.5) then
  79.              y(i) = y(i) + d
  80.              x(i) = 0.5
  81.           endif
  82.         enddo
  83.         y(k) = L - 0.5
  84.         x(k) = L - 0.5
  85.         do i=k+1, N
  86.           y(i) = y(i-1)
  87.           x(i) = x(i-1) - d
  88.           if(x(i).lt.0.5) then
  89.              y(i) = y(i) - d
  90.              x(i) = L - 0.5
  91.           endif
  92.         enddo
  93.        end
  94.        
  95.        subroutine showmatrix(n,x,y)
  96.        integer n
  97.        real x(n), y(n)
  98.        open(99,file='matrix-0.1,L=60,T=2.txt')
  99.        do i=1, n
  100.           write(99,*) x(i), y(i)
  101.        enddo
  102.        close(99)
  103.        end
  104.  
  105.  
  106.        FUNCTION ran1(idum)
  107.       INTEGER idum,IA,IM,IQ,IR,NTAB,NDIV
  108.       REAL ran1,AM,EPS,RNMX
  109.       PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836,
  110.      *NTAB=32,NDIV=1+(IM-1)/NTAB,EPS=1.2e-7,RNMX=1.-EPS)
  111.       INTEGER j,k,iv(NTAB),iy
  112.       SAVE iv,iy
  113.       DATA iv /NTAB*0/, iy /0/
  114.       if (idum.le.0.or.iy.eq.0) then
  115.         idum=max(-idum,1)
  116.         do 11 j=NTAB+8,1,-1
  117.           k=idum/IQ
  118.           idum=IA*(idum-k*IQ)-IR*k
  119.           if (idum.lt.0) idum=idum+IM
  120.           if (j.le.NTAB) iv(j)=idum
  121. 11      continue
  122.         iy=iv(1)
  123.       endif
  124.       k=idum/IQ
  125.       idum=IA*(idum-k*IQ)-IR*k
  126.       if (idum.lt.0) idum=idum+IM
  127.  
  128.       j=1+iy/NDIV
  129.       iy=iv(j)
  130.       iv(j)=idum
  131.       ran1=min(AM*iy,RNMX)
  132.       return
  133.       END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement