Skip to content

MRSF-TDDFT

Recommended .oqp input

OpenQP 1.3.0 includes the .oqp parser. Start with the physical calculation you want:

mrsf/bhhlyp/6-31g* opt
geom="h2o.xyz"

This optimizes S0. Write opt(S1) for the next singlet or opt(T0) for the lowest triplet. Do not enter a ROHF multiplicity: OpenQP selects the internal MRSF reference automatically. Add controls only when needed:

mrsf(nstate=3)/bhhlyp/6-31g* opt(S1,maxit=100) scf(conv=1e-08)
geom="h2o.xyz"

See the .oqp Quick Start.

MRSF-TDDFT uses input.method=tdhf, tdhf.type=mrsf, and usually a triplet ROHF reference. Although it is configured through the TDHF/TDDFT response section, MRSF-TDDFT is used for multiconfigurational ground-state surfaces as well as excited-state surfaces.

MRSF-TDDFT combines the two high-spin spin-flip reference components into a mixed-reference response problem. This keeps the linear-response workflow close to TDDFT while reducing the spin contamination that can obscure ordinary spin-flip TDDFT roots. See the References page for the original theory, analytic-gradient implementation, and recent accounts.

Energy

The concise form defaults to the singlet manifold:

mrsf(nstate=3)/bhhlyp/6-31g*
geom="h2o.xyz"

This calculates S0--S2. Select another physical manifold through the driver, not through the route:

mrsf(nstate=3)/bhhlyp/6-31g* energy(T0)
geom="h2o.xyz"

This calculates T0--T2. All-electron MRSF also accepts energy(Q0) for a quintet manifold. Route parentheses accept nstate only.

For MRSF-TDHF, use the explicit basis-only route:

mrsf-tdhf(nstate=3)/6-31g*
geom="h2o.xyz"

Related basis-only routes are sf-tdhf(...), umrsf-tdhf(...), and tda-tdhf(...); cis(...) is an accepted alias of tda-tdhf(...).

Python:

from oqp.openqp import OpenQP

job = OpenQP("h2o_mrsf", silent=1)
job.molecule(geometry="water", charge=0)
job.theory.mrsf(functional="bhhlyp", basis="6-31g*", nstate=3)

mol = job.run()
results = mol.get_results()
print("Ground/reference energy:", results["energy"])
print("TD energies:", results["td_energies"])

Canonical .oqp input:

mrsf(nstate=3)/bhhlyp/6-31g* energy(S0)
geom="molecule.xyz"

Runnable .oqp: examples/MRSF-TDDFT/H2O_BHHLYP-MRSFTDDFT_ENERGY.oqp.

For post-run NTOs, attachment/detachment densities, transition densities, cube files, QCSchema export, FCIDUMP export, and external-code comparisons, see MRSF Analysis and Interoperability.

Gradient

In canonical input, select the physical state directly; an omitted state defaults to S0:

mrsf/bhhlyp/6-31g* grad(S2)
geom="h2o.xyz"

Here physical S2 lowers to internal response root 3, matching the traditional and Python examples below.

Python:

from oqp.openqp import OpenQP

job = OpenQP("h2o_mrsf_grad", silent=1)
job.molecule(geometry="water", charge=0)
job.theory.mrsf(functional="bhhlyp", basis="6-31g*", nstate=3)
job.workflow.gradient(state=3)

mol = job.run()
gradient = mol.get_grad()

The same physical derivative in a canonical file is:

mrsf/bhhlyp/6-31g* grad(S2)
geom="molecule.xyz"

Runnable .oqp: examples/MRSF-TDDFT/H2O_BHHLYP-MRSFTDDFT_GRADIENT.oqp.

Notes

  • Logs distinguish the physical target (S0, S1, and so on) from the triplet ROHF reference and internal response-root index. The reference is an implementation requirement, not the spin or identity of the requested target state.
  • MRSF states are zero-based within every physical spin manifold. S0, T0, and Q0 lower to response root 1; S1, T1, and Q1 lower to root 2.
  • In Python, job.theory.mrsf(...) supplies the usual ROHF triplet reference for MRSF-TDDFT, as does the canonical mrsf route. In internal metadata, tdhf.multiplicity=1, 3, or 5 is the physical response multiplicity, not the SCF reference multiplicity.
  • MRSF state numbering follows the spin-flip/MRSF target-state list. state=1 in Python, or grad=1 in properties, means the lowest MRSF target state, which can be the multiconfigurational ground state. This differs from ordinary TDHF/TDDFT, where state 1 means the first excited state.
  • The internal tdhf.nstate must include every state requested by gradients, NACME, SOC, or EKT analysis; .oqp input widens the root count from the driver's state labels automatically, so mrsf/bhhlyp/6-31g* grad(S2) solves three roots without a route nstate.
  • For SOC, mrsf(nstate=3)/... soc requests S0--S2 and T0--T2. Use mrsf/... soc(ns=3,nt=5) for unequal counts; ns and nt must appear together and cannot be combined with route nstate.
  • NAMD uses the same zero-based labels. namd(T0,scheme=Overlap,soc=true) means the first triplet MCH state and lowers to md.init_state=T0; it must not be written as T1 merely because the internal response root is 1.
  • For ordinary TDDFT, see TDDFT and TDHF.
  • For spin-flip TDDFT without mixed-reference correction, use SF-TDDFT.
  • UMRSF-TDDFT uses tdhf.type=umrsf with a UHF triplet reference. Besides energies it provides analytic nuclear gradients (runtype=grad) and the gradient-driven optimize, meci, mecp and tci workflows for HF, LDA/GGA and global-hybrid functionals; job.theory.umrsf(...) is the compact-API counterpart of job.theory.mrsf(...). Range-separated, meta-GGA and double-hybrid functionals and custom spin-pair-coupling scales are energy-only, and Hessians, NACME and SOC are not available for UMRSF. Gradient-driven UMRSF runs accept singlet and triplet response states (tdhf.multiplicity=1 or 3; roots are numbered from 1 within that manifold, so grad=1 with multiplicity=1 is S0). In Python, the multiplicity argument of job.theory.umrsf(...) sets the UHF reference; select a triplet response with a following job.tdhf(multiplicity=3). UMRSF gradients also accept effective core potentials, and the input checker rejects properties.td_prop=True, tdhf.ixcore and QM/MM (qmmm_flag=True) for them because the relaxed density and ESPF charges those paths consume are not produced. See examples/UMRSF-TDDFT/H2CO_BHHLYP_UMRSFTDDFT_GRAD.oqp and, with an ECP, examples/ECP/HBr_BHHLYP-UMRSFTDDFT_GRAD.oqp.

Scientific references

MRSF-TDDFT.