@@ -369,63 +369,45 @@ function _steadystate_fourier(
369369 n_fourier = 2 * n_max + 1
370370 n_list = (- n_max): n_max
371371
372- weight = 1
373- rows = _dense_similar (L_0_mat, Ns)
374- cols = _dense_similar (L_0_mat, Ns)
375- vals = _dense_similar (L_0_mat, Ns)
376- fill! (rows, 1 )
377- for j in 1 : Ns
378- cols[j] = Ns * (j - 1 ) + j
379- end
380- fill! (vals, weight)
372+ weight = one (T)
373+ rows = ones (Int, Ns)
374+ cols = [Ns * (j - 1 ) + j for j in 1 : Ns]
375+ vals = fill (weight, Ns)
381376 Mn = _sparse_similar (L_0_mat, rows, cols, vals, N, N)
382377 L = L_0_mat + Mn
383378
384379 M = _sparse_similar (L_0_mat, n_fourier * N, n_fourier * N)
385-
386- # Add superdiagonal blocks (L_m)
387380 for i in 1 : (n_fourier- 1 )
388- rows_block = _dense_similar (L_0_mat, N)
389- cols_block = _dense_similar (L_0_mat, N )
390- fill! (rows_block, i)
391- fill! (cols_block, i + 1 )
392- block = _sparse_similar (L_0_mat, rows_block, cols_block, ones (N), n_fourier, n_fourier )
393- M += kron (block, L_m_mat)
381+ M_block = _sparse_similar (L_0_mat, N , N)
382+ copyto! (M_block, L_p_mat )
383+ M[(i * N + 1 ) : ((i + 1 ) * N), ((i - 1 ) * N + 1 ) : (i * N)] = M_block
384+ M_block = _sparse_similar (L_0_mat, N, N )
385+ copyto! (M_block, L_m_mat )
386+ M[((i - 1 ) * N + 1 ) : (i * N), (i * N + 1 ) : ((i + 1 ) * N)] = M_block
394387 end
395388
396- # Add subdiagonal blocks (L_p)
397- for i in 1 : (n_fourier- 1 )
398- rows_block = _dense_similar (L_0_mat, N)
399- cols_block = _dense_similar (L_0_mat, N)
400- fill! (rows_block, i+ 1 )
401- fill! (cols_block, i)
402- block = _sparse_similar (L_0_mat, rows_block, cols_block, ones (N), n_fourier, n_fourier)
403- M += kron (block, L_p_mat)
404- end
405-
406- # Add diagonal blocks (L - i*ωd*n)
407389 for i in 1 : n_fourier
408390 n = n_list[i]
409- block_diag = L - 1im * ωd * n * I
410- rows_block = _dense_similar (L_0_mat, N)
411- cols_block = _dense_similar (L_0_mat, N)
412- fill! (rows_block, i)
413- fill! (cols_block, i)
414- block = _sparse_similar (L_0_mat, rows_block, cols_block, ones (N), n_fourier, n_fourier)
415- M += kron (block, block_diag)
391+ M_block = _sparse_similar (L_0_mat, N, N)
392+ copyto! (M_block, L)
393+ M_block -= 1im * ωd * n * sparse (I, N, N)
394+ M[((i- 1 )* N+ 1 ): (i* N), ((i- 1 )* N+ 1 ): (i* N)] = M_block
416395 end
417396
418- v0 = _dense_similar (L_0_mat, n_fourier * N)
419- fill! (v0, 0 )
420- allowed_setindex! (v0, weight, n_max * N + 1 )
397+ v0 = similar (L_0_mat, n_fourier * N)
398+ fill! (v0, zero (T))
399+ target_idx = n_max* N + 1
400+ QuantumToolbox. allowed_setindex! (v0, weight, target_idx)
421401
402+ (haskey (kwargs, :Pl ) || haskey (kwargs, :Pr )) && error (" The use of preconditioners must be defined in the solver." )
422403 if ! isnothing (solver. Pl)
423404 kwargs = merge ((; kwargs... ), (Pl = solver. Pl (M),))
424405 elseif isa (M, SparseMatrixCSC)
425406 kwargs = merge ((; kwargs... ), (Pl = ilu (M, τ = 0.01 ),))
426407 end
427408 ! isnothing (solver. Pr) && (kwargs = merge ((; kwargs... ), (Pr = solver. Pr (M),)))
428- kwargs = merge ((abstol = tol, reltol = tol), kwargs)
409+ ! haskey (kwargs, :abstol ) && (kwargs = merge ((; kwargs... ), (abstol = tol,)))
410+ ! haskey (kwargs, :reltol ) && (kwargs = merge ((; kwargs... ), (reltol = tol,)))
429411
430412 prob = LinearProblem (M, v0)
431413 ρtot = solve (prob, solver. alg; kwargs... ). u
0 commit comments