PySCF : implémentation de l'argument gelé SHCI
J'essaie d'exécuter un calcul SHCI dans PYSCF avec DICE ; cependant, je souhaite geler les deux premières orbitales centrales et les 3 orbitales virtuelles les plus élevées dans un calcul.
Dans d'autres parties de PySCF, cela peut normalement être accompli avec l' frozenargument. Ici, je ne sais pas comment l'argument figé est implémenté.
Voici un exemple de code extrait de :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]
Réponses
Le gel peut avoir deux sens : soit geler l'occupation (orbitales centrales doublement occupées et orbitales virtuelles inactives), soit geler l'orbitale spatiale en optimisation orbitale (ici : en SHCI-SCF).
Dans le premier cas, il est facile de déterminer le nombre d'orbitales centrales gelées et d'orbitales virtuelles inactives : puisque vous spécifiez le nombre d'électrons et le nombre d'orbitales, vous n'avez pas besoin de spécifier le nombre d'orbitales centrales gelées ou virtuelles gelées. Le nombre d'orbitales occupées actives peut être déterminé en comptant les électrons, alors que le nombre d'orbitales virtuelles actives est simplement le nombre d'orbitales actives moins le nombre d'orbitales occupées actives.
Ce dernier cas est également assez simple : vous mettez simplement à zéro la mise à jour pour les orbitales gelées, afin qu'elles ne soient pas modifiées.
Dans PySCF, l' frozenargument semble se référer à ce dernier cas, voir par exemplehttps://github.com/pyscf/pyscf/blob/a75bfbbc940f9d0a7ec047468a675221a05111a8/pyscf/mcscf/mc1step.py#L882
Cette option ne semble pas être implémentée dans le code SHCIhttps://github.com/pyscf/pyscf/blob/master/pyscf/shciscf/shci.py. Il devrait cependant être assez simple de pirater le code SHCI pour ajouter la prise en charge d'un frozenargument, par exemple en copiant-collant le code de blocage d'autres méthodes. Vous pouvez bifurquer PySCF, apporter les modifications pertinentes et déposer une demande d'extraction afin que la fonctionnalité soit accessible à tous.