Driven systems and dynamical decoupling
Inspirations taken from an example in QuTiP-BoFiN article (Lambert et al. 2023).
Introduction
In this example, we show how to solve the time evolution with time-dependent Hamiltonian problems in hierarchical equations of motion approach.
Here, we study dynamical decoupling which is a common tool used to undo the dephasing effect from the environment even for finite pulse duration.
Hamiltonian
We consider a two-level system coupled to a bosonic reservoir (\(\textrm{b}\)). The total Hamiltonian is given by \(H_{\textrm{T}}=H_\textrm{s}+H_\textrm{b}+H_\textrm{sb}\), where each terms takes the form
\[ \begin{aligned} H_{\textrm{s}}(t) &= H_0 + H_{\textrm{D}}(t),\\ H_0 &= \frac{\omega_0}{2} \sigma_z,\\ H_{\textrm{b}} &=\sum_{k}\omega_{k}b_{k}^{\dagger}b_{k},\\ H_{\textrm{sb}} &=\sigma_z\sum_{k}g_{\alpha,k}(b_k + b_k^{\dagger}). \end{aligned} \]
Here, \(H_{\textrm{b}}\) describes a bosonic reservoir where \(b_{k}\) \((b_{k}^{\dagger})\) is the bosonic annihilation (creation) operator associated to the \(k\)th mode (with frequency \(\omega_{k}\)).
Furthermore, to observe the time evolution of the coherence, we consider the initial state to be \[ ψ(t=0)=\frac{1}{\sqrt{2}}\left(|0\rangle+|1\rangle\right) \]
Now, we need to build the system Hamiltonian and initial state with the package QuantumToolbox.jl
to construct the operators.
ω0 = 0.0
σz = sigmaz()
σx = sigmax()
H0 = 0.5 * ω0 * σz
# Define the operator that measures the 0, 1 element of density matrix
ρ01 = Qobj([0 1; 0 0])
ψ0 = (basis(2, 0) + basis(2, 1)) / √2
Quantum Object: type=Ket dims=[2] size=(2,)
2-element Vector{ComplexF64}:
0.7071067811865475 + 0.0im
0.7071067811865475 + 0.0im
The time-dependent driving term \(H_{\textrm{D}}(t)\) has the form
\[ H_{\textrm{D}}(t) = \sum_{n=1}^N f_n(t) \sigma_x \]
where the pulse is chosen to have duration \(\tau\) together with a delay \(\Delta\) between each pulses, namely
\[ f_n(t) = \begin{cases} V & \textrm{if}~~(n-1)\tau + n\Delta \leq t \leq n (\tau + \Delta),\\ 0 & \textrm{otherwise}. \end{cases} \]
Here, we set the period of the pulses to be \(\tau V = \pi/2\). Therefore, we consider two scenarios with fast and slow pulses:
# a function which returns the amplitude of the pulse at time t
function pulse(p, t)
τ = 0.5 * π / p.V
period = τ + p.Δ
if (t % period) < τ
return p.V
else
return 0
end
end
tlist = 0:0.4:400
amp_fast = 0.50
amp_slow = 0.01
delay = 20
fastTuple = (V = amp_fast, Δ = delay)
slowTuple = (V = amp_slow, Δ = delay)
# plot
fig = Figure(size = (600, 350))
ax = Axis(fig[1, 1], xlabel = L"t")
lines!(ax, tlist, [pulse(fastTuple, t) for t in tlist], label = "Fast Pulse", linestyle = :solid)
lines!(ax, tlist, [pulse(slowTuple, t) for t in tlist], label = "Slow Pulse", linestyle = :dash)
axislegend(ax, position = :rt)
fig
Construct bath objects
We assume the bosonic reservoir to have a Drude-Lorentz Spectral Density, and we utilize the Padé decomposition. Furthermore, the spectral densities depend on the following physical parameters:
- the coupling strength \(\Gamma\) between system and reservoir
- the band-width \(W\)
- the product of the Boltzmann constant \(k\) and the absolute temperature \(T\) : \(kT\)
- the total number of exponentials for the reservoir \((N + 1)\)
Construct HEOMLS matrix
Only provide the time-independent part of system Hamiltonian when constructing HEOMLS matrices (the time-dependent part H_t
should be given when solving the time evolution).
Preparing block matrices for HEOM Liouvillian superoperator (using 4 threads)...
Progress: [ ] 0.5% --- Elapsed Time: 0h 00m 01s (ETA: 0h 03m 29s)Progress: [==============================] 100.0% --- Elapsed Time: 0h 00m 01s (ETA: 0h 00m 00s)
Constructing matrix...[DONE]
Boson type HEOMLS matrix acting on even-parity ADOs
system dims = [2]
number of ADOs N = 210
data =
MatrixOperator(840 × 840)
time evolution with time-independent Hamiltonian
Solve time evolution with time-dependent Hamiltonian
We need to provide a QuantumToolbox.QuantumObjectEvolution
(named as H_D
in this case)
Quantum Object Evo.: type=Operator dims=[2] size=(2, 2) ishermitian=true isconstant=false
ScalarOperator(0.0 + 0.0im) * MatrixOperator(2 × 2)
The keyword argument params
in HEOMsolve
will be passed to the argument p
in user-defined function (pulse
in this case) directly:
fastPulseSol = HEOMsolve(M, ψ0, tlist; e_ops = [ρ01], H_t = H_D, params = fastTuple)
slowPulseSol = HEOMsolve(M, ψ0, tlist; e_ops = [ρ01], H_t = H_D, params = slowTuple)
Solving time evolution for ADOs by Ordinary Differential Equations method...
Progress: [ ] 0.1% --- Elapsed Time: 0h 00m 01s (ETA: 0h 16m 40s)Progress: [==============================] 100.0% --- Elapsed Time: 0h 00m 01s (ETA: 0h 00m 00s)
Solving time evolution for ADOs by Ordinary Differential Equations method...
Progress: [==============================] 100.0% --- Elapsed Time: 0h 00m 00s (ETA: 0h 00m 00s)
Solution of hierarchical EOM
(return code: Success)
----------------------------
Btier = 6
Ftier = 0
num_states = 1
num_expect = 1
ODE alg.: OrdinaryDiffEqLowOrderRK.DP5{typeof(OrdinaryDiffEqCore.trivial_limiter!), typeof(OrdinaryDiffEqCore.trivial_limiter!), Static.False}(OrdinaryDiffEqCore.trivial_limiter!, OrdinaryDiffEqCore.trivial_limiter!, static(false))
abstol = 1.0e-8
reltol = 1.0e-6
Plot the coherence
fig = Figure(size = (600, 350))
ax = Axis(fig[1, 1], xlabel = L"t", ylabel = L"\rho_{01}")
lines!(ax, tlist, real(fastPulseSol.expect[1, :]), label = "Fast Pulse", linestyle = :solid)
lines!(ax, tlist, real(slowPulseSol.expect[1, :]), label = "Slow Pulse", linestyle = :dot)
lines!(ax, tlist, real(noPulseSol.expect[1, :]), label = "no Pulse", linestyle = :dash)
axislegend(ax, position = :lb)
fig
Version Information
__
/ \
__ __ __ \__/ __
| | | | / \ / \
| | | | ______ ______ \__/_ _\__/
| |___| |/ __ \ / __ \ / ' \/ \
| ___ | |__) | / \ | _ _ |
| | | | ____/| ( ) | / \ / \ |
| | | | |____ | \__/ | | | | | |
|__| |__|\______) \______/|__| |_| |_|
Julia framework for Hierarchical Equations of Motion
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
Copyright © QuTiP team 2023 and later.
Lead developer : Yi-Te Huang
Other developers:
Simon Cross, Neill Lambert, Po-Chen Kuo and Shen-Liang Yang
Package information:
====================================
Julia Ver. 1.11.2
HierarchicalEOM Ver. 2.3.3
QuantumToolbox Ver. 0.24.0
SciMLOperators Ver. 0.3.12
LinearSolve Ver. 2.38.0
OrdinaryDiffEqCore Ver. 1.14.1
System information:
====================================
OS : Linux (x86_64-linux-gnu)
CPU : 4 × AMD EPYC 7763 64-Core Processor
Memory : 15.615 GB
WORD_SIZE: 64
LIBM : libopenlibm
LLVM : libLLVM-16.0.6 (ORCJIT, znver3)
BLAS : libopenblas64_.so (ilp64)
Threads : 4 (on 4 virtual cores)