get rid of that d/2 nonsense

This commit is contained in:
Valentin Boettcher 2024-05-31 19:02:23 -04:00
parent 27bcba8287
commit d5e74d718e
7 changed files with 423 additions and 98 deletions

View file

@ -0,0 +1,104 @@
"""
Just a quick hack prior to the re-calculation of the full phase
diagram.
"""
import numpy as np
from rabifun.system import *
from rabifun.plots import *
from rabifun.utilities import *
import scipy
import matplotlib.pyplot as plt
def self_energy(ω, g, ε):
"""
Calculate the self-energy of the system.
:param g: The coupling strengths.
:param ε: The bath energies.
"""
return np.sum(np.abs(g[None, :] / (ω[:, None] - ε[None, :])) ** 2, axis=1)
def coefficients(ω, g, ε):
coeff = 1 / (1 + self_energy(ω, g, ε))
return coeff / np.sum((coeff))
def characteristic_poly(g: np.ndarray, ε: np.ndarray, η_A: float = 0):
g2 = np.abs(g) ** 2
def poly(ω):
s = ω[0] + ω[1] * 1j
res = s + 1j * η_A - np.sum(g2 / (s - ε))
return (res * res.conjugate()).real
return poly
def hamiltonian(g: np.ndarray, ε: np.ndarray, η_A: float = 0):
H = np.diag([-1j * η_A, *ε])
H[0, 1:] = g
H[1:, 0] = np.conj(g)
return H
def a_site_population(t, ω, coeff):
return (
np.abs(np.sum(coeff[None, :] * np.exp(-1j * ω[None, :] * t[:, None]), axis=1))
** 2
)
def make_params(ω_c=0.1 / 2, N=10, gbar=1 / 3):
"""
Make a set of parameters for the system with the current
best-known settings.
"""
return Params(
η=0.5,
Ω=13,
δ=1 / 4,
ω_c=ω_c,
g_0=ω_c * gbar,
laser_detuning=0,
N=2 * N + 2,
N_couplings=N,
measurement_detuning=0,
α=0,
rwa=False,
flat_energies=False,
correct_lamb_shift=True,
laser_off_time=0,
)
def test():
params = make_params(N=10, gbar=1 / 3)
params.flat_energies = False
params.α = 0.0
params.correct_lamb_shift = True
runtime = RuntimeParams(params)
t = time_axis(params, recurrences=1.5)
g = runtime.g / 2
ε = runtime.bath_ε
H = hamiltonian(g, ε.real, 0 * params.η / 2)
ω = np.linalg.eigvals(H)
M = np.linalg.eig(H).eigenvectors
Minv = np.linalg.inv(M)
v0 = Minv[:, 0]
coeff = M[0, :] * v0.T
print(coeff)
# coeff /= np.abs(np.sum(coeff))
# coeff = coefficients(ω, g, ε)
plt.cla()
plt.plot(t, a_site_population(t, ω, coeff))
plt.ylim(0, 1)
return ω

View file

@ -5,7 +5,7 @@ import itertools
# %% interactive # %% interactive
def make_params(ω_c=0.1 / 2, N=10, gbar=1 / 3): def make_params(ω_c=0.1 / 2, N=10, gbar=1 / 3, compensate=2):
""" """
Make a set of parameters for the system with the current Make a set of parameters for the system with the current
best-known settings. best-known settings.
@ -23,7 +23,7 @@ def make_params(ω_c=0.1 / 2, N=10, gbar=1 / 3):
α=0, α=0,
rwa=False, rwa=False,
flat_energies=False, flat_energies=False,
correct_lamb_shift=True, correct_lamb_shift=compensate,
laser_off_time=0, laser_off_time=0,
) )
@ -45,7 +45,7 @@ def decay_rwa_analysis():
ω_c = 0.05 ω_c = 0.05
Ns = [5, 10, 20] Ns = [5, 10, 20]
gbar = 1 / 3 gbar = 1 / 3 / 2
fig = make_figure("decay_test", figsize=(15, len(Ns) * 3)) fig = make_figure("decay_test", figsize=(15, len(Ns) * 3))
ax_ns = fig.subplots(len(Ns), 2) ax_ns = fig.subplots(len(Ns), 2)
@ -57,7 +57,7 @@ def decay_rwa_analysis():
for i, N in enumerate(Ns): for i, N in enumerate(Ns):
params = make_params(ω_c=ω_c, N=N, gbar=gbar) params = make_params(ω_c=ω_c, N=N, gbar=gbar)
params.laser_off_time = params.lifetimes(0) params.laser_off_time = 0
params.initial_state = make_zero_intial_state(params) params.initial_state = make_zero_intial_state(params)
params.initial_state[1] = 1 params.initial_state[1] = 1
@ -65,9 +65,9 @@ def decay_rwa_analysis():
ax_real, ax_corrected = ax_ns[i] ax_real, ax_corrected = ax_ns[i]
t = time_axis(params, recurrence_time(params) * 1.1 / params.lifetimes(1), 0.1) t = time_axis(params, recurrences=1.1, resolution=0.1)
for α in [0, 2]: for α in np.linspace(0, 2, 5):
params.α = α params.α = α
sol_nonrwa, sol_rwa = solve_nonrwa_rwa(t, params) sol_nonrwa, sol_rwa = solve_nonrwa_rwa(t, params)
@ -75,6 +75,7 @@ def decay_rwa_analysis():
results[(N, α, False)] = sol_nonrwa results[(N, α, False)] = sol_nonrwa
param_dict[(N, α)] = params param_dict[(N, α)] = params
color = None
for correct, rwa in itertools.product([True, False], [True, False]): for correct, rwa in itertools.product([True, False], [True, False]):
sol = sol_rwa if rwa else sol_nonrwa sol = sol_rwa if rwa else sol_nonrwa
ax = ax_corrected if correct else ax_real ax = ax_corrected if correct else ax_real
@ -82,14 +83,15 @@ def decay_rwa_analysis():
if correct: if correct:
y = correct_for_decay(sol, params) y = correct_for_decay(sol, params)
ax.plot( l = ax.plot(
sol.t, sol.t,
np.abs(y[a_site]) ** 2, np.abs(y[a_site]) ** 2,
label=f"{'rwa' if rwa else ''} α={α}", label=f"{'rwa' if rwa else ''} α={α}",
linestyle="--" if rwa else "-", linestyle="--" if rwa else "-",
alpha=0.5 if rwa else 1, alpha=0.5 if rwa else 1,
color=f"C{α}", color=color,
) )
color = l[0].get_color()
ax_real.set_title(f"Real, N={N}") ax_real.set_title(f"Real, N={N}")
ax_corrected.set_title(f"Decay Removed, N={N}") ax_corrected.set_title(f"Decay Removed, N={N}")

View file

@ -1,6 +1,6 @@
change_id: snsvmqorzwxnvuvwsrsxqqmukqyspwkw change_id: wykwpsvmtrzvwtunotxnzokztpyrnsrx
commit_id: 6ec1859dba940a2ada3aefedc5adea2cb436339f commit_id: 94f23ecee30914b5163f14fd5af637a8777b42cc
description: 'RESULTS: make some nice demos' description: ''
extra_meta: extra_meta:
Ns: Ns:
- 5 - 5
@ -9,20 +9,36 @@ extra_meta:
params: params:
? !!python/tuple ? !!python/tuple
- 5 - 5
- !!python/object/apply:numpy.core.multiarray.scalar
- &id001 !!python/object/apply:numpy.dtype
args:
- f8
- false
- true
state: !!python/tuple
- 3
- <
- null
- null
- null
- -1
- -1
- 0 - 0
: &id001 !!python/object:rabifun.system.Params - !!binary |
AAAAAAAAAAA=
: &id002 !!python/object:rabifun.system.Params
N: 12 N: 12
N_couplings: 5 N_couplings: 5
correct_lamb_shift: true correct_lamb_shift: 2
drive_off_time: null drive_off_time: null
dynamic_detunting: &id002 !!python/tuple dynamic_detunting: &id003 !!python/tuple
- 0 - 0
- 0 - 0
flat_energies: false flat_energies: false
g_0: 0.016666666666666666 g_0: 0.008333333333333333
initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct
args: args:
- &id003 !!python/name:numpy.ndarray '' - &id004 !!python/name:numpy.ndarray ''
- !!python/tuple - !!python/tuple
- 0 - 0
- !!binary | - !!binary |
@ -31,7 +47,7 @@ extra_meta:
- 1 - 1
- !!python/tuple - !!python/tuple
- 14 - 14
- &id004 !!python/object/apply:numpy.dtype - &id005 !!python/object/apply:numpy.dtype
args: args:
- c16 - c16
- false - false
@ -52,32 +68,62 @@ extra_meta:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
laser_detuning: 0 laser_detuning: 0
laser_off_time: 0.0 laser_off_time: 0
measurement_detuning: 0 measurement_detuning: 0
rwa: false rwa: false
"\u03A9": 13 "\u03A9": 13
"\u03B1": 2 "\u03B1": !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
"\u03B4": 0.25 "\u03B4": 0.25
"\u03B7": 0.5 "\u03B7": 0.5
"\u03C9_c": 0.05 "\u03C9_c": 0.05
? !!python/tuple ? !!python/tuple
- 5 - 5
- 2 - !!python/object/apply:numpy.core.multiarray.scalar
: *id001 - *id001
- !!binary |
AAAAAAAA4D8=
: *id002
? !!python/tuple
- 5
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA8D8=
: *id002
? !!python/tuple
- 5
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA+D8=
: *id002
? !!python/tuple
- 5
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
: *id002
? !!python/tuple ? !!python/tuple
- 10 - 10
- 0 - !!python/object/apply:numpy.core.multiarray.scalar
: &id005 !!python/object:rabifun.system.Params - *id001
- !!binary |
AAAAAAAAAAA=
: &id006 !!python/object:rabifun.system.Params
N: 22 N: 22
N_couplings: 10 N_couplings: 10
correct_lamb_shift: true correct_lamb_shift: 2
drive_off_time: null drive_off_time: null
dynamic_detunting: *id002 dynamic_detunting: *id003
flat_energies: false flat_energies: false
g_0: 0.016666666666666666 g_0: 0.008333333333333333
initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct
args: args:
- *id003 - *id004
- !!python/tuple - !!python/tuple
- 0 - 0
- !!binary | - !!binary |
@ -86,7 +132,7 @@ extra_meta:
- 1 - 1
- !!python/tuple - !!python/tuple
- 24 - 24
- *id004 - *id005
- false - false
- !!binary | - !!binary |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -97,32 +143,62 @@ extra_meta:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
laser_detuning: 0 laser_detuning: 0
laser_off_time: 0.0 laser_off_time: 0
measurement_detuning: 0 measurement_detuning: 0
rwa: false rwa: false
"\u03A9": 13 "\u03A9": 13
"\u03B1": 2 "\u03B1": !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
"\u03B4": 0.25 "\u03B4": 0.25
"\u03B7": 0.5 "\u03B7": 0.5
"\u03C9_c": 0.05 "\u03C9_c": 0.05
? !!python/tuple ? !!python/tuple
- 10 - 10
- 2 - !!python/object/apply:numpy.core.multiarray.scalar
: *id005 - *id001
- !!binary |
AAAAAAAA4D8=
: *id006
? !!python/tuple
- 10
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA8D8=
: *id006
? !!python/tuple
- 10
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA+D8=
: *id006
? !!python/tuple
- 10
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
: *id006
? !!python/tuple ? !!python/tuple
- 20 - 20
- 0 - !!python/object/apply:numpy.core.multiarray.scalar
: &id006 !!python/object:rabifun.system.Params - *id001
- !!binary |
AAAAAAAAAAA=
: &id007 !!python/object:rabifun.system.Params
N: 42 N: 42
N_couplings: 20 N_couplings: 20
correct_lamb_shift: true correct_lamb_shift: 2
drive_off_time: null drive_off_time: null
dynamic_detunting: *id002 dynamic_detunting: *id003
flat_energies: false flat_energies: false
g_0: 0.016666666666666666 g_0: 0.008333333333333333
initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct
args: args:
- *id003 - *id004
- !!python/tuple - !!python/tuple
- 0 - 0
- !!binary | - !!binary |
@ -131,7 +207,7 @@ extra_meta:
- 1 - 1
- !!python/tuple - !!python/tuple
- 44 - 44
- *id004 - *id005
- false - false
- !!binary | - !!binary |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -148,18 +224,45 @@ extra_meta:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAA= AAAAAAAAAAAAAAAAAAAAAAAAAAA=
laser_detuning: 0 laser_detuning: 0
laser_off_time: 0.0 laser_off_time: 0
measurement_detuning: 0 measurement_detuning: 0
rwa: false rwa: false
"\u03A9": 13 "\u03A9": 13
"\u03B1": 2 "\u03B1": !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
"\u03B4": 0.25 "\u03B4": 0.25
"\u03B7": 0.5 "\u03B7": 0.5
"\u03C9_c": 0.05 "\u03C9_c": 0.05
? !!python/tuple ? !!python/tuple
- 20 - 20
- 2 - !!python/object/apply:numpy.core.multiarray.scalar
: *id006 - *id001
- !!binary |
AAAAAAAA4D8=
: *id007
? !!python/tuple
- 20
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA8D8=
: *id007
? !!python/tuple
- 20
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA+D8=
: *id007
? !!python/tuple
- 20
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
: *id007
function: decay_rwa_analysis function: decay_rwa_analysis
name: 001_decay_test name: 001_decay_test
refers_to: ./figs/001_decay_test.pdf refers_to: ./figs/001_decay_test.pdf

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 2.6 MiB

View file

@ -1,24 +1,40 @@
change_id: snsvmqorzwxnvuvwsrsxqqmukqyspwkw change_id: wykwpsvmtrzvwtunotxnzokztpyrnsrx
commit_id: 049b547f220987c6bb63165a9a020b20b1c4377b commit_id: e4399f86a81e8dc0fbbe24226b948db60bd83807
description: 'RESULTS: make some nice demos' description: ''
function: decay_rwa_analysis function: decay_rwa_analysis
param_dict: param_dict:
? !!python/tuple ? !!python/tuple
- 5 - 5
- !!python/object/apply:numpy.core.multiarray.scalar
- &id001 !!python/object/apply:numpy.dtype
args:
- f8
- false
- true
state: !!python/tuple
- 3
- <
- null
- null
- null
- -1
- -1
- 0 - 0
: &id001 !!python/object:rabifun.system.Params - !!binary |
AAAAAAAAAAA=
: &id002 !!python/object:rabifun.system.Params
N: 12 N: 12
N_couplings: 5 N_couplings: 5
correct_lamb_shift: true correct_lamb_shift: 2
drive_off_time: null drive_off_time: null
dynamic_detunting: &id002 !!python/tuple dynamic_detunting: &id003 !!python/tuple
- 0 - 0
- 0 - 0
flat_energies: false flat_energies: false
g_0: 0.016666666666666666 g_0: 0.008333333333333333
initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct
args: args:
- &id003 !!python/name:numpy.ndarray '' - &id004 !!python/name:numpy.ndarray ''
- !!python/tuple - !!python/tuple
- 0 - 0
- !!binary | - !!binary |
@ -27,7 +43,7 @@ param_dict:
- 1 - 1
- !!python/tuple - !!python/tuple
- 14 - 14
- &id004 !!python/object/apply:numpy.dtype - &id005 !!python/object/apply:numpy.dtype
args: args:
- c16 - c16
- false - false
@ -48,32 +64,62 @@ param_dict:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
laser_detuning: 0 laser_detuning: 0
laser_off_time: 0.0 laser_off_time: 0
measurement_detuning: 0 measurement_detuning: 0
rwa: false rwa: false
"\u03A9": 13 "\u03A9": 13
"\u03B1": 2 "\u03B1": !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
"\u03B4": 0.25 "\u03B4": 0.25
"\u03B7": 0.5 "\u03B7": 0.5
"\u03C9_c": 0.05 "\u03C9_c": 0.05
? !!python/tuple ? !!python/tuple
- 5 - 5
- 2 - !!python/object/apply:numpy.core.multiarray.scalar
: *id001 - *id001
- !!binary |
AAAAAAAA4D8=
: *id002
? !!python/tuple
- 5
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA8D8=
: *id002
? !!python/tuple
- 5
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA+D8=
: *id002
? !!python/tuple
- 5
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
: *id002
? !!python/tuple ? !!python/tuple
- 10 - 10
- 0 - !!python/object/apply:numpy.core.multiarray.scalar
: &id005 !!python/object:rabifun.system.Params - *id001
- !!binary |
AAAAAAAAAAA=
: &id006 !!python/object:rabifun.system.Params
N: 22 N: 22
N_couplings: 10 N_couplings: 10
correct_lamb_shift: true correct_lamb_shift: 2
drive_off_time: null drive_off_time: null
dynamic_detunting: *id002 dynamic_detunting: *id003
flat_energies: false flat_energies: false
g_0: 0.016666666666666666 g_0: 0.008333333333333333
initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct
args: args:
- *id003 - *id004
- !!python/tuple - !!python/tuple
- 0 - 0
- !!binary | - !!binary |
@ -82,7 +128,7 @@ param_dict:
- 1 - 1
- !!python/tuple - !!python/tuple
- 24 - 24
- *id004 - *id005
- false - false
- !!binary | - !!binary |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -93,32 +139,62 @@ param_dict:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
laser_detuning: 0 laser_detuning: 0
laser_off_time: 0.0 laser_off_time: 0
measurement_detuning: 0 measurement_detuning: 0
rwa: false rwa: false
"\u03A9": 13 "\u03A9": 13
"\u03B1": 2 "\u03B1": !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
"\u03B4": 0.25 "\u03B4": 0.25
"\u03B7": 0.5 "\u03B7": 0.5
"\u03C9_c": 0.05 "\u03C9_c": 0.05
? !!python/tuple ? !!python/tuple
- 10 - 10
- 2 - !!python/object/apply:numpy.core.multiarray.scalar
: *id005 - *id001
- !!binary |
AAAAAAAA4D8=
: *id006
? !!python/tuple
- 10
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA8D8=
: *id006
? !!python/tuple
- 10
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA+D8=
: *id006
? !!python/tuple
- 10
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
: *id006
? !!python/tuple ? !!python/tuple
- 20 - 20
- 0 - !!python/object/apply:numpy.core.multiarray.scalar
: &id006 !!python/object:rabifun.system.Params - *id001
- !!binary |
AAAAAAAAAAA=
: &id007 !!python/object:rabifun.system.Params
N: 42 N: 42
N_couplings: 20 N_couplings: 20
correct_lamb_shift: true correct_lamb_shift: 2
drive_off_time: null drive_off_time: null
dynamic_detunting: *id002 dynamic_detunting: *id003
flat_energies: false flat_energies: false
g_0: 0.016666666666666666 g_0: 0.008333333333333333
initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct initial_state: !!python/object/apply:numpy.core.multiarray._reconstruct
args: args:
- *id003 - *id004
- !!python/tuple - !!python/tuple
- 0 - 0
- !!binary | - !!binary |
@ -127,7 +203,7 @@ param_dict:
- 1 - 1
- !!python/tuple - !!python/tuple
- 44 - 44
- *id004 - *id005
- false - false
- !!binary | - !!binary |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -144,17 +220,44 @@ param_dict:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAA= AAAAAAAAAAAAAAAAAAAAAAAAAAA=
laser_detuning: 0 laser_detuning: 0
laser_off_time: 0.0 laser_off_time: 0
measurement_detuning: 0 measurement_detuning: 0
rwa: false rwa: false
"\u03A9": 13 "\u03A9": 13
"\u03B1": 2 "\u03B1": !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
"\u03B4": 0.25 "\u03B4": 0.25
"\u03B7": 0.5 "\u03B7": 0.5
"\u03C9_c": 0.05 "\u03C9_c": 0.05
? !!python/tuple ? !!python/tuple
- 20 - 20
- 2 - !!python/object/apply:numpy.core.multiarray.scalar
: *id006 - *id001
- !!binary |
AAAAAAAA4D8=
: *id007
? !!python/tuple
- 20
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA8D8=
: *id007
? !!python/tuple
- 20
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAA+D8=
: *id007
? !!python/tuple
- 20
- !!python/object/apply:numpy.core.multiarray.scalar
- *id001
- !!binary |
AAAAAAAAAEA=
: *id007
refers_to: outputs/001_decay_test.pkl refers_to: outputs/001_decay_test.pkl
source: scripts/simulations/001_full_system_rwa_analysis.py source: scripts/simulations/001_full_system_rwa_analysis.py

View file

@ -63,7 +63,7 @@ class Params:
initial_state: np.ndarray | None = None initial_state: np.ndarray | None = None
"""The initial state of the system.""" """The initial state of the system."""
correct_lamb_shift: bool = True correct_lamb_shift: float = 1
"""Whether to correct for the Lamb shift by tweaking the detuning.""" """Whether to correct for the Lamb shift by tweaking the detuning."""
def __post_init__(self): def __post_init__(self):
@ -93,7 +93,7 @@ class Params:
if not self.flat_energies: if not self.flat_energies:
raise ValueError("Rabi splitting is only defined for flat energies.") raise ValueError("Rabi splitting is only defined for flat energies.")
return np.sqrt((self.Ω * self.g_0) ** 2 + (self.ω_c * self.Ω) ** 2) return np.sqrt((self.Ω * self.g_0 * 2) ** 2 + (self.ω_c * self.Ω) ** 2)
class RuntimeParams: class RuntimeParams:
@ -110,12 +110,14 @@ class RuntimeParams:
decay_rates = -1j * np.repeat(params.η / 2, params.N + 2) decay_rates = -1j * np.repeat(params.η / 2, params.N + 2)
Ωs = freqs + decay_rates Ωs = freqs + decay_rates
self.drive_frequencies, self.detunings, self.drive_amplitudes = ( self.drive_frequencies, self.detunings, self.g = (
drive_frequencies_and_amplitudes(params) drive_frequencies_and_amplitudes(params)
) # linear frequencies! ) # linear frequencies!
self.g *= 2 * np.pi
self.Ωs = Ωs self.Ωs = Ωs
self.diag_energies = ( self.bath_ε = 2 * np.pi * self.detunings - 1j * params.η / 2
self.ε = (
2 2
* np.pi * np.pi
* np.concatenate( * np.concatenate(
@ -128,13 +130,18 @@ class RuntimeParams:
+ decay_rates + decay_rates
) )
self.detuned_Ωs = freqs - self.diag_energies.real self.detuned_Ωs = freqs - self.ε.real
def __repr__(self): def __repr__(self):
return f"{self.__class__.__name__}(Ωs={self.Ωs}, drive_frequencies={self.drive_frequencies}, drive_amplitudes={self.drive_amplitudes})" return f"{self.__class__.__name__}(Ωs={self.Ωs}, drive_frequencies={self.drive_frequencies}, drive_amplitudes={self.g})"
def time_axis(params: Params, lifetimes: float, resolution: float = 1): def time_axis(
params: Params,
lifetimes: float | None = None,
recurrences: float | None = None,
resolution: float = 1,
):
"""Generate a time axis for the simulation. """Generate a time axis for the simulation.
:param params: system parameters :param params: system parameters
@ -146,9 +153,15 @@ def time_axis(params: Params, lifetimes: float, resolution: float = 1):
smaller value yields more points in the time axis. smaller value yields more points in the time axis.
""" """
return np.arange( tmax = 0
0, params.lifetimes(lifetimes), resolution * np.pi / (params.Ω * params.N) if lifetimes is not None:
) tmax = params.lifetimes(lifetimes)
elif recurrences is not None:
tmax = recurrence_time(params) * recurrences
else:
raise ValueError("Either lifetimes or recurrences must be set.")
return np.arange(0, tmax, resolution * np.pi / (params.Ω * params.N))
def eom_drive(t, x, ds, ωs, rwa, detuned_Ωs): def eom_drive(t, x, ds, ωs, rwa, detuned_Ωs):
@ -160,12 +173,11 @@ def eom_drive(t, x, ds, ωs, rwa, detuned_Ωs):
:param ωs: linear drive frequencies :param ωs: linear drive frequencies
""" """
ds = 2 * np.pi * ds
if rwa: if rwa:
coupled_indices = 2 + len(ds) coupled_indices = 2 + len(ds)
det_matrix = np.zeros((len(x), len(x))) det_matrix = np.zeros((len(x), len(x)))
det_matrix[1, 2:coupled_indices] = ds / 2 det_matrix[1, 2:coupled_indices] = ds
det_matrix[2:coupled_indices, 1] = ds / 2 det_matrix[2:coupled_indices, 1] = ds
driven_x = det_matrix @ x driven_x = det_matrix @ x
else: else:
det_matrix = detuned_Ωs[:, None] - detuned_Ωs[None, :] det_matrix = detuned_Ωs[:, None] - detuned_Ωs[None, :]
@ -176,7 +188,7 @@ def eom_drive(t, x, ds, ωs, rwa, detuned_Ωs):
det_matrix = np.exp(-1j * det_matrix * t) det_matrix = np.exp(-1j * det_matrix * t)
driven_x = np.sum(ds * np.sin(2 * np.pi * ωs * t)) * (det_matrix @ x) driven_x = np.sum(2 * ds * np.sin(2 * np.pi * ωs * t)) * (det_matrix @ x)
return driven_x return driven_x
@ -199,7 +211,7 @@ def make_righthand_side(runtime_params: RuntimeParams, params: Params):
"""The right hand side of the equation of motion.""" """The right hand side of the equation of motion."""
def rhs(t, x): def rhs(t, x):
differential = runtime_params.diag_energies * x differential = runtime_params.ε * x
if params.rwa: if params.rwa:
x[0] = 0 x[0] = 0
@ -209,7 +221,7 @@ def make_righthand_side(runtime_params: RuntimeParams, params: Params):
differential += eom_drive( differential += eom_drive(
t, t,
x, x,
runtime_params.drive_amplitudes, runtime_params.g,
runtime_params.drive_frequencies, runtime_params.drive_frequencies,
params.rwa, params.rwa,
runtime_params.detuned_Ωs, runtime_params.detuned_Ωs,
@ -266,7 +278,7 @@ def solve(t: np.ndarray, params: Params, **kwargs):
(np.min(t), np.max(t)), (np.min(t), np.max(t)),
initial, initial,
vectorized=False, vectorized=False,
# max_step=2 * np.pi / (params.Ω * params.N_couplings), max_step=2 * np.pi / (params.Ω * params.N),
t_eval=t, t_eval=t,
method="DOP853", method="DOP853",
atol=1e-7, atol=1e-7,
@ -350,8 +362,9 @@ def drive_frequencies_and_amplitudes(
amplitudes /= np.sum(amplitudes) amplitudes /= np.sum(amplitudes)
amplitudes = params.Ω * params.g_0 * np.sqrt(amplitudes) amplitudes = params.Ω * params.g_0 * np.sqrt(amplitudes)
# FIXME: this is twice too big
if not params.flat_energies and params.correct_lamb_shift: if not params.flat_energies and params.correct_lamb_shift:
Δs -= np.sum(amplitudes**2 / Δs) Δs -= np.sum(amplitudes**2 / Δs) * params.correct_lamb_shift**2
ωs = ((np.arange(1, params.N_couplings + 1) - params.δ) * params.Ω) - Δs ωs = ((np.arange(1, params.N_couplings + 1) - params.δ) * params.Ω) - Δs
return ωs, Δs, amplitudes return ωs, Δs, amplitudes