Skip to main content

Kinetic Isotope Effect

Compute a harmonic Kinetic Isotope Effect (KIE) from pre-computed vibrational analyses using the Bigeleisen–Mayer equation with a Bell infinite-parabola tunneling correction.

The KIE is the ratio of rate constants for the light and heavy isotopologues: KIE = k(light) / k(heavy). A value greater than 1 means the light isotopologue reacts faster, which is commonly observed for primary hydrogen KIEs.

Quick Start

The KIE job requires vibrational analyses (hessians and frequencies) for both the reactant and transition state. Run those first, then feed the results into a KineticIsotopeEffect job:

import atomiverse
from atomiverse import (
Atoms,
KineticIsotopeEffect,
Vibrations,
)
from atomiverse.levels import GFN2_XTB

atomiverse.configure(api_key="your-api-key")

# 1. Optimize geometries (not shown) and run vibrational analyses
reactant = Atoms.from_smiles("CC")
ts = Atoms.from_smiles("[CH2]C") # simplified TS for illustration

rct_vib = Vibrations(atoms=reactant, level_of_theory=GFN2_XTB)
ts_vib = Vibrations(atoms=ts, level_of_theory=GFN2_XTB)

rct_vib.submit(wait=True)
ts_vib.submit(wait=True)

rct_res = rct_vib.require_result()
ts_res = ts_vib.require_result()

# 2. Compute the KIE for H → D on atom index 0
kie_job = KineticIsotopeEffect(
reactant_atoms=reactant,
reactant_hessian=rct_res.hessian,
reactant_frequencies=rct_res.frequencies,
ts_atoms=ts,
ts_hessian=ts_res.hessian,
ts_frequencies=ts_res.frequencies,
isotopes=[0], # substitute atom 0 with its heavy isotope
temperature=298.15, # K
freq_scale_factor=1.0,
)

kie_job.submit(wait=True)
result = kie_job.require_result()

print(f"KIE (with tunneling) : {result.kie:.4f}")
print(f"KIE (no tunneling) : {result.kie_no_tunnel:.4f}")
print(f"TS imag freq (light) : {result.ts_imag_freq_light:.2f}i cm⁻¹")

Inputs

ParameterTypeDescription
reactant_atomsAtomsOptimized reactant geometry
reactant_hessianlist[list[float]]Cartesian Hessian in Hartree/Ų from reactant vibrational analysis
reactant_frequencieslist[float]Harmonic frequencies in cm⁻¹ from reactant vibrational analysis
ts_atomsAtomsOptimized transition-state geometry
ts_hessianlist[list[float]]Cartesian Hessian in Hartree/Ų from TS vibrational analysis
ts_frequencieslist[float]Harmonic frequencies in cm⁻¹ from TS vibrational analysis (must contain at least one imaginary mode)
isotopeslist[int] or dict[int, float]List: atom indices to substitute with common heavy isotopes (¹H→²D, ¹²C→¹³C, ¹⁶O→¹⁷O, etc.). Dict: {atom_index: heavy_mass} for explicit masses in amu
temperaturefloatTemperature in Kelvin (default 298.15)
freq_scale_factorfloatHarmonic frequency scaling factor (default 1.0)

Result

job.require_result() returns a KineticIsotopeEffectResult:

FieldTypeDescription
kiefloatFinal KIE including the Bell tunneling correction
kie_no_tunnelfloatKIE without tunneling
freq_factorfloatRatio of TS imaginary frequencies ν‡_L / ν‡_H
zpe_contribfloatZero-point-energy contribution
exc_contribfloatVibrational excitation (temperature-dependent) contribution
trpf_contribfloatTeller–Redlich product-factor contribution
tunnel_corrfloatBell infinite-parabola tunneling correction factor
ts_imag_freq_lightfloatImaginary frequency (cm⁻¹) of the light TS isotopologue
ts_imag_freq_heavyfloatImaginary frequency (cm⁻¹) of the heavy TS isotopologue

Theory

The Bigeleisen–Mayer equation decomposes the KIE into four multiplicative factors:

TermMeaning
ν‡_L / ν‡_HRatio of imaginary frequencies at the transition state
ZPEZero-point energy contribution
EXCVibrational excitation (temperature-dependent)
TRPFTeller–Redlich product factor

The Bell correction accounts for quantum tunneling through a parabolic barrier. It is only valid when h c ν‡ / 2 k_B T < π. At very low temperatures or for large imaginary frequencies the correction can become unreliable — a warning is logged in such cases.

Isotope Specification

List mode (auto-detection)

Pass a list of atom indices. The current mass of each atom is inspected and the common heavy isotope is selected automatically:

kie_job = KineticIsotopeEffect(
...,
isotopes=[0, 3, 5], # auto-detect: ¹H→²H(D), ¹²C→¹³C, etc.
)

Supported auto-detections:

Light isotopeHeavy isotope
¹H (1.008)²H / D (2.014)
¹²C (12.000)¹³C (13.003)
¹⁴N (14.003)¹⁵N (15.000)
¹⁶O (15.995)¹⁷O (16.999)
³²S (31.972)³⁴S (33.968)
³⁵Cl (34.969)³⁷Cl (36.966)
⁷⁹Br (78.918)⁸¹Br (80.916)

Dict mode (explicit masses)

For uncommon isotopes or precise control, specify masses directly:

kie_job = KineticIsotopeEffect(
...,
isotopes={0: 2.01410178, 5: 18.000}, # H→D, O→¹⁸O
)

Compute Resources

KIE calculations are lightweight — they only diagonalize a few matrices and compute statistical-mechanical partition sums. Typical runtime is under one minute regardless of system size.