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
| Parameter | Type | Description |
|---|---|---|
reactant_atoms | Atoms | Optimized reactant geometry |
reactant_hessian | list[list[float]] | Cartesian Hessian in Hartree/Ų from reactant vibrational analysis |
reactant_frequencies | list[float] | Harmonic frequencies in cm⁻¹ from reactant vibrational analysis |
ts_atoms | Atoms | Optimized transition-state geometry |
ts_hessian | list[list[float]] | Cartesian Hessian in Hartree/Ų from TS vibrational analysis |
ts_frequencies | list[float] | Harmonic frequencies in cm⁻¹ from TS vibrational analysis (must contain at least one imaginary mode) |
isotopes | list[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 |
temperature | float | Temperature in Kelvin (default 298.15) |
freq_scale_factor | float | Harmonic frequency scaling factor (default 1.0) |
Result
job.require_result() returns a KineticIsotopeEffectResult:
| Field | Type | Description |
|---|---|---|
kie | float | Final KIE including the Bell tunneling correction |
kie_no_tunnel | float | KIE without tunneling |
freq_factor | float | Ratio of TS imaginary frequencies ν‡_L / ν‡_H |
zpe_contrib | float | Zero-point-energy contribution |
exc_contrib | float | Vibrational excitation (temperature-dependent) contribution |
trpf_contrib | float | Teller–Redlich product-factor contribution |
tunnel_corr | float | Bell infinite-parabola tunneling correction factor |
ts_imag_freq_light | float | Imaginary frequency (cm⁻¹) of the light TS isotopologue |
ts_imag_freq_heavy | float | Imaginary frequency (cm⁻¹) of the heavy TS isotopologue |
Theory
The Bigeleisen–Mayer equation decomposes the KIE into four multiplicative factors:
| Term | Meaning |
|---|---|
| ν‡_L / ν‡_H | Ratio of imaginary frequencies at the transition state |
| ZPE | Zero-point energy contribution |
| EXC | Vibrational excitation (temperature-dependent) |
| TRPF | Teller–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 isotope | Heavy 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.