Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Vibrational spectroscopies

VeloxChem provides simulations of vibrational spectroscopies by evaluating molecular force constants and deriving normal modes whose frequencies and transition properties form the basis for IR and Raman spectra. Building on a converged ground‑state DFT reference, the program computes the molecular Hessian and transforms it to mass‑weighted internal coordinates to obtain physically meaningful vibrational modes, while subsequent response‑theory evaluations yield dipole‑derivative and polarizability‑derivative quantities that determine vibrational intensities. Together, these capabilities enable predictions of both harmonic vibrational frequencies and their associated infrared and Raman signatures.

The calculation of normal modes is performed with the aid of geomeTRIC.

Infrared

Infrared (IR) spectroscopy in VeloxChem is based on the calculation of harmonic vibrational frequencies and their dipole‑moment derivatives, which determine the intensity of each normal‑mode transition. Starting from a ground state DFT reference, the molecular Hessian is evaluated and transformed into mass‑weighted normal modes, whose frequencies and IR intensities together form the vibrational spectrum.

Python script

import veloxchem as vlx

molecule = vlx.Molecule.read_name("formaldehyde")
basis = vlx.MolecularBasis.read(molecule, "def2-svp")

scf_drv = vlx.ScfRestrictedDriver()
scf_drv.xcfun = "b3lyp"
results = scf_drv.compute(molecule, basis)

vib_drv = vlx.VibrationalAnalysis(scf_drv)
vib_drv.do_ir = True

vib_results = vib_drv.compute(molecule, basis)
<Figure size 800x500 with 2 Axes>

Text file

@jobs
task: vibrational
@end

@method settings
xcfun: b3lyp
basis: def2-svp
@end

@vibrational
do_ir: yes
@end

@molecule
charge: 0
multiplicity: 1
xyz:
...                     
@end

Raman

Raman spectroscopy in VeloxChem is based on evaluating harmonic vibrational frequencies together with the derivatives of the molecular polarizability tensor, which determine the Raman scattering strength of each normal mode. Using the Hessian, the normal modes are obtained in their mass‑weighted form and used to compute Raman intensities from the corresponding polarizability changes. This framework enables prediction of Raman‑active vibrational features and provides a complementary perspective to IR spectroscopy through polarizability‑based selection rules.

Python script

import veloxchem as vlx

molecule = vlx.Molecule.read_name("formaldehyde")
basis = vlx.MolecularBasis.read(molecule, "def2-svp")

scf_drv = vlx.ScfRestrictedDriver()
scf_drv.xcfun = "b3lyp"
results = scf_drv.compute(molecule, basis)

vib_drv = vlx.VibrationalAnalysis(scf_drv)
vib_drv.do_ir = False
vib_drv.do_raman = True

vib_results = vib_drv.compute(molecule, basis)
<Figure size 800x500 with 2 Axes>

Text file

@jobs
task: vibrational
@end

@method settings
xcfun: b3lyp
basis: def2-svp
@end

@vibrational
do_raman: yes
@end

@molecule
charge: 0
multiplicity: 1
xyz:
...                     
@end

Resonance Raman

In resonance Raman spectroscopy, the vibrational intensities are selectively amplified when the excitation frequency is tuned close to an allowed electronic transition; in practice, we are often concerned with the spectrum at the transition energy of the first excited state (S1_1).

VeloxChem implements resonance Raman spectroscopy based on geometric derivatives of the complex polarizability. For further details on this approach, see Saidi & Norman (2014).

Loading...
S1 excitation energy:   0.141911 (a.u.)

Python script

import veloxchem as vlx
import numpy as np

molecule = vlx.Molecule.read_name("formaldehyde")
basis = vlx.MolecularBasis.read(molecule, "def2-svp")

scf_drv = vlx.ScfRestrictedDriver()
scf_drv.xcfun = "b3lyp"
scf_results = scf_drv.compute(molecule, basis)

vib_drv = vlx.VibrationalAnalysis(scf_drv)
vib_drv.do_ir = False
vib_drv.do_raman = False
vib_drv.do_resonance_raman = True

vib_drv.frequencies = [0.141911]

vib_results = vib_drv.compute(molecule, basis)
<Figure size 800x500 with 2 Axes>

Text file

@jobs
task: vibrational
@end

@method settings
xcfun: b3lyp
basis: def2-svp
@end

@vibrational
do_resonance_raman: yes
frequencies: 0.05-0.10 (0.05)
@end

@molecule
charge: 0
multiplicity: 1
xyz:
...                      
@end
References
  1. Saidi, W. A., & Norman, P. (2014). Probing single-walled carbon nanotube defect chemistry using resonance Raman spectroscopy. Carbon, 67, 17–26. 10.1016/j.carbon.2013.09.045