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
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)