Source code for tcutility.job.dftb
from tcutility.job.ams import AMSJob
from tcutility import results
import os
j = os.path.join
[docs]
class DFTBJob(AMSJob):
'''
Setup and run a density functional with tight-binding (DFTB) calculation as implemented in the Amsterdam modelling suite (AMS).
This class supports all methods of the parent :class:`AMSJob <tcutility.job.ams.AMSJob>`.
'''
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.settings = results.Result()
self._model = None
self.kspace('Good')
self.single_point()
self.model('GFN1-xTB')
self.solvent('vacuum')
[docs]
def kspace(self, quality: str = 'Good'):
'''
Set the k-space integration quality for this job.
Args:
quality: the type of basis-set to use. Default is ``Good``.
'''
self.settings.input.DFTB.kspace.quality = quality
[docs]
def model(self, name: str = 'GFN1-xTB', dispersion: str = None, parameter_dir: str = None):
'''
Set the model Hamiltonian for the job to use.
Args:
name: name of the model Hamiltonian. This is the same name as the one in the DFTB gui. Default is ``GFN1-xTB``.
'''
self.settings.input.DFTB.Model = name
if dispersion is None:
for disp_suffix in ['-UFF', '-ULG', '-D2', '-D3-BJ', '-D4', '-Auto']:
if not name.endswith(disp_suffix):
continue
self.settings.input.DFTB.DispersionCorrection = disp_suffix[1:]
self.settings.input.DFTB.Model[:-len(disp_suffix)]
else:
self.settings.input.DFTB.DispersionCorrection = dispersion
if parameter_dir:
self.settings.input.DFTB.ResourcesDir = parameter_dir
[docs]
def solvent(self, name: str = None, grid_size=974):
'''
Model solvation using the GBSA model.
Args:
name: the name of the solvent you want to use. Must be ``None``, ``Acetone``, ``Acetonitrile``, ``CHCl3``, ``CS2``, ``DMSO``, ``Ether``, ``H2O``, ``Methanol``, ``THF`` or ``Toluene``.
grid_size: the size of the grid used to construct the solvent accessible surface. Must be ``230``, ``974``, ``2030`` or ``5810``.
'''
if name == 'vacuum':
self.settings.input.DFTB.pop('solvation', None)
return
self.settings.input.DFTB.Solvation.Solvent = name
self.settings.input.DFTB.Solvation.SurfaceGrid = grid_size
if __name__ == '__main__':
with DFTBJob(test_mode=False, overwrite=True) as job:
job.rundir = 'tmp/SN2'
job.name = 'DFTB'
job.molecule('../../../test/fixtures/xyz/transitionstate_radical_addition.xyz')
job.sbatch(p='tc', ntasks_per_node=15)
job.model('GFN1-xTB')
job.optimization()
job.kspace('Good')
job.solvent('H2O')