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 ()
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()
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
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)
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)
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()