Exemplo n.º 1
0
def build_sys(u_over_j, j_tunn, trap_freq, drive_freq, basis_states,
              floquet_radius, gamma):
    drive_y = drive_coefficients.y(gamma)
    drive_freq = drive_coefficients.crit_drive_freq(drive_y, trap_freq)
    m_list = np.arange(-floquet_radius, floquet_radius + 1)
    raw_int = fock_basis.onsite_interactions(basis_states)
    raw_hop = -j_tunn * fock_basis.nearest_neighbor_hopping(basis_states)
    raw_jsq_onsite = fock_basis.onsite_offset(
        fock_basis.jsq_offset(basis_states.shape[1]), basis_states)
    scale_idxs = np.abs(
        np.arange((2 * floquet_radius + 1))[np.newaxis, :] -
        np.arange((2 * floquet_radius + 1))[:, np.newaxis])
    small_xi_blocks = drive_coefficients.n_small_xis(2 * floquet_radius + 1,
                                                     drive_y)[scale_idxs]
    big_xi_blocks = drive_coefficients.n_big_xis(2 * floquet_radius + 1,
                                                 drive_y)[scale_idxs]
    jsq_prescale = tpf * (np.square(trap_freq * small_xi_blocks) -
                          np.square(drive_freq * big_xi_blocks))

    chi = drive_coefficients.all_chis(drive_y)
    chi_blocks = (np.diag(np.full(2 * floquet_radius + 1, chi[0])) +
                  np.diag(np.full(2 * floquet_radius, chi[1]), k=1) +
                  np.diag(np.full(2 * floquet_radius, chi[1]), k=-1) +
                  np.diag(np.full(2 * floquet_radius - 1, chi[2]), k=2) +
                  np.diag(np.full(2 * floquet_radius - 1, chi[2]), k=-2))
    floquet_interactions = 0.5 * u_over_j * j_tunn * np.kron(
        chi_blocks, raw_int)
    floquet_diag = np.kron(np.diag(m_list),
                           np.diag(np.full(basis_states.shape[0], drive_freq)))
    floquet_tunneling = np.kron(chi_blocks, raw_hop)
    floquet_offsets = np.kron(jsq_prescale, raw_jsq_onsite)
    return floquet_interactions + floquet_diag + floquet_tunneling + floquet_offsets
Exemplo n.º 2
0
def build_sys(u_over_j, drive_over_j, k_over_drive, basis_states, floquet_radius):
    m_list = np.arange(-floquet_radius, floquet_radius+1)
    raw_int = fock_basis.onsite_interactions(basis_states)
    raw_hop = -fock_basis.nearest_neighbor_hopping(basis_states)
    floquet_interactions = 0.5*u_over_j * np.kron(np.diag(np.ones(2*floquet_radius+1)), raw_int)
    floquet_diag = np.kron(np.diag(m_list), np.diag(np.full(basis_states.shape[0], drive_over_j)))
    tun_blocks = scaling_blocks(floquet_radius, k_over_drive, s_matrix(basis_states, raw_hop), raw_hop)
    return floquet_interactions + floquet_diag + tun_blocks
fock_basis.jsq_offset(5)

# In[11]:

# Try to reproduce arXiv:cond-mat/0601020

# In[12]:

n_scan = 65
n_sites = 5
j_sc = 20
u_sc = np.linspace(0.0, 10.0, n_scan, endpoint=True)
basis = fock_basis.unit_filling(n_sites).copy()
hopping_mi = -j_sc * fock_basis.nearest_neighbor_hopping(basis)
unscaled_interactions = fock_basis.onsite_interactions(basis)

print(basis.shape, basis.shape[0] * 9)

# In[13]:

get_ipython().run_cell_magic(
    'time', '',
    'mi_energies = np.empty((n_scan, basis.shape[0]))\nfor idx, this_u_sc in progbar(enumerate(u_sc), every=1, size=n_scan):\n    ham = hopping_mi + 0.5 * this_u_sc * j_sc * unscaled_interactions\n    mi_energies[idx] = np.linalg.eigvalsh(ham)'
)

# In[14]:

for idx, this_u_sc in enumerate(u_sc):
    plt.plot(np.full(basis.shape[0], this_u_sc),
             mi_energies[idx] / j_sc,