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:
topologies — array[Topology] (default: required)One or more molecular systems.residues — array[Residues] (default: unset)TRC residue definitions aligned to topologies.external_charges — object (default: unset)External point charges (positions + charges).driver — string (default: required)Calculation type (Energy, Gradient, Dynamics, Optimization, Hessian, QMMM).model — object (default: required)Level of theory (method) + basis configuration.system — object (default: unset)Hardware configuration.keywords — object (default: required)Calculation parameters; may be {}.schema_version — string (default: 0.2.0)Input schema version.title — string (default: unset)Printed in output files.check_schema — bool (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:
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:
{
"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": {}
}
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:
{
"topologies": [
{ "xyz": "molecule.xyz" }
],
"driver": "Energy",
"model": { "method": "RestrictedHF", "basis": "cc-pVDZ" },
"keywords": {}
}
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:
{
"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
}
}
}
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.
{
"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.
positions — array[float] (default: required)Flat XYZ list of charge positions.
The positions length must be \(3 \times \mathrm{len}(charges)\). Positions are in angstroms.
charges — array[float] (default: required)Charge values aligned to positions.Configuration¶
driver¶
The driver field selects the calculation type:
EnergySingle-point energy and related properties.
OptimizationGeometry optimization. See optimization, plus regions when using Q4ML regions.
QMMMQM/MM or QM/ML/MM workflows. See qmmm, plus regions as needed.
GradientAnalytic or finite-difference gradients. See gradient for gradient options.
HessianHessian and vibrational analysis. See hessian, plus SCF/DFT keywords as needed.
DynamicsMolecular dynamics. See dynamics and force_field.
model¶
{
"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": {}
}
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,
)
method — string (default: required)Level of theory (RestrictedHF, UnrestrictedHF, RestrictedKSDFT, RestrictedRIMP2, UnrestrictedRIMP2, RestrictedRICCSD).
Level-of-theory descriptions:
RestrictedHFRestricted Hartree-Fock (closed-shell).
UnrestrictedHFUnrestricted Hartree-Fock (open-shell).
RestrictedKSDFTRestricted Kohn-Sham density functional theory.
RestrictedRIMP2Restricted RI Moller-Plesset second-order perturbation theory.
UnrestrictedRIMP2Unrestricted RI Moller-Plesset second-order perturbation theory.
Not supported; EXESS errors if this is selected.
RestrictedRICCSDRestricted 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.
basis — string (default: required)Primary basis set. See basis sets.
When running through rush-py, basis defaults to cc-pVDZ if omitted.
aux_basis — string (default: unset)Auxiliary basis for RI methods. See basis sets.
Required for RI HF, RI MP2, RI CCSD, and double-hybrid KSDFT.
standard_orientation — string (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_sets — bool (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¶
{
"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": {}
}
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_mb — uint64 (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_gpus — bool (default: false)Allow multiple processes per GPU.
Expert setting to allow multiple processes per GPU.
teams_per_node — uint32 (default: 1)Worker teams per node.
teams_per_node and gpus_per_team control fragmentation scaling; one team
handles one fragment queue.
gpus_per_team — uint32 (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:
rush-py defaults: any non-
Nonevalues set in Python (function defaults or dataclass defaults) are explicit values.EXESS JSON parser defaults (as defined in the C++ input parser) for omitted fields.
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:
Modelin rush-py only includesstandard_orientationandforce_cartesian_basis_sets;method,basis, andaux_basisare function parameters.keywordsin rush-py are passed as Python dataclasses (forSCFKeywords,FragKeywords,ExportKeywords,OptimizationKeywords, etc.).frag_keywordsdefaults to a dimer fragmentation setup; passfrag_keywords=Noneto run a full-system calculation.external_chargesand 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"(forexess.exess),method="RestrictedHF",basis="cc-pVDZ",aux_basis=None,standard_orientationunset (EXESS defaultFullSystem),force_cartesian_basis_setsunset (EXESS defaulttrue).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_orientationunset (EXESS defaultFullSystem),force_cartesian_basis_setsunset (EXESS defaulttrue),dt_ps=0.002,temperature_kelvin=290.0,pressure_atm=None, gradient methodAnalyticalwith default step size.exess.optimization:method="RestrictedHF",basis="cc-pVDZ",aux_basis=None,standard_orientationunset (EXESS defaultFullSystem),force_cartesian_basis_setsunset (EXESS defaulttrue),max_itersrequired.
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 forDynamicsandOptimizationdrivers.tools/input_transformer/create_json_input.jlin 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")'