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()
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()
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())
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())