def test_potentiostat(): size = 2 atoms = FaceCenteredCubic(directions=[[1, 0, 0], [0, 1, 0], [0, 0, 1]], symbol='Al', size=(size, size, size), pbc=True) atoms.set_calculator(EMT()) E0 = atoms.get_potential_energy() atoms.rattle(stdev=0.18, seed=312) md_temp = 300 rng = np.random.RandomState(60622) MaxwellBoltzmannDistribution(atoms, temperature_K=md_temp, rng=rng) initial_energy = atoms.get_potential_energy() print("Energy Above Ground State: {: .4f} eV/atom".format( (initial_energy - E0) / len(atoms))) name = 'test_potentiostat' traj_name = name + '.traj' log_name = name + '.log' dyn = contour_exploration( atoms, maxstep=1.0, parallel_drift=0.05, remove_translation=True, force_parallel_step_scale=None, energy_target=initial_energy, angle_limit=20, use_tangent_curvature=False, #trajectory = traj_name, #logfile = log_name, ) for i in range(5): dyn.run(10) energy_error = (atoms.get_potential_energy() - initial_energy) / len(atoms) print('Potentiostat Error {: .4f} eV/atom'.format(energy_error)) assert 0 == pytest.approx(energy_error, abs=0.01)
def test_momentum_conservation2(): d = 1.9 atoms = Atoms('Al4', positions=[[d, 0, 0], [0, d, 0], [-d, 0, 0], [0, -d, 0]]) atoms.center(vacuum=10) atoms.calc = EMT() #atoms.set_momenta([[1,0,0],[0,0,0],[0,0,0],[0,0,0]]) atoms.set_momenta([[0, 1, 0], [-1, 0, 0], [0, -1, 0], [1, 0, 0]]) atoms.set_momenta(atoms.get_momenta() * 1 + np.array([0, 0, 4])) momentum_target = atoms.get_momenta().sum(axis=0) atoms.set_calculator(EMT()) initial_energy = atoms.get_potential_energy() #io.write('debug.traj', atoms) print("Target Momentum: [{: .6f} {: .6f} {: .6f}]".format( *tuple(momentum_target))) name = 'test_momentum_conservation2' traj_name = name + '.traj' log_name = name + '.log' dyn = contour_exploration( atoms, maxstep=1.0, parallel_drift=0.0, remove_translation=False, force_parallel_step_scale=None, energy_target=initial_energy, angle_limit=15, use_tangent_curvature=False, trajectory=traj_name, #logfile = log_name, ) for i in range(10): dyn.run(30) momentum = atoms.get_momenta().sum(axis=0) print("Momentum: [{: .6f} {: .6f} {: .6f}]".format(*tuple(momentum))) assert 0 == pytest.approx(np.linalg.norm(momentum_target - momentum), abs=1e2)
def test_momentum_conservation1(): pair_distance = 2.6 atoms = Atoms('AlAl', positions=[[0, -pair_distance / 2, 0], [0, pair_distance / 2, 0]]) atoms.center(vacuum=10) atoms.calc = EMT() atoms.set_momenta([[1, 0, 0], [0, 0, 0]]) momentum_target = atoms.get_momenta().sum(axis=0) atoms.set_calculator(EMT()) initial_energy = atoms.get_potential_energy() print("Target Momentum: [{: .6f} {: .6f} {: .6f}]".format( *tuple(momentum_target))) name = 'test_momentum_conservation1' traj_name = name + '.traj' log_name = name + '.log' dyn = contour_exploration( atoms, maxstep=1.0, parallel_drift=0.0, remove_translation=False, force_parallel_step_scale=None, energy_target=initial_energy, angle_limit=15, use_tangent_curvature=False, trajectory=traj_name, #logfile = log_name, ) for i in range(5): dyn.run(30) momentum = atoms.get_momenta().sum(axis=0) print("Momentum: [{: .6f} {: .6f} {: .6f}]".format(*tuple(momentum))) assert 0 == pytest.approx(np.linalg.norm(momentum_target - momentum), abs=1e-0)
def test_kappa2(): pair_distance = 2.6 radius = pair_distance * np.sqrt(2) / 2 atoms = Atoms('AlAl', positions=[[-pair_distance / 2, 0, 0], [pair_distance / 2, 0, 0]]) atoms.center(vacuum=10) atoms.calc = EMT() atoms.set_momenta([[0, -10, 0], [0, 10, 0]]) atoms.set_calculator(EMT()) initial_energy = atoms.get_potential_energy() print("Target Radius (1/kappa) {: .6f} Ang".format(radius)) name = 'test_kappa2' traj_name = name + '.traj' log_name = name + '.log' dyn = contour_exploration( atoms, maxstep=1.0, parallel_drift=0.0, remove_translation=False, force_parallel_step_scale=None, energy_target=initial_energy, angle_limit=15, use_tangent_curvature=False, #trajectory = traj_name, #logfile = log_name, ) for i in range(5): dyn.run(30) print('Radius (1/kappa) {: .6f} Ang'.format(1 / dyn.kappa)) assert 0 == pytest.approx(radius - 1 / dyn.kappa, abs=1e-3)
def test_potentiostat_no_FS(): radius = 2.6 atoms = Atoms('AlAl', positions=[[-radius / 2, 0, 0], [radius / 2, 0, 0]]) atoms.center(vacuum=10) atoms.calc = EMT() atoms.set_momenta([[0, -10, 0], [0, 10, 0]]) atoms.set_calculator(EMT()) initial_energy = atoms.get_potential_energy() print("Pair distance {: .6f} Ang".format(radius)) name = 'test_potentiostat_no_FS' traj_name = name + '.traj' log_name = name + '.log' dyn = contour_exploration( atoms, maxstep=0.2, parallel_drift=0.0, remove_translation=False, force_parallel_step_scale=None, energy_target=initial_energy, use_FS=False, #trajectory = traj_name, #logfile = log_name, ) for i in range(5): dyn.run(10) energy_error = (atoms.get_potential_energy() - initial_energy) / len(atoms) print('Potentiostat Error {: .4f} eV/atom'.format(energy_error)) assert 0 == pytest.approx(energy_error, abs=0.01)