Skip to content

Inner-sphere reorganization energies (Q-Chem), with a constrained-DFT diabatic mode - #1614

Open
rohithsrinivaas wants to merge 3 commits into
materialsproject:mainfrom
rohithsrinivaas:qchem-reorganization-energy
Open

rohithsrinivaas wants to merge 3 commits into
materialsproject:mainfrom
rohithsrinivaas:qchem-reorganization-energy

Conversation

@rohithsrinivaas

Copy link
Copy Markdown
Contributor

Adds InnerReorganizationMaker, a Q-Chem flow for the intramolecular (inner-sphere) reorganization energy λ of an electron transfer between two states of a molecule (e.g. a molecule and its radical ion), using the four-point scheme of Nelsen et al. The outer-sphere (solvent) contribution depends on the environment (donor–acceptor distance, electrode, ε/ε∞) and is left to post-processing.

Flow

  1. Optimize both states (opt_maker, default FrequencyOptFlatteningMaker; None uses the given geometries).
  2. Four single points at the same level of theory: each state at its own and at the other state's optimized geometry, with scf_convergence = 8 (Q-Chem's single-point default of 5 is too loose for meV energy differences).
  3. analyze_inner_reorganization → InnerReorganizationDocument: λ on both surfaces and their mean, vertical and adiabatic energies (and ΔG with frequencies), the RMSD between the geometries, a connectivity check (flags ET coupled to bond
    breaking), and an electronic-state check (max_spin_change, electronic_state_change): a state whose Mulliken spin moves by > 0.3 on an atom between its two geometries is not the same electronic state at both, and its unconstrained λ
    mixes two surfaces.

Constrained-DFT diabatic mode

When the transferred electron localizes differently at the two geometries, the unconstrained λ is meaningless. With cdft_fragment=(first, last) and cdft_fragment_states=((q₁, m₁), (q₂, m₂)), the single points become constrained DFT
calculations that keep each state's charge (and spin) on the fragment at both geometries (default partition: fragment-based Hirshfeld). By default the unconstrained points are also run, giving the true vertical/adiabatic energies and the
diabatic–adiabatic gaps.

InnerReorganizationMaker(
    cdft_fragment=(1, 10),                   # ethylene carbonate (Li is atom 11)
    cdft_fragment_states=((0, 1), (-1, 2)),  # EC in Li+-EC, EC•⁻ in the reduced complex
)   

To support this, QCInputGenerator gets cdft_constraints (pymatgen QCInput.cdft format) and fragments. Note: Q-Chem 6.2 silently ignores $cdft when gen_scfman = true (atomate2's default) — the energy equals the unconstrained one
and no CDFT iterations are printed (checked on He₂⁺). The generator therefore sets gen_scfman = false whenever constraints are given.

Also

  • SinglePointMaker, ForceMaker and TransitionStateMaker now set valid task_types ("Single Point", "Force", "Transition State Geometry Optimization"), like OptMaker/FreqMaker. Without them the task document stored the job name (e.g.
    "single point") as task_type, which is not a valid emmet TaskType, so the whole task document could not be loaded back (resolving a reference to it raised a pydantic ValidationError).

Tests

  • NH₃ → NH₃⁺ (ωB97M-V/def2-SVPD, vacuum; real Q-Chem 6.2 data): vertical IE 10.90 eV, adiabatic 10.17 eV, λ = 0.225 / 0.723 eV.
  • Li⁺–EC → Li⁺–EC•⁻ (ωB97M-V/def2-SVPD, custom SMD): unconstrained, the reduced complex at the Li⁺–EC geometry puts the electron on Li (λ₂ = 0.33 eV, flagged by electronic_state_change); the diabatic mode gives λ = 2.165 / 1.200 eV, with
    diabatic–adiabatic gaps of 0.04–0.05 eV at each state's own minimum.
  • Unit tests for the document, fragments, CDFT input set, constraint bookkeeping, spin check and maker validation.

The end-to-end CDFT test needs emmet to parse Q-Chem inputs with fragments (and a custom SMD solvent), materialsproject/emmet#1537; it is skipped with an emmet that cannot.

rohithsrinivaas and others added 3 commits October 19, 2026 22:42
SinglePointMaker, ForceMaker and TransitionStateMaker had no task_type, so the
task document stored the job name (e.g. "single point") as its task_type. Such
names are not valid emmet TaskTypes, so the task document cannot be loaded back:
resolving a reference to the whole output raises a pydantic ValidationError.
OptMaker and FreqMaker already set their task types this way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Four-point (Nelsen) workflow for the intramolecular reorganization energy of an
electron transfer between two states of a molecule (e.g. a molecule and its
radical ion). Both states are optimized (by default with
FrequencyOptFlatteningMaker, or the given geometries are used) and four single
points are run at the same level of theory: each state at its own and at the
other state's optimized geometry, with tight SCF convergence.

The final job returns an InnerReorganizationDocument with lambda on both potential
energy surfaces and their mean, the vertical and adiabatic energies (and the
adiabatic free energy when the optimizations include frequencies), the RMSD
between the geometries and a connectivity check that flags electron transfers
coupled to bond breaking. The outer-sphere (solvent) contribution depends on the
environment and is left to post-processing.

Tests use NH3 -> NH3+ single points (wB97M-V/def2-SVPD), which reproduce the
vertical (10.90 eV) and adiabatic (10.17 eV) ionization energies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The unconstrained four-point reorganization energy assumes that each state is the
same electronic state at both geometries. When the added electron localizes
differently at the two geometries (e.g. on Li at the Li+-EC geometry and on the
EC carbonyl at the reduced geometry), the two energies of a state come from
different potential energy surfaces and lambda is meaningless.

- QCInputGenerator: new cdft_constraints (pymatgen QCInput.cdft format) and
  fragments options. With constraints it sets cdft = true and gen_scfman = false
  (Q-Chem 6.2 silently ignores $cdft under GEN_SCFMAN) and defaults cdft_pop to
  fbh when fragments are given; split_into_fragments builds the fragment list.
- InnerReorganizationMaker: cdft_fragment / cdft_fragment_states (charge and
  multiplicity of the constrained fragment in each state) switch the four single
  points to constrained DFT, keeping each state's charge (and spin) on the
  fragment at both geometries; by default the unconstrained single points are
  also run (run_unconstrained).
- InnerReorganizationDocument: diabatic, cdft_settings, unconstrained_energies,
  diabatic_gaps (constrained minus unconstrained energy), and, in both modes,
  max_spin_change / electronic_state_change, which flag a state whose Mulliken
  spin moves by more than 0.3 on an atom between the two geometries. Vertical
  and adiabatic energies use the unconstrained points when available.

Tests: unit tests for the fragments, CDFT input set, constraint bookkeeping,
diabatic document and spin check, and an end-to-end run on Li+-EC -> Li+ EC
radical anion (wB97M-V/def2-SVPD, SMD), which needs an emmet that parses Q-Chem
inputs with fragments and is skipped otherwise.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant