allen-tildesley-book
|
README,
f.00,
f.01,
f.02,
f.03,
f.04,
f.05,
f.06,
f.07,
f.08,
f.09,
f.10,
f.11,
f.12,
f.13,
f.14,
f.15,
f.16,
f.17,
f.18,
f.19,
f.20,
f.21,
f.22,
f.23,
f.24,
f.25,
f.26,
f.27,
f.28,
f.29,
f.30,
f.31,
f.32,
f.33,
f.34,
f.35,
f.36,
f.37,
older-version
|
|
|
********************************************************************************
** FICHE F.13. THE HEART OF A CONSTANT MU VT MONTE CARLO PROGRAM **
** This FORTRAN code is intended to illustrate points made in the text. **
** To our knowledge it works correctly. However it is the responsibility of **
** the user to test it, if it is to be used in a research application. **
********************************************************************************
C *******************************************************************
C ** ATTEMPTED CREATIONS AND DESTRUCTIONS IN GRAND CANONICAL MC. **
C ** **
C ** THESE ROUTINES ALLOW FOR A TRIAL DESTRUCTION OR CREATION IN A **
C ** GRAND CANONICAL MONTE CARLO PROGRAM. **
C ** **
C ** PRINCIPAL VARIABLES: **
C ** **
C ** INTEGER N NUMBER OF ATOMS BEFORE THE TRIAL **
C ** INTEGER NTRIAL NUMBER OF ATOMS DURING THE TRIAL **
C ** INTEGER NMAX MAXIMUM NUMBER OF ATOMS ALLOWED **
C ** INTEGER LOCATE(NMAX) ARRAY OF ACTIVE ATOM INDICES **
C ** REAL RXNEW,RYNEW,RZNEW POSITION FOR ADDITION OF ATOM **
C ** REAL RX(NMAX) ETC. POSITIONS OF CURRENT ATOMS **
C ** REAL V POTENTIAL ENERGY + LRC **
C ** REAL W VIRIAL + LRC **
C ** REAL DELTV CHANGE IN ENERGY **
C ** REAL DELTW CHANGE IN VIRIAL **
C ** REAL TEMP REDUCED TEMPERATURE **
C ** REAL Z ABSOLUTE ACTIVITY COEFFICIENT **
C ** REAL SIGMA LENNARD JONES DIAMETER **
C ** REAL RCUT REDUCED CUTOFF DISTANCE **
C ** REAL RMIN REDUCED MINIMUM SEPARATION **
C ** LOGICAL OVRLAP TRUE FOR SUBSTANTIAL ATOM OVERLAP **
C ** LOGICAL CREATE TRUE FOR AN ACCEPTED CREATION **
C ** LOGICAL GHOST TRUE FOR AN ACCEPTED DESTRUCTION **
C ** **
C ** ROUTINES SUPPLIED: **
C ** **
C ** SUBROUTINE IN ( TEMP, Z, SIGMA, RCUT, N, V, W, CREATE ) **
C ** PERFORMS A TRIAL CREATION **
C ** SUBROUTINE OUT ( TEMP, Z, SIGMA, RCUT, N, V, W, GHOST ) **
C ** PERFORMS A TRIAL DESTRUCTION **
C ** SUBROUTINE POTIN ( RXNEW, RYNEW, RZNEW, N, SIGMA, RCUT, RMIN, **
C ** : DELTV, DELTW, OVRLAP ) **
C ** CALCULATES THE POTENTIAL ENERGY CHANGE ON CREATION **
C ** SUBROUTINE POTOUT ( IPULL, N, SIGMA, RCUT, DELTV, DELTW ) **
C ** CALCULATES THE POTENTIAL ENERGY CHANGE ON DESTRUCTION **
C ** **
C ** ROUTINES REFERENCED: **
C ** **
C ** REAL FUNCTION RANF ( DUMMY ) (GIVEN IN F.11) **
C ** RETURNS A UNIFORM RANDOM VARIATE ON ZERO TO ONE **
C ** SUBROUTINE ADD ( RXNEW, RYNEW, RZNEW, N ) **
C ** UPDATES LOCATE AFTER ADDITION (GIVEN IN F.14) **
C ** SUBROUTINE REMOVE ( NLOC, IPULL, N ) **
C ** UPDATES LOCATE AFTER REMOVAL (GIVEN IN F.14) **
C ** **
C ** USAGE: **
C ** **
C ** ROUTINES IN AND OUT SHOULD BE CALLED WITH EQUAL PROBABILITY **
C ** IN A GRAND CANONICAL MONTE CARLO SIMULATION. IF A TRIAL **
C ** CREATION IS ACCEPTED THEN CREATE IS SET TO TRUE. IF A TRIAL **
C ** DESTRUCTION IS ACCEPTED THEN GHOST IS SET TO TRUE. THE **
C ** ROUTINES ARE WRITTEN FOR LENNARD-JONES ATOMS. THE BOX IS OF **
C ** UNIT LENGTH, ALL DISTANCES ARE SCALED TO THE BOX LENGTH. **
C ** TRIAL INPUTS WHICH RESULT IN A SEPARATION OF LESS THAN **
C ** 0.5*SIGMA ARE REJECTED. THE LONG-RANGE CORRECTIONS ARE **
C ** INCLUDED IN V AND W. ALL ACCUMULATORS ARE UPDATED IN THE MAIN **
C ** PART OF THE PROGRAM WHICH IS NOT GIVEN HERE. **
C *******************************************************************
SUBROUTINE IN ( TEMP, Z, SIGMA, RCUT, N, V, W, CREATE )
COMMON / BLOCK1 / RX, RY, RZ
COMMON / BLOCK2 / LOCATE
C *******************************************************************
C ** ROUTINE TO ATTEMPT A TRIAL CREATION **
C ** **
C ** PRINCIPAL VARIABLES: **
C ** **
C ** REAL TEMP TEMPERATURE **
C ** REAL Z ABSOLUTE ACTIVITY **
C ** REAL SIGMA LENNARD-JONES DIAMETER **
C ** REAL RCUT CUT-OFF DISTANCE **
C ** REAL V POTENTIAL ENERGY **
C ** REAL W VIRIAL **
C ** INTEGER N NUMBER OF ATOMS BEFORE TRIAL CREATION **
C ** LOGICAL CREATE TRUE FOR A SUCCESSFUL CREATION **
C *******************************************************************
INTEGER NMAX
PARAMETER ( NMAX = 500 )
REAL RX(NMAX), RY(NMAX), RZ(NMAX)
REAL TEMP, Z, SIGMA, RCUT, V, W
INTEGER LOCATE(NMAX)
INTEGER N
LOGICAL CREATE
REAL BETA, RXNEW, RYNEW, RZNEW, DELTV, DELTW, DELTCB
REAL RANF, DUMMY, RMIN
INTEGER NTRIAL
LOGICAL OVRLAP
C *******************************************************************
CREATE = .FALSE.
BETA = 1.0 / TEMP
RMIN = 0.5 * SIGMA
NTRIAL = N + 1
IF ( NTRIAL .GE. NMAX ) STOP 'MAXIMUM NUMBER OF ATOMS IN BOX'
C ** GENERATE THE POSITION OF THE TRIAL ATOM **
RXNEW = RANF ( DUMMY ) - 0.5
RYNEW = RANF ( DUMMY ) - 0.5
RZNEW = RANF ( DUMMY ) - 0.5
C ** CALCULATE ENERGY CHANGE ON ADDITION **
CALL POTIN ( RXNEW, RYNEW, RZNEW, N, SIGMA, RCUT, RMIN, DELTV,
: DELTW, OVRLAP )
C ** CHECK FOR ACCEPTANCE **
IF ( .NOT. OVRLAP ) THEN
DELTCB = BETA * DELTV - LOG ( Z / REAL ( NTRIAL ) )
IF ( DELTCB .LT. 75.0 ) THEN
IF ( DELTCB .LE. 0.0 ) THEN
CREATE = .TRUE.
CALL ADD ( RXNEW, RYNEW, RZNEW, N )
V = V + DELTV
W = W + DELTW
N = NTRIAL
ELSE IF ( EXP ( - DELTCB ) .GT. RANF ( DUMMY ) ) THEN
CREATE = .TRUE.
CALL ADD ( RXNEW, RYNEW, RZNEW, N )
V = V + DELTV
W = W + DELTW
N = NTRIAL
ENDIF
ENDIF
ENDIF
RETURN
END
SUBROUTINE OUT ( TEMP, Z, SIGMA, RCUT, N, V, W, GHOST )
COMMON / BLOCK1 / RX, RY, RZ
COMMON / BLOCK2 / LOCATE
C *******************************************************************
C ** ROUTINE TO ATTEMPT A TRIAL DESTRUCTION **
C ** **
C ** PRINCIPAL VARIABLES: **
C ** **
C ** REAL TEMP TEMPERATURE **
C ** REAL Z ABSOLUTE ACTIVITY **
C ** REAL SIGMA LENNARD-JONES DIAMETER **
C ** REAL RCUT CUT-OFF DISTANCE **
C ** REAL V POTENTIAL ENERGY **
C ** REAL W VIRIAL **
C ** INTEGER N NUMBER OF ATOMS BEFORE TRIAL DESTRUCTION **
C ** LOGICAL GHOST TRUE FOR A SUCCESSFUL DESTRUCTION **
C *******************************************************************
INTEGER NMAX
PARAMETER ( NMAX = 500 )
REAL RX(NMAX), RY(NMAX), RZ(NMAX)
REAL TEMP, Z, SIGMA, RCUT, V, W
INTEGER LOCATE(NMAX)
INTEGER N
LOGICAL GHOST
REAL BETA, DELTV, DELTW, DELTDB, RANF, DUMMY
INTEGER NTRIAL, NLOC, IPULL
LOGICAL OVRLAP
C *******************************************************************
GHOST = .FALSE.
BETA = 1.0 / TEMP
NTRIAL = N - 1
IF ( NTRIAL .EQ. 1 ) STOP 'ONLY ONE ATOM REMAINS'
C ** PICK A RANDOM ELEMENT FROM THE ACTIVE PART OF LOCATE **
NLOC = INT ( REAL ( NTRIAL ) * RANF ( DUMMY ) ) + 1
IPULL = LOCATE(NLOC)
C ** CALCULATE ENERGY CHANGE ON REMOVAL OF ATOM IPULL **
CALL POTOUT ( IPULL, N, SIGMA, RCUT, DELTV, DELTW )
C ** CHECK FOR ACCEPTANCE **
DELTDB = BETA * DELTV - LOG ( REAL ( N ) / Z )
IF ( DELTDB .LT. 75.0 ) THEN
IF ( DELTDB .LT. 0.0 ) THEN
GHOST = .TRUE.
CALL REMOVE ( NLOC, IPULL, N )
V = V + DELTV
W = W + DELTW
N = NTRIAL
ELSE IF ( EXP( -DELTDB ) .GT. RANF ( DUMMY ) ) THEN
GHOST = .TRUE.
CALL REMOVE ( NLOC, IPULL, N )
V = V + DELTV
W = W + DELTW
N = NTRIAL
ENDIF
ENDIF
RETURN
END
SUBROUTINE POTIN ( RXI, RYI, RZI, N, SIGMA, RCUT, RMIN, DELTV,
: DELTW, OVRLAP )
COMMON / BLOCK1 / RX, RY, RZ
COMMON / BLOCK2 / LOCATE
C *******************************************************************
C ** RETURNS THE POTENTIAL ENERGY CHANGE ON ADDING AN ATOM. **
C ** **
C ** PRINCIPAL VARIABLES: **
C ** **
C ** INTEGER N THE NUMBER OF ATOMS BEFORE ADDITION **
C ** REAL RXI,RYI,RZI THE COORDINATES OF THE ADDED ATOM **
C ** REAL DELTV THE CHANCE IN POTENTIAL **
C ** REAL DELTW THE CHANGE IN VIRIAL **
C ** REAL SIGMA LJ DIAMETER **
C ** REAL RCUT CUTOFF DISTANCE FOR POTENTIAL **
C ** REAL RMIN MINIMUM ALLOWED APPROACH OF ATOMS **
C ** LOGICAL OVRLAP TRUE FOR SUBSTANTIAL ATOM OVERLAP **
C ** **
C ** USAGE: **
C ** **
C ** THIS SUBROUTINE IS USED TO CALCULATE THE CHANGE OF ENERGY **
C ** DURING A TRIAL ADDITION OF AN ATOM TO THE FLUID. THE LONG **
C ** RANGE CORRECTIONS IS INCLUDED. **
C *******************************************************************
INTEGER NMAX
PARAMETER ( NMAX = 500 )
REAL RX(NMAX), RY(NMAX), RZ(NMAX)
REAL RCUT, RMIN, SIGMA, RXI, RYI, RZI, DELTV, DELTW
INTEGER N, NTRIAL, LOCATE(NMAX)
LOGICAL OVRLAP
REAL RCUTSQ, RMINSQ, SIGSQ, SR2, SR6, SR3, SR9
REAL RXIJ, RYIJ, RZIJ, RIJSQ, VIJ, WIJ, SIGCUB, PI
REAL VLRC0, WLRC0
INTEGER J, JIN
PARAMETER ( PI = 3.14159265 )
C ******************************************************************
OVRLAP = .FALSE.
RCUTSQ = RCUT * RCUT
RMINSQ = RMIN * RMIN
SIGSQ = SIGMA * SIGMA
C ** CALCULATE LONG RANGE CORRECTIONS **
C ** NOTE: SPECIFIC TO LENNARD-JONES **
SIGCUB = SIGSQ * SIGMA
SR3 = ( SIGMA / RCUT ) ** 3
SR9 = SR3 ** 3
VLRC0 = ( 8.0 / 9.0 ) * PI * SIGCUB * ( SR9 - 3.0*SR3 )
WLRC0 = ( 16.0 / 9.0 ) * PI * SIGCUB * ( 2.0*SR9 - 3.0*SR3 )
C ** ZERO ACCUMULATORS **
DELTV = 0.0
DELTW = 0.0
C ** LOOP OVER ALL ATOMS **
DO 100 J = 1, N
C ** PICK ACTIVE ATOMS FROM THE ARRAY LOCATE **
JIN = LOCATE(J)
RXIJ = RXI - RX(JIN)
RYIJ = RYI - RY(JIN)
RZIJ = RZI - RZ(JIN)
RXIJ = RXIJ - ANINT ( RXIJ )
RYIJ = RYIJ - ANINT ( RYIJ )
RZIJ = RZIJ - ANINT ( RZIJ )
RIJSQ = RXIJ * RXIJ + RYIJ * RYIJ + RZIJ * RZIJ
IF ( RIJSQ .LT. RMINSQ) THEN
OVRLAP = .TRUE.
RETURN
ELSEIF ( RIJSQ .LT. RCUTSQ ) THEN
SR2 = SIGSQ / RIJSQ
SR6 = SR2 * SR2 * SR2
VIJ = SR6 * ( SR6 - 1.0 )
WIJ = SR6 * ( SR6 - 0.5 )
DELTV = DELTV + VIJ
DELTW = DELTW + WIJ
ENDIF
100 CONTINUE
DELTV = 4.0 * DELTV
DELTW = 48.0 * DELTW / 3.0
C ** ADD CHANGE IN LONG RANGE CORRECTION **
DELTV = DELTV + ( 2.0 * REAL ( N ) + 1.0 ) * VLRC0
DELTW = DELTW + ( 2.0 * REAL ( N ) + 1.0 ) * WLRC0
RETURN
END
SUBROUTINE POTOUT ( IPULL, N, SIGMA, RCUT, DELTV, DELTW )
COMMON / BLOCK1 / RX, RY, RZ
COMMON / BLOCK2 / LOCATE
C *******************************************************************
C ** RETURNS THE POTENTIAL ENERGY CHANGE WHEN AN ATOM IS REMOVED. **
C ** **
C ** PRINCIPAL VARIABLES: **
C ** **
C ** INTEGER N THE NUMBER OF ATOMS BEFORE REMOVAL **
C ** INTEGER IPULL THE ATOM TO BE REMOVED **
C ** INTEGER LOCATE(NMAX) ARRAY OF ACTIVE ATOM INDICES **
C ** REAL RX(NMAX) ETC. THE ATOM POSITIONS **
C ** REAL DELTV THE CHANCE IN POTENTIAL **
C ** REAL DELTW THE CHANGE IN VIRIAL **
C ** REAL SIGMA LJ DIAMETER **
C ** REAL RCUT CUTOFF DISTANCE FOR POTENTIAL **
C ** **
C ** USAGE: **
C ** **
C ** THIS SUBROUTINE IS USED TO CALCULATE THE CHANGE OF ENERGY **
C ** DURING A TRIAL DELETION OF AN ATOM FROM THE FLUID. THE LONG **
C ** RANGE CORRECTIONS IS INCLUDED. **
C *******************************************************************
INTEGER NMAX
PARAMETER ( NMAX = 500 )
REAL RX(NMAX), RY(NMAX), RZ(NMAX)
REAL RCUT, SIGMA, DELTV, DELTW
INTEGER N, IPULL, LOCATE(NMAX)
REAL RCUTSQ, SIGSQ, SR2, SR6, SR3, SR9, RXI, RYI, RZI
REAL RXIJ, RYIJ, RZIJ, RIJSQ, VIJ, WIJ, SIGCUB, PI
REAL VLRC0, WLRC0
INTEGER J, JIN
PARAMETER ( PI = 3.14159265 )
C ******************************************************************
RCUTSQ = RCUT * RCUT
SIGSQ = SIGMA * SIGMA
SIGCUB = SIGSQ * SIGMA
C ** CALCULATE LONG RANGE CORRECTIONS **
C ** NOTE: SPECIFIC TO LENNARD-JONES **
SR3 = ( SIGMA / RCUT ) ** 3
SR9 = SR3 ** 3
VLRC0 = ( 8.0 / 9.0 ) * PI * SIGCUB * ( SR9 - 3.0*SR3 )
WLRC0 = ( 16.0 / 9.0 ) * PI * SIGCUB * ( 2.0*SR9 - 3.0*SR3 )
C ** ZERO ACCUMULATORS **
DELTV = 0.0
DELTW = 0.0
RXI = RX(IPULL)
RYI = RY(IPULL)
RZI = RZ(IPULL)
C ** LOOP OVER ALL ATOMS EXCEPT IPULL **
DO 100 J = 1, N
C ** PICK ACTIVE ATOMS FROM LOCATE **
JIN = LOCATE(J)
IF ( JIN .NE. IPULL ) THEN
RXIJ = RXI - RX(JIN)
RYIJ = RYI - RY(JIN)
RZIJ = RZI - RZ(JIN)
RXIJ = RXIJ - ANINT ( RXIJ )
RYIJ = RYIJ - ANINT ( RYIJ )
RZIJ = RZIJ - ANINT ( RZIJ )
RIJSQ = RXIJ * RXIJ + RYIJ * RYIJ + RZIJ * RZIJ
IF ( RIJSQ .LT. RCUTSQ ) THEN
SR2 = SIGSQ / RIJSQ
SR6 = SR2 * SR2 * SR2
VIJ = SR6 * ( SR6 - 1.0 )
WIJ = SR6 * ( SR6 - 0.5 )
DELTV = DELTV + VIJ
DELTW = DELTW + WIJ
ENDIF
ENDIF
100 CONTINUE
DELTV = 4.0 * DELTV
DELTW = 48.0 * DELTW / 3.0
C ** ADD CHANGE IN LONG RANGE CORRECTION **
DELTV = DELTV + ( 2.0 * REAL ( N ) - 1.0 ) * VLRC0
DELTW = DELTW + ( 2.0 * REAL ( N ) - 1.0 ) * WLRC0
C ** CHANGE SIGN OF DELTV AND DELTW FOR A REMOVAL **
DELTV = - DELTV
DELTW = - DELTW
RETURN
END
|