Exemplo n.º 1
0
def run_dftb(system, c, records):
    calc = Dftb(
        label='graphene',
        atoms=graphene,
        kpts=(1, 1, 1),
        run_manyDftb_steps=False,
        # Specific DFTB+ keywords
        Hamiltonian_SCC='Yes',
        Hamiltonian_SCCTolerance=1E-5,
        Hamiltonian_Charge=-1.0,
        Hamiltonian_Filling_='Fermi',
        Hamiltonian_Filling_Temperature='1E-6',
        Hamiltonian_SpinPolarisation_='Colinear',
        Hamiltonian_SpinPolarisation_UnpairedElectrons=1.0,
        Hamiltonian_SpinConstants_='',
        Hamiltonian_SpinConstants_C='{ -0.023}',
        Hamiltonian_ElectricField_='',
        Hamiltonian_ElectricField_PointCharges_='',
        Hamiltonian_ElectricField_PointCharges_CoordsAndCharges_='DirectRead',
        Hamiltonian_ElectricField_PointCharges_CoordsAndCharges_Records=records,
        Hamiltonian_ElectricField_PointCharges_CoordsAndCharges_File=
        'charges.dat')

    graphene.set_calculator(calc)
    calc.calculate(system)

    return ()
Exemplo n.º 2
0
def main():
    '''Main driver routine.'''
    system = read(GEO_PATH, format='gen')

    calc = Dftb(label='H2O_cluster',
                atoms=system,
                Hamiltonian_SCC='Yes',
                Hamiltonian_SCCTolerance='1.00E-010',
                Driver_='ConjugateGradient',
                Driver_MaxForceComponent='1.00E-008',
                Driver_MaxSteps=1000,
                Hamiltonian_MaxAngularMomentum_='',
                Hamiltonian_MaxAngularMomentum_O='"p"',
                Hamiltonian_MaxAngularMomentum_H='"s"')

    system.set_calculator(calc)
    calc.calculate(system)

    final = read('geo_end.gen')

    forces = system.get_forces()
    energy = system.get_potential_energy()
Exemplo n.º 3
0
def dftb_calc(path, calc_folder, sys):
    os.chdir(path)
    i = 0
    if os.path.exists(calc_folder):
        calc_folder += '_{0}'.format(i)
    while os.path.exists(calc_folder):
        i += 1
        last_underscore = calc_folder.rfind('_')
        calc_folder = calc_folder[:last_underscore+1] + str(i)

    os.makedirs(calc_folder)
    os.chdir(calc_folder)
    # Assuming C and H are always present
    args = {}
    if 'N' in sys.get_chemical_symbols():
        args['Hamiltonian_MaxAngularMomentum_N'] = '"p"'
    if 'O' in sys.get_chemical_symbols():
        args['Hamiltonian_MaxAngularMomentum_O'] = '"p"'

    calc = Dftb(label=calc_folder,
                atoms=sys,
                run_manyDftb_steps=True,
#                WriteResultsTag='Yes',
                Driver_='ConjugateGradient',
                Driver_MaxForceComponent='1E-4',
                Driver_MaxSteps=1000,
                Hamiltonian_MaxAngularMomentum_='',
                Hamiltonian_MaxAngularMomentum_C='"p"',
                Hamiltonian_MaxAngularMomentum_H='"s"',
                **args)

    sys.set_calculator(calc)
    sys.write('geo_start.xyz')
    calc.calculate(sys)
    os.chdir(os.pardir)
    return calc
Exemplo n.º 4
0
from ase.calculators.dftb import Dftb
from ase.io import write, read
from ase.build import molecule

atoms = molecule('H2O')
calc = Dftb(atoms=atoms,
            label='h2o',
            Driver_='ConjugateGradient',
            Driver_MaxForceComponent=1e-4,
            Driver_MaxSteps=1000,
            Hamiltonian_MaxAngularMomentum_='',
            Hamiltonian_MaxAngularMomentum_O='p',
            Hamiltonian_MaxAngularMomentum_H='s')
atoms.set_calculator(calc)

calc.calculate(atoms)
final = read('geo_end.gen')
write('final.xyz', final)
Exemplo n.º 5
0
from ase.calculators.dftb import Dftb
from ase.io import write, read

from ase.build import molecule
system = molecule('H2O')
calc = Dftb(label='h2o', atoms=system,
            run_manyDftb_steps=True,
            Driver_='ConjugateGradient',
            Driver_MaxForceComponent='1E-4',
            Driver_MaxSteps=1000,
            Hamiltonian_MaxAngularMomentum_='',
            Hamiltonian_MaxAngularMomentum_O='"p"',
            Hamiltonian_MaxAngularMomentum_H='"s"')
system.set_calculator(calc)
calc.calculate(system)
final = read('geo_end.gen')
write('test.final.xyz', final)
Exemplo n.º 6
0
from ase.calculators.dftb import Dftb
from ase.io import write, read

from ase.build import molecule

system = molecule('H2O')
calc = Dftb(label='h2o',
            atoms=system,
            run_manyDftb_steps=True,
            Driver_='ConjugateGradient',
            Driver_MaxForceComponent='1E-4',
            Driver_MaxSteps=1000,
            Hamiltonian_MaxAngularMomentum_='',
            Hamiltonian_MaxAngularMomentum_O='"p"',
            Hamiltonian_MaxAngularMomentum_H='"s"')
system.set_calculator(calc)
calc.calculate(system)
final = read('geo_end.gen')
write('test.final.xyz', final)
Exemplo n.º 7
0
def test_dftb_bandstructure():
    import os
    import subprocess
    from unittest import SkipTest
    from ase.test import require
    from ase.test.testsuite import datafiles_directory
    from ase.calculators.dftb import Dftb
    from ase.build import bulk

    require('dftb')

    os.environ['DFTB_PREFIX'] = datafiles_directory

    # We need to get the DFTB+ version to know
    # whether to skip this test or not.
    # For this, we need to run DFTB+ and grep
    # the version from the output header.
    cmd = os.environ['ASE_DFTB_COMMAND'].split()[0]
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)

    lines = ''
    for line in proc.stdout:
        l = line.decode()
        if 'DFTB+' in l and ('version' in l.lower() or 'release' in l.lower()):
            version = l[l.index('DFTB+'):]
            break
        lines += l + '\n'
    else:
        raise RuntimeError('Could not parse DFTB+ version ' + lines)

    if '17.1' not in version:
        msg = 'Band structure properties not present in results.tag for ' + version
        raise SkipTest(msg)

    # The actual testing starts here
    calc = Dftb(label='dftb',
                kpts=(3, 3, 3),
                Hamiltonian_SCC='Yes',
                Hamiltonian_SCCTolerance=1e-5,
                Hamiltonian_MaxAngularMomentum_Si='d')

    atoms = bulk('Si')
    atoms.set_calculator(calc)
    atoms.get_potential_energy()

    efermi = calc.get_fermi_level()
    assert abs(efermi - -2.90086680996455) < 1.

    # DOS does not currently work because of
    # missing "get_k_point_weights" function
    #from ase.dft.dos import DOS
    #dos = DOS(calc, width=0.2)
    #d = dos.get_dos()
    #e = dos.get_energies()
    #print(d, e)

    calc = Dftb(atoms=atoms,
                label='dftb',
                kpts={
                    'path': 'WGXWLG',
                    'npoints': 50
                },
                Hamiltonian_SCC='Yes',
                Hamiltonian_MaxSCCIterations=1,
                Hamiltonian_ReadInitialCharges='Yes',
                Hamiltonian_MaxAngularMomentum_Si='d')

    atoms.set_calculator(calc)
    calc.calculate(atoms)

    calc.results['fermi_levels'] = [efermi]
    calc.band_structure()