1import numpy as np 2import pytest 3from ase import Atoms, io 4from ase.calculators.lj import LennardJones 5from ase.optimize.basin import BasinHopping 6from ase.io import read 7from ase.units import kB 8 9 10@pytest.mark.slow 11def test_basin(testdir): 12 # Global minima from 13 # Wales and Doye, J. Phys. Chem. A, vol 101 (1997) 5111-5116 14 E_global = { 15 4: -6.000000, 16 5: -9.103852, 17 6: -12.712062, 18 7: -16.505384} 19 N = 7 20 R = N**(1. / 3.) 21 np.random.seed(42) 22 pos = np.random.uniform(-R, R, (N, 3)) 23 s = Atoms('He' + str(N), 24 positions=pos) 25 s.calc = LennardJones() 26 original_positions = 1. * s.get_positions() 27 28 ftraj = 'lowest.traj' 29 30 with BasinHopping(s, 31 temperature=100 * kB, 32 dr=0.5, 33 trajectory=ftraj, 34 optimizer_logfile=None) as GlobalOptimizer: 35 GlobalOptimizer.run(10) 36 Emin, smin = GlobalOptimizer.get_minimum() 37 print("N=", N, 'minimal energy found', Emin, 38 ' global minimum:', E_global[N]) 39 40 # recalc energy 41 smin.calc = LennardJones() 42 E = smin.get_potential_energy() 43 assert abs(E - Emin) < 1e-15 44 other = read(ftraj) 45 E2 = other.get_potential_energy() 46 assert abs(E2 - Emin) < 1e-15 47 48 # check that only minima were written 49 last_energy = None 50 for im in io.read(ftraj, index=':'): 51 energy = im.get_potential_energy() 52 if last_energy is not None: 53 assert energy < last_energy 54 last_energy = energy 55 56 # reset positions 57 s.set_positions(original_positions) 58