Quickstart
This package computes full-counting-statistics cumulants from Lindblad dynamics. A model is defined by a Hamiltonian and jump operators, or by a preassembled Liouvillian; a current is defined by monitored jumps mJ and weights nu.
Installation
To install the package, in the Julia REPL,
using Pkg
Pkg.add("QuantumFCS")Quickstart example
We model a quantum dot heat engine as a single mode coupled to two reservoirs (hot and cold) in the large bias limit ($n_c = 0,~ n_h = 1$). We monitor the cold-reservoir loss channel and assign it weight +1, so the first cumulant is positive for this chosen current orientation.
using QuantumOptics
using QuantumFCS
# Basis for the single quantum dot
b = FockBasis(1)
# Operators
d = destroy(b)
d_dag = create(b)
# Parameters
ϵd = 1.0; # Energy level of the quantum dot
κc = 0.1; # Coupling strength to cold reservoir
κh = 0.5; # Coupling strength to hot reservoir
# Hamiltonian and jump operators
H = ϵd * d_dag * d;
Jcloss = sqrt(κc) * d; # Jumps into the cold reservoir
Jhgain = sqrt(κh) * d_dag; # Jumps from the hot reservoir
J = [Jcloss, Jhgain];
# Steady state
ρss = steadystate.iterative(H, J)
# Weight vector: +1 for each monitored cold-reservoir jump
nu = [1];
# Monitored jump operator
mJ = [Jcloss];
# Calculating the first two cumulants
c1, c2 = fcscumulants_recursive(H, J, mJ, 2, ρss, nu);
println("\nFull Counting Statistics:")
println("First cumulant : $c1")
println("Second cumulant : $c2") Without a quantum framework
You do not need QuantumOptics.jl (or QuantumToolbox.jl). If you already have a vectorised Liouvillian L, its steady state ρss, and your monitored jump operators mJ, call the core method directly:
using QuantumFCS
# L : ComplexF64 sparse/dense matrix — the vectorized Liouvillian
# mJ : Vector of monitored jump operators (matrices, not super-operators)
# ρss : steady-state density matrix
# nu : weights, one per entry of mJ
c1, c2, c3 = fcscumulants_recursive(L, mJ, 3, ρss, nu)See the Examples for a full manual Liouvillian construction.
Next steps
- For large sparse Liouvillians, switch to the matrix-free iterative backend with
fcscumulants_recursive(...; method = :iterative)— see Drazin solvers. - To bundle a problem with its solver options, use the
LindbladFCSproblem type and callfcscumulants_recursive(problem). - To reuse solver setup across several currents of the same system, build a
PreparedLindbladFCScontext withprepare_fcs_context.