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.

Polarizability

The calculation of molecular polarizabilities in VeloxChem is based on linear‑response theory, where the induced dipole moment is evaluated as a function of an external electric field to obtain the polarizability tensor. Starting from the ground state DFT reference, the frequency‑dependent response equations are solved to provide both static and dynamic polarizabilities, which serve as the foundation for describing optical properties such as refractive indices and light‑scattering behavior.

The linear electric-dipole polarizabilty is determined from the linear response function

ααβ(ω)=μ^α;μ^βω\alpha_{\alpha\beta}(\omega) = - \langle\langle \hat{\mu}_\alpha; \hat{\mu}_\beta \rangle \rangle_\omega

where μ^α\hat{\mu}_\alpha is the electric-dipole operator along Cartesian coordinate α\alpha and ω\omega is the optical angular frequency.

At optical frequencies well separated from transition frequencies in the system, the polarizability is real, whereas in near-resonance or resonance regions of the spectrum, it becomes complex. For further theoretical details, see Norman et al. (2018).

Nonresonant region

In the nonresonant region, where the driving field lies far from any electronic transition, the molecular polarizability varies smoothly with frequency, and the response is dominated by elastic Rayleigh scattering arising from the real part of the polarizability tensor, while the imaginary component remains vanishingly small due to the absence of absorption.

Python script

import veloxchem as vlx

molecule = vlx.Molecule.read_name("methane")
basis = vlx.MolecularBasis.read(molecule, "def2-svpd")

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

lr_drv = vlx.LinearResponseDriver()

lr_drv.property = "polarizability"
lr_drv.frequencies = [0.0656]  # static field is default

lr_results = lr_drv.compute(molecule, basis, scf_results)

Text file

@jobs
task: response
@end

@method settings
basis: aug-cc-pvdz
@end

@response
property: polarizability
frequencies: 0-0.25 (0.05)
@end

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

The frequencies of the perturbing electric field is specified as a list in the Python script input file and as a frequency region with a frequency point separation in parenthesis in the text file input.

Resonant region

In the resonant region, the molecular polarizability exhibits strong frequency dependence as the probing field approaches an electronic transition, leading to large dispersive features in the real part and the emergence of an imaginary component directly associated with absorption and radiative damping processes.

Python script

import numpy as np
import veloxchem as vlx

molecule = vlx.Molecule.read_molecule_string("""
C        0.67759997    0.00000000    0.00000000
C       -0.67759997    0.00000000    0.00000000
H        1.21655197    0.92414474    0.00000000
H        1.21655197   -0.92414474    0.00000000
H       -1.21655197   -0.92414474    0.00000000
H       -1.21655197    0.92414474    0.00000000
""")
basis = vlx.MolecularBasis.read(molecule, "def2-svpd")

scf_drv = vlx.ScfRestrictedDriver()

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

crs = vlx.ComplexResponse()

# to be implemented (together with a plot function)
#crs.property = "polarizability"

crs.a_operator = "electric dipole"
crs.b_operator = "electric dipole"

crs.a_components = ["x"]
crs.b_components = ["x"]

crs.frequencies = np.arange(0.0, 0.4, 0.0025)

crs_results = crs.compute(molecule, basis, scf_results)
<Figure size 640x480 with 1 Axes>
References
  1. Norman, P., Ruud, K., & Saue, T. (2018). Principles and practices of molecular properties. John Wiley & Sons, Ltd.