Vibrational analysis with ASE¶
If the ASE module is present, it can be used to calculate numerical vibrational frequencies and IR intensities in parallel.
See the ASE documentation for a detailed overview of its capabilities. The VibrationsJob
class provides an easy to use interface to the ase.vibrations.Vibrations
class, allowing for parallel calculations of single-point gradients and therefore speeding up any Frequency calculation by a factor equal to the atomic displacements beeing calculated. The IRJob
class is a child of VibrationsJob
and provides access to the ase.vibrations.Infrared
class.
Example¶
settings = Settings()
settings.input.symmetry = 'nosym'
settings.input.basis.type = 'DZ'
settings.input.basis.core = 'None'
settings.input.xc.gga = 'PBE'
settings.input.basis.createoutput = 'None'
settings.input.noprint = 'logfile'
settings.input.gradient = True
#Use previously converged coefficients to speed up convergence - saves a lot of CPU time!!
#settings.input.restart._h = os.path.join(os.getcwd(),'restart.t21')+' &'
#settings.input.restart.nogeo = True
mol = Molecule('mol.xyz') # read Molecule from mol.xyz
irJob = IRJob(molecule=mol, settings=settings, aseVibOpt={ 'indices': [1], 'nfree': 4 })
irJob.run()
ir = irJob.results.get_ASEVib()
ir.summary(method='Frederiksen')
API¶
-
class
VibrationsJob
(molecule, settings, jobType=ADFJob, get_gradients='get_gradients', aseVibOpt={}, name='plams.vib')[source]¶ Class for calculating numerical Frequencies in parallel using arbitrary interfaces. This is achieved using the Vibrations class from ASE.
name
– Name of theMultiJob
molecule
–Molecule
object (most propably in the chosen Methods optimized state)settings
–Settings
instance for all Single-Point jobs to be run. Don’t forget reference to a restart file if you want to save a lot of computer time!jobType
–Job
Class you want to use.get_gradients
– Function name to retrieve gradients of theResults
object of your chosenjobType.results
. Must take optionsenergy_unit='eV'
anddist_unit='Angstrom'
.aseVibOpt
– Options forase.vibrations.Vibrations.__init__
The
self.__init__()
method calls on ase.vibrations.Vibrations.run to create all displacements, then adds them as children. After running, theself.postrun()
method reads the gradients from all single-points and saves them according to the ASE scheme. Finally the ASE Vibrations object is made accessible inself.results.get_ASEVib
for the retrieval of the ASE results.-
__init__
(molecule, settings, jobType=<class 'scm.plams.interfaces.adfsuite.adf.ADFJob'>, get_gradients='get_gradients', aseVibOpt={}, name='plams.vib')[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
new_children
()[source]¶ Generate new children jobs.
This method is useful when some of children jobs are not known beforehand and need to be generated based on other children jobs, like for example in any kind of self-consistent procedure.
The goal of this method is to produce a new portion of children jobs. Newly created jobs should be returned in a container compatible with
self.children
(e.g. list for list, dict for dict). No adjustment of newly created jobs’parent
attribute is needed. This method cannot modify_active_children
attribute.The method defined here is a default template, returning
None
, which means no new children jobs are generated and the entire execution of the parent job consists only of running jobs initially found inself.children
. To modify this behavior you can override this method in aMultiJob
subclass or you can use one of Binding decorators, just like with Prerun and postrun methods.
-
postrun
()[source]¶ Actions to take just after the actual job execution.
This method is initially empty, it can be defined in subclasses or directly added to either the whole class or a single instance using Binding decorators.
-
class
VibrationsResults
(job)[source]¶ A Class for handling numerical Vibrational analysis Results.
Use
get_ASEVib()
to access thease.vibrations.Vibrations
object. Using e.g.self.get_ASEVib().summary()
the results of the ASE frequency calculation are accessible.
-
class
IRJob
(molecule, settings, get_dipole_vector='get_dipole_vector', **kwargs)[source]¶ Subclass of
VibrationsJob
to calculate IR modes and intensities.Usage is the same as for the parent class, see
VibrationsJob
.Additional arguments:
get_dipole_vector
– Function name to retrieve dipole vector of theResults
object. Must take argumentunit='au'
.
-
__init__
(molecule, settings, get_dipole_vector='get_dipole_vector', **kwargs)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
postrun
()[source]¶ Actions to take just after the actual job execution.
This method is initially empty, it can be defined in subclasses or directly added to either the whole class or a single instance using Binding decorators.