@@ -2,7 +2,7 @@ module PCTNPI
2
2
3
3
using LinearAlgebra
4
4
using HDF5
5
- using ITensors
5
+ using ITensors, ITensorMPS
6
6
using FLoops
7
7
using .. EtaCoefficients, .. Propagators, .. SpectralDensities, .. Blip, .. Utilities, .. TTM
8
8
@@ -12,15 +12,15 @@ const references = """
12
12
const PCTNPIArgs = Utilities. TensorNetworkArgs
13
13
14
14
function generate_bottom_right_tensor (ηs, sites, blip_sites, state_to_blip, fbU, k:: Int , Δs, sbar)
15
- ind1 = sites[k- 1 ]
16
- ind2 = sites[k]
17
- ind3 = blip_sites[k]'
18
- η11 = [η. η00 for η in ηs]
19
- η10 = [η. η0m[1 ] for η in ηs]
15
+ @inbounds ind1 = sites[k- 1 ]
16
+ @inbounds ind2 = sites[k]
17
+ @inbounds ind3 = blip_sites[k]'
18
+ @inbounds η11 = [η. η00 for η in ηs]
19
+ @inbounds η10 = [η. η0m[1 ] for η in ηs]
20
20
tens = ITensor (ind1, ind2, ind3)
21
21
for skp = 1 : dim (ind1)
22
22
for sk = 1 : dim (ind2)
23
- tens[ind1=> skp, ind2=> sk, ind3=> state_to_blip[sk]] = fbU[sk, skp] *
23
+ @inbounds tens[ind1=> skp, ind2=> sk, ind3=> state_to_blip[sk]] = fbU[sk, skp] *
24
24
exp .(- sum (Δs[:, sk] .* (real (η11) .* Δs[:, sk] + 2im * imag (η11) .* sbar[:, sk]))) *
25
25
exp .(- sum (Δs[:, sk] .* (real (η10) .* Δs[:, skp] + 2im * imag (η10) .* sbar[:, skp])))
26
26
end
@@ -29,16 +29,16 @@ function generate_bottom_right_tensor(ηs, sites, blip_sites, state_to_blip, fbU
29
29
end
30
30
31
31
function generate_bottom_left_tensor (ηs, sites, fbU, k:: Int , Δs, sbar)
32
- ind1 = sites[k- 1 ]
33
- ind2 = sites[k]
34
- ind3 = sites[k- 1 ]'
35
- η00 = [η. η00 for η in ηs]
36
- η11 = [η. ηmm for η in ηs]
37
- η10 = [η. η0m[1 ] for η in ηs]
32
+ @inbounds ind1 = sites[k- 1 ]
33
+ @inbounds ind2 = sites[k]
34
+ @inbounds ind3 = sites[k- 1 ]'
35
+ @inbounds η00 = [η. η00 for η in ηs]
36
+ @inbounds η11 = [η. ηmm for η in ηs]
37
+ @inbounds η10 = [η. η0m[1 ] for η in ηs]
38
38
tens = ITensor (ind1, ind2, ind3)
39
39
for skp = 1 : dim (ind1)
40
40
for sk = 1 : dim (ind2)
41
- tens[ind1=> skp, ind2=> sk, ind3=> skp] = fbU[sk, skp] *
41
+ @inbounds tens[ind1=> skp, ind2=> sk, ind3=> skp] = fbU[sk, skp] *
42
42
exp .(- sum (Δs[:, skp] .* (real (η00) .* Δs[:, skp] + 2im * imag (η00) .* sbar[:, skp]))) *
43
43
exp .(- sum (Δs[:, sk] .* (real (η11) .* Δs[:, sk] + 2im * imag (η11) .* sbar[:, sk]))) *
44
44
exp .(- sum (Δs[:, sk] .* (real (η10) .* Δs[:, skp] + 2im * imag (η10) .* sbar[:, skp])))
@@ -48,16 +48,16 @@ function generate_bottom_left_tensor(ηs, sites, fbU, k::Int, Δs, sbar)
48
48
end
49
49
50
50
function generate_bottom_center_tensor (ηs, sites, blip_sites, state_to_blip, fbU, k:: Int , Δs, sbar)
51
- ind1 = sites[k- 1 ]
52
- ind2 = sites[k]
53
- ind3 = sites[k- 1 ]'
54
- ind4 = blip_sites[k]'
55
- η11 = [η. ηmm for η in ηs]
56
- η10 = [η. ηmn[1 ] for η in ηs]
51
+ @inbounds ind1 = sites[k- 1 ]
52
+ @inbounds ind2 = sites[k]
53
+ @inbounds ind3 = sites[k- 1 ]'
54
+ @inbounds ind4 = blip_sites[k]'
55
+ @inbounds η11 = [η. ηmm for η in ηs]
56
+ @inbounds η10 = [η. ηmn[1 ] for η in ηs]
57
57
tens = ITensor (ind1, ind2, ind3, ind4)
58
58
for skp = 1 : dim (ind1)
59
59
for sk = 1 : dim (ind2)
60
- tens[ind1=> skp, ind2=> sk, ind3=> skp, ind4=> state_to_blip[sk]] = fbU[sk, skp] *
60
+ @inbounds tens[ind1=> skp, ind2=> sk, ind3=> skp, ind4=> state_to_blip[sk]] = fbU[sk, skp] *
61
61
exp .(- sum (Δs[:, sk] .* (real (η11) .* Δs[:, sk] + 2im * imag (η11) .* sbar[:, sk]))) *
62
62
exp .(- sum (Δs[:, sk] .* (real (η10) .* Δs[:, skp] + 2im * imag (η10) .* sbar[:, skp])))
63
63
end
67
67
68
68
function generate_center_tensor (ηs, sites, blip_sites, k:: Int , kp:: Int , group_Δs, Δs, sbar)
69
69
kkp = k - kp
70
- ind1 = prime (sites[kp], kkp - 1 )
71
- ind2 = prime (blip_sites[k], kkp - 1 )
72
- ind3 = prime (sites[kp], kkp)
73
- ind4 = prime (blip_sites[k], kkp)
74
- η = [η. ηmn[kkp] for η in ηs]
70
+ @inbounds ind1 = prime (sites[kp], kkp - 1 )
71
+ @inbounds ind2 = prime (blip_sites[k], kkp - 1 )
72
+ @inbounds ind3 = prime (sites[kp], kkp)
73
+ @inbounds ind4 = prime (blip_sites[k], kkp)
74
+ @inbounds η = [η. ηmn[kkp] for η in ηs]
75
75
tens = ITensor (ind1, ind2, ind3, ind4)
76
76
for skp = 1 : dim (ind1)
77
77
for sk = 1 : dim (ind2)
78
- tens[ind1=> skp, ind2=> sk, ind3=> skp, ind4=> sk] = exp .(- sum (group_Δs[:, sk] .* (real (η) .* Δs[:, skp] + 2im * imag (η) .* sbar[:, skp])))
78
+ @inbounds tens[ind1=> skp, ind2=> sk, ind3=> skp, ind4=> sk] = exp .(- sum (group_Δs[:, sk] .* (real (η) .* Δs[:, skp] + 2im * imag (η) .* sbar[:, skp])))
79
79
end
80
80
end
81
81
tens
82
82
end
83
83
84
84
function generate_left_tensor (ηs, sites, blip_sites, k:: Int , kp:: Int , group_Δs, Δs, sbar)
85
85
kkp = k - kp
86
- ind1 = prime (sites[kp], kkp - 1 )
87
- ind2 = prime (blip_sites[k], kkp - 1 )
88
- ind3 = prime (sites[kp], kkp)
89
- η = [η. η0m[kkp] for η in ηs]
86
+ @inbounds ind1 = prime (sites[kp], kkp - 1 )
87
+ @inbounds ind2 = prime (blip_sites[k], kkp - 1 )
88
+ @inbounds ind3 = prime (sites[kp], kkp)
89
+ @inbounds η = [η. η0m[kkp] for η in ηs]
90
90
tens = ITensor (ind1, ind2, ind3)
91
91
for skp = 1 : dim (ind1)
92
92
for sk = 1 : dim (ind2)
93
- tens[ind1=> skp, ind2=> sk, ind3=> skp] = exp .(- sum (group_Δs[:, sk] .* (real (η) .* Δs[:, skp] + 2im * imag (η) .* sbar[:, skp])))
93
+ @inbounds tens[ind1=> skp, ind2=> sk, ind3=> skp] = exp .(- sum (group_Δs[:, sk] .* (real (η) .* Δs[:, skp] + 2im * imag (η) .* sbar[:, skp])))
94
94
end
95
95
end
96
96
tens
97
97
end
98
98
99
99
function generate_right_tensor (ηs, sites, blip_sites, k:: Int , kp:: Int , group_Δs, Δs, sbar)
100
100
kkp = k - kp
101
- ind1 = prime (sites[kp], kkp - 1 )
102
- ind2 = prime (blip_sites[k], kkp - 1 )
103
- ind3 = prime (blip_sites[k], kkp)
104
- η = [η. η0m[kkp] for η in ηs]
101
+ @inbounds ind1 = prime (sites[kp], kkp - 1 )
102
+ @inbounds ind2 = prime (blip_sites[k], kkp - 1 )
103
+ @inbounds ind3 = prime (blip_sites[k], kkp)
104
+ @inbounds η = [η. η0m[kkp] for η in ηs]
105
105
tens = ITensor (ind1, ind2, ind3)
106
106
for skp = 1 : dim (ind1)
107
107
for sk = 1 : dim (ind2)
108
- tens[ind1=> skp, ind2=> sk, ind3=> sk] = exp .(- sum (group_Δs[:, sk] .* (real (η) .* Δs[:, skp] + 2im * imag (η) .* sbar[:, skp])))
108
+ @inbounds tens[ind1=> skp, ind2=> sk, ind3=> sk] = exp .(- sum (group_Δs[:, sk] .* (real (η) .* Δs[:, skp] + 2im * imag (η) .* sbar[:, skp])))
109
109
end
110
110
end
111
111
tens
112
112
end
113
113
114
114
function generate_top_tensor (ηs, sites, blip_sites, k:: Int , kp:: Int , group_Δs, Δs, sbar)
115
115
kkp = k - kp
116
- ind1 = prime (sites[kp], kkp - 1 )
117
- ind2 = prime (blip_sites[k], kkp - 1 )
118
- η = [η. η0e[kkp] for η in ηs]
116
+ @inbounds ind1 = prime (sites[kp], kkp - 1 )
117
+ @inbounds ind2 = prime (blip_sites[k], kkp - 1 )
118
+ @inbounds η = [η. η0e[kkp] for η in ηs]
119
119
tens = ITensor (ind1, ind2)
120
120
for skp = 1 : dim (ind1)
121
121
for sk = 1 : dim (ind2)
122
- tens[ind1=> skp, ind2=> sk] = exp .(- sum (group_Δs[:, sk] .* (real (η) .* Δs[:, skp] + 2im * imag (η) .* sbar[:, skp])))
122
+ @inbounds tens[ind1=> skp, ind2=> sk] = exp .(- sum (group_Δs[:, sk] .* (real (η) .* Δs[:, skp] + 2im * imag (η) .* sbar[:, skp])))
123
123
end
124
124
end
125
125
tens
@@ -151,63 +151,74 @@ function build_augmented_propagator(; fbU::AbstractArray{ComplexF64,3}, Jw::Abst
151
151
U0e = zeros (ComplexF64, ntimes, sdim2, sdim2)
152
152
T0e = zero (U0e)
153
153
154
- # calculate for the first time step separately, s1->s2
155
- U0e[1 , :, :] = fbU[1 , :, :]
156
- for (bn, η) in enumerate (ηs)
157
- infl = exp .(- Δs[bn, :] .* (real (η. η00) * Δs[bn, :] + 2im * imag (η. η00) * sbar[bn, :]))
158
- for t = 1 : sdim2
159
- U0e[1 , t, :] .*= infl
160
- U0e[1 , :, t] .*= infl
161
- infl1 = exp .(- Δs[bn, t] .* (real (η. η0e[1 ]) * Δs[bn, :] + 2im * imag (η. η0e[1 ]) * sbar[bn, :]))
162
- U0e[1 , t, :] .*= infl1
154
+ @inbounds begin
155
+ # calculate for the first time step separately, s1->s2
156
+ U0e[1 , :, :] = fbU[1 , :, :]
157
+ for (bn, η) in enumerate (ηs)
158
+ infl = exp .(- Δs[bn, :] .* (real (η. η00) * Δs[bn, :] + 2im * imag (η. η00) * sbar[bn, :]))
159
+ for t = 1 : sdim2
160
+ U0e[1 , t, :] .*= infl
161
+ U0e[1 , :, t] .*= infl
162
+ infl1 = exp .(- Δs[bn, t] .* (real (η. η0e[1 ]) * Δs[bn, :] + 2im * imag (η. η0e[1 ]) * sbar[bn, :]))
163
+ U0e[1 , t, :] .*= infl1
164
+ end
163
165
end
164
- end
165
- TTM. update_Ts! (T0e, U0e, 1 )
166
- if ! isnothing (output)
167
- if ! from_TTM
168
- Utilities. check_or_insert_value (output, " U0e" , U0e)
166
+ TTM. update_Ts! (T0e, U0e, 1 )
167
+ if ! isnothing (output)
168
+ if ! from_TTM
169
+ Utilities. check_or_insert_value (output, " U0e" , U0e)
170
+ end
171
+ Utilities. check_or_insert_value (output, " T0e" , T0e)
172
+ output[" U0e" ][1 , :, :] = U0e[1 , :, :]
173
+ output[" T0e" ][1 , :, :] = T0e[1 , :, :]
174
+ flush (output)
169
175
end
170
- Utilities. check_or_insert_value (output, " T0e" , T0e)
171
- output[" U0e" ][1 , :, :] = U0e[1 , :, :]
172
- output[" T0e" ][1 , :, :] = T0e[1 , :, :]
173
- flush (output)
174
- end
175
176
176
- sites = siteinds (sdim2, ntimes + 1 )
177
- blip_sites = siteinds (size (group_Δs, 2 ), ntimes + 1 ; add_tags= " blip_sites" )
178
- for j = 2 : ntimes
179
- if verbose
180
- @info " Step = $(j) "
181
- end
182
- # calculation for s1->s_{j+1}
183
- tens = [generate_top_tensor (ηs, sites, blip_sites, j + 1 , 1 , group_Δs, Δs, sbar)]
184
- for l = j: - 1 : 3
185
- push! (tens, generate_left_tensor (ηs, sites, blip_sites, l, 1 , group_Δs, Δs, sbar))
186
- end
187
- push! (tens, generate_bottom_left_tensor (ηs, sites, fbU[1 , :, :], 2 , Δs, sbar))
177
+ sites = siteinds (sdim2, ntimes + 1 )
178
+ blip_sites = siteinds (size (group_Δs, 2 ), ntimes + 1 ; add_tags= " blip_sites" )
179
+ for j = 2 : ntimes
180
+ if verbose
181
+ @info " Step = $(j) "
182
+ end
183
+ tens = Vector {ITensor} (undef, j * (j+ 1 ) ÷ 2 )
184
+ # calculation for s1->s_{j+1}
185
+ k = 1
186
+ tens[k] = generate_top_tensor (ηs, sites, blip_sites, j + 1 , 1 , group_Δs, Δs, sbar)
187
+ k += 1
188
+ for l = j: - 1 : 3
189
+ tens[k] = generate_left_tensor (ηs, sites, blip_sites, l, 1 , group_Δs, Δs, sbar)
190
+ k += 1
191
+ end
192
+ tens[k] = generate_bottom_left_tensor (ηs, sites, fbU[1 , :, :], 2 , Δs, sbar)
193
+ k += 1
188
194
189
- for p = 3 : j
190
- push! (tens, generate_bottom_center_tensor (ηs, sites, blip_sites, state_to_blip, fbU[p- 1 , :, :], p, Δs, sbar))
195
+ for p = 3 : j
196
+ tens[k] = generate_bottom_center_tensor (ηs, sites, blip_sites, state_to_blip, fbU[p- 1 , :, :], p, Δs, sbar)
197
+ k += 1
191
198
192
- for h = 1 : j- p
193
- push! (tens, generate_center_tensor (ηs, sites, blip_sites, p + h, p - 1 , group_Δs, Δs, sbar))
194
- end
199
+ for h = 1 : j- p
200
+ tens[k] = generate_center_tensor (ηs, sites, blip_sites, p + h, p - 1 , group_Δs, Δs, sbar)
201
+ k += 1
202
+ end
195
203
196
- push! (tens, generate_right_tensor (ηs, sites, blip_sites, j + 1 , p - 1 , group_Δs, Δs, sbar))
197
- end
204
+ tens[k] = generate_right_tensor (ηs, sites, blip_sites, j + 1 , p - 1 , group_Δs, Δs, sbar)
205
+ k += 1
206
+ end
198
207
199
- push! (tens, generate_bottom_right_tensor (ηs, sites, blip_sites, state_to_blip, fbU[j, :, :], j + 1 , Δs, sbar))
208
+ tens[k] = generate_bottom_right_tensor (ηs, sites, blip_sites, state_to_blip, fbU[j, :, :], j + 1 , Δs, sbar)
209
+ k += 1
200
210
201
- prop = deepcopy (tens[1 ])
202
- for tensor in tens[2 : end ]
203
- prop *= tensor
204
- end
205
- U0e[j, :, :] = Utilities. convert_ITensor_to_matrix (prop, sites[1 ], sites[j+ 1 ])
206
- TTM. update_Ts! (T0e, U0e, j)
207
- if ! isnothing (output)
208
- output[" U0e" ][j, :, :] = U0e[j, :, :]
209
- output[" T0e" ][j, :, :] = T0e[j, :, :]
210
- flush (output)
211
+ prop = deepcopy (tens[1 ])
212
+ for tensor in tens[2 : end ]
213
+ prop *= tensor
214
+ end
215
+ U0e[j, :, :] = Utilities. convert_ITensor_to_matrix (prop, sites[1 ], sites[j+ 1 ])
216
+ TTM. update_Ts! (T0e, U0e, j)
217
+ if ! isnothing (output)
218
+ output[" U0e" ][j, :, :] = U0e[j, :, :]
219
+ output[" T0e" ][j, :, :] = T0e[j, :, :]
220
+ flush (output)
221
+ end
211
222
end
212
223
end
213
224
U0e
0 commit comments