def floquet_modes_table(f_modes_0, f_energies, tlist, H, T, args=None): """ Pre-calculate the Floquet modes for a range of times spanning the floquet period. Can later be used as a table to look up the floquet modes for any time. Parameters ---------- f_modes_0 : list of :class:`qutip.Qobj` (kets) Floquet modes at :math:`t` f_energies : list Floquet energies. tlist : array The list of times at which to evaluate the floquet modes. H : :class:`qutip.Qobj` system Hamiltonian, time-dependent with period `T` T : float The period of the time-dependence of the hamiltonian. args : dictionary dictionary with variables required to evaluate H Returns ------- output : nested list A nested list of Floquet modes as kets for each time in `tlist` """ # truncate tlist to the driving period tlist_period = tlist[np.where(tlist <= T)] f_modes_table_t = [[] for t in tlist_period] opt = Odeoptions() opt.rhs_reuse = True for n, f_mode in enumerate(f_modes_0): output = mesolve(H, f_mode, tlist_period, [], [], args, opt) for t_idx, f_state_t in enumerate(output.states): f_modes_table_t[t_idx].append( f_state_t * exp(1j * f_energies[n] * tlist_period[t_idx])) return f_modes_table_t
def floquet_modes_table(f_modes_0, f_energies, tlist, H, T, args=None): """ Pre-calculate the Floquet modes for a range of times spanning the floquet period. Can later be used as a table to look up the floquet modes for any time. Parameters ---------- f_modes_0 : list of :class:`qutip.Qobj` (kets) Floquet modes at :math:`t` f_energies : list Floquet energies. tlist : array The list of times at which to evaluate the floquet modes. H : :class:`qutip.Qobj` system Hamiltonian, time-dependent with period `T` T : float The period of the time-dependence of the hamiltonian. args : dictionary dictionary with variables required to evaluate H Returns ------- output : nested list A nested list of Floquet modes as kets for each time in `tlist` """ # truncate tlist to the driving period tlist_period = tlist[np.where(tlist <= T)] f_modes_table_t = [[] for t in tlist_period] opt = Odeoptions() opt.rhs_reuse = True for n, f_mode in enumerate(f_modes_0): output = mesolve(H, f_mode, tlist_period, [], [], args, opt) for t_idx, f_state_t in enumerate(output.states): f_modes_table_t[t_idx].append(f_state_t * exp(1j * f_energies[n]*tlist_period[t_idx])) return f_modes_table_t
def floquet_modes_table(f_modes_0, f_energies, tlist, H, T, args=None): """ Pre-calculate the Floquet modes for a range of times spanning the floquet period. Can later be used as a table to look up the floquet modes for any time. """ # truncate tlist to the driving period tlist_period = tlist[where(tlist <= T)] f_modes_table_t = [[] for t in tlist_period] opt = Odeoptions() opt.rhs_reuse = True for n, f_mode in enumerate(f_modes_0): output = mesolve(H, f_mode, tlist_period, [], [], args, opt) for t_idx, f_state_t in enumerate(output.states): f_modes_table_t[t_idx].append(f_state_t * exp(1j * f_energies[n]*tlist_period[t_idx])) return f_modes_table_t
def floquet_modes_table(f_modes_0, f_energies, tlist, H, T, args=None): """ Pre-calculate the Floquet modes for a range of times spanning the floquet period. Can later be used as a table to look up the floquet modes for any time. """ # truncate tlist to the driving period tlist_period = tlist[where(tlist <= T)] f_modes_table_t = [[] for t in tlist_period] opt = Odeoptions() opt.rhs_reuse = True for n, f_mode in enumerate(f_modes_0): output = mesolve(H, f_mode, tlist_period, [], [], args, opt) for t_idx, f_state_t in enumerate(output.states): f_modes_table_t[t_idx].append( f_state_t * exp(1j * f_energies[n] * tlist_period[t_idx])) return f_modes_table_t
def propagator(H, t, c_op_list, H_args=None, opt=None): """ Calculate the propagator U(t) for the density matrix or wave function such that :math:`\psi(t) = U(t)\psi(0)` or :math:`\\rho_{\mathrm vec}(t) = U(t) \\rho_{\mathrm vec}(0)` where :math:`\\rho_{\mathrm vec}` is the vector representation of the density matrix. Parameters ---------- H : qobj Hamiltonian t : float Time. c_op_list : list List of qobj collapse operators. Other Parameters ---------------- H_args : list/array/dictionary Parameters to callback functions for time-dependent Hamiltonians. Returns ------- a : qobj Instance representing the propagator :math:`U(t)`. """ if opt == None: opt = Odeoptions() opt.rhs_reuse = True if len(c_op_list) == 0: # calculate propagator for the wave function if isinstance(H, FunctionType): H0 = H(0.0, H_args) N = H0.shape[0] elif isinstance(H, list): if isinstance(H[0], list): H0 = H[0][0] N = H0.shape[0] else: H0 = H[0] N = H0.shape[0] else: N = H.shape[0] u = zeros([N, N], dtype=complex) for n in range(0, N): psi0 = basis(N, n) output = mesolve(H, psi0, [0, t], [], [], H_args, opt) u[:,n] = output.states[1].full().T # todo: evolving a batch of wave functions: #psi_0_list = [basis(N, n) for n in range(N)] #psi_t_list = mesolve(H, psi_0_list, [0, t], [], [], H_args, opt) #for n in range(0, N): # u[:,n] = psi_t_list[n][1].full().T else: # calculate the propagator for the vector representation of the # density matrix if isinstance(H, FunctionType): H0 = H(0.0, H_args) N = H0.shape[0] elif isinstance(H, list): if isinstance(H[0], list): H0 = H[0][0] N = H0.shape[0] else: H0 = H[0] N = H0.shape[0] else: N = H.shape[0] u = zeros([N*N, N*N], dtype=complex) for n in range(0, N*N): psi0 = basis(N*N, n) rho0 = Qobj(vec2mat(psi0.full())) output = mesolve(H, rho0, [0, t], c_op_list, [], H_args, opt) u[:,n] = mat2vec(output.states[1].full()).T return Qobj(u)
def propagator(H, t, c_op_list, H_args=None, opt=None): """ Calculate the propagator U(t) for the density matrix or wave function such that :math:`\psi(t) = U(t)\psi(0)` or :math:`\\rho_{\mathrm vec}(t) = U(t) \\rho_{\mathrm vec}(0)` where :math:`\\rho_{\mathrm vec}` is the vector representation of the density matrix. Parameters ---------- H : qobj or list Hamiltonian as a Qobj instance of a nested list of Qobjs and coefficients in the list-string or list-function format for time-dependent Hamiltonians (see description in :func:`qutip.mesolve`). t : float or array-like Time or list of times for which to evaluate the propagator. c_op_list : list List of qobj collapse operators. H_args : list/array/dictionary Parameters to callback functions for time-dependent Hamiltonians. Returns ------- a : qobj Instance representing the propagator :math:`U(t)`. """ if opt == None: opt = Odeoptions() opt.rhs_reuse = True tlist = [0, t] if isinstance(t,(int,float,np.int64,np.float64)) else t if len(c_op_list) == 0: # calculate propagator for the wave function if isinstance(H, types.FunctionType): H0 = H(0.0, H_args) N = H0.shape[0] elif isinstance(H, list): if isinstance(H[0], list): H0 = H[0][0] N = H0.shape[0] else: H0 = H[0] N = H0.shape[0] else: N = H.shape[0] u = np.zeros([N, N, len(tlist)], dtype=complex) for n in range(0, N): psi0 = basis(N, n) output = mesolve(H, psi0, tlist, [], [], H_args, opt) for k, t in enumerate(tlist): u[:,n,k] = output.states[k].full().T # todo: evolving a batch of wave functions: #psi_0_list = [basis(N, n) for n in range(N)] #psi_t_list = mesolve(H, psi_0_list, [0, t], [], [], H_args, opt) #for n in range(0, N): # u[:,n] = psi_t_list[n][1].full().T else: # calculate the propagator for the vector representation of the # density matrix if isinstance(H, types.FunctionType): H0 = H(0.0, H_args) N = H0.shape[0] elif isinstance(H, list): if isinstance(H[0], list): H0 = H[0][0] N = H0.shape[0] else: H0 = H[0] N = H0.shape[0] else: N = H.shape[0] u = np.zeros([N*N, N*N, len(tlist)], dtype=complex) for n in range(0, N*N): psi0 = basis(N*N, n) rho0 = Qobj(vec2mat(psi0.full())) output = mesolve(H, rho0, tlist, c_op_list, [], H_args, opt) for k, t in enumerate(tlist): u[:,n,k] = mat2vec(output.states[k].full()).T if len(tlist) == 2: return Qobj(u[:,:,1]) else: return [Qobj(u[:,:,k]) for k in range(len(tlist))]
def propagator(H, t, c_op_list, H_args=None, opt=None): """ Calculate the propagator U(t) for the density matrix or wave function such that :math:`\psi(t) = U(t)\psi(0)` or :math:`\\rho_{\mathrm vec}(t) = U(t) \\rho_{\mathrm vec}(0)` where :math:`\\rho_{\mathrm vec}` is the vector representation of the density matrix. Parameters ---------- H : qobj Hamiltonian t : float Time. c_op_list : list List of qobj collapse operators. Other Parameters ---------------- H_args : list/array/dictionary Parameters to callback functions for time-dependent Hamiltonians. Returns ------- a : qobj Instance representing the propagator :math:`U(t)`. """ if opt == None: opt = Odeoptions() opt.rhs_reuse = True if len(c_op_list) == 0: # calculate propagator for the wave function if isinstance(H, FunctionType): H0 = H(0.0, H_args) N = H0.shape[0] elif isinstance(H, list): if isinstance(H[0], list): H0 = H[0][0] N = H0.shape[0] else: H0 = H[0] N = H0.shape[0] else: N = H.shape[0] u = zeros([N, N], dtype=complex) for n in range(0, N): psi0 = basis(N, n) output = mesolve(H, psi0, [0, t], [], [], H_args, opt) u[:, n] = output.states[1].full().T # todo: evolving a batch of wave functions: #psi_0_list = [basis(N, n) for n in range(N)] #psi_t_list = mesolve(H, psi_0_list, [0, t], [], [], H_args, opt) #for n in range(0, N): # u[:,n] = psi_t_list[n][1].full().T else: # calculate the propagator for the vector representation of the # density matrix if isinstance(H, FunctionType): H0 = H(0.0, H_args) N = H0.shape[0] elif isinstance(H, list): if isinstance(H[0], list): H0 = H[0][0] N = H0.shape[0] else: H0 = H[0] N = H0.shape[0] else: N = H.shape[0] u = zeros([N * N, N * N], dtype=complex) for n in range(0, N * N): psi0 = basis(N * N, n) rho0 = Qobj(vec2mat(psi0.full())) output = mesolve(H, rho0, [0, t], c_op_list, [], H_args, opt) u[:, n] = mat2vec(output.states[1].full()).T return Qobj(u)