def bhopt(atoms=None, gen='poscar.gen', fmax=0.3, step=100, dr=0.5, temperature=100, optimizer=BFGS, vdwnn=False, nn=True, v=False): if atoms is None: atoms = read(gen) atoms.calc = IRFF(atoms=atoms, libfile='ffield.json', rcut=None, nn=nn, vdwnn=vdwnn) optimizer = BasinHopping( atoms=atoms, # the system to optimize temperature=temperature * kB, # 'temperature' to overcome barriers dr=dr, # maximal stepwidth optimizer=optimizer, fmax=fmax, # maximal force for the optimizer trajectory="opt.traj") optimizer.run(step) if v: images = Trajectory('opt.traj') view(images[-1]) return atoms
def test_basin(): # Global minima from # Wales and Doye, J. Phys. Chem. A, vol 101 (1997) 5111-5116 E_global = {4: -6.000000, 5: -9.103852, 6: -12.712062, 7: -16.505384} N = 7 R = N**(1. / 3.) np.random.seed(42) pos = np.random.uniform(-R, R, (N, 3)) s = Atoms('He' + str(N), positions=pos) s.calc = LennardJones() original_positions = 1. * s.get_positions() ftraj = 'lowest.traj' for GlobalOptimizer in [ BasinHopping(s, temperature=100 * kB, dr=0.5, trajectory=ftraj, optimizer_logfile=None) ]: if isinstance(GlobalOptimizer, BasinHopping): GlobalOptimizer.run(10) Emin, smin = GlobalOptimizer.get_minimum() else: GlobalOptimizer(totalsteps=10) Emin = s.get_potential_energy() smin = s print("N=", N, 'minimal energy found', Emin, ' global minimum:', E_global[N]) # recalc energy smin.calc = LennardJones() E = smin.get_potential_energy() assert abs(E - Emin) < 1e-15 other = read(ftraj) E2 = other.get_potential_energy() assert abs(E2 - Emin) < 1e-15 # check that only minima were written last_energy = None for im in io.read(ftraj, index=':'): energy = im.get_potential_energy() if last_energy is not None: assert energy < last_energy last_energy = energy # reset positions s.set_positions(original_positions)
#!/usr/bin/env python from ase import Atoms, Atom from ase.calculators.aims import Aims, AimsCube from ase.cluster.icosahedron import Icosahedron from ase.io.aims import read_aims from ase.optimize.basin import BasinHopping from ase.optimize import LBFGS import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt atoms = Icosahedron('Pt', noshells=1) calc = Aims(label='cluster/pt-isosahedron-1-bh', xc='pbe', spin='none', relativistic = 'atomic_zora scalar', sc_accuracy_etot=1e-5, sc_accuracy_eev=1e-3, sc_accuracy_rho=1e-4, sc_accuracy_forces=1e-3) atoms.set_calculator(calc) bh = BasinHopping(atoms) bh.run(temperature=100 * kB, # 'temperature' to overcome barriers dr=0.5, # maximal stepwidth optimizer=LBFGS, # optimizer to find local minima fmax=0.1# maximal force for the optimizer )
7: -16.505384, } N = 7 R = N**(1. / 3.) np.random.seed(42) pos = np.random.uniform(-R, R, (N, 3)) s = Atoms('He' + str(N), positions=pos) s.set_calculator(LennardJones()) original_positions = 1. * s.get_positions() ftraj = 'lowest.traj' for GlobalOptimizer in [ BasinHopping(s, temperature=100 * kB, dr=0.5, trajectory=ftraj, optimizer_logfile=None), ]: if str(GlobalOptimizer.__class__) == 'ase.optimize.basin.BasinHopping': GlobalOptimizer.run(10) Emin, smin = GlobalOptimizer.get_minimum() else: GlobalOptimizer(totalsteps=10) Emin = s.get_potential_energy() smin = s print "N=", N, 'minimal energy found', Emin, print ' global minimum:', E_global[N] # recalc energy
from ase import Atoms, Atom from ase.calculators.aims import Aims from ase.cluster.decahedron import Decahedron from ase.optimize.basin import BasinHopping from ase.units import kB from ase.optimize import LBFGS atoms = Decahedron('Pt', p=2, # natoms on 100 face normal to 5-fold axis q=1, # natoms 0n 100 parallel to 5-fold axis r=0) # depth of the Marks re-entrance? calc = Aims(label='cluster/pt-decahedron-2-1-bh', xc='pbe', spin='none', relativistic = 'atomic_zora scalar', sc_accuracy_etot=1e-5, sc_accuracy_eev=1e-3, sc_accuracy_rho=1e-4, sc_accuracy_forces=1e-3) atoms.set_calculator(calc) bh = BasinHopping(atoms = atoms, temperature=100 * kB, # 'temperature' to overcome barriers dr=0.5, # maximal stepwidth optimizer=LBFGS, # optimizer to find local minima fmax=0.1 ) bh.run(10)
#!/usr/bin/env python from ase import Atoms, Atom from jasp import * from ase.cluster.icosahedron import Icosahedron from ase.optimize.basin import BasinHopping from ase.units import kB from ase.optimize import LBFGS atoms = Atoms('Pt3', ([0, 0, 0], [0, 0, 2.0], [0, 2.0, 0.0]), cell=(8, 8, 8)) with jasp('cluster/pt3', xc='PBE', encut=450, kpts=[5, 5, 5], ismear=0, sigma=0.01, # this is small for a molecule ibrion=2, # conjugate gradient optimizer nsw=500, # do at least 5 steps to relax ediff=1e-5, # set precise energies atoms=atoms) as calc: bh = BasinHopping(atoms = atoms, temperature=100 * kB, # 'temperature' to overcome barriers dr=0.5, # maximal stepwidth optimizer=LBFGS, # optimizer to find local minima fmax=0.1 ) bh.run(100)
from ase.calculators.lj import LennardJones from ase.optimize.basin import BasinHopping from ase.io import PickleTrajectory, read from ase.units import kB N = 7 R = N**(1./3.) pos = np.random.uniform(-R, R, (N, 3)) s = Atoms('He' + str(N), positions = pos) s.set_calculator(LennardJones()) ftraj = 'lowest.traj' traj = PickleTrajectory(ftraj, 'w', s) bh = BasinHopping(s, temperature=100 * kB, dr=0.5, optimizer_logfile=None) bh.attach(traj) bh.run(10) Emin, smin = bh.get_minimum() # recalc energy smin.set_calculator(LennardJones()) E = smin.get_potential_energy() assert abs(E - Emin) < 1e-15 traj.close() smim = read(ftraj) E = smin.get_potential_energy() assert abs(E - Emin) < 1e-15
from math import pi, sqrt from ase import Atoms from ase.calculators.lj import LennardJones from ase.optimize.basin import BasinHopping from ase.io import PickleTrajectory, read from ase.units import kB N = 7 R = N**(1. / 3.) pos = np.random.uniform(-R, R, (N, 3)) s = Atoms('He' + str(N), positions=pos) s.set_calculator(LennardJones()) ftraj = 'lowest.traj' traj = PickleTrajectory(ftraj, 'w', s) bh = BasinHopping(s, temperature=100 * kB, dr=0.5, optimizer_logfile=None) bh.attach(traj) bh.run(10) Emin, smin = bh.get_minimum() # recalc energy smin.set_calculator(LennardJones()) E = smin.get_potential_energy() assert abs(E - Emin) < 1e-15 traj.close() smim = read(ftraj) E = smin.get_potential_energy() assert abs(E - Emin) < 1e-15 #view(smin)