|
1 | | -function brterm() |
| 1 | +function brterm( |
| 2 | + H::QuantumObject{Operator}, |
| 3 | + a_op::QuantumObject{Operator}, |
| 4 | + spectra::Function; |
| 5 | + sec_cutoff::Real=0.1, |
| 6 | + fock_basis::Union{Bool, Val}=Val(false) |
| 7 | + ) |
| 8 | + rst = eigenstates(H) |
| 9 | + term = _brterm(rst, a_op, spectra, sec_cutoff, makeVal(fock_basis)) |
| 10 | + if getVal(fock_basis) |
| 11 | + return term |
| 12 | + else |
| 13 | + return term, Qobj(rst.vectors, Operator(), rst.dimensions) |
| 14 | + end |
| 15 | +end |
| 16 | + |
| 17 | +# method for `EigsolveResult` (so `eigenstates` is not called |
| 18 | +# repeatedly when called by `bloch_redfield_tensor`) |
| 19 | +function _brterm( |
| 20 | + rst::EigsolveResult, |
| 21 | + a_op::T, |
| 22 | + spectra::F, |
| 23 | + sec_cutoff::Real, |
| 24 | + fock_basis::Union{Val{true},Val{false}} |
| 25 | + ) where {T<:QuantumObject{Operator},F<:Function} |
| 26 | + |
| 27 | + _check_br_spectra(spectra) |
| 28 | + |
| 29 | + U, N = rst.vectors, prod(rst.dimensions) |
| 30 | + |
| 31 | + skew = @. rst.values - rst.values' |> real |
| 32 | + spectrum = spectra.(skew) |
| 33 | + |
| 34 | + A_mat = U' * a_op.data * U |
| 35 | + |
| 36 | + ac_term = (A_mat .* spectrum) * A_mat |
| 37 | + bd_term = A_mat * (A_mat .* trans(spectrum)) |
| 38 | + |
| 39 | + if sec_cutoff != -1 |
| 40 | + m_cut = similar(skew) |
| 41 | + map!(x -> abs(x) < sec_cutoff, m_cut, skew) |
| 42 | + ac_term .*= m_cut |
| 43 | + bd_term .*= m_cut |
| 44 | + |
| 45 | + Id = I(N) |
| 46 | + vec_skew = vec(skew) |
| 47 | + M_cut = @. abs(vec_skew - vec_skew') < sec_cutoff |
| 48 | + end |
| 49 | + |
| 50 | + out = 0.5 * ( |
| 51 | + + QuantumToolbox._sprepost(A_mat .* trans(spectrum), A_mat) |
| 52 | + + QuantumToolbox._sprepost(A_mat, A_mat .* spectrum) |
| 53 | + - _spost(ac_term, Id) |
| 54 | + - QuantumToolbox._spre(bd_term, Id) |
| 55 | + ) |
| 56 | + |
| 57 | + (sec_cutoff != -1) && (out .*= M_cut) |
| 58 | + |
2 | 59 |
|
| 60 | + if getVal(fock_basis) |
| 61 | + SU = _sprepost(U, U') |
| 62 | + return QuantumObject(SU * out * SU', SuperOperator(), rst.dimensions) |
| 63 | + else |
| 64 | + return QuantumObject(out, SuperOperator(), rst.dimensions) |
| 65 | + end |
3 | 66 | end |
4 | 67 |
|
5 | 68 | function bloch_redfield_tensor() |
|
0 commit comments