Skip to content

Commit 77270e9

Browse files
authored
Merge pull request #20 from numericalEFT/dev
Dev
2 parents 3dc0f69 + 1e1f30d commit 77270e9

File tree

10 files changed

+144
-98
lines changed

10 files changed

+144
-98
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "Lehmann"
22
uuid = "95bf888a-8996-4655-9f35-1c0506bdfefe"
33
authors = ["Kun Chen", "Tao Wang", "Xiansheng Cai"]
4-
version = "0.2.2"
4+
version = "0.2.3"
55

66
[deps]
77
DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab"

docs/src/manual/kernel.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ We use the following conventions:
2323
- Fourier transform follows the convention in the book "Quantum Many-particle Systems" by J. Negele and H. Orland, Page 95,
2424

2525
```math
26-
G(\tau) = \frac{1}{\beta} \sum_n G(i\omega_n) \text{e}^{i\omega_n \tau}
26+
G(\tau) = \frac{1}{\beta} \sum_n G(i\omega_n) \text{e}^{-i\omega_n \tau}
2727
```
2828

2929
```math
30-
G(i\omega_n) = \int_0^\beta G(\tau) \text{e}^{-i\omega_n \tau} d\tau
30+
G(i\omega_n) = \int_0^\beta G(\tau) \text{e}^{i\omega_n \tau} d\tau
3131
```
3232

3333
# Fermion without Symmetry
@@ -65,7 +65,7 @@ K(τ, ω) = e^{-ω|τ|}+e^{-ω(β-|τ|)}
6565
```
6666
- Matusbara frequency
6767
```math
68-
K(iω_n, ω) = -\frac{2iω_n}{ω^2+ω_n^2}(1+e^{-ωβ}),
68+
K(iω_n, ω) = \frac{2iω_n}{ω^2+ω_n^2}(1+e^{-ωβ}),
6969
```
7070

7171
# Boson with the Particle-hole Symmetry
@@ -104,5 +104,5 @@ K(τ, ω) = e^{-ω|τ|}-e^{-ω(β-|τ|)}
104104
```
105105
- Matusbara frequency
106106
```math
107-
K(iω_n, ω) = -\frac{2iω_n}{ω^2+ω_n^2}(1-e^{-ωβ}),
107+
K(iω_n, ω) = \frac{2iω_n}{ω^2+ω_n^2}(1-e^{-ωβ}),
108108
```

example/SYK.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ end
4242
function dyson(d, sigma_q, mu)
4343
if d.symmetry == :ph #symmetrized G
4444
@assert mu 0.0 "Only the case μ=0 enjoys the particle-hole symmetry."
45-
return 1im * imag.(1 ./ (d.ωn * 1im .+ mu .- sigma_q))
45+
return 1im * imag.(-1 ./ (d.ωn * 1im .- mu .+ sigma_q))
4646
elseif d.symmetry == :none
4747
return -1 ./ (d.ωn * 1im .- mu .+ sigma_q)
4848
else
@@ -102,13 +102,13 @@ for Euv in LinRange(5.0, 10.0, 50)
102102
# printstyled("===== Symmetrized DLR solver for SYK model =======\n", color = :yellow)
103103
mix = 0.01
104104
dsym = DLRGrid(Euv = Euv, β = β, isFermi = true, rtol = rtol, symmetry = :ph, rebuild = true, verbose = false) # Initialize DLR object
105-
G_x_ph = solve_syk_with_fixpoint_iter(dsym, 0.00, mix = mix, verbose = verbose)
105+
@time G_x_ph = solve_syk_with_fixpoint_iter(dsym, 0.00, mix = mix, verbose = verbose)
106106
# printG(dsym, G_x_ph)
107107

108108
# printstyled("===== Unsymmetrized DLR solver for SYK model =======\n", color = :yellow)
109109
mix = 0.01
110110
dnone = DLRGrid(Euv = Euv, β = β, isFermi = true, rtol = rtol, symmetry = :none, rebuild = true, verbose = false) # Initialize DLR object
111-
G_x_none = solve_syk_with_fixpoint_iter(dnone, 0.00, mix = mix, verbose = verbose)
111+
@time G_x_none = solve_syk_with_fixpoint_iter(dnone, 0.00, mix = mix, verbose = verbose)
112112
# printG(dnone, G_x_none)
113113

114114
# printstyled("===== Unsymmetrized versus Symmetrized DLR solver =======\n", color = :yellow)

src/discrete/kernel.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,11 @@ function preciseKernelT(dlrGrid, τ, ω, print::Bool = true)
103103
#symmetrize K(τ, ω)=K(β-τ, -ω) for τ>0
104104
@assert isodd.np) #symmetrization is only possible for odd τ panels
105105
halfτ = ((τ.np - 1) ÷ 2) * τ.degree
106-
kernel[1:halfτ, :] = Spectral.kernelT(true, symmetry, τ.grid[1:halfτ], ω.grid, 1.0, true)
107-
kernel[end:-1:(halfτ+1), :] = Spectral.kernelT(true, symmetry, τ.grid[1:halfτ], ω.grid[end:-1:1], 1.0, true)
106+
kernel[1:halfτ, :] = Spectral.kernelT(Val(true), Val(symmetry), τ.grid[1:halfτ], ω.grid, 1.0, true)
107+
kernel[end:-1:(halfτ+1), :] = Spectral.kernelT(Val(true), Val(symmetry), τ.grid[1:halfτ], ω.grid[end:-1:1], 1.0, true)
108108
# use the fermionic kernel for both the fermionic and bosonic propagators
109109
else
110-
kernel = Spectral.kernelT(dlrGrid.isFermi, symmetry, τGrid, ωGrid, 1.0, true)
110+
kernel = Spectral.kernelT(Val(dlrGrid.isFermi), Val(symmetry), τGrid, ωGrid, 1.0, true)
111111
end
112112

113113
# print && println("===== Kernel Discretization =====")
@@ -191,8 +191,8 @@ function preciseKernelΩn(dlrGrid, ω, print::Bool = true)
191191
symmetry = dlrGrid.symmetry
192192
n = nGrid(dlrGrid.isFermi, symmetry, dlrGrid.Λ)
193193

194-
nkernelFermi = Spectral.kernelΩ(true, symmetry, n, Float64.(ωGrid), 1.0, true)
195-
nkernelBose = Spectral.kernelΩ(false, symmetry, n, Float64.(ωGrid), 1.0, true)
194+
nkernelFermi = Spectral.kernelΩ(Val(true), Val(symmetry), n, Float64.(ωGrid), 1.0, true)
195+
nkernelBose = Spectral.kernelΩ(Val(false), Val(symmetry), n, Float64.(ωGrid), 1.0, true)
196196

197197
return n, nkernelFermi, nkernelBose
198198
end

src/dlr.jl

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ struct DLRGrid
2626
- `ωn` : (2n+1)π/β
2727
- `τ` : selected representative imaginary-time grid
2828
"""
29-
struct DLRGrid
29+
mutable struct DLRGrid
3030
isFermi::Bool
3131
symmetry::Symbol
3232
Euv::Float64
@@ -41,6 +41,9 @@ struct DLRGrid
4141
ωn::Vector{Float64} # (2n+1)π/β
4242
τ::Vector{Float64}
4343

44+
kernel_τ::Any
45+
kernel_n::Any
46+
4447
"""
4548
function DLRGrid(Euv, β, rtol, isFermi::Bool; symmetry::Symbol = :none, rebuild = false, folder = nothing, algorithm = :functional, verbose = false)
4649
function DLRGrid(; Euv, β, isFermi::Bool, symmetry::Symbol = :none, rtol = 1e-8, rebuild = false, folder = nothing, algorithm = :functional, verbose = false)
@@ -110,41 +113,34 @@ struct DLRGrid
110113

111114
if rebuild == false
112115
if isnothing(folder)
113-
Λfloor = Λ < 100 ? Int(100) : 10^(Int(ceil(log10(Λ)))) # get smallest n so that Λ<10^n
114-
116+
Λ = Λ < 100 ? Int(100) : 10^(Int(ceil(log10(Λ)))) # get smallest n so that Λ<10^n
115117
folderList = [string(@__DIR__, "/../basis/"),]
116-
file = filename(Λfloor, rtolpower)
117-
118-
dlrfile = finddlr(folderList, file)
119-
120-
if isnothing(dlrfile) == false
121-
dlr = new(isFermi, symmetry, Euv, β, Λfloor, 10.0^(float(rtolpower)), [], [], [], [])
122-
_load!(dlr, dlrfile, verbose)
123-
return dlr
124-
else
125-
@warn("No DLR is found in the folder $folder, try to rebuild instead.")
126-
end
127118
else
128-
file = filename(Euv * β, rtolpower)
129119
folderList = [folder,]
120+
end
130121

131-
dlrfile = finddlr(folderList, file)
122+
file = filename(Λ, rtolpower)
123+
dlrfile = finddlr(folderList, file)
132124

133-
if isnothing(dlrfile) == false
134-
dlr = new(isFermi, symmetry, Euv, β, Euv * β, rtol, [], [], [], [])
135-
_load!(dlr, dlrfile, verbose)
136-
return dlr
137-
else
138-
@warn("No DLR is found in the folder $folder, try to rebuild instead.")
139-
end
125+
if isnothing(dlrfile) == false
126+
dlr = new(isFermi, symmetry, Euv, β, Λ, rtol, [], [], [], [], nothing, nothing)
127+
_load!(dlr, dlrfile, verbose)
128+
dlr.kernel_τ = Spectral.kernelT(Val(dlr.isFermi), Val(dlr.symmetry), dlr.τ, dlr.ω, dlr.β, true)
129+
dlr.kernel_n = Spectral.kernelΩ(Val(dlr.isFermi), Val(dlr.symmetry), dlr.n, dlr.ω, dlr.β, true)
130+
return dlr
131+
else
132+
@warn("No DLR is found in the folder $folder, try to rebuild instead.")
140133
end
141134

142135
end
143136

144137
# try to rebuild the dlrGrid
145-
dlr = new(isFermi, symmetry, Euv, β, Euv * β, rtol, [], [], [], [])
138+
dlr = new(isFermi, symmetry, Euv, β, Euv * β, rtol, [], [], [], [], nothing, nothing)
146139
file2save = filename(Euv * β, rtolpower)
147140
_build!(dlr, folder, file2save, algorithm, verbose)
141+
142+
dlr.kernel_τ = Spectral.kernelT(Val(dlr.isFermi), Val(dlr.symmetry), dlr.τ, dlr.ω, dlr.β, true)
143+
dlr.kernel_n = Spectral.kernelΩ(Val(dlr.isFermi), Val(dlr.symmetry), dlr.n, dlr.ω, dlr.β, true)
148144
return dlr
149145
end
150146

src/operation.jl

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,20 @@ function tau2dlr(dlrGrid::DLRGrid, green, τGrid = dlrGrid.τ; error = nothing,
8989
@assert size(green)[axis] == length(τGrid)
9090
ωGrid = dlrGrid.ω
9191

92-
kernel = Spectral.kernelT(dlrGrid.isFermi, dlrGrid.symmetry, τGrid, ωGrid, dlrGrid.β, true)
93-
typ = promote_type(eltype(kernel), eltype(green))
94-
kernel = convert.(typ, kernel)
95-
green = convert.(typ, green)
92+
typ = promote_type(eltype(dlrGrid.kernel_τ), eltype(green))
93+
94+
if length(τGrid) == dlrGrid.size && isapprox(τGrid, dlrGrid.τ; rtol = 1e-14)
95+
kernel = dlrGrid.kernel_τ
96+
else
97+
kernel = Spectral.kernelT(Val(dlrGrid.isFermi), Val(dlrGrid.symmetry), τGrid, ωGrid, dlrGrid.β, true; type = typ)
98+
end
99+
100+
if typ != eltype(kernel)
101+
kernel = convert.(typ, kernel)
102+
end
103+
if typ != eltype(green)
104+
green = convert.(typ, green)
105+
end
96106

97107
g, partialsize = _tensor2matrix(green, axis)
98108

@@ -102,7 +112,7 @@ function tau2dlr(dlrGrid::DLRGrid, green, τGrid = dlrGrid.τ; error = nothing,
102112
end
103113
coeff = _weightedLeastSqureFit(g, error, kernel)
104114

105-
if all(abs.(coeff) .< 1e16) == false
115+
if all(x -> abs(x) < 1e16, coeff) == false
106116
@warn("Some of the DLR coefficients are larger than 1e16. The quality of DLR fitting could be bad.")
107117
end
108118

@@ -127,7 +137,11 @@ function dlr2tau(dlrGrid::DLRGrid, dlrcoeff, τGrid = dlrGrid.τ; axis = 1)
127137
β = dlrGrid.β
128138
ωGrid = dlrGrid.ω
129139

130-
kernel = Spectral.kernelT(dlrGrid.isFermi, dlrGrid.symmetry, τGrid, ωGrid, β, true)
140+
if length(τGrid) == dlrGrid.size && isapprox(τGrid, dlrGrid.τ; rtol = 1e-14)
141+
kernel = dlrGrid.kernel_τ
142+
else
143+
kernel = Spectral.kernelT(Val(dlrGrid.isFermi), Val(dlrGrid.symmetry), τGrid, ωGrid, dlrGrid.β, true)
144+
end
131145

132146
coeff, partialsize = _tensor2matrix(dlrcoeff, axis)
133147

@@ -154,10 +168,21 @@ function matfreq2dlr(dlrGrid::DLRGrid, green, nGrid = dlrGrid.n; error = nothing
154168
@assert eltype(nGrid) <: Integer
155169
ωGrid = dlrGrid.ω
156170

157-
kernel = Spectral.kernelΩ(dlrGrid.isFermi, dlrGrid.symmetry, nGrid, ωGrid, dlrGrid.β, true)
158-
typ = promote_type(eltype(kernel), eltype(green))
159-
kernel = convert.(typ, kernel)
160-
green = convert.(typ, green)
171+
typ = promote_type(eltype(dlrGrid.kernel_n), eltype(green))
172+
173+
if length(nGrid) == dlrGrid.size && isapprox(nGrid, dlrGrid.n; rtol = 1e-14)
174+
kernel = dlrGrid.kernel_n
175+
else
176+
kernel = Spectral.kernelΩ(Val(dlrGrid.isFermi), Val(dlrGrid.symmetry), nGrid, ωGrid, dlrGrid.β, true; type = typ)
177+
end
178+
179+
if typ != eltype(green)
180+
green = convert.(typ, green)
181+
end
182+
183+
if typ != eltype(kernel)
184+
dlrGrid.kernel_n = convert.(typ, dlrGrid.kernel_n)
185+
end
161186

162187
g, partialsize = _tensor2matrix(green, axis)
163188

@@ -166,7 +191,7 @@ function matfreq2dlr(dlrGrid::DLRGrid, green, nGrid = dlrGrid.n; error = nothing
166191
error, psize = _tensor2matrix(error, axis)
167192
end
168193
coeff = _weightedLeastSqureFit(g, error, kernel)
169-
if all(abs.(coeff) .< 1e16) == false
194+
if all(x -> abs(x) < 1e16, coeff) == false
170195
@warn("Some of the DLR coefficients are larger than 1e16. The quality of DLR fitting could be bad.")
171196
end
172197
return _matrix2tensor(coeff, partialsize, axis)
@@ -189,7 +214,11 @@ function dlr2matfreq(dlrGrid::DLRGrid, dlrcoeff, nGrid = dlrGrid.n; axis = 1)
189214
@assert eltype(nGrid) <: Integer
190215
ωGrid = dlrGrid.ω
191216

192-
kernel = Spectral.kernelΩ(dlrGrid.isFermi, dlrGrid.symmetry, nGrid, ωGrid, dlrGrid.β, true)
217+
if length(nGrid) == dlrGrid.size && isapprox(nGrid, dlrGrid.n; rtol = 1e-14)
218+
kernel = dlrGrid.kernel_n
219+
else
220+
kernel = Spectral.kernelΩ(Val(dlrGrid.isFermi), Val(dlrGrid.symmetry), nGrid, ωGrid, dlrGrid.β, true)
221+
end
193222

194223
coeff, partialsize = _tensor2matrix(dlrcoeff, axis)
195224

src/sample/sample.jl

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,19 @@ function _Green(::Val{IsMatFreq}, Euv, β, isFermi, Grid, symmetry, n, pbp, npo,
8989
#spectral density is defined for positivie frequency only for correlation functions
9090
continue
9191
end
92-
ker = IsMatFreq ? Spectral.kernelΩ(isFermi, symmetry, τ, Euv * x, β, regularized) : Spectral.kernelT(isFermi, symmetry, τ, Euv * x, β, regularized)
92+
ker = IsMatFreq ?
93+
Spectral.kernelΩ(Val(isFermi), Val(symmetry), τ, Euv * x, β, regularized) :
94+
Spectral.kernelT(Val(isFermi), Val(symmetry), τ, Euv * x, β, regularized)
9395
G[τi] += (b - a) / 2 * wl[jj] * ker * sqrt(1 - x^2)
9496
end
9597
end
9698

9799
a, b = 1.0 / 2, 1.0
98100
for jj = 1:n
99101
x = (a + b) / 2 + (b - a) / 2 * xj[jj]
100-
ker = IsMatFreq ? Spectral.kernelΩ(isFermi, symmetry, τ, Euv * x, β, regularized) : Spectral.kernelT(isFermi, symmetry, τ, Euv * x, β, regularized)
102+
ker = IsMatFreq ?
103+
Spectral.kernelΩ(Val(isFermi), Val(symmetry), τ, Euv * x, β, regularized) :
104+
Spectral.kernelT(Val(isFermi), Val(symmetry), τ, Euv * x, β, regularized)
101105
G[τi] += ((b - a) / 2)^1.5 * wj[jj] * ker * sqrt(1 + x)
102106
end
103107

@@ -106,7 +110,9 @@ function _Green(::Val{IsMatFreq}, Euv, β, isFermi, Grid, symmetry, n, pbp, npo,
106110
a, b = -1.0, -1.0 / 2
107111
for jj = 1:n
108112
x = (a + b) / 2 + (b - a) / 2 * (-xj[n-jj+1])
109-
ker = IsMatFreq ? Spectral.kernelΩ(isFermi, symmetry, τ, Euv * x, β, regularized) : Spectral.kernelT(isFermi, symmetry, τ, Euv * x, β, regularized)
113+
ker = IsMatFreq ?
114+
Spectral.kernelΩ(Val(isFermi), Val(symmetry), τ, Euv * x, β, regularized) :
115+
Spectral.kernelT(Val(isFermi), Val(symmetry), τ, Euv * x, β, regularized)
110116
G[τi] += ((b - a) / 2)^1.5 * wj[n-jj+1] * ker * sqrt(1 - x)
111117
end
112118
end
@@ -153,9 +159,9 @@ function MultiPole(β, isFermi::Bool, Grid, type::Symbol, poles, symmetry::Symbo
153159
end
154160

155161
if IsMatFreq == false
156-
g[τi] += Spectral.kernelT(isFermi, symmetry, τ, ω, β, regularized)
162+
g[τi] += Spectral.kernelT(Val(isFermi), Val(symmetry), τ, ω, β, regularized)
157163
else
158-
g[τi] += Spectral.kernelΩ(isFermi, symmetry, τ, ω, β, regularized)
164+
g[τi] += Spectral.kernelΩ(Val(isFermi), Val(symmetry), τ, ω, β, regularized)
159165
end
160166
end
161167
end

0 commit comments

Comments
 (0)