Skip to content

Commit

Permalink
Create lj_npt
Browse files Browse the repository at this point in the history
  • Loading branch information
kkly1995 committed Apr 27, 2022
1 parent fc7beff commit da78c7b
Showing 1 changed file with 88 additions and 0 deletions.
88 changes: 88 additions & 0 deletions bin/lj_npt
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#!/usr/bin/env python
import numpy as np
import mcase.particle_moves as mcp
import mcase.cell_moves as mcc
from ase.io import read, write
from ase.units import kB
from ase.calculators.lj import LennardJones
from mcase.reader import read_input
from sys import argv

settings = read_input(argv[1])
rng = np.random.default_rng()

# setup system
walker = read(settings['xyz'])
walker.calc = LennardJones(epsilon=float(settings['epsilon']),\
sigma=float(settings['sigma']))

# setup simulation
temperature = float(settings['temperature'])
pressure = float(settings['pressure'])
timestep = float(settings['timestep'])
cellstep = float(settings['cellstep'])
number_samples = int(settings['samples'])
beta = 1.0/(kB*temperature)
scale = np.sqrt(2*timestep)

# successful read, print out stuff
print('read inputs from ' + argv[1])
print('particles read from ' + settings['xyz'])
print('Lennard-jones potential, with epsilon = %s and sigma = %s'\
% (settings['epsilon'], settings['sigma']))
print('temperature: %s K (beta = %s eV^-1)' % (temperature, beta))
print('pressure: %s eV/A^3' % pressure)
print('timestep: %s (length scale = %s)' % (timestep, scale))
print('cell step: %s A' % cellstep)
print('number of samples to calculate: %d' % number_samples)

# start sampling
p_accepted = 0 # for particle moves
c_accepted = 0 # for cell moves
r = walker.get_positions()
energy = walker.get_potential_energy()
force = walker.get_forces()
cell = walker.cell.cellpar()[:3] # stick to orthorhombic changes
volume = walker.get_volume()
N = len(walker)

for _ in range(number_samples):
# particle move
dr = rng.normal(size=r.shape, scale=scale) + timestep*beta*force
r_new = r + dr
walker.set_positions(r_new)
energy_new = walker.get_potential_energy()
force_new = walker.get_forces()
# accept or reject
if rng.random() < mcp.acceptance_ratio(r, r_new, energy, energy_new,\
force, force_new, beta, timestep):
energy = energy_new
force = np.copy(force_new)
r = walker.get_positions(wrap=True) # wrap to avoid blowing up
p_accepted += 1
else:
walker.set_positions(r)
# cell move
dc = cellstep*(rng.random(size=3) - 0.5)
cell_new = cell + dc
walker.set_cell(cell_new, scale_atoms=True)
volume_new = walker.get_volume()
energy_new = walker.get_potential_energy()
if rng.random() < mcc.acceptance_ratio(energy, energy_new,\
volume, volume_new, N, pressure, beta):
energy = energy_new
force = walker.get_forces()
r = walker.get_positions(wrap=True)
cell = np.copy(cell_new)
volume = volume_new
c_accepted += 1
else:
walker.set_cell(cell, scale_atoms=True)
print(energy, cell[0], cell[1], cell[2])

# finished
print('particle move acceptance rate: %.2f' % (p_accepted / number_samples))
print('cell move acceptance rate: %.2f' % (c_accepted / number_samples))

print('writing final configuration to', settings['save_xyz'])
write(settings['save_xyz'], walker, format='extxyz')

0 comments on commit da78c7b

Please sign in to comment.