@@ -214,14 +214,15 @@ This method solves the following equation:
214214``
215215"""
216216function calc_χγ (type:: Symbol , h:: Union{lDΓAHelper,AlDΓAHelper} , χ₀: :χ₀T ; verbose= true , ω_symmetric:: Bool = false , use_threads= false )
217- calc_χγ (type, getfield (h, Symbol (" Γ_$(type) " )), χ₀, h. kG, h. mP, h. sP, verbose= verbose, ω_symmetric= ω_symmetric, use_threads= use_threads)
217+ calc_χγ (type, getfield (h, Symbol (" Γ_$(type) " )), χ₀, h. kG, h. mP, h. sP; verbose= verbose, ω_symmetric= ω_symmetric, use_threads= use_threads)
218218end
219219
220- function calc_χγ (type:: Symbol , Γr: :ΓT , χ₀: :χ₀T , kG:: KGrid , mP:: ModelParameters , sP:: SimulationParameters ; verbose= true , ω_symmetric:: Bool = false , use_threads= false )
220+ function calc_χγ (type:: Symbol , Γr: :ΓT , χ₀: :χ₀T , kG:: KGrid , mP:: ModelParameters , sP:: SimulationParameters ;
221+ verbose= true , ω_symmetric:: Bool = false , use_threads= false )
221222 s = type == :d ? - 1 : 1
222223 ! (type in (:d , :m )) && error (" Unkown type $type " )
223224
224- NT = Threads . nthreads ()
225+
225226 Nν = 2 * sP. n_iν
226227 Nq = length (kG. kMult)
227228 Nω = size (χ₀. data, χ₀. axis_types[:ω ])
@@ -232,31 +233,36 @@ function calc_χγ(type::Symbol, Γr::ΓT, χ₀::χ₀T, kG::KGrid, mP::ModelPa
232233 qi_range = 1 : Nq
233234 χ_ω = Vector {Float64} (undef, Nω)
234235
235-
236236 if use_threads
237+ bthreads = BLAS. get_num_threads ()
238+ BLAS. set_num_threads (1 )
239+ NT = Threads. nthreads ()
237240 χννpω = [Matrix {ComplexF64} (undef, Nν, Nν) for ti in 1 : NT]
238241 ipiv = [Vector {Int} (undef, Nν) for ti in 1 : NT]
239- work = [_gen_inv_work_arr (χννpω[1 ], ipiv[1 ]) for ti in 1 : NT]
242+ work = [_gen_inv_work_arr (χννpω[Threads . threadid () ], ipiv[Threads . threadid () ]) for ti in 1 : NT]
240243 λ_cache = [Vector {ComplexF64} (undef, Nν) for ti in 1 : NT]
244+ diag_cache = [similar (sP. χ_helper. diag_asym_buffer) for ti in 1 : NT]
241245 Threads. @threads for qi in qi_range
242246 for ωm in ωm_range
243247 ωi = ωm + sP. n_iω + 1
244248 invert_BSE! (χ, γ, χννpω[Threads. threadid ()], ipiv[Threads. threadid ()], work[Threads. threadid ()],
245- sP. χ_helper, λ_cache[Threads. threadid ()], type, ω_symmetric, s, Γr, χ₀. data, χ₀. asym,
249+ sP. χ_helper, λ_cache[Threads. threadid ()], diag_cache[Threads . threadid ()], type, ω_symmetric, s, Γr, χ₀. data, χ₀. asym,
246250 χ₀. ν_shell_size, qi, sP. n_iω, ωm, ωi, mP. U, mP. β)
247251 end
248252 end
253+ BLAS. set_num_threads (bthreads)
249254 else
250255 χννpω = Matrix {ComplexF64} (undef, Nν, Nν)
251256 ipiv = Vector {Int} (undef, Nν)
252257 work = _gen_inv_work_arr (χννpω, ipiv)
253258 λ_cache = Vector {ComplexF64} (undef, Nν)
254259
255- for qi in qi_range
256- for ωm in ωm_range
257- ωi = ωm + sP. n_iω + 1
258- invert_BSE! (χ, γ, χννpω, ipiv, work, sP. χ_helper, λ_cache, type, ω_symmetric, s, Γr, χ₀. data, χ₀. asym,
259- χ₀. ν_shell_size, qi, sP. n_iω, ωm, ωi, mP. U, mP. β)
260+ for ωm in ωm_range
261+ ωi = ωm + sP. n_iω + 1
262+ for qi in qi_range
263+ invert_BSE! (χ, γ, χννpω, ipiv, work,
264+ sP. χ_helper, λ_cache, sP. χ_helper. diag_asym_buffer, type, ω_symmetric, s, Γr, χ₀. data, χ₀. asym,
265+ χ₀. ν_shell_size, qi, sP. n_iω, ωm, ωi, mP. U, mP. β)
260266 end
261267 end
262268 end
@@ -272,23 +278,25 @@ function calc_χγ(type::Symbol, Γr::ΓT, χ₀::χ₀T, kG::KGrid, mP::ModelPa
272278end
273279
274280function invert_BSE! (χ:: AbstractArray{Float64,2} , γ:: AbstractArray{ComplexF64,3} , χννpω:: AbstractArray{ComplexF64,2} ,
275- ipiv:: Vector{Int} , work:: Vector{ComplexF64} , χ_helper, λ_cache, type:: Symbol , ω_symmetric:: Bool , s:: Int ,
281+ ipiv:: Vector{Int} , work:: Vector{ComplexF64} , χ_helper:: BSE_Asym_Helper , λ_cache:: Vector{ComplexF64} , diag_cache:: Vector{ComplexF64} ,
282+ type:: Symbol , ω_symmetric:: Bool , s:: Int ,
276283 Γr:: AbstractArray{ComplexF64,3} , χ₀_data:: AbstractArray{ComplexF64,3} , χ₀_asym:: AbstractArray{ComplexF64,2} ,
277284 ν_shell_size:: Int , qi:: Int , ωm_max:: Int , ωm:: Int , ωi:: Int , U:: Float64 , β:: Float64 )
278- χννpω[:, :] = deepcopy (Γr[:, :, ωi])
285+
286+ copy! (χννpω, view (Γr,:,:, ωi))
279287 for l in axes (χννpω, 1 )
280- χννpω[l, l] += 1.0 / χ₀_data[qi, ν_shell_size+ l, ωi]
288+ @inbounds χννpω[l, l] += 1.0 / χ₀_data[qi, ν_shell_size+ l, ωi]
281289 end
282-
283290 inv! (χννpω, ipiv, work)
284291 if typeof (χ_helper) <: BSE_Asym_Helpers
285292 χ[qi, ωi] = real (
286- calc_χλ_impr! (λ_cache, type, ωm, χννpω,
287- view (χ₀_data, qi, :, ωi), U, β,
288- χ₀_asym[qi, ωi], χ_helper,
289- ),
290- )
291- γ[qi, :, ωi] = (1 .- s * λ_cache) ./ (1 .+ s * U .* χ[qi, ωi])
293+ calc_χλ_impr! (λ_cache, diag_cache, type, qi, ωi, ωm, χννpω,
294+ χ₀_data, U, β,
295+ χ₀_asym[qi, ωi], χ_helper,
296+ ))
297+ for νi in axes (γ,2 )
298+ @inbounds γ[qi, νi, ωi] = (1 - s * λ_cache[νi]) / (1 + s * U * χ[qi, ωi])
299+ end
292300 else
293301 if typeof (χ_helper) === BSE_SC_Helper
294302 improve_χ! (type, ωi, view (χννpω, :, :, ωi), view (χ₀, qi, :, ωi), U, β, χ_helper)
@@ -306,7 +314,6 @@ function invert_BSE!(χ::AbstractArray{Float64,2}, γ::AbstractArray{ComplexF64,
306314end
307315
308316
309-
310317"""
311318 calc_gen_χ(Γr::ΓT, χ₀::χ₀T, kG::KGrid)
312319
0 commit comments