Расчёт орбиталей на основе подхода Хартри-Фока-Рутана
import hfscf
def SCF (r = 1.4632, Z=[1,1], b1 = GTO["H"], b2 = GTO["H"], b = 3, vbs=False): # Электронные (r) и ядерные (R) степени свободы
R = [0, r]
if vbs: print("Создаем матрицу перекрываний орбиталей (S)")
s_scf = S(R, b1, b2, b)
if vbs: print("Создаем гамильтониан Н")
h_scf = H(R=R, Z=Z, b1=b1, b2=b2, b=b)
if vbs: print("Диагонализируем матрицу S и получаем транспонированную матрицу")
X = diagon(m=s_scf)
Xa = X.getH()
if vbs: print("Считаем матрицу расчетной плотности P")
p_scf = np.matrix([[0,0],[0,0]], dtype=np.float64)
# улучшаем матрицу P в каждом новом цикле
if vbs: print("Подсчет SCF")
for iteration in range(50):
# F = H + G
if vbs: print("Генерируем матрицу Фока, вычисляем интеграл для двух электронов")
g_scf = G(r=r, p=p_scf, b1=b1, b2=b2, b=b)
f_scf = h_scf + g_scf
# генерируем матрицу 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 = X * C'
if vbs: print("Генерируем матрицу С")
c_scf = X * c_tra
# строим матрицу P из C.
if vbs: print("Перерасчет матрицы плотности P.")
p_temp = hfscf.P(c_scf)
#строим графики
orbital(c_tra, r, b1, b2, b)
orbital2D(c_scf, X, f_scf, r, b1, b2, b)
print("Цикл " + str(iteration + 1) + " закончен.")
# проверяем сходимость
if np.linalg.norm(p_temp - p_scf) < 1E-4:
print("\n\n-->Самосогласованное поле сходится!")
print({"S" : s_scf, "H" : h_scf, "X" : X, "F" : f_scf, "C" : c_scf, "P" : p_temp})
print("Электронная энергия:", ener_elec(p_temp, h_scf, f_scf))
print("Полная энергия:", ener_tot(r, Z, ener_elec(p_temp, h_scf, f_scf)))
return("Complete")
else:
p_scf = p_temp
print("\n\n-->Поле не сошлось!\nПересмотрим исходные данные")
return {"S" : s_scf, "H" : h_scf , "X" : X , "F" : f_scf ,"C" : c_scf, "P" : p_temp}
SCF()
Цикл 1 закончен.
Цикл 2 закончен.
Цикл 3 закончен.
Цикл 4 закончен.
Цикл 5 закончен.
Цикл 6 закончен.
Цикл 7 закончен. -->Самосогласованное поле сходится! {'S': matrix([[0.99999999, 0.63749012], [0.63749012, 0.99999999]]), 'H': matrix([[-1.09920375, -0.91954841], [-0.91954841, -1.09920375]]), 'X': matrix([[ 0.55258063, 1.17442445], [ 0.55258063, -1.17442445]]), 'F': matrix([[-0.34684107, -0.57771139], [-0.57771139, -0.34684028]]), 'C': matrix([[ 0.55258114, -1.17442421], [ 0.55258013, 1.17442468]]), 'P': matrix([[0.61069182, 0.61069071], [0.61069071, 0.6106896 ]])} Электронная энергия: -1.7974485548087507 Полная энергия: -1.1140149845517797
'Complete'