コード例 #1
0
ファイル: ehrenfest.py プロジェクト: tberkel/pyrho
 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
コード例 #2
0
ファイル: ehrenfest.py プロジェクト: xuanleng/pyrho
 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
コード例 #3
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
コード例 #4
0
ファイル: redfield.py プロジェクト: tberkel/pyrho
    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