In [1]:
import hfscf
import numpy as np

def SCF (r = 1.4632, Z=[1,1], b1 = hfscf.GTO["H"], b2 = hfscf.GTO["H"], b = 3, vbs=True):
    R = [0, r]#центры
    
    # найти матрицу перекрывания
    if vbs: print("*) Generando matriz de traslape S.")#исполняется ли код
    s_scf = hfscf.S(R, b1, b2, b)
    
   
    if vbs: print("\n*) Generando hamiltoniano H.")
    h_scf = hfscf.H(R, Z, b1, b2, b) #гамильтониан H 
        
    if vbs: print("\n*) Diagonalizando matriz S y hallando matriz diagonal X.")
    X = hfscf.diagon(m=s_scf)#диагонализация матрицы S
    Xa = X.getH()#сопряженная транспонированная матрица X

    if vbs: print("\n*) Creando matriz de densidad P.")
    p_scf = np.matrix([[0,0],[0,0]], dtype=np.float64)  # инициализация матрицы плотности
    
    # scf-итерации, те заполняем матрицу F, диагонализируем, проверяем
    if vbs: print("\n*) Comenzando con el SCF.")
    for iteracion in range(50):
        # Расчет двух электронной части матрицы Фока
        # F = H + G
        if vbs: print("\n**) Generando la matriz de Fock: calculando \
integrales de dos electrones.")
        g_scf = hfscf.G(r, p_scf, b1, b2, b)
        f_scf = h_scf + g_scf 
        
        #F', переход к другому базису F
        # F' = X_adj * F * X
        if vbs: print("**) Cambiando la base de F.")
        f_tra = Xa * f_scf * X
        
        # диагонализация F' -> C'
        if vbs: print("**) Diagonalizando F' y generando C'.")
        c_tra = hfscf.diagon2(m=f_tra)
        
        # генерируем C
        # C = X * C'
        if vbs: print("**) Construyendo matriz de coeficientes C.")
        c_scf = X * c_tra
        
        # пересчет матрицы плотности P
        if vbs: print("**) Recalculando matriz de densidad P.")
        p_temp = hfscf.P(C=c_scf)
        
        print("\nConcluida la " + str(iteracion + 1) + ". iteracion.\n")
        
        # проверка сходимости
        if np.linalg.norm(p_temp - p_scf) < 1E-4: 
            print("\n\n-->El campo autoconsistente SI ha convergido!")
            return {"S":s_scf,"H":h_scf,"X": X,"F":f_scf,"C":c_scf,"P":p_temp}
        else:
            p_scf = p_temp
    print("\n\n-->El campo autoconsistente NO ha convergido!\nRevisar supuestos.")
    return {"S":s_scf,"H":h_scf,"X": X,"F":f_scf,"C":c_scf,"P":p_temp}

Описание объектов: S-матрица перекрытия. F-базисные вектора. X-диагональная матрица, получается диагонализацией S. H-гамильтониан. C-матрица коэффициентов

Электронная энергия молекулы

In [8]:
hfscf.ener_elec(orbs['P'], orbs['H'], orbs['F'])
Out[8]:
-1.7974485548087507

Полная энергия молекулы

In [7]:
hfscf.ener_tot()
Out[7]:
0.683433570256971

2D-plot

In [3]:
hfscf.orbital(orbs['C'])

3D-plot

In [4]:
hfscf.orbital2D(orbs['C'], orbs['X'], orbs['F'])