前回までは一次元でした。二次元格子をみてみます。相変わらず参考はこちら、
https://queracomputing.github.io/Bloqade.jl/dev/tutorials/2.adiabatic/main/
その前に、bloqadeを使う際には部分空間機能を使うことで、隣接する原子同士がともに1にならないという制約をかけて計算することで高速化ができるようです。
space = blockade_subspace(atoms, 5.73);
こちらは参考までに。早速二次元系を見てみましょう。
nx, ny = 3, 3
nsites = nx * ny
atoms = generate_sites(SquareLattice(), nx, ny, scale = 6.7)
ちょっと前回と違うのはxy方向に数を指定します。3*3の格子にして、原子間距離は6.7マイクロメートルです。
total_time = 2.9
Ω_max = 2π * 4.3
Ω = piecewise_linear(clocks = [0.0, 0.3, 2.6, total_time], values = [0.0, Ω_max, Ω_max, 0]);
U = 2π * 15.0
Δ = piecewise_linear(clocks = [0.0, 0.3, 2.6, total_time], values = [-U, -U, U, U]);
fig, (ax1, ax2) = plt.subplots(ncols = 2, figsize = (10, 4))
Bloqade.plot!(ax1, Ω)
ax1.set_ylabel("Ω/2π (MHz)")
Bloqade.plot!(ax2, Δ)
ax2.set_ylabel("Δ/2π (MHz)")
fig
一番上は全体のスケジュールの時間です。2.9マイクロ秒と設定されています。
次に設定されているのが横磁場のスケジュール、そしてリュードベリ状態のパラメータ。
最後に図示をしてみます。
前回の一次元の時と近い感じですね。計算実行して、時間の経過を見てみます。
h = rydberg_h(atoms; Δ, Ω)
reg = zero_state(9);
prob = SchrodingerProblem(reg, total_time, h);
integrator = init(prob, Vern8());
densities = [];
for _ in TimeChoiceIterator(integrator, 0.0:1e-3:total_time)
push!(densities, rydberg_density(reg))
end
D = hcat(densities...)
fig, ax = plt.subplots(figsize = (10, 4))
shw = ax.imshow(real(D), interpolation = "nearest", aspect = "auto", extent = [0, total_time, 0.5, nsites + 0.5])
ax.set_xlabel("time (μs)")
ax.set_ylabel("site")
ax.set_xticks(0:0.2:total_time)
ax.set_yticks(1:nsites)
bar = fig.colorbar(shw)
fig
今回の結果は、一次元系の時とほぼ同じですね。赤色が1、グレーが0となる原子を表しています。時間とともに変化が見て取れます。以上です。