SF-TDDFT¶
Spin-flip TDDFT uses a high-spin open-shell reference and tdhf.type=sf.
It is useful for accessing low-spin target states from a high-spin reference.
MRSF-TDDFT is the recommended OpenQP route when the mixed-reference correction
is needed to reduce spin contamination and to describe multiconfigurational
ground-state surfaces.
In Python scripts, SF-TDDFT is a theory choice. Select the calculation type
separately with job.workflow.* only when you need a non-energy workflow.
.oqp uses response roots
The spin character of an SF root is not known before diagonalization.
State-specific .oqp input must therefore use root=N, for example:
sf(nstate=3)/bhhlyp/6-31g* grad(root=1)
geom="h2o.xyz"
Do not write an S/T label or omit the root on an SF state-specific
driver.
Energy¶
.oqp:
sf(nstate=3)/bhhlyp/6-31g*
geom="h2o.xyz"
Python:
from oqp.openqp import OpenQP
job = OpenQP("h2o_sf", silent=1)
job.molecule(geometry="water", charge=0)
job.theory.sf_tddft(functional="bhhlyp", basis="6-31g*", nstate=3)
mol = job.run()
print("SF-TDDFT energies:", mol.get_td_energies())
Canonical .oqp input:
sf(nstate=3)/bhhlyp/6-31g*
geom="molecule.xyz"
Runnable .oqp:
examples/SF-TDDFT/H2O_BHHLYP-SFTDDFT_ENERGY.oqp.
Gradient¶
In SF-TDDFT, root 1 means the lowest spin-flip target state, not the first
ordinary TDDFT excited state.
.oqp:
sf/bhhlyp/6-31g* grad(root=3)
geom="h2o.xyz"
Python:
from oqp.openqp import OpenQP
job = OpenQP("h2o_sf_grad", silent=1)
job.molecule(geometry="water", charge=0)
job.theory.sf_tddft(functional="bhhlyp", basis="6-31g*", nstate=3)
job.workflow.gradient(state=3)
mol = job.run()
gradient = mol.get_grad()
Canonical .oqp input:
sf/bhhlyp/6-31g* grad(root=3)
geom="molecule.xyz"
Runnable .oqp:
examples/SF-TDDFT/H2O_BHHLYP-SFTDDFT_GRADIENT.oqp.
Notes¶
- SF-TDDFT accepts an ROHF or a UHF high-spin reference (
scf.type=rohfortype=uhf). With UHF, the spin-flip holes are the alpha-occupied orbitals and the particles are the beta-virtual orbitals of the unrestricted reference. The UHF path provides energies and analytic gradients, including the gradient-drivenoptimize,meciandtciworkflows. MECP is rejected for SF-TDDFT with either reference: the SF kernels do not depend ontdhf.multiplicity, so the two crossing surfaces would be identical; use MRSF or UMRSF for MECP. Numerical Hessians (runtype=hess,type=numerical) still require the ROHF reference. The UHF gradient also rejects range-separated (CAM/LRC) functionals. Nonadiabatic couplings, NAMD and SOC are not SF-TDDFT workflows with either reference; they require the MRSF response model (tdhf.type=mrsf), see MRSF-TDDFT. - Select the UHF reference through the Python API with
job.theory.sf_tddft(..., reference="uhf")in Python. Concise.oqproutes such assf/...always use the ROHF reference, becausescf.typeis route-selected there and the route takes no reference option. - Make sure the UHF reference is the lowest triplet. A UHF energy above the
ROHF energy proves the solution is not the lowest one. A UHF energy below
ROHF does not prove the opposite, because a metastable UHF solution can also
lie below ROHF. Confirm by comparing several guesses, for example
guess.type=sapandtype=minao, or with a wavefunction stability analysis. For the water example, the Huckel, modified Huckel andautoguesses converge to higher triplets in 6-31G* and cc-pVDZ. The core-Hamiltonian guess does so in cc-pVDZ.guess.type=sapreaches the lowest UHF solution in both bases; see the Python API for a separately qualified unrestricted reference. - The internal
tdhf.nstatemust include the highest spin-flip state requested by a gradient or follow-up workflow;.oqpinput widens the root count fromroot=Nautomatically. - For the mixed-reference correction and OpenQP's main multistate workflow, use MRSF-TDDFT.