def __init__(self, potential, coords, temperature, stepsize, niter, hEmin=0, hEmax=100, hbinsize=0.01, radius=2.5, acceptance=0.5, adjustf=0.9, adjustf_niter=1e4, adjustf_navg=100, bdim=3, single=False, seeds=None): #construct base class super(Metropolis_MCrunner, self).__init__(potential, coords, temperature, niter) #get/set seeds if not seeds: i32max = np.iinfo(np.int32).max seeds = dict(takestep=np.random.randint(i32max), metropolis=np.random.randint(i32max)) self.seeds = seeds #construct takestep: random step self.step = RandomCoordsDisplacement(self.seeds['takestep'], stepsize, report_interval=adjustf_navg, factor=adjustf, min_acc_ratio=acceptance, max_acc_ratio=acceptance, single=single, nparticles=int( len(coords) / bdim), bdim=bdim) #construct early configuration test: check within spherical container self.conftest = CheckSphericalContainer(radius, bdim) #construct accept test: Metropolis self.metropolis = MetropolisTest(self.seeds['metropolis']) #construct action: energy histogram self.binsize = hbinsize self.histogram = RecordEnergyHistogram(hEmin, hEmax, self.binsize, adjustf_niter) #set up pele:MC self.set_takestep(self.step) self.set_report_steps( adjustf_niter ) #set number of iterations for which steps are adapted self.add_accept_test(self.metropolis) self.add_conf_test(self.conftest) self.add_action(self.histogram)
def __init__(self, boxdim=2, nr_particles=100, hard_phi=0.4, nr_steps=1e6, epsilon=1, alpha=0.1, verbose=False): # Settings. np.random.seed(42) # Input parameters. self.boxdim = boxdim self.nr_particles = nr_particles self.hard_phi = hard_phi self.nr_steps = nr_steps self.epsilon = epsilon self.alpha = alpha self.verbose = verbose # Derived quantities. self.hard_radii = np.ones(self.nr_particles) def volume_nball(radius, n): return np.power(np.pi, n / 2) * np.power(radius, n) / gamma(n / 2 + 1) self.box_length = np.power( np.sum( np.asarray( [volume_nball(r, self.boxdim) for r in self.hard_radii])) / self.hard_phi, 1 / self.boxdim) self.box_vector = np.ones(self.boxdim) * self.box_length # HS-WCA potential. self.potential = HS_WCA(use_periodic=True, use_cell_lists=True, ndim=self.boxdim, eps=self.epsilon, sca=self.alpha, radii=self.hard_radii, boxvec=self.box_vector) # Initial configuration by minimization. self.nr_dof = self.boxdim * self.nr_particles self.x = np.random.uniform(-0.5 * self.box_length, 0.5 * self.box_length, self.nr_dof) optimizer = LBFGS_CPP(self.x, self.potential) optimizer.run() if not optimizer.get_result().success: print("warning: minimization has not converged") self.x = optimizer.get_result().coords.copy() # Potential and MC rules. self.temperature = 1 self.mc = MC(self.potential, self.x, self.temperature, self.nr_steps) self.step = RandomCoordsDisplacement(42, 1, single=True, nparticles=self.nr_particles, bdim=self.boxdim) if self.verbose: print("initial MC stepsize") print self.step.get_stepsize() self.mc.set_takestep(self.step) self.eq_steps = self.nr_steps / 2 self.mc.set_report_steps(self.eq_steps) self.gr_quench = RecordPairDistHistogram(self.box_vector, 50, self.eq_steps, self.nr_particles, optimizer=optimizer) self.gr = RecordPairDistHistogram(self.box_vector, 50, self.eq_steps, self.nr_particles) self.mc.add_action(self.gr_quench) self.mc.add_action(self.gr) self.test = MetropolisTest(44) self.mc.add_accept_test(self.test)