eOn
    • rgpycrumbs Python helpers for eOn workflows
    • chemparseplot Parsing and plotting for computational chemistry
/

Contents

  • eOn Team
  • Installation
  • Obtaining sources
  • Licenses
  • Tutorials
    • AKMC Tutorial
    • Running a Parallel Replica Job
    • Targeted Displacement for Saddle Searches
    • Dictionary-Style Configuration
    • Visualizing Optimization Trajectories
    • CECAM Workshop 2024
      • Virtualbox Troublshooting
  • User Guide
    • External Potential
    • LAMMPS Potential
    • ASE Interface
    • Metatomic Interface
    • QUIP with LAMMPS
    • MPI Potential
    • Choosing an algorithm
    • General Simulation Parameters
    • Potential
    • Structure Comparison
    • Optimizer
    • Minimization
    • Nudged Elastic Band
    • Dimer method
    • Lanczos
    • ARTn (Activation-Relaxation Technique nouveau)
    • Hessian
    • Prefactor
    • Adaptive Kinetic Monte Carlo
    • Saddle Search
    • Basin Hopping
    • Process Search
    • Recycling
    • Coarse Graining
    • Dynamics
    • Parallel Replica
    • Hyperdynamics
    • Communicator
    • Debug
    • Paths
    • Kinetic Database
    • Serve Mode
  • Development Documentation
    • Tests
    • Benchmarks
    • Parallel Force Evaluation
    • Working with the documentation
    • Subversion
    • Migrating from SVN
    • Tracking changes
    • Release workflow
  • API Reference
    • eon
      • eon.mcamc
        • eon.mcamc.mcamc
        • eon.mcamc.test
      • eon.locking
      • eon.displace
      • eon.akmcstate
      • eon.prstatelist
      • eon.config
      • eon.superbasin
      • eon.akmcstatelist
      • eon.escaperate
      • eon.state
      • eon.atoms
      • eon.askmc
      • eon.prstate
      • eon.eon_kdb
      • eon.communicator
      • eon.recycling
      • eon.explorer
      • eon.movie
      • eon.server
      • eon.parallelreplica
      • eon.fileio
      • eon.statelist
      • eon.superbasinscheme
      • eon.basinhopping
      • eon.mpiwait
      • eon.akmc
  • Releases
    • Changelog
    • [v2.14.0] - 2026-XX-XX
      • Release notes
    • [v2.13.0] - 2026-XX-XX
      • Release notes
    • [v2.12.0] - 2026-03-08
      • Release notes
    • [v2.11.2] - 2026-03-02
      • Release notes
    • [v2.11.1] - 2026-03-01
      • Release notes
    • [v2.11.0] - 2026-02-24
      • Release notes
    • [v2.10.2] - 2026-02-22
      • Release notes
    • [v2.10.1] - 2026-02-18
      • Release notes
    • [v2.10.0] - 2026-02-15
      • Release notes
    • [v2.9.0] - 2026-01-27
      • Release notes
      • Related Publications
    • [v2.8.2] - 2025-12-01
      • Release notes
    • [v2.8.1] - 2025-11-03
      • Release notes
      • Related Publications
    • [v2.8.0] - 2025-09-04
      • Release notes
      • Related Publications

On this page

  • Displacement Strategies
    • Epicenters and Weight-Based Selection
    • Radius and Magnitude
    • Displacing All Listed Atoms
    • Dynamic Atom Lists via Scripts
    • Client-Side Displacement
  • Configuration
    • SaddleSearchConfig
      • bowl_active_atoms
      • bowl_breakout
      • client_displace_type
      • confine_positive
      • confine_positive_boost
      • confine_positive_min_active
      • confine_positive_min_force
      • confine_positive_scale_ratio
      • converged_force
      • disp_at_random
      • displace_1d
      • displace_all_listed
      • displace_atom_kmc_state_script
      • displace_atom_list
      • displace_least_coordinated_weight
      • displace_listed_atom_weight
      • displace_listed_type_weight
      • displace_magnitude
      • displace_max_coordination
      • displace_min_norm
      • displace_not_FCC_HCP_weight
      • displace_not_TCP_BCC_weight
      • displace_not_TCP_weight
      • displace_radius
      • displace_random_weight
      • displace_type_list
      • displace_under_coordinated_weight
      • displace_water_weight
      • dynamics_linear_interpolation
      • dynamics_max_init_curvature
      • dynamics_record_interval
      • dynamics_state_check_interval
      • dynamics_temperature
      • max_energy
      • max_iterations
      • max_single_displace
      • max_step_size
      • method
      • min_mode_method
      • molecule_list
      • nonlocal_count_abort
      • nonlocal_distance_abort
      • nonnegative_displacement_abort
      • perp_force_ratio
      • random_mode
      • remove_rotation
      • stdev_rotation
      • stdev_translation
      • void_bias_fraction
      • zero_mode_abort_curvature
  • Output
  • See also
  • References
TheochemUI/eOn 0 0
Edit this page
  1. eOn /
  2. User Guide /
  3. Saddle Search
View as Markdown Open in ChatGPT Open in Claude

Saddle Search¶

A saddle search is initiated by making a local displacement of atoms from their position at the minimum of the current state. This displacement can be done using the different strategies indicated by the client_displace_type option, and the following parameters. If the user knows something about the local environment where reactions are likely to take place in the system, this information can be used to make saddle searches more efficient by getting them started in the right part of configuration space.

Displacement Strategies¶

Epicenters and Weight-Based Selection¶

Each saddle search begins by choosing an epicenter — a single atom around which the initial displacement is constructed. The epicenter is selected probabilistically from several strategies, each controlled by a relative weight:

Weight parameter

Strategy

displace_random_weight

Pick any atom at random

displace_least_coordinated_weight

Pick an atom with the lowest coordination number

displace_not_FCC_HCP_weight

Pick an atom whose local environment is neither FCC nor HCP

displace_under_coordinated_weight

Pick an atom with coordination ≤ displace_max_coordination

displace_listed_atom_weight

Pick an atom from displace_atom_list

displace_listed_type_weight

Pick an atom whose type is in displace_type_list

The weights do not need to sum to 1 — they are normalised internally. Setting a weight to 0 disables that strategy. For example, setting only displace_listed_atom_weight = 1.0 and all other weights to 0 ensures that every saddle search starts from an atom in the explicit list.

Radius and Magnitude¶

Once the epicenter is chosen, all atoms within displace_radius of the epicenter are displaced. Each displaced atom receives a random perturbation drawn from a Gaussian distribution with standard deviation displace_magnitude (in Ångströms) independently in each Cartesian direction.

Displacing All Listed Atoms¶

When displace_all_listed is true and a listed-atom strategy is selected, every atom in displace_atom_list (or displace_type_list) is displaced — not just one chosen at random. Atoms within displace_radius of any displaced atom are also included. Set displace_radius to 0 to restrict the displacement strictly to the listed atoms.

Dynamic Atom Lists via Scripts¶

For systems where the relevant atoms change from state to state (e.g. a migrating vacancy), a static list is insufficient. The displace_atom_kmc_state_script option lets you specify a Python script that is executed once per new AKMC state to determine the atom list dynamically. See the Targeted Displacement for Saddle Searches tutorial for worked examples covering vacancy diffusion and adsorbate-on-surface scenarios.

Client-Side Displacement¶

The client_displace_type option selects how the client (C++ code) picks the epicenter when the displacement is performed client-side rather than by the server:

  • random — uniform random atom

  • last_atom — the last atom in the configuration

  • min_coordinated — the atom with the fewest neighbours

  • not_fcc_or_hcp — an atom whose local structure is neither FCC nor HCP

  • listed_atoms — an atom from displace_atom_list (parsed from the INI config; no server displacement file needed)

  • load — read a displacement vector from a file written by the server

Configuration¶

[Saddle Search]
pydantic model eon.schema.SaddleSearchConfig[source]¶

Show JSON schema
{
   "title": "SaddleSearchConfig",
   "type": "object",
   "properties": {
      "method": {
         "default": "min_mode",
         "description": "Method to locate the saddle point.",
         "enum": [
            "min_mode",
            "dynamics",
            "basin_hopping",
            "bgsd",
            "artn"
         ],
         "title": "Method",
         "type": "string"
      },
      "min_mode_method": {
         "default": "dimer",
         "description": "Min-mode method to use.",
         "enum": [
            "dimer",
            "lanczos",
            "gprdimer",
            "artn"
         ],
         "title": "Min Mode Method",
         "type": "string"
      },
      "disp_at_random": {
         "default": 1,
         "description": "Legacy displacement control flag used by the client.",
         "title": "Disp At Random",
         "type": "integer"
      },
      "max_energy": {
         "default": 20.0,
         "description": "The energy at which a saddle search is considered bad and terminated.",
         "title": "Max Energy",
         "type": "number"
      },
      "max_step_size": {
         "default": 0.2,
         "description": "Maximum step size for saddle-search displacement updates.",
         "title": "Max Step Size",
         "type": "number"
      },
      "displace_radius": {
         "default": 5.0,
         "description": "Atoms within this distance of the epicenter will be displaced.",
         "title": "Displace Radius",
         "type": "number"
      },
      "displace_magnitude": {
         "default": 0.1,
         "description": "The standard deviation of the Gaussian displacement in each degree of freedom for the selected atoms.",
         "title": "Displace Magnitude",
         "type": "number"
      },
      "displace_min_norm": {
         "default": 0.0,
         "description": "Minimum displacement norm enforced for the initial perturbation.",
         "title": "Displace Min Norm",
         "type": "number"
      },
      "displace_random_weight": {
         "default": 0.0,
         "description": "Relative probability to displace with a random epicenter.",
         "title": "Displace Random Weight",
         "type": "number"
      },
      "displace_not_FCC_HCP_weight": {
         "default": 0.0,
         "description": "Relative probability to displace with an epicenter that is not FCC or HCP coordinated.",
         "title": "Displace Not Fcc Hcp Weight",
         "type": "number"
      },
      "displace_not_TCP_BCC_weight": {
         "default": 0.0,
         "description": "Relative probability to displace with an epicenter that is not TCP or BCC coordinated.",
         "title": "Displace Not Tcp Bcc Weight",
         "type": "number"
      },
      "displace_not_TCP_weight": {
         "default": 0.0,
         "description": "Relative probability to displace with an epicenter that is not TCP coordinated.",
         "title": "Displace Not Tcp Weight",
         "type": "number"
      },
      "displace_water_weight": {
         "default": 0.0,
         "description": "Relative probability to displace with an epicenter selected by the water heuristic.",
         "title": "Displace Water Weight",
         "type": "number"
      },
      "displace_least_coordinated_weight": {
         "default": 0.0,
         "description": "Relative probability to displace with an epicenter that has a coordination number equal to the least-coordinated atom in the configuration.",
         "title": "Displace Least Coordinated Weight",
         "type": "number"
      },
      "displace_under_coordinated_weight": {
         "default": 0.0,
         "description": "Relative probability to displace with an epicenter with a coordination equal to or less than displace_max_coordination.",
         "title": "Displace Under Coordinated Weight",
         "type": "number"
      },
      "displace_listed_atom_weight": {
         "default": 0.0,
         "description": "Relative probability to displace with an epicenter listed in displace_atom_list.",
         "title": "Displace Listed Atom Weight",
         "type": "number"
      },
      "displace_atom_list": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "items": {
                  "type": "integer"
               },
               "type": "array"
            }
         ],
         "default": "0",
         "description": "0-based atom indices to use as displacement epicenters, separated by commas. Example: 10, 20, -1 would be atoms 10, 20, and the last atom. When displace_atom_kmc_state_script is set, this list is populated dynamically per AKMC state from the script's output.",
         "title": "Displace Atom List"
      },
      "displace_atom_kmc_state_script": {
         "default": "",
         "description": "Path to a Python script that determines which atoms to displace. The script receives the path to a .con file as its sole positional argument and must print a comma-separated list of 0-based atom indices to stdout. It is executed once per new AKMC state; the result is cached in state.info. The path can be relative (resolved against the eOn root directory) or absolute. See the displacement scripts tutorial for worked examples.",
         "title": "Displace Atom Kmc State Script",
         "type": "string"
      },
      "displace_listed_type_weight": {
         "default": 0.0,
         "description": "Relative probability to displace with an epicenter listed in displace_type_list.",
         "title": "Displace Listed Type Weight",
         "type": "number"
      },
      "displace_type_list": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "items": {
                  "type": "string"
               },
               "type": "array"
            }
         ],
         "default": "0",
         "description": "The atom types should be separated by a comma.",
         "title": "Displace Type List"
      },
      "molecule_list": {
         "default": "[]",
         "description": "Legacy molecule list used by molecular displacement logic.",
         "title": "Molecule List",
         "type": "string"
      },
      "displace_all_listed": {
         "default": false,
         "description": "If true, displace all atoms in displace_atom_list (or displace_type_list) simultaneously. If false, one atom is chosen at random from the list per saddle search. In either case, atoms within displace_radius of any displaced atom are also included. Set displace_radius to 0 to restrict displacement strictly to listed atoms.",
         "title": "Displace All Listed",
         "type": "boolean"
      },
      "displace_max_coordination": {
         "default": 11,
         "description": "When using under_coordinated as the displacement type, choose only atoms with a coordination equal to or less than this.",
         "title": "Displace Max Coordination",
         "type": "integer"
      },
      "displace_1d": {
         "default": false,
         "description": "Restrict the initial displacement to a single dimension.",
         "title": "Displace 1D",
         "type": "boolean"
      },
      "converged_force": {
         "default": 0.01,
         "description": "When the maximum force (in eV/A) on any one atom is smaller than this value, the structure is considered converged onto a saddle point.",
         "title": "Converged Force",
         "type": "number"
      },
      "max_iterations": {
         "default": 1000,
         "description": "The maximum number of translation steps to be taken.",
         "title": "Max Iterations",
         "type": "integer"
      },
      "nonlocal_count_abort": {
         "default": 0,
         "description": "If this is not zero, the saddle search will abort when this many atoms have moved more than nonlocal_distance_abort from the initial displacement.",
         "title": "Nonlocal Count Abort",
         "type": "integer"
      },
      "nonlocal_distance_abort": {
         "default": 0.0,
         "description": "If nonlocal_count_abort is not zero, the saddle search will abort when nonlocal_count_abort atoms have moved more than this distance.",
         "title": "Nonlocal Distance Abort",
         "type": "number"
      },
      "client_displace_type": {
         "default": "random",
         "description": "Epicenter selection method used by the C++ client. 'random': uniform random atom. 'last_atom': the last atom in the configuration. 'least_coordinated': the atom with the fewest neighbours. 'not_fcc_hcp_coordinated': an atom whose local structure is neither FCC nor HCP. 'listed_atoms': an atom from displace_atom_list (parsed from config, no server displacement file needed). 'load': read a displacement vector from a file written by the server.",
         "enum": [
            "load",
            "random",
            "last_atom",
            "least_coordinated",
            "not_fcc_hcp_coordinated",
            "listed_atoms"
         ],
         "title": "Client Displace Type",
         "type": "string"
      },
      "stdev_translation": {
         "default": 0.2,
         "description": "Standard deviation for translational displacement components.",
         "title": "Stdev Translation",
         "type": "number"
      },
      "stdev_rotation": {
         "default": 1.0,
         "description": "Standard deviation for rotational displacement components.",
         "title": "Stdev Rotation",
         "type": "number"
      },
      "void_bias_fraction": {
         "default": 0.0,
         "description": "Bias fraction applied to the void-based displacement heuristic.",
         "title": "Void Bias Fraction",
         "type": "number"
      },
      "random_mode": {
         "default": true,
         "description": "Enable randomized initial-mode generation.",
         "title": "Random Mode",
         "type": "boolean"
      },
      "zero_mode_abort_curvature": {
         "default": 0.0,
         "description": "The saddle search will abort when the magnitude of the minmode curvature is less than this value.",
         "title": "Zero Mode Abort Curvature",
         "type": "number"
      },
      "confine_positive": {
         "default": false,
         "description": "Activates a confinement scheme when the search is within a positive region of the PES.",
         "title": "Confine Positive",
         "type": "boolean"
      },
      "bowl_breakout": {
         "default": false,
         "description": "When activated, the search within positive regions of PES is confined to a subset of atoms.",
         "title": "Bowl Breakout",
         "type": "boolean"
      },
      "bowl_active_atoms": {
         "default": 20,
         "description": "Size of the applied confinement in the bowl breakout scheme.",
         "title": "Bowl Active Atoms",
         "type": "integer"
      },
      "dynamics_temperature": {
         "default": 300.0,
         "description": "The temperature, in Kelvin, for the molecular dynamics run.",
         "title": "Dynamics Temperature",
         "type": "number"
      },
      "dynamics_state_check_interval": {
         "default": 100.0,
         "description": "The time interval, in femtoseconds, to minimize the geometry and check if the system has left the initial state.",
         "title": "Dynamics State Check Interval",
         "type": "number"
      },
      "dynamics_record_interval": {
         "default": 10.0,
         "description": "The time interval, in femtoseconds, between snapshots of the molecular dynamics trajectory.",
         "title": "Dynamics Record Interval",
         "type": "number"
      },
      "dynamics_linear_interpolation": {
         "default": false,
         "description": "- If true, then the band connecting the initial and final states will be\n  initialized using a linear interpolation.\n- If false, then the band is interpolated through the first snapshot that\n  minimizes to the final state.",
         "title": "Dynamics Linear Interpolation",
         "type": "boolean"
      },
      "dynamics_max_init_curvature": {
         "default": 0.0,
         "description": "The maximum initial curvature for the dynamics method in eV/\u00c5^2.",
         "title": "Dynamics Max Init Curvature",
         "type": "number"
      },
      "nonnegative_displacement_abort": {
         "default": false,
         "description": "Abort the search if a non-negative displacement is detected.",
         "title": "Nonnegative Displacement Abort",
         "type": "boolean"
      },
      "max_single_displace": {
         "default": 10.0,
         "description": "The maximum single displacement value.",
         "title": "Max Single Displace",
         "type": "number"
      },
      "remove_rotation": {
         "default": false,
         "description": "Remove rotational components from the displacement.",
         "title": "Remove Rotation",
         "type": "boolean"
      },
      "perp_force_ratio": {
         "default": 0.0,
         "description": "The ratio of perpendicular force, undocumented.",
         "title": "Perp Force Ratio",
         "type": "number"
      },
      "confine_positive_min_force": {
         "default": 0.5,
         "description": "The minimum force for confining the positive region of the PES, undocumented.",
         "title": "Confine Positive Min Force",
         "type": "number"
      },
      "confine_positive_scale_ratio": {
         "default": 0.9,
         "description": "The scaling ratio for confining the positive region of the PES, undocumented.",
         "title": "Confine Positive Scale Ratio",
         "type": "number"
      },
      "confine_positive_boost": {
         "default": 10.0,
         "description": "The boost factor for confining the positive region of the PES, undocumented.",
         "title": "Confine Positive Boost",
         "type": "number"
      },
      "confine_positive_min_active": {
         "default": 30,
         "description": "The minimum number of active atoms for confining the positive region of the PES, undocumented.",
         "title": "Confine Positive Min Active",
         "type": "integer"
      }
   }
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
  • bowl_active_atoms (int)

  • bowl_breakout (bool)

  • client_displace_type (Literal['load', 'random', 'last_atom', 'least_coordinated', 'not_fcc_hcp_coordinated', 'listed_atoms'])

  • confine_positive (bool)

  • confine_positive_boost (float)

  • confine_positive_min_active (int)

  • confine_positive_min_force (float)

  • confine_positive_scale_ratio (float)

  • converged_force (float)

  • disp_at_random (int)

  • displace_1d (bool)

  • displace_all_listed (bool)

  • displace_atom_kmc_state_script (str)

  • displace_atom_list (str | list[int])

  • displace_least_coordinated_weight (float)

  • displace_listed_atom_weight (float)

  • displace_listed_type_weight (float)

  • displace_magnitude (float)

  • displace_max_coordination (int)

  • displace_min_norm (float)

  • displace_not_FCC_HCP_weight (float)

  • displace_not_TCP_BCC_weight (float)

  • displace_not_TCP_weight (float)

  • displace_radius (float)

  • displace_random_weight (float)

  • displace_type_list (str | list[str])

  • displace_under_coordinated_weight (float)

  • displace_water_weight (float)

  • dynamics_linear_interpolation (bool)

  • dynamics_max_init_curvature (float)

  • dynamics_record_interval (float)

  • dynamics_state_check_interval (float)

  • dynamics_temperature (float)

  • max_energy (float)

  • max_iterations (int)

  • max_single_displace (float)

  • max_step_size (float)

  • method (Literal['min_mode', 'dynamics', 'basin_hopping', 'bgsd', 'artn'])

  • min_mode_method (Literal['dimer', 'lanczos', 'gprdimer', 'artn'])

  • molecule_list (str)

  • nonlocal_count_abort (int)

  • nonlocal_distance_abort (float)

  • nonnegative_displacement_abort (bool)

  • perp_force_ratio (float)

  • random_mode (bool)

  • remove_rotation (bool)

  • stdev_rotation (float)

  • stdev_translation (float)

  • void_bias_fraction (float)

  • zero_mode_abort_curvature (float)

field bowl_active_atoms: int = 20¶

Size of the applied confinement in the bowl breakout scheme.

field bowl_breakout: bool = False¶

Determines bowl_active_atoms that are subject to the largest forces. To activate, confine_positive must also be true. Method of Pedersen and Luiser [SS_PL14].

When activated, the search within positive regions of PES is confined to a subset of atoms.

field client_displace_type: Literal['load', 'random', 'last_atom', 'least_coordinated', 'not_fcc_hcp_coordinated', 'listed_atoms'] = 'random'¶

Epicenter selection method used by the C++ client. ‘random’: uniform random atom. ‘last_atom’: the last atom in the configuration. ‘least_coordinated’: the atom with the fewest neighbours. ‘not_fcc_hcp_coordinated’: an atom whose local structure is neither FCC nor HCP. ‘listed_atoms’: an atom from displace_atom_list (parsed from config, no server displacement file needed). ‘load’: read a displacement vector from a file written by the server.

field confine_positive: bool = False¶

Activates a confinement scheme when the search is within a positive region of the PES.

field confine_positive_boost: float = 10.0¶

The boost factor for confining the positive region of the PES, undocumented.

field confine_positive_min_active: int = 30¶

The minimum number of active atoms for confining the positive region of the PES, undocumented.

field confine_positive_min_force: float = 0.5¶

The minimum force for confining the positive region of the PES, undocumented.

field confine_positive_scale_ratio: float = 0.9¶

The scaling ratio for confining the positive region of the PES, undocumented.

field converged_force: float = 0.01¶

When the maximum force (in eV/A) on any one atom is smaller than this value, the structure is considered converged onto a saddle point.

field disp_at_random: int = 1¶

Legacy displacement control flag used by the client.

field displace_1d: bool = False¶

Restrict the initial displacement to a single dimension.

field displace_all_listed: bool = False¶

This can be disabled by setting displace_radius to 0. Otherwise:

  • If true, each displacement will include all of the degrees of freedom of all of the listed atoms in displace_atom_list or displace_type_list.

  • If false, one of the atoms in displace_atom_list or displace_type_list will be selected at random for each displacement.

  • In either case, all atoms up to displace_radius distance away from any displaced atom will be included in the displacement.

If true, displace all atoms in displace_atom_list (or displace_type_list) simultaneously. If false, one atom is chosen at random from the list per saddle search. In either case, atoms within displace_radius of any displaced atom are also included. Set displace_radius to 0 to restrict displacement strictly to listed atoms.

field displace_atom_kmc_state_script: str = ''¶

Path to a Python script that determines which atoms to displace. The script receives the path to a .con file as its sole positional argument and must print a comma-separated list of 0-based atom indices to stdout. It is executed once per new AKMC state; the result is cached in state.info. The path can be relative (resolved against the eOn root directory) or absolute. See the displacement scripts tutorial for worked examples.

field displace_atom_list: str | list[int] = '0'¶

0-based atom indices to use as displacement epicenters, separated by commas. Example: 10, 20, -1 would be atoms 10, 20, and the last atom. When displace_atom_kmc_state_script is set, this list is populated dynamically per AKMC state from the script’s output.

field displace_least_coordinated_weight: float = 0.0¶

Relative probability to displace with an epicenter that has a coordination number equal to the least-coordinated atom in the configuration.

field displace_listed_atom_weight: float = 0.0¶

Relative probability to displace with an epicenter listed in displace_atom_list.

field displace_listed_type_weight: float = 0.0¶

Relative probability to displace with an epicenter listed in displace_type_list.

field displace_magnitude: float = 0.1¶

The standard deviation of the Gaussian displacement in each degree of freedom for the selected atoms.

field displace_max_coordination: int = 11¶

When using under_coordinated as the displacement type, choose only atoms with a coordination equal to or less than this.

field displace_min_norm: float = 0.0¶

Minimum displacement norm enforced for the initial perturbation.

field displace_not_FCC_HCP_weight: float = 0.0¶

Relative probability to displace with an epicenter that is not FCC or HCP coordinated.

field displace_not_TCP_BCC_weight: float = 0.0¶

Relative probability to displace with an epicenter that is not TCP or BCC coordinated.

field displace_not_TCP_weight: float = 0.0¶

Relative probability to displace with an epicenter that is not TCP coordinated.

field displace_radius: float = 5.0¶

Atoms within this distance of the epicenter will be displaced.

field displace_random_weight: float = 0.0¶

Relative probability to displace with a random epicenter.

field displace_type_list: str | list[str] = '0'¶

The atom types should be separated by a comma.

field displace_under_coordinated_weight: float = 0.0¶

Relative probability to displace with an epicenter with a coordination equal to or less than displace_max_coordination.

field displace_water_weight: float = 0.0¶

Relative probability to displace with an epicenter selected by the water heuristic.

field dynamics_linear_interpolation: bool = False¶
  • If true, then the band connecting the initial and final states will be initialized using a linear interpolation.

  • If false, then the band is interpolated through the first snapshot that minimizes to the final state.

  • If true, then the band connecting the initial and final states will be initialized using a linear interpolation.

  • If false, then the band is interpolated through the first snapshot that minimizes to the final state.

field dynamics_max_init_curvature: float = 0.0¶

The maximum initial curvature for the dynamics method in eV/Å^2.

field dynamics_record_interval: float = 10.0¶

Snapshots of MD trajectories are used to locate when the system first left the initial state. A binary search is used to locate the first snapshot that minimizes to a new geometry.

The time interval, in femtoseconds, between snapshots of the molecular dynamics trajectory.

field dynamics_state_check_interval: float = 100.0¶

The time interval, in femtoseconds, to minimize the geometry and check if the system has left the initial state.

field dynamics_temperature: float = 300.0¶

A good initial choice might be near the melting temperature of the material.

The temperature, in Kelvin, for the molecular dynamics run.

field max_energy: float = 20.0¶

The energy at which a saddle search is considered bad and terminated.

field max_iterations: int = 1000¶

The maximum number of translation steps to be taken.

field max_single_displace: float = 10.0¶

The maximum single displacement value.

field max_step_size: float = 0.2¶

Maximum step size for saddle-search displacement updates.

field method: Literal['min_mode', 'dynamics', 'basin_hopping', 'bgsd', 'artn'] = 'min_mode'¶
Options:
  • min_mode: Use a min-mode following scheme to locate the saddle point.

  • dynamics: Experimental method that uses molecular dynamics to find new states and then runs a climbing image NEB calculation to find the saddle and a dimer calculation to estimate the eigenmode at the saddle.

  • basin_hopping: Use basin hopping as the saddle search backend within a process search workflow.

  • bgsd: Use biased gradient squared descent within a process search workflow.

  • artn: Use the Activation-Relaxation Technique nouveau. ARTn starts from pos.con, ignores displacement.con, and performs its own push, Lanczos eigenmode estimation, and perpendicular relaxation internally. direction.dat is optional and only biases the initial push when present.

Method to locate the saddle point.

field min_mode_method: Literal['dimer', 'lanczos', 'gprdimer', 'artn'] = 'dimer'¶
Options:
  • dimer: Use the dimer min-mode method from Henkelman and Jónsson [SS_HJonsson99]

  • lanczos: Use the Lanczos min-mode method from Malek and Mousseau [SS_MM00]

  • gprdimer: Use the GP accelerated dimer method.

  • artn: Use ARTn as a drop-in for min-mode search. eOn’s displacement seeds the initial mode; ARTn takes over from the displaced structure.

Min-mode method to use.

field molecule_list: str = '[]'¶

Legacy molecule list used by molecular displacement logic.

field nonlocal_count_abort: int = 0¶

If this is not zero, the saddle search will abort when this many atoms have moved more than nonlocal_distance_abort from the initial displacement.

field nonlocal_distance_abort: float = 0.0¶

If nonlocal_count_abort is not zero, the saddle search will abort when nonlocal_count_abort atoms have moved more than this distance.

field nonnegative_displacement_abort: bool = False¶

Abort the search if a non-negative displacement is detected.

field perp_force_ratio: float = 0.0¶

The ratio of perpendicular force, undocumented.

field random_mode: bool = True¶

Enable randomized initial-mode generation.

field remove_rotation: bool = False¶

Remove rotational components from the displacement.

field stdev_rotation: float = 1.0¶

Standard deviation for rotational displacement components.

field stdev_translation: float = 0.2¶

Standard deviation for translational displacement components.

field void_bias_fraction: float = 0.0¶

Bias fraction applied to the void-based displacement heuristic.

field zero_mode_abort_curvature: float = 0.0¶

The saddle search will abort when the magnitude of the minmode curvature is less than this value.

Output¶

The saddle search writes:

  • saddle.con: the saddle point structure

  • mode.dat: eigenvector at the saddle (Nx3 whitespace-separated)

  • results.dat: energy, force calls, convergence status, eigenvalue

With write_movies = true (in [Debug]), climb.con is written as a concatenated structure movie (one frame per iteration). Each frame stores structured JSON metadata on line 2 via readcon-core, including energy, frame_index, step_size, delta_e, convergence, eigenvalue, torque, angle, and rotations.

Set write_deprecated_outs = true in [Debug] to also emit the legacy climb.dat sidecar during the compatibility window.

See also¶

  • Dimer method for the eigenmode method used during the saddle search

  • Process Search for automated saddle search + minimization

  • Nudged Elastic Band for finding paths when both endpoints are known

  • NEB modularization for the eigenmode variant implementation (dimer, improved dimer, Lanczos, GPR dimer)

References¶

[SS_HJonsson99]

Graeme Henkelman and Hannes Jónsson. A dimer method for finding saddle points on high dimensional potential surfaces using only first derivatives. The Journal of Chemical Physics, 111(15):7010–7022, October 1999. doi:10.1063/1.480097.

[SS_MM00]

Rachid Malek and Normand Mousseau. Dynamics of Lennard-Jones clusters: A characterization of the activation-relaxation technique. Physical Review E, 62(6):7723–7728, December 2000. doi:10.1103/PhysRevE.62.7723.

[SS_PL14]

Andreas Pedersen and Mathieu Luiser. Bowl breakout: Escaping the positive region when searching for saddle points. The Journal of Chemical Physics, 141(2):024109, July 2014. doi:10.1063/1.4885852.

Previous
Adaptive Kinetic Monte Carlo
Next
Basin Hopping

2026, the eOn developers

Made with Sphinx and Shibuya theme.