PySCF: Implementando argumento congelado SHCI

Sep 30 2020

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

9 SusiLehtola Sep 30 2020 at 19:14

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.