MatthewRHermes / mrh

MRH's research code
Other
18 stars 30 forks source link

Question: How to calculate the trans_rdm1 when using CSF_SOLVER as fcisolver in sa-casscf? #102

Closed JangidBhavnesh closed 3 months ago

JangidBhavnesh commented 3 months ago

Is this functionality available?

I have glanced through the code, i didn't find it.

MatthewRHermes commented 3 months ago

With an up-to-date PySCF backend, csf.FCISolver should inherit the trans_rdm* functions from direct_spin1.FCIBase (here).

The arguments of these functions are (cibra, ciket, norb, nelec), where cibra and ciket must each be ONE (1) vector. There is as of yet no quick-and-dirty way to get the transition RDMs between the various states of a single state-averaged calculation with only one function call. The name trans_rdm12 has to be used for a different type of calculation in order for the mc.newton () SA-CASSCF algorithm to work (see below).

When doing SA(n)-CASSCF, the fcisolver member of the CASSCF instance is replaced with a state-averaged child class which overwrites trans_rdm12 (but not trans_rdm12s, trans_rdm1, or trans_rdm1s) to produce the state-averaged transition density matrix, so that both cibra and ciket have to be a list of n CI vectors. To escape from this awkward redefinition:

fcisolver = mc.fcisolver.undo_state_average ()
# This is a badly named function: it does not change mc.fcisolver.
# Instead it returns a "view" of mc.fcisolver that undoes all of the
# state-average throat-clearing so that you can use the original
# member functions.
JangidBhavnesh commented 3 months ago

Thank you.