Closed zhaivanczha closed 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
Resolving issue #34 is part of the roadmap for extending state-averaged orbital optimizations to the case that I think you are describing.
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 thelroots
kwarg to thelasci
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?
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.
Ok. Thank you for the confirmation and the information. I'm really looking forward to these updates. :)
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