Skip to main content

TS Optimization + Imaginary-Mode Cleaning

A transition-state optimization with automatic imaginary-frequency displacement. This job first performs a saddle-point search on a TS guess and then, if more than one imaginary frequency is found, automatically displaces the geometry along the spurious modes and re-optimizes.

What It Runs

For each submitted job, Atomiverse executes:

  1. Saddle-point optimization on the TS guess.
  2. Vibrational analysis on the optimized structure.
  3. If multiple imaginary frequencies are found: displacement along each spurious mode followed by constrained (minimum) optimization.
  4. Final vibrational check on the cleaned structure.

The goal is to produce a transition state with exactly one imaginary frequency — the reaction coordinate mode.

Your First TS Opt + Imag Cleaning

import atomiverse
from atomiverse import (
Atoms,
JobFailedError,
TSOptimizationWithImagDisplacement,
)
from atomiverse.levels import GFN2_XTB

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

ts_guess = Atoms.from_smiles("[H][H]")

job = TSOptimizationWithImagDisplacement(
ts_atoms=ts_guess,
level_of_theory=GFN2_XTB,
)
job.submit()

try:
result = job.require_result()
except JobFailedError as exc:
print(f"Job failed: {exc.failure.error}")
else:
print(f"TS Energy: {result.energy:.6f} eV")
print(f"Imag. freq: {result.imaginary_frequency_cm1} cm⁻¹")
print(f"Imag. before cleaning: {result.n_imag_initial}")
print(f"Imag. after cleaning: {result.n_imag_final}")

Input Parameters

Required:

  • ts_atoms: transition-state guess structure
  • level_of_theory: electronic-structure method

Optional:

  • charge (default 0)
  • multiplicity (default 1)
  • amplitude (default 0.2): scaling factor for displacement along normal modes. Larger values push the geometry further from the saddle point.
  • max_iterations (default 3, max 10): maximum number of iterative imag-cleaning cycles.
job = TSOptimizationWithImagDisplacement(
ts_atoms=ts_guess,
charge=0,
multiplicity=1,
level_of_theory=GFN2_XTB,
amplitude=0.3,
max_iterations=5,
)

Result

job.require_result() returns a TSOptimizationWithImagDisplacementResult.

FieldTypeDescription
optimized_ts_atomsAtomsFinal TS structure after optimization / cleaning.
energyfloatFinal energy in eV.
imaginary_frequency_cm1float | NoneRemaining imaginary frequency (the reaction mode).
n_imag_initialintNumber of imaginary modes before cleaning.
n_imag_finalintNumber of imaginary modes after cleaning.
displaced_modeslist[int]Indices of modes that were displaced.
ts_optimization_trajectorylist[TrajectoryStep]Steps of the initial saddle-point search.

Non-blocking Submission

from atomiverse import State

job.submit(wait=False)
job.refresh()

if job.state == State.DONE:
result = job.require_result()
print(f"TS Energy: {result.energy:.6f} eV")
elif job.state == State.FAILED:
print(job.require_failure().error)