MatthewRHermes / mrh

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

Inquiry of state-average LASSCF #75

Closed zhaivanczha closed 7 months ago

zhaivanczha commented 7 months ago

Hi developers,

I am interested in the LASSCF method and have successfully used it to optimize orbitals for some molecular aggregates. Thank you for developing such a helpful library; almost all of my calculations have been successful. However, I'm curious about LASSCF's capability to perform state-average calculations, similar to standard CASSCF. Is it feasible to define a single product state for the excited states, similar to the ground state, and then obtain state-average molecular orbitals? If feasible, does the current code support this functionality?

Thank you for your time. Ivan

MatthewRHermes commented 7 months ago

Currently, the state_average functionality only addresses averaging over, i.e., different numbers of electrons in different fragments, not "up to xth excited state of fragment y". You can access locally excited states with a frozen set of orbitals by passing the lroots kwarg to the lasci member function of the LASSCF class.

# In this example there are 3 fragments
las = las.state_average (
    weights=[.5,.5],
    charges=[[0,0,0],[1,-1,0]],
    spins=[[0,0,0],[1,-1,0]],
    smults=[[1,1,1],[2,2,1]]
    )
# Now there are two "rootspaces": in the second one, a beta electron hops from the first to the second fragment
# You can optimize orbitals for this
las.kernel ()

# The below populates las.ci with the lowest two eigenstates of each fragment in each rootspace
lroots = np.array ([[2,2],[2,2],[2,2]])
las.lasci (lroots=lroots)
# For fragment i, rootspace j, local-state k the energy is
# las.e_states[j] + las.e_lexc[i][j][k]
# You cannot yet optimize the orbitals for this

from mrh.my_pyscf import lassi
lsi = lassi.LASSI (las).run ()
# This builds and diagonalizes the Hamiltonian matrix in the basis of the 16 states prepared above (2*2*2 for the first rootspace and 2*2*2 for the second) and stores the energies on lsi.e_roots.
# You cannot yet optimize the orbitals for this
MatthewRHermes commented 7 months ago

Resolving issue #34 is part of the roadmap for extending state-averaged orbital optimizations to the case that I think you are describing.

zhaivanczha commented 7 months ago

Currently, the state_average functionality only addresses averaging over, i.e., different numbers of electrons in different fragments, not "up to xth excited state of fragment y". You can access locally excited states with a frozen set of orbitals by passing the lroots kwarg to the lasci member function of the LASSCF class.

# In this example there are 3 fragments
las = las.state_average (
    weights=[.5,.5],
    charges=[[0,0,0],[1,-1,0]],
    spins=[[0,0,0],[1,-1,0]],
    smults=[[1,1,1],[2,2,1]]
    )
# Now there are two "rootspaces": in the second one, a beta electron hops from the first to the second fragment
# You can optimize orbitals for this
las.kernel ()

# The below populates las.ci with the lowest two eigenstates of each fragment in each rootspace
lroots = np.array ([[2,2],[2,2],[2,2]])
las.lasci (lroots=lroots)
# For fragment i, rootspace j, local-state k the energy is
# las.e_states[j] + las.e_lexc[i][j][k]
# You cannot yet optimize the orbitals for this

from mrh.my_pyscf import lassi
lsi = lassi.LASSI (las).run ()
# This builds and diagonalizes the Hamiltonian matrix in the basis of the 16 states prepared above (2*2*2 for the first rootspace and 2*2*2 for the second) and stores the energies on lsi.e_roots.
# You cannot yet optimize the orbitals for this

Hi Matthew!

Thank you very much for the quick reply. The example code clearly demonstrates the capabilities of LASSCF. Therefore, based on your explanation, I understand that for performing a state-average calculation with global S0, charge transfer, or TT states, it's possible to get optimized orbitals from state-averaged LASSCF by setting different quantum numbers on fragments. However, for a state-average calculation with S0, S1 states, I can only proceed with LASCI without orbital optimization, thus unable to obtain optimized orbitals with the current code. Is my understanding correct?

MatthewRHermes commented 7 months ago

Yes. Optimization including averaging over S0, S1, etc., may be coming down the pipeline. Optimizing the orbitals for, i.e., the final adiabatic states ("LASSI") would be significantly further down the pipeline.

zhaivanczha commented 7 months ago

Ok. Thank you for the confirmation and the information. I'm really looking forward to these updates. :)