Skip to content

Commit 4bd3abe

Browse files
committed
resolve #462 GPU support for steadystate_fourier
1 parent 5e41ed3 commit 4bd3abe

File tree

2 files changed

+68
-11
lines changed

2 files changed

+68
-11
lines changed

src/steadystate.jl

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,29 @@ function steadystate_fourier(
345345
return _steadystate_fourier(L_0, L_p, L_m, ωd, solver; n_max = n_max, tol = tol, kwargs...)
346346
end
347347

348+
function steadystate_fourier(
349+
H_0::QuantumObject{OpType1},
350+
H_p::QuantumObject{OpType2},
351+
H_m::QuantumObject{OpType3},
352+
ωd::Number,
353+
c_ops::Union{Nothing,AbstractVector,Tuple} = nothing;
354+
n_max::Integer = 2,
355+
tol::R = 1e-8,
356+
solver::FSolver = SteadyStateLinearSolver(),
357+
kwargs...,
358+
) where {
359+
OpType1<:Union{Operator,SuperOperator},
360+
OpType2<:Union{Operator,SuperOperator},
361+
OpType3<:Union{Operator,SuperOperator},
362+
R<:Real,
363+
FSolver<:SteadyStateSolver,
364+
}
365+
L_0 = liouvillian(H_0, c_ops)
366+
L_p = liouvillian(H_p)
367+
L_m = liouvillian(H_m)
368+
return _steadystate_fourier(L_0, L_p, L_m, ωd, solver; n_max = n_max, tol = tol, kwargs...)
369+
end
370+
348371
function _steadystate_fourier(
349372
L_0::QuantumObject{SuperOperator},
350373
L_p::QuantumObject{SuperOperator},
@@ -370,29 +393,62 @@ function _steadystate_fourier(
370393
n_list = (-n_max):n_max
371394

372395
weight = 1
373-
Mn = sparse(ones(Ns), [Ns * (j - 1) + j for j in 1:Ns], fill(weight, Ns), N, N)
396+
rows = _dense_similar(L_0_mat, Ns)
397+
cols = _dense_similar(L_0_mat, Ns)
398+
vals = _dense_similar(L_0_mat, Ns)
399+
fill!(rows, 1)
400+
for j in 1:Ns
401+
cols[j] = Ns * (j - 1) + j
402+
end
403+
fill!(vals, weight)
404+
Mn = _sparse_similar(L_0_mat, rows, cols, vals, N, N)
374405
L = L_0_mat + Mn
375406

376-
M = spzeros(T, n_fourier * N, n_fourier * N)
377-
M += kron(spdiagm(1 => ones(n_fourier - 1)), L_m_mat)
378-
M += kron(spdiagm(-1 => ones(n_fourier - 1)), L_p_mat)
407+
M = _sparse_similar(L_0_mat, n_fourier * N, n_fourier * N)
408+
409+
# Add superdiagonal blocks (L_m)
410+
for i in 1:(n_fourier-1)
411+
rows_block = _dense_similar(L_0_mat, N)
412+
cols_block = _dense_similar(L_0_mat, N)
413+
fill!(rows_block, i)
414+
fill!(cols_block, i+1)
415+
block = _sparse_similar(L_0_mat, rows_block, cols_block, ones(N), n_fourier, n_fourier)
416+
M += kron(block, L_m_mat)
417+
end
418+
419+
# Add subdiagonal blocks (L_p)
420+
for i in 1:(n_fourier-1)
421+
rows_block = _dense_similar(L_0_mat, N)
422+
cols_block = _dense_similar(L_0_mat, N)
423+
fill!(rows_block, i+1)
424+
fill!(cols_block, i)
425+
block = _sparse_similar(L_0_mat, rows_block, cols_block, ones(N), n_fourier, n_fourier)
426+
M += kron(block, L_p_mat)
427+
end
428+
429+
# Add diagonal blocks (L - i*ωd*n)
379430
for i in 1:n_fourier
380431
n = n_list[i]
381-
M += kron(sparse([i], [i], one(T), n_fourier, n_fourier), L - 1im * ωd * n * I)
432+
block_diag = L - 1im * ωd * n * I
433+
rows_block = _dense_similar(L_0_mat, N)
434+
cols_block = _dense_similar(L_0_mat, N)
435+
fill!(rows_block, i)
436+
fill!(cols_block, i)
437+
block = _sparse_similar(L_0_mat, rows_block, cols_block, ones(N), n_fourier, n_fourier)
438+
M += kron(block, block_diag)
382439
end
383440

384-
v0 = zeros(T, n_fourier * N)
385-
v0[n_max*N+1] = weight
441+
v0 = _dense_similar(L_0_mat, n_fourier * N)
442+
fill!(v0, 0)
443+
allowed_setindex!(v0, weight, n_max * N + 1)
386444

387-
(haskey(kwargs, :Pl) || haskey(kwargs, :Pr)) && error("The use of preconditioners must be defined in the solver.")
388445
if !isnothing(solver.Pl)
389446
kwargs = merge((; kwargs...), (Pl = solver.Pl(M),))
390447
elseif isa(M, SparseMatrixCSC)
391448
kwargs = merge((; kwargs...), (Pl = ilu(M, τ = 0.01),))
392449
end
393450
!isnothing(solver.Pr) && (kwargs = merge((; kwargs...), (Pr = solver.Pr(M),)))
394-
!haskey(kwargs, :abstol) && (kwargs = merge((; kwargs...), (abstol = tol,)))
395-
!haskey(kwargs, :reltol) && (kwargs = merge((; kwargs...), (reltol = tol,)))
451+
kwargs = merge((abstol = tol, reltol = tol), kwargs)
396452

397453
prob = LinearProblem(M, v0)
398454
ρtot = solve(prob, solver.alg; kwargs...).u
@@ -414,7 +470,6 @@ function _steadystate_fourier(
414470

415471
return ρ_list
416472
end
417-
418473
function _steadystate_fourier(
419474
L_0::QuantumObject{SuperOperator},
420475
L_p::QuantumObject{SuperOperator},

src/utilities.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ _dense_similar(A::AbstractArray, args...) = similar(A, args...)
134134
_dense_similar(A::AbstractSparseMatrix, args...) = similar(nonzeros(A), args...)
135135

136136
_sparse_similar(A::AbstractArray, args...) = sparse(args...)
137+
_sparse_similar(A::AbstractArray, m::Int, n::Int) = spzeros(eltype(A), m, n)
138+
_sparse_similar(A::AbstractArray, rows, cols, vals, m::Int, n::Int) = sparse(rows, cols, vals, m, n)
137139

138140
_Ginibre_ensemble(n::Int, rank::Int = n) = randn(ComplexF64, n, rank) / sqrt(n)
139141

0 commit comments

Comments
 (0)