Skip to content

Commit a5138f4

Browse files
committed
add sum rule demo
1 parent 123e0ea commit a5138f4

File tree

3 files changed

+46
-27
lines changed

3 files changed

+46
-27
lines changed

example/demoSumRule.jl

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using Lehmann
2+
using Printf
3+
using Gaston
4+
β = 40.0
5+
rtol = 1e-8
6+
eta = 1e-2
7+
N = 128
8+
9+
dlr = DLRGrid= β, Euv = 1.0, isFermi = true, rtol = rtol, symmetry = :none)
10+
τgrid = collect(LinRange(0.0, β, N))
11+
println(τgrid)
12+
G = Sample.SemiCircle(dlr, , τgrid)
13+
G += rand(length(G)) / 2.0 * eta
14+
coeff = tau2dlr(dlr, G, τgrid)
15+
coeff_sumrule = tau2dlr(dlr, G, τgrid, sumrule = π / 2)
16+
println("sum rule: ", abs(sum(coeff) - π / 2), " versus ", abs(sum(coeff_sumrule) - π / 2))
17+
18+
19+
dlr10 = DLRGrid= β, Euv = 100.0, isFermi = true, rtol = rtol, symmetry = :none)
20+
21+
Gtrue = Sample.SemiCircle(dlr, , dlr10.τ)
22+
Gfit = real.(dlr2tau(dlr, coeff, dlr10.τ))
23+
Gfit_sumrule = real.(dlr2tau(dlr, coeff_sumrule, dlr10.τ))
24+
25+
@printf("%15s%30s%30s%30s\n", "tau", "true", "no sumrule", "with sumrule")
26+
for i in 1:dlr10.size
27+
@printf("%15.6f%30.15f%30.15e%30.15e\n", dlr10.τ[i], Gtrue[i], abs(Gfit[i] - Gtrue[i]), abs(Gfit_sumrule[i] - Gtrue[i]))
28+
end
29+
30+
set(term = "qt")
31+
# p = plot(dlr10.τ, Gtrue, label = "original", axis = "semilogy")
32+
xrange = (0.0, 40)
33+
p = plot(dlr10.τ, Gfit - Gtrue, plotstyle = :linespoints, leg = Symbol("DLR no sum rule"), Axes(xrange = xrange))
34+
plot!(dlr10.τ, Gfit_sumrule - Gtrue, plotstyle = :linespoints, leg = Symbol("DLR with sum rule"))
35+
display(p)
36+
readline()

example/test.jl

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/operation.jl

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,14 @@ function _weightedLeastSqureFit(dlrGrid, Gτ, error, kernel, sumrule)
122122
Nτ, Nω = size(kernel)
123123
@assert size(Gτ)[1] ==
124124
if isnothing(sumrule) == false
125+
@assert dlrGrid.symmetry == :none && dlrGrid.isFermi "only unsymmetrized ferminoic sum rule has been implemented!"
125126
# println(size(Gτ))
126-
kernel_m0 = kernel[:, end]
127-
kernel = kernel[:, 1:-1] #a copy of kernel submatrix will be created
127+
M = Int(floor(dlrGrid.size / 2))
128+
# M = dlrGrid.size
129+
130+
kernel_m0 = kernel[:, M]
131+
# kernel = kernel[:, 1:Nω-1] #a copy of kernel submatrix will be created
132+
kernel = hcat(kernel[:, 1:M-1], kernel[:, M+1:end])
128133

129134
for i in 1:
130135
Gτ[i, :] .-= kernel_m0[i] * sumrule
@@ -161,8 +166,9 @@ function _weightedLeastSqureFit(dlrGrid, Gτ, error, kernel, sumrule)
161166
#add back the coeff that are fixed by the sum rule
162167
coeffmore = sumrule' .- sum(coeff, dims = 1)
163168
cnew = zeros(eltype(coeff), size(coeff)[1] + 1, size(coeff)[2])
164-
cnew[1:end-1, :] = coeff
165-
cnew[end, :] = coeffmore
169+
cnew[1:M-1, :] = coeff[1:M-1, :]
170+
cnew[M+1:end, :] = coeff[M:end, :]
171+
cnew[M, :] = coeffmore
166172
return cnew
167173
else
168174
return coeff

0 commit comments

Comments
 (0)