PySCF: Implementierung des eingefrorenen SHCI-Arguments
Ich versuche, eine SHCI-Berechnung in PYSCF mit DICE durchzuführen. Ich möchte jedoch die ersten beiden Kernorbitale und die höchsten drei virtuellen Orbitale in einer Berechnung einfrieren.
In anderen Teilen von PySCF kann dies normalerweise mit dem frozenArgument erreicht werden. Hier bin ich mir nicht sicher, wie das eingefrorene Argument implementiert wird.
Das Folgende ist ein Beispielcode aus: https://sanshar.github.io/Dice/usingincasscf.html?highlight=shciscf
from pyscf import gto, scf
from pyscf.future.shciscf import shci
# Initialize C2 molecule
b = 1.243
mol = gto.Mole()
mol.build(
verbose = 5,
output = None,
atom = [
['C',( 0.000000, 0.000000, -b/2)],
['C',( 0.000000, 0.000000, b/2)], ],
basis = {'C': 'ccpvdz', },
symmetry = True,
symmetry_subgroup = 'D2h',
spin = 0
)
# Create HF molecule
mf = scf.RHF( mol )
mf.conv_tol = 1e-9
mf.scf()
# Number of orbital and electrons
norb = 26
nelec = 8
# Create SHCI molecule for just variational opt.
# Active spaces chosen to reflect valence active space.
mch = shci.SHCISCF( mf, norb, nelec )
mch.fcisolver.mpiprefix = 'mpirun -np 2'
mch.fcisolver.stochastic = True
mch.fcisolver.nPTiter = 0
mch.fcisolver.sweep_iter = [ 0, 3 ]
mch.fcisolver.DoRDM = True
mch.fcisolver.sweep_epsilon = [ 5e-3, 1e-3 ]
e_shci = mch.mc1step()[0]
Antworten
Das Einfrieren kann zwei Bedeutungen haben: entweder das Einfrieren der Besetzung (doppelt besetzte Kernorbitale und inaktive virtuelle Orbitale) oder das Einfrieren des räumlichen Orbitals bei der Orbitaloptimierung (hier: in SHCI-SCF).
Im ersteren Fall ist es einfach, die Anzahl der Orbitale des gefrorenen Kerns und der inaktiven virtuellen Orbitale herauszufinden: Da Sie die Anzahl der Elektronen und die Anzahl der Orbitale angeben, müssen Sie die Anzahl der gefrorenen Kernorbitale oder der eingefrorenen virtuellen Orbitale nicht angeben. Die Anzahl der aktiv besetzten Orbitale kann durch Zählen der Elektronen bestimmt werden, während die Anzahl der aktiven virtuellen Orbitale einfach die Anzahl der aktiven Orbitale abzüglich der Anzahl der aktiv besetzten Orbitale ist.
Der letztere Fall ist auch ganz einfach: Sie setzen das Update für die eingefrorenen Orbitale einfach auf Null, damit sie nicht geändert werden.
In PySCF frozenscheint sich das Argument auf den letzteren Fall zu beziehen, siehe zhttps://github.com/pyscf/pyscf/blob/a75bfbbc940f9d0a7ec047468a675221a05111a8/pyscf/mcscf/mc1step.py#L882
Diese Option scheint im SHCI-Code nicht implementiert zu sein https://github.com/pyscf/pyscf/blob/master/pyscf/shciscf/shci.py. Es sollte jedoch recht einfach sein, den SHCI-Code zu hacken, um Unterstützung für ein frozenArgument hinzuzufügen, indem beispielsweise der Einfriercode von anderen Methoden kopiert und eingefügt wird . Sie können PySCF aufteilen, die relevanten Änderungen vornehmen und eine Pull-Anfrage einreichen, damit die Funktion für alle verfügbar wird.