import hfscf
import numpy as np
def SCF (r = 1.4632, Z=[1,1], b1 = hfscf.GTO["H"], b2 = hfscf.GTO["H"], b = 3):
R = [0, r] # Задаем центры атомов
s_scf = hfscf.S(R, b1, b2, b) # Создаем матрицу перекрывания S
h_scf = hfscf.H(R, Z, b1, b2, b) # Создаем гамильтониан H для оператора Фока
X = hfscf.diagon(m=s_scf) # Переводим матрицу S в диагональную и находим диагональную матрицу Х
Xa = X.getH() # Получаем транспонированную матрицу Xa
p_scf = np.matrix([[0,0],[0,0]], dtype=np.float64) # Создаем матрицу плотности Р
for iteracion in range(50): # Проверяем сходимость SCF
g_scf = hfscf.G(r, p_scf, b1, b2, b) # Расчет двухэлектронной части матрицы Фока
f_scf = h_scf + g_scf # Генерация матрицы Фока
f_tra = Xa * f_scf * X # Создание матрицы F' = X_adj * F * X
c_tra = hfscf.diagon2(m = f_tra) # Диагонализируем матрицу F' и получаем транспонированную матрицу C'
c_scf = X * c_tra # Построение матрицы коэффициентов C C = X * C'
p_temp = hfscf.P(C = c_scf) # Из матрицы C строим матрицу Р и пересчитываем матрицы плотности P
print("Итерация " + str(iteracion + 1) + " окончена.\n")
if np.linalg.norm(p_temp - p_scf) < 1E-4: # Проверка сходимости
print("Сошлось")
return {"S":s_scf,"H":h_scf,"X": X,"F":f_scf,"C":c_scf,"P":p_temp}
else:
p_scf = p_temp
print("Не сошлось")
return {"S":s_scf,"H":h_scf,"X": X,"F":f_scf,"C":c_scf,"P":p_temp}
o = SCF()
o # орбитали
hfscf.orbital(o['C'])
hfscf.orbital2D(o['C'], o['X'], o['F'])