Exemple #1
0
    def get_propagation(self, ham, psi_init, steps, dz, norm=False):
        """
        Get the time evolution.

        :param ham: sparse.csr_matrix. Tight-Binding Hamilonian.
        :param psi_init: np.ndarray. Initial state.
        :param steps: Positive Integer. Number of steps.
        :param dz: Positive number. Step.
        :param norm: Boolean. Default value True. Normalize the norm to 1 at each step.
        """
        error_handling.empty_ham(ham)
        error_handling.ndarray(psi_init, "psi_init", self.lat.sites)
        error_handling.positive_int(steps, "steps")
        error_handling.positive_real(dz, "dz")
        error_handling.boolean(norm, "norm")
        self.steps = steps
        self.dz = dz
        self.prop = np.empty((self.lat.sites, self.steps), "c16")
        self.prop[:, 0] = psi_init
        diag = 1j * np.ones(self.lat.sites, "c16")
        A = (sparse.diags(diag, 0) - 0.5 * self.dz * ham).toarray()
        B = (sparse.diags(diag, 0) + 0.5 * self.dz * ham).toarray()
        mat = np.dot(LA.inv(A), B)
        for i in range(1, self.steps):
            self.prop[:, i] = np.dot(mat, self.prop[:, i - 1])
            if norm:
                self.prop[:, i] /= np.abs(self.prop[:, i]).sum()
Exemple #2
0
    def get_propagation(self, ham, psi_init, steps, dz, norm=False):
        '''
        Get the time evolution.

        :param ham: sparse.csr_matrix. Tight-Binding Hamilonian.
        :param psi_init: np.ndarray. Initial state.
        :param steps: Positive Integer. Number of steps.
        :param dz: Positive number. Step.
        :param norm: Boolean. Default value True. Normalize the norm to 1 at each step.
        '''
        error_handling.empty_ham(ham)
        error_handling.ndarray(psi_init, 'psi_init', self.lat.sites)
        error_handling.positive_int(steps, 'steps')
        error_handling.positive_real(dz, 'dz')
        error_handling.boolean(norm, 'norm')
        self.steps = steps
        self.dz = dz
        self.prop = np.empty((self.lat.sites, self.steps), 'c16')
        self.prop[:, 0] = psi_init
        diag = 1j*np.ones(self.lat.sites, 'c16')
        A = (sparse.diags(diag, 0) - 0.5 * self.dz * ham).toarray()
        B = (sparse.diags(diag, 0) + 0.5 * self.dz * ham).toarray()
        mat = (np.dot(LA.inv(A), B))
        for i in range(1, self.steps):
            self.prop[:, i] = np.dot(mat, self.prop[:, i-1])
            if norm:
                self.prop[:, i] /= np.abs(self.prop[:, i]).sum()
Exemple #3
0
    def get_eig(self, eigenvec=False, left=False):
        '''
        Get the eigenergies, eigenvectors and polarisation.

        :param eigenvec: Boolean. Default value False. 
            If True, get the eigenvectors.
        :param left: Boolean. Default value False. 
            If True, get the left eigenvectors too. 
            Relevant for non-Hermitian matrices.
        '''
        error_handling.empty_ham(self.ham)
        error_handling.boolean(eigenvec, 'eigenvec')
        error_handling.boolean(left, 'left')
        if eigenvec:
            if (self.ham.H != self.ham).nnz:
                if not left:
                    self.en, self.rn = LA.eig(self.ham.toarray())
                else:
                    self.en, self.rn, self.ln = LA.eig(self.ham.toarray(),
                                                       left=left)
                ind = np.argsort(self.en.real)
                self.en = self.en[ind]
                self.rn = self.rn[:, ind]
                if self.ln.size:
                    self.ln = self.ln[:, ind]
            else:
                self.en, self.rn = LA.eigh(self.ham.toarray())
            self.intensity = np.abs(self.rn)**2
            self.pola = np.zeros((self.lat.sites, len(self.lat.tags)))
            for i, tag in enumerate(self.lat.tags):
                self.pola[:, i] = np.sum(
                    self.intensity[self.lat.coor['tag'] == tag, :], axis=0)
        else:
            if (self.ham.H != self.ham).nnz:
                self.en = LA.eigvals(self.ham.toarray())
                ind = np.argsort(self.en.real)
                self.en = self.en[ind]
            else:
                self.en = LA.eigvalsh(self.ham.toarray())
Exemple #4
0
    def get_eig(self, eigenvec=False, left=False):
        '''
        Get the eigenergies, eigenvectors and polarisation.

        :param eigenvec: Boolean. Default value False. 
            If True, get the eigenvectors.
        :param left: Boolean. Default value False. 
            If True, get the left eigenvectors too. 
            Relevant for non-Hermitian matrices.
        '''
        error_handling.empty_ham(self.ham)
        error_handling.boolean(eigenvec, 'eigenvec')
        error_handling.boolean(left, 'left')
        if eigenvec:
            if (self.ham.H != self.ham).nnz:
                if not left:
                    self.en, self.rn = LA.eig(self.ham.toarray())
                else:
                    self.en, self.rn, self.ln = LA.eig(self.ham.toarray(), left=left)
                ind = np.argsort(self.en.real)
                self.en = self.en[ind]
                self.rn = self.rn[:, ind]
                if self.ln.size:
                    self.ln = self.ln[:, ind]
            else:
                self.en, self.rn = LA.eigh(self.ham.toarray())
            self.intensity = np.abs(self.rn) ** 2
            self.pola = np.zeros((self.lat.sites, len(self.lat.tags)))
            for i, tag in enumerate(self.lat.tags):
                self.pola[:, i] = np.sum(self.intensity[self.lat.coor['tag'] == tag, :], axis=0)
        else:
            if (self.ham.H != self.ham).nnz:
                self.en = LA.eigvals(self.ham.toarray())
                ind = np.argsort(self.en.real)
                self.en = self.en[ind]
            else:
                self.en = LA.eigvalsh(self.ham.toarray())