Skip to content

Instantly share code, notes, and snippets.

@amitjamadagni
Last active August 29, 2015 14:24
Show Gist options
  • Save amitjamadagni/18ef0dc03b136339bc16 to your computer and use it in GitHub Desktop.
Save amitjamadagni/18ef0dc03b136339bc16 to your computer and use it in GitHub Desktop.
Lindblad Master Equation Type
immutable QuLindbladMasterEq{H<:QuBase.AbstractQuMatrix, V<:QuBase.AbstractQuArray} <: QuEquation
hamitonian::H
collapse_ops::Array{V}
QuLindbladMasterEq(hamiltonian, collapse_ops) = new(hamiltonian, collapse_ops)
end
QuLindbladMasterEq{H<:QuBase.AbstractQuMatrix, V<:QuBase.AbstractQuArray}(hamiltonian::H, collapse_ops::Array{V}) = lindblad(hamiltonian, collapse_ops)
function lindblad(hamiltonian::QuBase.AbstractQuMatrix, collapse_ops::Vector{QuBase.AbstractQuMatrix})
nb = size(coeffs(hamiltonian), 1)
nlop = length(collapse_ops)
heff = zeros(typeof(im*one(eltype(hamiltonian))), size(coeffs(hamiltonian)))
for l=1:nlop
heff = heff + 0.5*coeffs(collapse_ops[l])'*coeffs(collapse_ops[l])
end
SI = Array(Int,0)
SJ = Array(Int,0)
Lvals = Array(typeof(im*one(eltype(hamiltonian))),0)
for m=1:nb
for n=1:nb
for i=1:nb
for j=1:nb
sm = (n-1)*nb + m
sj = (j-1)*nb + i
lv = zero(Complex128)
for l=1:nlop
lv = lv + coeffs(collapse_ops[l])[m,i]*coeffs(collapse_ops[l]')[n,j]
end
if j==n
lv = lv - im*coeffs(hamiltonian)[m,i] - heff[m,i]
end
if i==m
lv = lv + im*coeffs(hamiltonian)[j,n] - heff[j,n]
end
if real(lv)!=0 || imag(lv)!=0
push!(SI, sm)
push!(SJ, sj)
push!(Lvals, lv)
end
end
end
end
end
return QuBase.similar_type(hamiltonian)(sparse(SI, SJ, Lvals, nb*nb, nb*nb))
end
QuPropagator{QPM<:QuPropagatorMethod, QM<:QuBase.AbstractQuMatrix}(eq::QuLindbladMasterEq, init_state::QM, tlist, method::QPM) = QuPropagator{QPM,QM,QuLindbladMasterEq}(QuLindbladMasterEq(eq), init_state, tlist, method)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment