Пример #1
0
def get_optima(length,
               V_0,
               V_T,
               phi,
               method,
               soc_field_variance={},
               optima_TAT={}):
    N = length**lattice_dim

    if phi == None: phi = phi_opt.at[V_0, str(V_T)]

    try:
        soc_field_variance[V_0, phi]
    except:
        soc_field_variance[V_0, phi] = h_std(V_0, phi)**2
    chi = soc_field_variance[V_0, phi] / ((N - 1) * U_int.at[V_0, str(V_T)])

    if method[4:] == "dec":
        dec_rates = (0, dec_rate / chi, dec_rate / chi)
    else:
        dec_rates = (0, 0, 0)

    # return optimum squeezing value and time for OAT or TAT appropriately
    if method[:3] == "OAT":

        def sqz_OAT_val(chi_t):
            return squeezing_OAT(N, chi_t, dec_rates)

        optimum_OAT = optimize.minimize_scalar(sqz_OAT_val,
                                               method="bounded",
                                               bounds=(0, max_time(N)))
        sqz_opt, t_opt = optimum_OAT.fun, optimum_OAT.x

    if method[:3] == "TAT":
        if optima_TAT.get(N) is None:

            S_op_vec, SS_op_mat = spin_op_vec_mat_dicke(N)
            S_op_vec = [X[::2, ::2] for X in S_op_vec]
            SS_op_mat = [[X[::2, ::2] for X in XS] for XS in SS_op_mat]

            H_TAT = 1 / 3 * (SS_op_mat[2][2] - SS_op_mat[1][1]).real

            state_nZ = np.zeros(N // 2 + 1)
            state_nZ[0] = 1

            if N < N_crossover:
                get_optima = get_optima_diagonalization
            else:
                get_optima = get_optima_simulation

            optima_TAT[N] = get_optima(N, H_TAT, S_op_vec, SS_op_mat, state_nZ,
                                       max_time(N))

        sqz_opt, t_opt = optima_TAT[N]

    return sqz_opt, t_opt / chi
Пример #2
0
plt.rcParams.update(params)

figsize = (1, 1)
fig_dir = "../figures/"
fig_dpi = 600
grid_size = 1000

N = 40
max_tau = 2
time_steps = 1000
ivp_tolerance = 1e-5

max_time = max_tau * N**(-2 / 3)
times = np.linspace(0, max_time, time_steps)

S_op_vec, SS_op_mat = spin_op_vec_mat_dicke(N)
S_z = S_op_vec[0]
H_OAT = S_z @ S_z


class Arrow3D(FancyArrowPatch):
    def __init__(self, xs, ys, zs, *args, **kwargs):
        FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs)
        self._verts3d = xs, ys, zs

    def draw(self, renderer):
        xs3d, ys3d, zs3d = self._verts3d
        xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
        self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))
        FancyArrowPatch.draw(self, renderer)