-
Notifications
You must be signed in to change notification settings - Fork 0
/
Basis.jl
129 lines (80 loc) · 2.51 KB
/
Basis.jl
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using LinearAlgebra
import Base.@kwdef
using KeywordDispatch
"""
We create two kinds of basis objects;
basis1 -> for systems with no translation invariance symmetry implemented.
field :
configs -> which is the vector of states represented as integer digits.
basis2 -> for systems with translation invariance implemented.
fields:
configs -> vector of states represented as integer digits,
preiodicity -> vector of integer digits representing the periodicity of the states in field configs,
k -> real number representing the momentum sector.
"""
struct basis1
configs::Vector{Int64}
end
struct basis2
configs::Vector{Int64}
periodicity::Vector{Int64}
k :: Real
end
"""
Different methods instances of the function hilbert_space using multiple dispatch.
Inputs:
N -> system size
Nup -> number of up spins
k -> momentum quantum number
"""
@kwdispatch hilbert_space()
@kwmethod function hilbert_space(;N::Int64)
hil_spc = zeros(Int64,2^N)
count = 0
for i in 0:2^(N)-1
count += 1
hil_spc[count] = i
end
return basis1(hil_spc)
end
@kwmethod function hilbert_space(;N::Int64,Nup::Int64)
if Nup > N
error("Nup must be less than or equal to N")
else
hil_spc = zeros(Int64,binomial(N,Nup))
count = 0
for i in 0:2^(N)-1
if count_ones(i) == Nup
count += 1
hil_spc[count] = i
end
end
return basis1(hil_spc)
end
end
@kwmethod function hilbert_space(;N::Int64,k::Real)
hil_spc = zeros(Int64,(2^N,2))
count = 0
for conf in hilbert_space(N=N).configs
r = checkstate(conf,k,N)
if r >= 0
count += 1
hil_spc[count,1] = conf
hil_spc[count,2] = r
end
end
return basis2(hil_spc[1:count,1],hil_spc[1:count,2],k)
end
@kwmethod function hilbert_space(;N::Int64,Nup::Int64,k::Real)
hil_spc = zeros(Int64,(2^N,2))
count = 0
for conf in hilbert_space(N=N,Nup=Nup).configs
r = checkstate(conf,k,N)
if r >= 0
count += 1
hil_spc[count,1] = conf
hil_spc[count,2] = r
end
end
return basis2(hil_spc[1:count,1],hil_spc[1:count,2],k)
end