Skip to content

Commit 596aa4c

Browse files
committed
function brterm
1 parent 829cb4f commit 596aa4c

File tree

1 file changed

+64
-1
lines changed

1 file changed

+64
-1
lines changed

src/brtools.jl

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,68 @@
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+
259

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
366
end
467

568
function bloch_redfield_tensor()

0 commit comments

Comments
 (0)