@@ -17,7 +17,7 @@ A SYK model solver based on a forward fixed-point iteration method.
17
17
18
18
The SYK Green's function has particle-hole symmetry when μ=0.
19
19
You may enforce such symmetry by setting `symmetry = :ph` when initialize the DLR grids.
20
- A symmetrized solver tends to be more robust than the unsymmetrized counterpart .
20
+ A symmetrized solver tends to be more robust than a unsymmetrized one .
21
21
"""
22
22
23
23
using Lehmann
@@ -50,7 +50,7 @@ function dyson(d, sigma_q, mu)
50
50
end
51
51
end
52
52
53
- function solve_syk_with_fixpoint_iter (d, mu, tol = d. rtol * 10 ; mix = 0.1 , maxiter = 1000 , G_x = zeros (ComplexF64, length (d)))
53
+ function solve_syk_with_fixpoint_iter (d, mu, tol = d. rtol * 10 ; mix = 0.1 , maxiter = 5000 , G_x = zeros (ComplexF64, length (d)), verbose = true )
54
54
55
55
for iter in 1 : maxiter
56
56
@@ -61,8 +61,10 @@ function solve_syk_with_fixpoint_iter(d, mu, tol = d.rtol * 10; mix = 0.1, maxit
61
61
G_x_new = matfreq2tau (d, G_q_new)
62
62
63
63
64
- if iter % (maxiter / 10 ) == 0
65
- println (" round $iter : change $(diff (G_x_new, G_x)) " )
64
+ if verbose
65
+ if iter % (maxiter / 10 ) == 0
66
+ println (" round $iter : change $(diff (G_x_new, G_x)) " )
67
+ end
66
68
end
67
69
if maximum (abs .(G_x_new .- G_x)) < tol && iter > 10
68
70
break
@@ -83,26 +85,51 @@ function printG(d, G_x)
83
85
println ()
84
86
end
85
87
86
- printstyled (" ===== Symmetrized DLR solver for SYK model =======\n " , color = :yellow )
87
- mix = 0.1
88
- dsym = DLRGrid (Euv = 5.0 , β = 1000.0 , isFermi = true , rtol = 1e-8 , symmetry = :ph ) # Initialize DLR object
89
- G_x_ph = solve_syk_with_fixpoint_iter (dsym, 0.00 , mix = mix)
90
- printG (dsym, G_x_ph)
91
-
92
- printstyled (" ===== Unsymmetrized DLR solver for SYK model =======\n " , color = :yellow )
93
- mix = 0.02
94
- dnone = DLRGrid (Euv = 5.0 , β = 1000.0 , isFermi = true , rtol = 1e-8 , symmetry = :none ) # Initialize DLR object
95
- G_x_none = solve_syk_with_fixpoint_iter (dnone, 0.00 , mix = mix)
96
- printG (dnone, G_x_none)
97
-
98
- printstyled (" ===== Unsymmetrized versus Symmetrized DLR solver =======\n " , color = :yellow )
99
- @printf (" %15s%40s%40s%40s\n " , " τ" , " sym DLR (interpolated)" , " unsym DLR" , " difference" )
100
- G_x_interp = tau2tau (dsym, G_x_ph, dnone. τ)
101
- for i in 1 : dnone. size
102
- if dnone. τ[i] <= dnone. β / 2
103
- @printf (" %15.8f%40.15f%40.15f%40.15f\n " , dnone. τ[i], real (G_x_interp[i]), real (G_x_none[i]), abs (real (G_x_interp[i] - G_x_none[i])))
104
- end
88
+ verbose = false
89
+
90
+ printstyled (" ===== Prepare the expected Green's function of the SYK model =======\n " , color = :yellow )
91
+ dsym_correct = DLRGrid (Euv = 5.0 , β = 10000.0 , isFermi = true , rtol = 1e-14 , symmetry = :ph ) # Initialize DLR object
92
+ G_x_correct = solve_syk_with_fixpoint_iter (dsym_correct, 0.00 , mix = 0.1 , verbose = false )
93
+ printG (dsym_correct, G_x_correct)
94
+
95
+ printstyled (" ===== Test Symmetrized and Unsymmetrized DLR solver for SYK model =======\n " , color = :yellow )
96
+
97
+ @printf (" %30s%30s%30s%15s\n " , " Euv" , " symmetrized solver error" , " unsymmetrized solver error" , " good or bad" )
98
+ for Euv in LinRange (5.0 , 10.0 , 50 )
99
+
100
+ rtol = 1e-10
101
+ β = 10000.0
102
+ # printstyled("===== Symmetrized DLR solver for SYK model =======\n", color = :yellow)
103
+ mix = 0.01
104
+ 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)
106
+ # printG(dsym, G_x_ph)
107
+
108
+ # printstyled("===== Unsymmetrized DLR solver for SYK model =======\n", color = :yellow)
109
+ mix = 0.01
110
+ 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)
112
+ # printG(dnone, G_x_none)
113
+
114
+ # printstyled("===== Unsymmetrized versus Symmetrized DLR solver =======\n", color = :yellow)
115
+ # @printf("%15s%40s%40s%40s\n", "τ", "sym DLR (interpolated)", "unsym DLR", "difference")
116
+ # G_x_interp = tau2tau(dsym_correct, G_x_correct, dnone.τ)
117
+ # for i in 1:dnone.size
118
+ # if dnone.τ[i] <= dnone.β / 2
119
+ # @printf("%15.8f%40.15f%40.15f%40.15f\n", dnone.τ[i], real(G_x_interp[i]), real(G_x_none[i]), abs(real(G_x_interp[i] - G_x_none[i])))
120
+ # end
121
+ # end
122
+
123
+ G_x_interp_ph = tau2tau (dsym_correct, G_x_correct, dsym. τ)
124
+ G_x_interp_none = tau2tau (dsym_correct, G_x_correct, dnone. τ)
125
+ d_ph = diff (G_x_interp_ph, G_x_ph)
126
+ d_none = diff (G_x_interp_none, G_x_none)
127
+ flag = (d_ph < 100 rtol) && (d_none < 100 rtol) ? " good" : " bad"
128
+
129
+ @printf (" %30.15f%30.15e%30.15e%20s\n " , Euv, d_ph, d_none, flag)
130
+ # println("symmetric Euv = $Euv maximumal difference: ", diff(G_x_interp, G_x_ph))
131
+ # println("non symmetric Euv = $Euv maximumal difference: ", diff(G_x_interp, G_x_none))
132
+
105
133
end
106
- println (" maximumal difference: " , diff (G_x_interp, G_x_none))
107
134
108
135
0 commit comments