def berry(self): # Calculate Berry phase around Dirac cones K = -(4 * np.pi) / (3 * np.sqrt(3)) if self.Haldane.value() != 0: Lat = lattice('Sheet', 'Haldane') else: Lat = lattice('Sheet', 'Monolayer') H = Hamiltonian(Lat, self.Hoppingt2.value(), 0, 0, self.Haldane.value()) if self.Magneticfield2.value() != 0: H.add_magnetic_field(self.Magneticfield2.value(), 'Perpendicular') if self.OnsiteV2.value() != 0: H.add_lattice_imbalance(self.OnsiteV2.value()) i = topology(H) k1 = i.berry_curvature(np.array([-(4 * np.pi) / (3 * np.sqrt(3)), 0])) k2 = i.berry_curvature(np.array([(4 * np.pi) / (6 * np.sqrt(3)), (4 * np.pi) / (3 * 2)])) k3 = i.berry_curvature(np.array([(4 * np.pi) / (6 * np.sqrt(3)), -(4 * np.pi) / (3 * 2)])) k4 = i.berry_curvature(np.array([(4 * np.pi) / (3 * np.sqrt(3)), 0])) k5 = i.berry_curvature(np.array([-(4 * np.pi) / (6 * np.sqrt(3)), (4 * np.pi) / (3 * 2)])) k6 = i.berry_curvature(np.array([-(4 * np.pi) / (6 * np.sqrt(3)), -(4 * np.pi) / (3 * 2)])) G = i.berry_curvature(np.array([0, 0])) msgBox = QtWidgets.QMessageBox() s = "K-point: {:.4f} \n K'-point: {:.4f} \n Gamma-point: {:.4f}".format(k1, k4, G) msgBox.setText("Berry phase") msgBox.setInformativeText(s) msgBox.exec_()
def locchernKprime(self): # Calculate local chern number at K' valley from chosen lattice and Hamiltonian K = -(4 * np.pi) / (3 * np.sqrt(3)) if self.Haldane.value() != 0: Lat = lattice('Sheet', 'Haldane') else: Lat = lattice('Sheet', 'Monolayer') H = Hamiltonian(Lat, self.Hoppingt2.value(), 0, 0, self.Haldane.value()) if self.Magneticfield2.value() != 0: H.add_magnetic_field(self.Magneticfield2.value(), 'Perpendicular') if self.OnsiteV2.value() != 0: H.add_lattice_imbalance(self.OnsiteV2.value()) i = topology(H) ch = i.chern_valley("K'", 0.01) # calculate chern number s = "{:.4f}".format(ch) msgBox = QtWidgets.QMessageBox() msgBox.setText("Local Chern number:") msgBox.setInformativeText(s) msgBox.exec_()
def dos(self): # Calculate density of states from chosen lattice and Hamiltonian K = -(4 * np.pi) / (3 * np.sqrt(3)) if self.Haldane.value() != 0 or self.AntiHaldane.value() != 0: Lat = lattice('Sheet', 'Haldane') else: Lat = lattice('Sheet', 'Monolayer') if self.AntiHaldane.value() != 0: H = Hamiltonian(Lat, self.Hoppingt2.value(), 0, 0, self.AntiHaldane.value()) H.add_antiHaldane() else: H = Hamiltonian(Lat, self.Hoppingt2.value(), 0, 0, self.Haldane.value()) if self.Magneticfield2.value() != 0: H.add_magnetic_field(self.Magneticfield2.value(), 'Perpendicular') if self.OnsiteV2.value() != 0: H.add_lattice_imbalance(self.OnsiteV2.value()) H.build_Hamiltonian() dos, ev = H.dos(self.numberofKop.value(), emin = -self.energy.value(), emax = self.energy.value(), kxmin=-np.pi, kxmax=np.pi, kymin=-np.pi, kymax=np.pi) plt.plot(dos[1][:-1], dos[0]) plt.ylabel('Density of states') plt.xlabel('Energy') plt.show()
def plot_summary(self): # Generate summary plot from chosen lattice and Hamiltonian K = -(4 * np.pi) / (3 * np.sqrt(3)) if self.Haldane.value() != 0 or self.AntiHaldane.value() != 0: Lat = lattice('Sheet', 'Haldane') # Get correct lattice else: Lat = lattice('Sheet', 'Monolayer') if self.AntiHaldane.value() != 0: H = Hamiltonian(Lat, self.Hoppingt2.value(), 0, 0, self.AntiHaldane.value()) H.add_antiHaldane() # If selected, add complex hopping else: H = Hamiltonian(Lat, self.Hoppingt2.value(), 0, 0, self.Haldane.value()) # If selected, add complex hopping if self.Magneticfield2.value() != 0: # Add magnetic field H.add_magnetic_field(self.Magneticfield2.value(), 'Perpendicular') if self.OnsiteV2.value() != 0: # Add sublattice imbalance H.add_lattice_imbalance(self.OnsiteV2.value()) # Generate summary plot P = Plot(H) P.summary(self.Nk.value(), K, 0, self.xIndex.value(), self.yIndex.value(), self.dxIndex.value(), self.dyIndex.value()) plt.show()
def locchernKprime(self): # Calculate local chern number in K' valley K = -(4 * np.pi) / (3 * np.sqrt(3)) Lat = lattice('Sheet', self.SelectStack.currentText()) H = Hamiltonian(Lat, self.Hoppingt2.value(), self.Hoppingtprime2.value()) if self.Magneticfield2.value() != 0: H.add_magnetic_field(self.Magneticfield2.value(), self.SelectBBil.currentText(), self.BAngle.value()) if self.OnsiteV_2.value() != 0: H.add_sublattice_imbalance(self.OnsiteV_2.value()) i = topology(H) ch = i.chern_valley("K'", 0.01) s = "{:.4f}".format(ch) #print("Local Chern number:", i.chern_valley("K'", 0.01)) msgBox = QtWidgets.QMessageBox() msgBox.setText("Local Chern number:") msgBox.setInformativeText(s) msgBox.exec_()
def locchernKprime(self): # Calculate local chern number at K' valley from chosen lattice and Hamiltonian K = -(4 * np.pi) / (3 * np.sqrt(3)) Lat = lattice('Sheet', self.SelectStack.currentText()) # Create lattice H = Hamiltonian(Lat, self.Hoppingt2.value(), self.Hoppingtprime2.value()) # Create Hamiltonian if self.Magneticfield2.value() != 0: # Add magnetic field H.add_magnetic_field(self.Magneticfield2.value(), self.SelectBBil.currentText(), self.BAngle.value()) if self.OnsiteV.value() != 0: # Add layer potentials H.add_lattice_imbalance(self.OnsiteV.value()) if self.OnsiteV_2.value() != 0: # Add sublattice potentials H.add_sublattice_imbalance(self.OnsiteV_2.value()) i = topology(H) # Create invariants object ch = i.chern_valley("K'", 0.01) # Calculate chern number s = "{:.4f}".format(ch) msgBox = QtWidgets.QMessageBox() msgBox.setText("Local Chern number:") msgBox.setInformativeText(s) msgBox.exec_()
def ldos(self): # Calculate local density of states from chosen lattice and Hamiltonian Lat = lattice( 'Ribbon', self.SelectEdge.currentText() + ' ' + self.SelectStack.currentText(), self.NUnit.value()) H = Hamiltonian(Lat, self.Hoppingt.value(), self.Hoppingtprime.value()) if self.Magneticfield.value() != 0: H.add_magnetic_field(self.Magneticfield.value(), self.SelectBBil.currentText()) if self.OnsiteV.value() != 0: H.add_lattice_imbalance(self.OnsiteV.value()) H.build_Hamiltonian() # calculate ldos ldos = H.expec_operators(es=np.linspace(-self.energy.value(), self.energy.value(), 100), delta=self.delta.value(), nk=self.numberofKop.value(), op=None) X, E = np.meshgrid( np.arange(0, len(Lat.orb[:, 1]), 1), np.linspace(-self.energy.value(), self.energy.value(), 100)) plt.contourf(X, E, ldos) cbar = plt.colorbar() cbar.set_label('Local density of states') plt.ylabel('Energy') plt.xlabel('Lattice sites') plt.show()
def dos(self): # Calculate density of states from chosen lattice and Hamiltonian Lat = lattice('Ribbon', self.SelectEdge.currentText() + ' ' + self.SelectStack.currentText(), self.NUnit.value()) # Generate lattice H = Hamiltonian(Lat, self.Hoppingt.value(), self.Hoppingtprime.value()) # Generate Hamiltonian if self.Magneticfield.value() != 0: # Add magnetic field H.add_magnetic_field(self.Magneticfield.value(), self.SelectBBil.currentText()) if self.OnsiteV.value() != 0: # Add layer polarization H.add_lattice_imbalance(self.OnsiteV.value()) H.build_Hamiltonian() # calculate dos dos, ev = H.dos(self.numberofKop.value(), emin=-self.energy.value(), emax=self.energy.value(), kxmin=-np.pi, kxmax=np.pi, kymin=-np.pi, kymax=np.pi) plt.plot(dos[1][:-1], dos[0]) plt.ylabel('Density of states') plt.xlabel('Energy') plt.show()
def berry(self): # calculate Berry phases K = -(4 * np.pi) / (3 * np.sqrt(3)) Lat = lattice('Sheet', self.SelectStack.currentText()) H = Hamiltonian(Lat, self.Hoppingt2.value(), self.Hoppingtprime2.value()) if self.Magneticfield2.value() != 0: H.add_magnetic_field(self.Magneticfield2.value(), self.SelectBBil.currentText(), self.BAngle.value()) if self.OnsiteV_2.value() != 0: H.add_sublattice_imbalance(self.OnsiteV_2.value()) i = topology(H) k1 = i.berry_curvature(np.array([-(4 * np.pi) / (3 * np.sqrt(3)), 0])) k2 = i.berry_curvature(np.array([(4 * np.pi) / (6 * np.sqrt(3)), (4 * np.pi) / (3 * 2)])) k3 = i.berry_curvature(np.array([(4 * np.pi) / (6 * np.sqrt(3)), -(4 * np.pi) / (3 * 2)])) k4 = i.berry_curvature(np.array([(4 * np.pi) / (3 * np.sqrt(3)), 0])) k5 = i.berry_curvature(np.array([-(4 * np.pi) / (6 * np.sqrt(3)), (4 * np.pi) / (3 * 2)])) k6 = i.berry_curvature(np.array([-(4 * np.pi) / (6 * np.sqrt(3)), -(4 * np.pi) / (3 * 2)])) G = i.berry_curvature(np.array([0, 0])) msgBox = QtWidgets.QMessageBox() s = "K-point: {:.4f} \n K'-point: {:.4f} \n Gamma-point: {:.4f}".format(k1, k4, G) msgBox.setText("Berry phase") msgBox.setInformativeText(s) msgBox.exec_()
def upper_edge(self): # Calculate bandstructure and highlight edge states Lat = lattice('Ribbon', self.SelectEdge.currentText()+' '+self.SelectStack.currentText(), self.NUnit.value()) # Create lattice H = Hamiltonian(Lat, self.Hoppingt.value(), self.Hoppingtprime.value())# Create Hamiltonian if self.Magneticfield.value() != 0:# Add magnetic field H.add_magnetic_field(self.Magneticfield.value(), self.SelectBBil.currentText()) if self.OnsiteV.value() != 0:# Add lattice imbalance H.add_lattice_imbalance(self.OnsiteV.value()) P = Plot(H) P.upper_edge()
def calc_bands(self): # Calculate bandstructure of finite system Lat = lattice('Ribbon', self.SelectEdge.currentText()+' '+self.SelectStack.currentText(), self.NUnit.value()) # Create lattice H = Hamiltonian(Lat, self.Hoppingt.value(), self.Hoppingtprime.value())# Create Hamiltonian if self.Magneticfield.value() != 0:# Add magnetic field H.add_magnetic_field(self.Magneticfield.value(), self.SelectBBil.currentText()) if self.OnsiteV.value() != 0:# Add lattice imbalance H.add_lattice_imbalance(self.OnsiteV.value()) P = Plot(H) P.show_rib()
def plot_summary(self): # Generate summary plot from chosen lattice and Hamiltonian K = -(4 * np.pi) / (3 * np.sqrt(3)) Lat = lattice('Sheet', self.SelectStack.currentText()) # Create lattice H = Hamiltonian(Lat, self.Hoppingt2.value(), self.Hoppingtprime2.value()) # Create Hamiltonian if self.Magneticfield2.value() != 0: # Add magnetic field H.add_magnetic_field(self.Magneticfield2.value(), self.SelectBBil.currentText(), self.BAngle.value()) if self.OnsiteV_2.value() != 0: # Add layer polarization H.add_sublattice_imbalance(self.OnsiteV_2.value()) P = Plot(H) P.summary(self.Nk.value(), K, 0, self.xIndex.value(), self.yIndex.value(), self.dxIndex.value(), self.dyIndex.value())
def calc_edge(self): # Calculate bandstructure from chosen lattice and Hamiltonian with colormap highlighting edge states Lat = lattice( 'Ribbon', self.SelectEdge.currentText() + ' ' + self.SelectStack.currentText(), self.NUnit.value()) H = Hamiltonian(Lat, self.Hoppingt.value(), self.Hoppingtprime.value()) if self.Magneticfield.value() != 0: H.add_magnetic_field(self.Magneticfield.value(), self.SelectBBil.currentText()) if self.OnsiteV.value() != 0: H.add_lattice_imbalance(self.OnsiteV.value()) P = Plot(H) P.calc_edge()
def berry(self): # Calculate berry phase around valleys from chosen lattice and Hamiltonian K = -(4 * np.pi) / (3 * np.sqrt(3)) Lat = lattice('Sheet', self.SelectStack.currentText()) # Create lattice H = Hamiltonian(Lat, self.Hoppingt2.value(), self.Hoppingtprime2.value()) # Create Hamiltonian if self.Magneticfield2.value() != 0: # Add magnetic field H.add_magnetic_field(self.Magneticfield2.value(), self.SelectBBil.currentText(), self.BAngle.value()) if self.OnsiteV.value() != 0: # Add layer potentials H.add_lattice_imbalance(self.OnsiteV.value()) if self.OnsiteV_2.value() != 0: # Add sublattice potentials H.add_sublattice_imbalance(self.OnsiteV_2.value()) i = topology(H) # Create invariants object
def calc_edge(self): # Calculate bandstructure from chosen lattice and Hamiltonian and highlight edge states Lat = lattice('Ribbon', 'Twisted Bilayer', self.NUnit.value(), self.TwistAngle.value()) H = Hamiltonian(Lat, self.Hoppingt.value()) if self.Magneticfield.value() != 0: H.add_magnetic_field(self.Magneticfield.value(), self.SelectBBil.currentText()) if self.OnsiteV.value() != 0: H.add_lattice_imbalance(self.OnsiteV.value()) if self.OnsiteV_2.value() != 0: H.add_sublattice_imbalance(self.OnsiteV_2.value()) P = Plot(H) P.calc_edge()
def plot_summary(self): # Generate summary plot of chosen lattice and Hamiltonian K = -(4 * np.pi) / (3 * np.sqrt(3)) Lat = lattice('Sheet', 'Twisted Bilayer', 1, self.TwistAngle.value()) H = Hamiltonian(Lat, self.Hoppingt2.value()) if self.Magneticfield2.value() != 0: H.add_magnetic_field(self.Magneticfield2.value(), self.SelectBBil.currentText(), self.BAngle.value()) if self.OnsiteV.value() != 0: H.add_lattice_imbalance(self.OnsiteV.value()) if self.OnsiteV_2.value() != 0: H.add_sublattice_imbalance(self.OnsiteV_2.value()) P = Plot(H) P.summary(self.Nk.value(), K, 0, 17, 75, 75, 75)
def dos(self): # Calculate density of states from chosen lattice and Hamiltonian K = -(4 * np.pi) / (3 * np.sqrt(3)) Lat = lattice('Sheet', self.SelectStack.currentText()) # Create lattice H = Hamiltonian(Lat, self.Hoppingt2.value(), self.Hoppingtprime2.value()) # Create Hamiltonian if self.Magneticfield2.value() != 0: # Add magnetic field H.add_magnetic_field(self.Magneticfield2.value(), self.SelectBBil.currentText(), self.BAngle.value()) if self.OnsiteV.value() != 0: # Add layer potentials H.add_lattice_imbalance(self.OnsiteV.value()) if self.OnsiteV_2.value() != 0: # Add sublattice potentials H.add_sublattice_imbalance(self.OnsiteV_2.value()) H.build_Hamiltonian() dos, ev = H.dos(self.numberofKop.value(), emin=-self.energy.value(), emax=self.energy.value(), kxmin=-np.pi, kxmax=np.pi, kymin=-np.pi, kymax=np.pi) plt.plot(dos[1][:-1], dos[0]) plt.ylabel('Density of states') plt.xlabel('Energy') plt.show()
ax.plot(H.axis2[:, 0], E[x, :, 5]) ax.set_xlabel("$k_ya$") ax.set_title('Plot along ky', fontsize=10) ax.set_ylabel("$\epsilon_{k}$") # List of parameters alpha = 0 theta = 0 t7 = 1 # Get lattice Lat = lattice('Sheet', 'Trilayer ABC') # Get Hamiltonian H = Hamiltonian(Lat, 3, 0.3) H.build_Hamiltonian() def run(): def update(ax1, ax2, ax3, ax4, val): alpha = alpha_slider.val theta = theta_slider.val t7 = t7_slider.val