Exemplo n.º 1
0
    def propagate_full(self, rho_hierarchy, t_init, t_final, dt):
        integrator = Integrator('ODE', dt, deriv_fn=self.heom_deriv)
        integrator.set_initial_value(rho_hierarchy, t_init)

        rhos_site = list()
        times = np.arange(t_init, t_final, dt)
        for time in times:
            rhos_site.append(integrator.y.copy())
            integrator.integrate()
            # TODO(TCB): If filtering, check if we can remove any ADMs

        return times, np.array(rhos_site)
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    def propagate_full(self, rho_bath, t_init, t_final, dt):
        times = np.arange(t_init, t_final, dt)

        def deriv_fn(t, y):
            return self.deriv(t, y)

        rho_0, q, p = self.unpack(rho_bath)
        rho_int_0 = self.ham.to_interaction(self.ham.site2eig(rho_0), t_init)
        integrator = Integrator('ODE', dt, deriv_fn=deriv_fn)
        integrator.set_initial_value(self.pack(rho_int_0, q, p), t_init)

        rho_bath_traj = list()
        for time in times:
            rho_int_t, qt, pt = self.unpack(np.array(integrator.y))
            rho_t = self.ham.eig2site(
                self.ham.from_interaction(rho_int_t, time))
            rho_bath_traj.append(self.pack(rho_t, qt, pt))
            integrator.integrate()

        return times, np.array(rho_bath_traj)