Skip to content

Commit

Permalink
add sum rule demo
Browse files Browse the repository at this point in the history
  • Loading branch information
LittleBug committed Jan 15, 2022
1 parent 123e0ea commit a5138f4
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 27 deletions.
36 changes: 36 additions & 0 deletions example/demoSumRule.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using Lehmann
using Printf
using Gaston
β = 40.0
rtol = 1e-8
eta = 1e-2
N = 128

dlr = DLRGrid= β, Euv = 1.0, isFermi = true, rtol = rtol, symmetry = :none)
τgrid = collect(LinRange(0.0, β, N))
println(τgrid)
G = Sample.SemiCircle(dlr, , τgrid)
G += rand(length(G)) / 2.0 * eta
coeff = tau2dlr(dlr, G, τgrid)
coeff_sumrule = tau2dlr(dlr, G, τgrid, sumrule = π / 2)
println("sum rule: ", abs(sum(coeff) - π / 2), " versus ", abs(sum(coeff_sumrule) - π / 2))


dlr10 = DLRGrid= β, Euv = 100.0, isFermi = true, rtol = rtol, symmetry = :none)

Gtrue = Sample.SemiCircle(dlr, , dlr10.τ)
Gfit = real.(dlr2tau(dlr, coeff, dlr10.τ))
Gfit_sumrule = real.(dlr2tau(dlr, coeff_sumrule, dlr10.τ))

@printf("%15s%30s%30s%30s\n", "tau", "true", "no sumrule", "with sumrule")
for i in 1:dlr10.size
@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]))
end

set(term = "qt")
# p = plot(dlr10.τ, Gtrue, label = "original", axis = "semilogy")
xrange = (0.0, 40)
p = plot(dlr10.τ, Gfit - Gtrue, plotstyle = :linespoints, leg = Symbol("DLR no sum rule"), Axes(xrange = xrange))
plot!(dlr10.τ, Gfit_sumrule - Gtrue, plotstyle = :linespoints, leg = Symbol("DLR with sum rule"))
display(p)
readline()
23 changes: 0 additions & 23 deletions example/test.jl

This file was deleted.

14 changes: 10 additions & 4 deletions src/operation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,14 @@ function _weightedLeastSqureFit(dlrGrid, Gτ, error, kernel, sumrule)
Nτ, Nω = size(kernel)
@assert size(Gτ)[1] ==
if isnothing(sumrule) == false
@assert dlrGrid.symmetry == :none && dlrGrid.isFermi "only unsymmetrized ferminoic sum rule has been implemented!"
# println(size(Gτ))
kernel_m0 = kernel[:, end]
kernel = kernel[:, 1:-1] #a copy of kernel submatrix will be created
M = Int(floor(dlrGrid.size / 2))
# M = dlrGrid.size

kernel_m0 = kernel[:, M]
# kernel = kernel[:, 1:Nω-1] #a copy of kernel submatrix will be created
kernel = hcat(kernel[:, 1:M-1], kernel[:, M+1:end])

for i in 1:
Gτ[i, :] .-= kernel_m0[i] * sumrule
Expand Down Expand Up @@ -161,8 +166,9 @@ function _weightedLeastSqureFit(dlrGrid, Gτ, error, kernel, sumrule)
#add back the coeff that are fixed by the sum rule
coeffmore = sumrule' .- sum(coeff, dims = 1)
cnew = zeros(eltype(coeff), size(coeff)[1] + 1, size(coeff)[2])
cnew[1:end-1, :] = coeff
cnew[end, :] = coeffmore
cnew[1:M-1, :] = coeff[1:M-1, :]
cnew[M+1:end, :] = coeff[M:end, :]
cnew[M, :] = coeffmore
return cnew
else
return coeff
Expand Down

0 comments on commit a5138f4

Please sign in to comment.