TD-SCF: excited-state densities and / or contributing excitations available yet?

I’m pretty sure that it is essentially only excited-state energies and oscillator strengths that are currently available from the TD-SCF / TD-DFT code but is it possible to print out the excitations that contribute to each excited state solved for? And is it possible to access / dump out cube files of the excited-state densities?

I know it’s pretty new code (and I’ve been watching and testing as it has progressed) so maybe they are a work in progress.

Not built-in, and there are no plans that I’m aware of. From my loose understanding of excited-state theory, you can pull the excitations from the eigenvector of the TDA approximation. (Once you leave TDA, left vs right eigenvector becomes a question, and you need to take the first half of the eigenvector.) That is available on the wavefunction by asking for variable TD-{functional_name_here} ROOT 0 -> ROOT {root_number} {left_or_right} EIGENVECTOR ALPHA - {irrep_here} SYMMETRY and its beta counterpart. Any further discussion is best left to people who know TD-DFT and cubefiles better than I do.

You’re welcome to file an issue for this feature, or even work on itself if you’re so inclined. The relevant code is all in Python.

Thanks for the info. I did dig into this a while back but never really got anywhere. Looking at it again now, I think I can see what I need to extract. If it gets to be usable, I will attempt to find time to submit a pull request.

I’ve been digging around in the TDSCF code as well as various bits of the nwchem source, and also various literature sources to try to get my head around what is what under the different conditions. I can reproduce the excitation coefficients that I was initially seeking fairly easily by appending a chunk of code to an input file but it would be lot cleaner if it were within PSI4 itself (and symmetry, etc. would become a lot easier to deal with).

Before I attempt to back-engineer what I have into the TDSCF code, I though it would be wise to check that I’m doing this the “correct” way because it seems to be very easy to get similar values using a variety of approaches!

My understanding is this:

The left and right eigenvectors are left = |Xn - Yn> and right = |Xn + Yn>, where Xn contains the excitation coefficients and Yn contains the de-excitation coefficients.

The left and right eigenvectors are both nocc rows by nvirt columns.

If TDA is used, de-excitations are ignored so Yn are zero, and so the left and right eigenvectors are identical: left = right = |Xn>. In this case, elements of either eigenvector are the excitation coefficients that I am after. Typically, these are normalised so that the sum of the squares of the coefficients = 0.5 (presumably, so that the alpha + beta coefficients are together normalised to 1).

If TDA isn’t used, then (I think!) I can simply use X = 1/2(right + left) and Y = 1/2(right - left), and then use X for the excitation coefficients as above and Y for the (usually smaller) de-excitation coefficients. Typically, these are normalised so that the (sum of the squares of the excitation coefficients) - (sum of the squares of the de-excitation coefficients) = 0.5.

(Normalisation of these coefficients is not always well documents and may not be performed by some software.)

Assuming the above is correct, it will be fairly easy for me to add the relevant bits to scf_response.py. I think that the TDSCF code currently only handles restricted formalism and singlets for TD-DFT and so I wouldn’t have to worry about alpha and beta coefficients, at least initially (although I think triplets are currently possible for TD-HF so I should probably explore that, too!).

I’d also add a new parameter (TDSCF_COEFF?) as a threshold for which coefficients to print in the output.

A couple of (fairly) basic questions that I can’t readily find an answers to that might improve the output I’m generating…

Is there a simple way to obtain MO symmetries from a wavefunction object? (As printed by HF::print_orbitals() in libscf_solver/hf.cc: I can’t see if the labels make it to the python interface or not.)

Is there a direct way to get the number of virtual orbitals or do I need to use something like: wfn.nmo()-wfn.nalpha()? (Although, I can easily get these from the dimensions of the left or right eigenvectors.)

I’ve got in touch with one of the authors of the TD-SCF code, and he requested you migrate this to an issue on our GitHub.

There is no direct way to get the number of virtuals.

Done. Thanks for the suggestion. (I’ll mark this thread as solved.)

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.