Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
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)
Beispiel #5
0
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)