Input format

EXESS inputs are JSON files loosely based on MolSSI QCSchema. In EXESS, the molecular group is called topology, and input files use a topologies array to allow batched runs (multiple systems evaluated with the same driver/model/keywords).

This page is organized by the top-level input groups (topologies, model, system, keywords, driver) and follows QC-JSON conventions where possible.

Schema overview

Top-level EXESS input fields:

topologiesarray[Topology] (default: required)One or more molecular systems.
residuesarray[Residues] (default: unset)TRC residue definitions aligned to topologies.
external_chargesobject (default: unset)External point charges (positions + charges).
driverstring (default: required)Calculation type (Energy, Gradient, Dynamics, Optimization, Hessian, QMMM).
modelobject (default: required)Level of theory (method) + basis configuration.
systemobject (default: unset)Hardware configuration.
keywordsobject (default: required)Calculation parameters; may be {}.
schema_versionstring (default: 0.2.0)Input schema version.
titlestring (default: unset)Printed in output files.
check_schemabool (default: true (when enabled))Enable schema validation when supported.

In the EXESS CLI JSON, keywords is required, but can be an empty object because defaults are applied by the parser. check_schema is only honored when schema checks are enabled; otherwise it is ignored.

Icon key:

Tip Expert

Input System Specification

topologies

topologies is an array of topology objects. Each topology provides molecular data and optional fragmentation/connectivity. See topologies for the full reference and validation rules.

Rush-py accepts the JSON topology format only (symbols + geometry). It does not accept xyz paths directly.

Example with inline geometry and symbols:

config.json
{
  "topologies": [
    {
      "symbols": ["O", "H", "H"],
      "geometry": [
        -1.1570, 0.0630, -0.4817,
        -1.1570, 0.8180, -1.0766,
        -1.1570, -0.6920, -1.0766
      ]
    }
  ],
  "driver": "Energy",
  "model": { "method": "RestrictedHF", "basis": "cc-pVDZ" },
  "keywords": {}
}
run.py
from pathlib import Path

from rush.exess import energy
from rush.mol import Element, Topology

topology = Topology(
    symbols=[Element.O, Element.H, Element.H],
    geometry=[
        -1.1570, 0.0630, -0.4817,
        -1.1570, 0.8180, -1.0766,
        -1.1570, -0.6920, -1.0766,
    ],
)

Path("molecule_t.json").write_text(topology.to_json())

energy(topology_path="molecule_t.json")

Example using an XYZ file:

config.json
{
  "topologies": [
    { "xyz": "molecule.xyz" }
  ],
  "driver": "Energy",
  "model": { "method": "RestrictedHF", "basis": "cc-pVDZ" },
  "keywords": {}
}
run.py
from pathlib import Path

from rush.exess import energy
from rush.mol import Element, Topology

lines = Path("molecule.xyz").read_text().splitlines()
symbols = []
geometry = []
for line in lines[2:]:
    if not line.strip():
        continue
    symbol, x, y, z = line.split()[:4]
    symbols.append(Element.from_str(symbol))
    geometry.extend([float(x), float(y), float(z)])

topology = Topology(symbols=symbols, geometry=geometry)
Path("molecule_t.json").write_text(topology.to_json())

energy(topology_path="molecule_t.json")

residues

residues is typically aligned one-to-one with topologies (same index). It is required for QMMM and other workflows that rely on residues. See residues for the full reference.

insertion_codes is required; use empty strings when there are no insertion codes.

Example:

config.json
{
  "topologies": [
    {
      "xyz": "molecule.xyz",
      "fragments": [[0, 1, 2], [3, 4, 5]]
    }
  ],
  "residues": [
    {
      "residues": [[0, 1, 2], [3, 4, 5]],
      "seqs": ["HOH", "HOH"],
      "seq_ns": [1, 2],
      "insertion_codes": ["", ""]
    }
  ],
  "driver": "QMMM",
  "model": { "method": "RestrictedHF", "basis": "STO-3G" },
  "keywords": {
    "regions": {
      "qm_fragments": [0],
      "mm_fragments": [1]
    },
    "qmmm": {
      "n_timesteps": 100
    }
  }
}
run.py
from pathlib import Path

from rush.exess import qmmm
from rush.mol import Element, Fragment, Residue, Residues, Topology

topology = Topology(
    symbols=[Element.O, Element.H, Element.H, Element.O, Element.H, Element.H],
    geometry=[
        0.0000, 0.0000, 0.0000,
        0.7570, 0.5860, 0.0000,
        -0.7570, 0.5860, 0.0000,
        2.8000, 0.0000, 0.0000,
        3.5570, 0.5860, 0.0000,
        2.0430, 0.5860, 0.0000,
    ],
    fragments=[Fragment([0, 1, 2]), Fragment([3, 4, 5])],
)

residues = Residues(
    residues=[Residue([0, 1, 2]), Residue([3, 4, 5])],
    seqs=["HOH", "HOH"],
    seq_ns=[1, 2],
    insertion_codes=["", ""],
)

Path("molecule_t.json").write_text(topology.to_json())
Path("molecule_r.json").write_text(residues.to_json())

qmmm(
    topology_path="molecule_t.json",
    residues_path="molecule_r.json",
    n_timesteps=100,
    qm_fragments=[0],
    mm_fragments=[1],
)

external_charges

External charges are supported for non-Dynamics drivers. EXESS errors if they are provided for Dynamics.

config.json
{
  "topologies": [{ "xyz": "molecule.xyz" }],
  "external_charges": {
    "positions": [0.0, 0.0, 0.0, 1.5, 0.0, 0.0],
    "charges": [0.5, -0.5]
  },
  "driver": "Energy",
  "model": { "method": "RestrictedHF", "basis": "cc-pVDZ" },
  "keywords": {}
}

Not supported.

positionsarray[float] (default: required)Flat XYZ list of charge positions.

The positions length must be \(3 \times \mathrm{len}(charges)\). Positions are in angstroms.

chargesarray[float] (default: required)Charge values aligned to positions.

Configuration

driver

The driver field selects the calculation type:

Energy

Single-point energy and related properties.

Optimization

Geometry optimization. See optimization, plus regions when using Q4ML regions.

QMMM

QM/MM or QM/ML/MM workflows. See qmmm, plus regions as needed.

Gradient

Analytic or finite-difference gradients. See gradient for gradient options.

Hessian

Hessian and vibrational analysis. See hessian, plus SCF/DFT keywords as needed.

Dynamics

Molecular dynamics. See dynamics and force_field.

model

config.json
{
  "topologies": [{ "xyz": "molecule.xyz" }],
  "driver": "Energy",
  "model": {
    "method": "RestrictedRIMP2",
    "basis": "cc-pVDZ",
    "aux_basis": "cc-pVDZ-RIFIT",
    "standard_orientation": "None",
    "force_cartesian_basis_sets": false
  },
  "keywords": {}
}
run.py
from rush.exess import energy

energy(
    topology_path="molecule_t.json",
    method="RestrictedRIMP2",
    basis="cc-pVDZ",
    aux_basis="cc-pVDZ-RIFIT",
    standard_orientation="None",  # String value, not None.
    force_cartesian_basis_sets=False,
)
methodstring (default: required)Level of theory (RestrictedHF, UnrestrictedHF, RestrictedKSDFT, RestrictedRIMP2, UnrestrictedRIMP2, RestrictedRICCSD).

Level-of-theory descriptions:

RestrictedHF

Restricted Hartree-Fock (closed-shell).

UnrestrictedHF

Unrestricted Hartree-Fock (open-shell).

RestrictedKSDFT

Restricted Kohn-Sham density functional theory.

RestrictedRIMP2

Restricted RI Moller-Plesset second-order perturbation theory.

UnrestrictedRIMP2

Unrestricted RI Moller-Plesset second-order perturbation theory.

Not supported; EXESS errors if this is selected.

RestrictedRICCSD

Restricted RI coupled cluster singles and doubles.

HF methods support multiple integral build types, while MP2 is only implemented via RI (resolution-of-identity).

When running through rush-py, method defaults to RestrictedHF if omitted.

basisstring (default: required)Primary basis set. See basis sets.

When running through rush-py, basis defaults to cc-pVDZ if omitted.

aux_basisstring (default: unset)Auxiliary basis for RI methods. See basis sets.

Required for RI HF, RI MP2, RI CCSD, and double-hybrid KSDFT.

standard_orientationstring (default: FullSystem)Orientation selection (FullSystem, None, PerFragment).

PerFragment rotates each fragment independently; this can cause inconsistent energies and energy differences in fragmented runs.

None prevents translation and rotation, which can make it easier to compare an optimization trajectory to the input conformation.

force_cartesian_basis_setsbool (default: true)Force Cartesian basis functions.

For d orbitals this yields components like \(x^2, xy, xz, y^2, yz, z^2\). Setting this to false is only supported for Energy calculations.

system

config.json
{
  "topologies": [{ "xyz": "molecule.xyz" }],
  "driver": "Energy",
  "model": { "method": "RestrictedHF", "basis": "cc-pVDZ" },
  "system": {
    "max_gpu_memory_mb": 24000,
    "teams_per_node": 4,
    "gpus_per_team": 1
  },
  "keywords": {}
}
run.py
from rush.exess import System, energy

energy(
    topology_path="molecule_t.json",
    system=System(
        max_gpu_memory_mb=24000,
        teams_per_node=4,
        gpus_per_team=1,
    ),
)
max_gpu_memory_mbuint64 (default: unset)Max GPU memory per process in MB.

When set, EXESS caps the requested value at 90% of free GPU memory. When unset, EXESS defaults to 75% of free GPU memory. For V100 GPUs with <20 GB free, the default is 50% of free memory. For non-RI gradient calculations, the default is halved again.

oversubscribe_gpusbool (default: false)Allow multiple processes per GPU.

Expert setting to allow multiple processes per GPU.

teams_per_nodeuint32 (default: 1)Worker teams per node.

teams_per_node and gpus_per_team control fragmentation scaling; one team handles one fragment queue.

gpus_per_teamuint32 (default: unset)GPUs per team (overridable by MBE_NGPUS).

gpus_per_team can be overridden by the MBE_NGPUS environment variable.

keywords

keywords contains method- and run-specific settings. See the keyword reference for full details. In the EXESS CLI JSON, keywords must be present even if empty; rush-py supplies defaults when omitted.

Default resolution order

Defaults are applied in the following order:

  1. rush-py defaults: any non-None values set in Python (function defaults or dataclass defaults) are explicit values.

  2. EXESS JSON parser defaults (as defined in the C++ input parser) for omitted fields.

  3. EXESS internal defaults for values that remain unset after parsing.

Rush-py input mapping

The Rush Python client does not submit the full EXESS input JSON directly. Instead, it accepts a topology path (and sometimes residues path) plus keyword objects and constructs the EXESS params internally.

Key differences:

  • Model in rush-py only includes standard_orientation and force_cartesian_basis_sets; method, basis, and aux_basis are function parameters.

  • keywords in rush-py are passed as Python dataclasses (for SCFKeywords, FragKeywords, ExportKeywords, OptimizationKeywords, etc.).

  • frag_keywords defaults to a dimer fragmentation setup; pass frag_keywords=None to run a full-system calculation.

  • external_charges and some keyword groups (e.g., rtat, integrals) are not yet exposed in the rush-py API.

See the Rush guides for TRC objects and conversions: Objects and TRC Files.

Rush-py defaults

Default values set by the rush-py entry points:

  • exess.exess / exess.energy / exess.interaction_energy: driver="Energy" (for exess.exess), method="RestrictedHF", basis="cc-pVDZ", aux_basis=None, standard_orientation unset (EXESS default FullSystem), force_cartesian_basis_sets unset (EXESS default true).

  • exess.chelpg: method="RestrictedHF", basis="cc-pVDZ", standard_orientation="None", force_cartesian_basis_sets=false.

  • exess.qmmm: method="RestrictedHF", basis="STO-3G", aux_basis=None, standard_orientation unset (EXESS default FullSystem), force_cartesian_basis_sets unset (EXESS default true), dt_ps=0.002, temperature_kelvin=290.0, pressure_atm=None, gradient method Analytical with default step size.

  • exess.optimization: method="RestrictedHF", basis="cc-pVDZ", aux_basis=None, standard_orientation unset (EXESS default FullSystem), force_cartesian_basis_sets unset (EXESS default true), max_iters required.

Keyword defaults for rush-py are documented in the keyword reference page.

Input conversion tools

Several helpers can generate EXESS inputs:

  • parley.py (https://github.com/JorgeG94/parley_exess) converts between XYZ and EXESS JSON. It can also add minimal defaults for Dynamics and Optimization drivers.

  • tools/input_transformer/create_json_input.jl in the EXESS source repository is a Julia helper for generating RHF inputs:

julia -E 'include("create_json_input.jl"); create_input_rhf("molecule.xyz", "BASIS")'