Skip to content

Commit 16a966b

Browse files
committed
Fix bug when generating DLR grid at small Lambda
1 parent 24df106 commit 16a966b

File tree

5 files changed

+87
-70
lines changed

5 files changed

+87
-70
lines changed

example/hightemperature.jl

-7
This file was deleted.

src/discrete/builder.jl

+5-4
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,11 @@ function τnQR(kernel, rank, print::Bool=true)
6363
@assert rank == size(kernel)[2] #the ω dimension of the τkernel should be the effective rank
6464

6565
τnqr = qr(transpose(kernel), Val(true)) # julia qr has a strange, Val(true) will do a pivot QR
66-
67-
return τnqr.p[1:rank]
68-
66+
if rank > length(τnqr.p)
67+
return τnqr.p
68+
else
69+
return τnqr.p[1:rank]
70+
end
6971
end
7072

7173
function buildωn(dlrGrid, print::Bool=true)
@@ -120,7 +122,6 @@ function build(dlrGrid, print::Bool=true)
120122
print && println("ω grid size = $(ω.ngrid)")
121123

122124
kernel = preciseKernelT(dlrGrid, τ, ω, print)
123-
println("test $(size(kernel)) $(length.grid)) $(length.grid ))\n")
124125
if dlrGrid.symmetry != :sym
125126
testInterpolation(dlrGrid, τ, ω, kernel, print)
126127
end

src/discrete/kernel.jl

+5-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ function ωChebyGrid(dlrGrid, degree, print=true)
2525
Λ, rtol = dlrGrid.Λ, dlrGrid.rtol
2626

2727
npo = Int(ceil(log(Λ) / log(2.0))) # subintervals on [0,lambda] in omega space (subintervals on [-lambda,lambda] is 2*npo)
28-
28+
if npo < 1
29+
npo = 1
30+
end
2931
if dlrGrid.symmetry == :ph || dlrGrid.symmetry == :pha
3032
# Panel break points for the real frequency ∈ [0, Λ]
3133
# get exponentially dense near 0⁺
@@ -52,8 +54,8 @@ function τChebyGrid(dlrGrid, degree, print=true)
5254
Λ, rtol = dlrGrid.Λ, dlrGrid.rtol
5355

5456
npt = Int(ceil(log(Λ) / log(2.0))) - 2 # subintervals on [0,1/2] in tau space (# subintervals on [0,1] is 2*npt)
55-
if npt < 2
56-
npt = 2
57+
if npt < 1
58+
npt = 1
5759
end
5860

5961
if dlrGrid.symmetry == :ph || dlrGrid.symmetry == :pha

src/dlr.jl

+32-12
Original file line numberDiff line numberDiff line change
@@ -343,20 +343,40 @@ function _build!(dlrGrid::DLRGrid, folder, filename, algorithm, verbose=false)
343343
end
344344
rank = length(ω)
345345
if isnothing(folder) == false
346-
open(joinpath(folder, filename), "w") do io
347-
@printf(io, "# %5s %25s %25s %25s %20s\n", "index", "freq", "tau", "fermi n", "bose n")
348-
for r = 1:rank
349-
@printf(io, "%5i %32.17g %32.17g %16i %16i\n", r, ω[r], τ[r], nF[r], nB[r])
350-
end
346+
nan = "NAN"
347+
print("$(filename)\n")
348+
file = open(joinpath(folder, filename), "w")
349+
#open(joinpath(folder, filename), "w") do io
350+
@printf(file, "# %5s %25s %25s %25s %20s\n", "index", "freq", "tau", "fermi n", "bose n")
351+
for r = 1:rank
352+
s0 = "%5i "
353+
s1 = r > length(ω) ? "%48s " : "%48.40g "
354+
s2 = r > length(τ) ? "%48s " : "%48.40g "
355+
s3 = r > length(nF) ? "%16s " : "%16i "
356+
s4 = r > length(nB) ? "%16s\n" : "%16i\n"
357+
f = Printf.Format(s0 * s1 * s2 * s3 * s4)
358+
Printf.format(file, f, r, r > length(ω) ? nan : ω[r],
359+
r > length(τ) ? nan : τ[r],
360+
r > length(nF) ? nan : nF[r],
361+
r > length(nB) ? nan : nB[r])
351362
end
363+
# for r = 1:rank
364+
# @printf(io, "%5i %32.17g %32.17g %16i %16i\n", r, ω[r], τ[r], nF[r], nB[r])
365+
# end
366+
close(file)
352367
end
353-
for r = 1:rank
354-
push!(dlrGrid.ω, ω[r] / β)
355-
push!(dlrGrid.τ, τ[r] * β)
356-
n = isFermi ? nF[r] : nB[r]
357-
push!(dlrGrid.n, n)
358-
push!(dlrGrid.ωn, isFermi ? (2n + 1.0) * π / β : 2n * π / β)
359-
end
368+
dlrGrid.ω = ω / β
369+
dlrGrid.τ = τ * β
370+
n = isFermi ? copy(nF) : copy(nB)
371+
dlrGrid.n = n
372+
dlrGrid.ωn = isFermi ? (2n .+ 1.0) * π / β : 2n * π / β
373+
# for r = 1:rank
374+
# push!(dlrGrid.ω, ω[r] / β)
375+
# push!(dlrGrid.τ, τ[r] * β)
376+
# n = isFermi ? nF[r] : nB[r]
377+
# push!(dlrGrid.n, n)
378+
# push!(dlrGrid.ωn, isFermi ? (2n + 1.0) * π / β : 2n * π / β)
379+
# end
360380
# println(rank)
361381
end
362382

test/data_generate.jl

+45-44
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ SemiCircle(dlr, grid, type) = Sample.SemiCircle(dlr, type, grid, degree=24, regu
66
#using DoubleFloats
77
#rtol(x, y) = maximum(abs.(x - y)) / maximum(abs.(x))
88

9-
function L2normτ(value_dlr, dlr, case, poles=nothing, weight = nothing)
10-
function fine_τGrid::Float,degree,ratio::Float) where {Float}
9+
function L2normτ(value_dlr, dlr, case, poles=nothing, weight=nothing)
10+
function fine_τGrid::Float, degree, ratio::Float) where {Float}
1111
############## use composite grid #############################################
1212
# Generating a log densed composite grid with LogDensedGrid()
1313
npo = Int(ceil(log(Λ) / log(ratio))) - 2 # subintervals on [0,1/2] in tau space (# subintervals on [0,1] is 2*npt)
@@ -16,7 +16,7 @@ function L2normτ(value_dlr, dlr, case, poles=nothing, weight = nothing)
1616
[0.0, 1.0],# The grid is defined on [0.0, β]
1717
[0.0, 1.0],# and is densed at 0.0 and β, as given by 2nd and 3rd parameter.
1818
npo,# N of log grid
19-
0.5 / ratio^(npo-1), # minimum interval length of log grid
19+
0.5 / ratio^(npo - 1), # minimum interval length of log grid
2020
degree, # N of bottom layer
2121
Float
2222
)
@@ -25,7 +25,7 @@ function L2normτ(value_dlr, dlr, case, poles=nothing, weight = nothing)
2525
# println("Composite expoential grid size: $(length(grid))")
2626
#println("fine grid size: $(length(grid)) within [$(grid[1]), $(grid[end])]")
2727
return grid
28-
28+
2929
############# DLR based fine grid ##########################################
3030
# dlr = DLRGrid(Euv=Float64(Λ), beta=1.0, rtol=Float64(rtol) / 100, isFermi=true, symmetry=:ph, rebuild=true)
3131
# # println("fine basis number: $(dlr.size)\n", dlr.ω)
@@ -36,22 +36,22 @@ function L2normτ(value_dlr, dlr, case, poles=nothing, weight = nothing)
3636
# uniform = [panel[i] + (panel[i+1] - panel[i]) / degree * j for j in 0:degree-1]
3737
# append!(grid, uniform)
3838
# end
39-
39+
4040
# println("fine grid size: $(length(grid)) within [$(grid[1]), $(grid[2])]")
4141
# return grid
4242
end
4343
fineGrid = fine_τGrid(dlr.Euv, 12, typeof(dlr.Euv)(1.5))
44-
value = real(tau2tau(dlr, value_dlr, fineGrid, dlr.τ ))
44+
value = real(tau2tau(dlr, value_dlr, fineGrid, dlr.τ))
4545
if case == MultiPole
4646
value_analy = case(dlr, fineGrid, , poles, weight)
4747
else
4848
value_analy = case(dlr, fineGrid, )
4949
end
5050
#print("value_analy $(value_analy[1:10])\n" )
51-
interp = Interp.integrate1D( value , fineGrid)
52-
interp_analy = Interp.integrate1D( value_analy , fineGrid)
51+
interp = Interp.integrate1D(value, fineGrid)
52+
interp_analy = Interp.integrate1D(value_analy, fineGrid)
5353
#print("$(interp_analy) $(interp_analy)\n")
54-
return abs(interp_analy), abs(interp-interp_analy), maximum(abs.(value - value_analy))/ maximum(abs.(value_analy))
54+
return abs(interp_analy), abs(interp - interp_analy), maximum(abs.(value - value_analy)) / maximum(abs.(value_analy))
5555
end
5656
#function MultiPole(dlr, grid, type)
5757
# Euv = dlr.Euv
@@ -60,7 +60,7 @@ end
6060
# return Sample.MultiPole(dlr, type, poles, grid; regularized=true)
6161
#end
6262

63-
function MultiPole(dlr, grid, type, coeff, weight = nothing)
63+
function MultiPole(dlr, grid, type, coeff, weight=nothing)
6464
Euv = dlr.Euv
6565
poles = coeff * Euv
6666
# return Sample.MultiPole(dlr.β, dlr.isFermi, grid, type, poles, dlr.symmetry; regularized = true)
@@ -71,32 +71,32 @@ function MultiPole(dlr, grid, type, coeff, weight = nothing)
7171
end
7272
end
7373

74-
function test_dlr_coeff(case, isFermi, symmetry, Euv, β, eps, eff_poles, weight; dtype=Float64, output = false)
74+
function test_dlr_coeff(case, isFermi, symmetry, Euv, β, eps, eff_poles, weight; dtype=Float64, output=false)
7575
para = "fermi=$isFermi, sym=$symmetry, Euv=$Euv, β=, rtol=$eps"
7676
dlr = DLRGrid(Euv, β, eps, isFermi, symmetry, dtype=dtype) #construct dlr basis
7777
#dlr10 = DLRGrid(10Euv, β, eps, isFermi, symmetry) #construct denser dlr basis for benchmark purpose
7878
dlr10 = DLRGrid(Euv, β, eps, isFermi, symmetry, dtype=dtype) #construct denser dlr basis for benchmark purpose
79-
79+
8080
N_poles = 1000
8181
N = 1000
82-
82+
8383
Gndlr = case(dlr, dlr.n, :n, eff_poles, weight)
8484
τSample = dlr10.τ
8585
Gsample = case(dlr, τSample, , eff_poles, weight)
8686

8787
Gfourier = matfreq2tau(dlr, Gndlr, τSample)
88-
dlreff = matfreq2dlr(dlr,Gndlr)
88+
dlreff = matfreq2dlr(dlr, Gndlr)
8989
dlreff = imag(dlreff)
9090
print("$(symmetry) $(Euv) $(eps) max $(maximum(abs.(dlreff) )) min $(minimum(abs.(dlreff )))\n")
9191
end
92-
function test_err(case, isFermi, symmetry, Euv, β, eps, poles, weights; dtype=Float64, output = false)
92+
function test_err(case, isFermi, symmetry, Euv, β, eps, poles, weights; dtype=Float64, output=false)
9393
# println("Test $case with isFermi=$isFermi, Symmetry = $symmetry, Euv=$Euv, β=$β, rtol=$eps")
9494
#N_poles = 100
9595
para = "fermi=$isFermi, sym=$symmetry, Euv=$Euv, β=, rtol=$eps"
9696
dlr = DLRGrid(Euv, β, eps, isFermi, symmetry, dtype=dtype) #construct dlr basis
9797
#dlr10 = DLRGrid(10Euv, β, eps, isFermi, symmetry) #construct denser dlr basis for benchmark purpose
9898
dlr10 = DLRGrid(Euv, β, eps, isFermi, symmetry, dtype=dtype) #construct denser dlr basis for benchmark purpose
99-
99+
100100
N_poles = size(poles)[2]
101101
N = size(poles)[1]
102102
value_sum = 0.0
@@ -106,63 +106,64 @@ function test_err(case, isFermi, symmetry, Euv, β, eps, poles, weights; dtype=F
106106
block = zeros(dtype, 10)
107107
if case == MultiPole
108108
for i in 1:N
109-
eff_poles = poles[i,:]
110-
weight = weights[i,:]
109+
eff_poles = poles[i, :]
110+
weight = weights[i, :]
111111
Gndlr = case(dlr, dlr.n, :n, eff_poles, weight)
112112
τSample = dlr10.τ
113113
Gsample = case(dlr, τSample, , eff_poles, weight)
114114

115115
Gfourier = matfreq2tau(dlr, Gndlr, τSample)
116-
dlreff = matfreq2dlr(dlr,Gndlr)
117-
value, err, max_err= L2normτ(Gfourier, dlr, case, eff_poles, weight)
116+
dlreff = matfreq2dlr(dlr, Gndlr)
117+
value, err, max_err = L2normτ(Gfourier, dlr, case, eff_poles, weight)
118118
modulus = abs(sum(dlreff))
119-
value_sum +=value/modulus
120-
err_sum += err/modulus
121-
eta += err/value
119+
value_sum += value / modulus
120+
err_sum += err / modulus
121+
eta += err / value
122122
max_err_sum += max_err
123-
block[(i-1) ÷ (N÷10)+1] +=err/value/N*10
123+
block[(i-1)÷(N÷10)+1] += err / value / N * 10
124124
end
125125
else
126126
Gndlr = case(dlr, dlr.n, :n)
127127
τSample = dlr10.τ
128128
Gsample = case(dlr, τSample, )
129129
Gfourier = matfreq2tau(dlr, Gndlr, τSample)
130-
dlreff = matfreq2dlr(dlr,Gndlr)
130+
dlreff = matfreq2dlr(dlr, Gndlr)
131131
print("max $(maximum(dlreff)) min $(minimum(dlreff))\n")
132-
value, err, max_err= L2normτ(Gfourier, dlr, case)
132+
value, err, max_err = L2normτ(Gfourier, dlr, case)
133133
modulus = abs(sum(dlreff))
134134
print("test Semi: $(modulus)\n")
135-
value_sum +=value/modulus
136-
err_sum += err/modulus
135+
value_sum += value / modulus
136+
err_sum += err / modulus
137137
max_err_sum += max_err
138138
end
139139
if output
140-
file = open("./accuracy_test1.dat", "a")
140+
file = open("./accuracy_test1.dat", "a")
141141
#@printf(file, "%48.40g %48.40g %48.40g\n", eps, abs(b-c), )
142142
#@printf(file, "%24.20g %24.20g %24.20g %24.20g %24.20g %24.20g\n", eps, value_sum/N, err_sum/N, err_sum /N/eps*Euv, max_err_sum/N, eta/N)
143-
@printf(file, "%24.20g %24.20g %24.20g\n", eps, log10(eta/N/eps), std( log10.(block/eps) ) )
143+
@printf(file, "%24.20g %24.20g %24.20g\n", eps, log10(eta / N / eps), std(log10.(block / eps)))
144144
close(file)
145145
end
146146
end
147147

148-
cases = [MultiPole]
148+
#cases = [MultiPole]
149+
cases = [SemiCircle]
149150
Λ = [1e4]
150151
#rtol = [ 1e-12]
151-
rtol = [ 1e-4, 1e-6, 1e-8, 1e-10, 1e-12]
152+
rtol = [1e-4, 1e-6, 1e-8, 1e-10, 1e-12]
152153
N_poles = 1000
153154
N = 1000
154155
setprecision(128)
155156
dtype = Float64
156157
#dtype = BigFloat
157-
poles = zeros(dtype,(N,N_poles) )
158-
weights = zeros(dtype, (N,N_poles))
158+
poles = zeros(dtype, (N, N_poles))
159+
weights = zeros(dtype, (N, N_poles))
159160
for i in 1:N
160-
poles[i,:] = 2.0*rand(dtype, N_poles) .- 1.0
161-
weights[i,:] = 2.0 *rand(dtype, N_poles) .- 1.0
161+
poles[i, :] = 2.0 * rand(dtype, N_poles) .- 1.0
162+
weights[i, :] = 2.0 * rand(dtype, N_poles) .- 1.0
162163
end
163164

164165

165-
166+
166167
for case in cases
167168
for l in Λ
168169
for r in rtol
@@ -177,11 +178,11 @@ for case in cases
177178
# test(case, false, :pha, l, 1.0, r,dtype=BigFloat)
178179
# test(case, true, :pha, l, 1.0, r, dtype= BigFloat)
179180
# end
180-
181-
test_err(case, true, :none, l, 1.0, r, poles , weights, dtype = Float64, output = true)
182-
183-
test_err(case, true, :sym, l, 1.0, r, poles, weights, dtype = Float64, output = true)
184-
# test_err(case, true, :sym, l, 1.0, r, poles, weights, dtype = BigFloat, output = true)
181+
182+
test_err(case, true, :none, l, 1.0, r, poles, weights, dtype=Float64, output=true)
183+
184+
test_err(case, true, :sym, l, 1.0, r, poles, weights, dtype=Float64, output=true)
185+
# test_err(case, true, :sym, l, 1.0, r, poles, weights, dtype = BigFloat, output = true)
185186
#test_err(case, false, :sym, l, 1.0, r, dtype = BigFloat, output = true)
186187
# dtype =BigFloat
187188
# N_poles = 1000
@@ -193,10 +194,10 @@ for case in cases
193194
# test_dlr_coeff(case, true, :none, l, 1.0, r, eff_poles, weight, dtype = Float64, output = true)
194195
# test_dlr_coeff(case, true, :sym, l, 1.0, r, eff_poles , weight, dtype = Float64, output = true)
195196

196-
197+
197198
end
198199
end
199200
end
200-
201+
201202

202203

0 commit comments

Comments
 (0)