-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSCF.py
86 lines (50 loc) · 1.57 KB
/
SCF.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import numpy as np
import matplotlib.pyplot as plt
#Theme: Self Consistent Field
#Author: Nan Sheng
def SCF(S,T,V,gabcd,Nel):
import e1, e2, sort_values, Build_Density, Build_Coulomb_Exchange, Fock_Energy
maxcycle=1000
ncycle=0
converged=0
S=e1.e1(S)
T=e1.e1(T)
V=e1.e1(V)
gabcd=e2.e2(gabcd)
H0=T+V
s,R=np.linalg.eig(S)
s=np.power(s,(-1/2))
s=np.mat(np.diag(s))
X=R*s*(R.H)
F=H0
Fprime=(X.H)*F*X
epsilon,Cprime=np.linalg.eig(Fprime)
C=X*Cprime
C,epsilon=sort_values.sort_values(C,epsilon)
D=Build_Density.Build_Density(C,Nel)
E=np.zeros((maxcycle,1))
while (ncycle<maxcycle) and (converged!=1):
G=Build_Coulomb_Exchange.Build_Coulomb_Exchange(D,gabcd)
F=H0+G
Fprime=(X.H)*F*X
epsilon,Cprime=np.linalg.eig(Fprime)
Cprime,epsilon=sort_values.sort_values(Cprime,epsilon)
C=X*Cprime
C,epsilon=sort_values.sort_values(C,epsilon)
D=Build_Density.Build_Density(C,Nel)
E[ncycle]=Fock_Energy.Fock_Energy(D,F,H0)
if (ncycle>0) and (np.abs(E[ncycle]-E[ncycle-1]) < 10**(-100)):
converged=1
else: converged=0
ncycle=ncycle+1
E=E[:(ncycle),0]
Emin=E[ncycle-1]
print('ncycle =',ncycle)
print('E =',E)
print('Emin =',Emin)
print('D =',D)