def unpack(self, yt): rho = utils.from_liouville(yt[:self.ham.nsite**2], self.ham.nsite) qp = yt[self.ham.nsite**2:].real q, p = qp[:self.ham.nbath*self.nmode], qp[self.ham.nbath*self.nmode:] q = q.reshape(self.ham.nbath,self.nmode) p = p.reshape(self.ham.nbath,self.nmode) return rho, q, p
def unpack(self, yt): rho = utils.from_liouville(yt[:self.ham.nsite**2], self.ham.nsite) qp = yt[self.ham.nsite**2:].real q, p = qp[:self.ham.nbath * self.nmode], qp[self.ham.nbath * self.nmode:] q = q.reshape(self.ham.nbath, self.nmode) p = p.reshape(self.ham.nbath, self.nmode) return rho, q, p
def propagate_full(self, rho_0, t_init, t_final, dt, markov_tol=1e-3, markov_time=np.inf, is_verbose=False): self.markov_tol = markov_tol self.markov_time = markov_time times = np.arange(t_init, t_final, dt) rho_eig = self.ham.site2eig(rho_0) integrator = Integrator(self.diffeq_type, dt, Omega=self.Omega, R=self.R, K=self.K) if self.method == 'TCL2': if not hasattr(self, 'redfield_tensor_n'): self.precompute_redfield_tensor(t_init, t_final, dt) elif len(self.redfield_tensor_n) < int((t_final - t_init) / dt): self.precompute_redfield_tensor(t_init, t_final, dt) if self.method == 'TC2': self.precompute_redfield_tensor(t_init, t_final, dt) #self.precompute_redfield_tensor_finegrid(t_init, t_final, dt, # integrator) integrator.set_initial_value(utils.to_liouville(rho_eig), t_init) rhos_site = [] for time in times: # Retrieve data from integrator rho_eig = utils.from_liouville(integrator.y) # Collect results rho_site = self.ham.eig2site(rho_eig) rhos_site.append(rho_site) # Propagate one timestep integrator.integrate() if is_verbose: print("\n--- Finished performing RDM dynamics") return times, rhos_site
def propagate(self, rho_0, t_init, t_final, dt, markov_tol = 1e-3, markov_time = np.inf, is_verbose=True): """Propagate the RDM according to Redfield-like dynamics. Parameters ---------- rho_0 : np.array The initial RDM. t_init : float The initial time. t_final : float The final time. dt : float The timestep. markov_tol : float The relative tolerance at which to decide that the memory tensor has stopped changing (and henceforth Markovian). markov_time : float The hard-coded time to stop re-calculating the memory tensor. is_verbose : bool Flag to indicate verbose printing. Returns ------- times : list of floats The times at which the RDM has been calculated. rhos_site : list of np.arrays The RDM at each time in the site basis. rhos_eig : list of np.arrays The RDM at each time in the system eigen-basis. """ self.markov_tol = markov_tol self.markov_time = markov_time times = np.arange(t_init, t_final, dt) rho_site = rho_0.copy() rho_eig = self.ham.site2eig(rho_site) integrator = Integrator(self.diffeq_type, dt, Omega=self.Omega, R=self.R, K=self.K) if self.method in ['TCL2', 'TC2']: self.precompute_redfield_tensor(t_init, t_final, dt) #self.precompute_redfield_tensor_finegrid(t_init, t_final, dt, # integrator) integrator.set_initial_value(utils.to_liouville(rho_eig), t_init) rhos_site = [] rhos_eig = [] for time in times: # Retrieve data from integrator rho_eig = utils.from_liouville(integrator.y) # Collect results rho_site = self.ham.eig2site(rho_eig) rhos_site.append(rho_site) rhos_eig.append(rho_eig) # Propagate one timestep integrator.integrate() if is_verbose: print "\n--- Finished performing RDM dynamics" return times, rhos_site, rhos_eig