PySCF: Implementando argumento congelado SHCI
Estou tentando executar um cálculo SHCI em PYSCF com DICE; no entanto, quero congelar os primeiros dois orbitais centrais e os três orbitais virtuais mais altos em um cálculo.
Em outras partes do PySCF, isso normalmente pode ser realizado com o frozenargumento. Aqui, não tenho certeza de como o argumento congelado é implementado.
O seguinte é um exemplo de código retirado 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]
Respostas
Congelar pode ter dois significados: congelar a ocupação (orbitais centrais duplamente ocupados e orbitais virtuais inativos) ou congelar o orbital espacial em otimização orbital (aqui: em SHCI-SCF).
No primeiro caso, descobrir o número de orbitais de núcleos congelados e orbitais virtuais inativos é fácil: já que você está especificando o número de elétrons e de orbitais, não é necessário especificar o número de orbitais congelados ou de orbitais virtuais congelados. O número de orbitais ocupados ativos pode ser determinado contando os elétrons, enquanto o número de orbitais virtuais ativos é simplesmente o número de orbitais ativos menos o número de orbitais ocupados ativos.
O último caso também é bastante simples: você apenas zera a atualização dos orbitais congelados, para que eles não sejam alterados.
Em PySCF, o frozenargumento parece referir-se ao último caso, ver, por exemplohttps://github.com/pyscf/pyscf/blob/a75bfbbc940f9d0a7ec047468a675221a05111a8/pyscf/mcscf/mc1step.py#L882
Esta opção não parece estar implementada no código SHCI https://github.com/pyscf/pyscf/blob/master/pyscf/shciscf/shci.py. Deve, entretanto, ser bastante simples hackear o código SHCI para adicionar suporte para um frozenargumento, por exemplo, copiando e colando o código de congelamento de outros métodos. Você pode fazer um fork do PySCF, fazer as alterações relevantes e enviar uma solicitação de pull para que o recurso fique disponível para todos.