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