@@ -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... )
346346end
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+
348371function _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
416472end
417-
418473function _steadystate_fourier (
419474 L_0:: QuantumObject{SuperOperator} ,
420475 L_p:: QuantumObject{SuperOperator} ,
0 commit comments