def test_bulk_silicon(): """ """ a_si = 5.50 PRIMITIVE_CELL = [[0, 0.5 * a_si, 0.5 * a_si], [0.5 * a_si, 0, 0.5 * a_si], [0.5 * a_si, 0.5 * a_si, 0]] tb.Orbitals.orbital_sets = {'Si': 'SiliconSP3D5S'} xyz_file = """2 Si2 cell Si1 0.0000000000 0.0000000000 0.0000000000 Si2 1.3750000000 1.3750000000 1.3750000000 """ h = tb.HamiltonianSp(xyz=xyz_file, nn_distance=2.5) h.initialize() h.set_periodic_bc(PRIMITIVE_CELL) sym_points = ['L', 'GAMMA', 'X'] num_points = [10, 25] k = tb.get_k_coords(sym_points, num_points, 'Si') band_sructure = [] vals = np.zeros((sum(num_points), h.num_eigs), dtype=np.complex) for jj, item in enumerate(k): vals[jj, :], _ = h.diagonalize_periodic_bc(item) band_structure = np.real(np.array(vals)) np.testing.assert_allclose( band_structure, expected_bulk_silicon_band_structure()[:, :h.num_eigs], atol=1e-4)
def main(): # specify atomic coordinates in xyz format path_to_xyz_file = """2 Bulk Si cell Si1 0.000 0.000 0.000 Si2 1.375 1.375 1.375""" # specify basis set Orbitals.orbital_sets = {'Si': 'SiliconSP3D5S'} # create a Hamiltonian object storing the Hamiltonian matrices h = Hamiltonian(xyz=path_to_xyz_file) h.initialize() # set periodic boundary conditions h.set_periodic_bc(primitive_cell) # define wave vector coordinates sym_points = ['L', 'GAMMA', 'X', 'W', 'K', 'L', 'W', 'X', 'K', 'GAMMA'] num_points = [15, 20, 15, 10, 15, 15, 15, 15, 20] k_points = get_k_coords(sym_points, num_points, 'Si') # compute band structure band_structure = np.zeros((sum(num_points), h.h_matrix.shape[0])) for jj, item in enumerate(k_points): band_structure[jj, :], _ = h.diagonalize_periodic_bc(item) # visualize ax = plt.axes() ax.set_title('Band structure of the bulk silicon') ax.set_ylabel('Energy (eV)') ax.plot(np.sort(np.real(band_structure))[:, :8], 'k') ax.plot([0, band_structure.shape[0]], [0, 0], '--', color='k', linewidth=0.5) plt.xticks(np.insert(np.cumsum(num_points) - 1, 0, 0), labels=sym_points) ax.xaxis.grid() plt.show()
def preprocess_data(param_file, k_points_file, xyz, code_name): """ Parameters ---------- param_file : k_points_file : xyz : code_name : Returns ------- """ params = tb.yaml_parser(param_file) # parse parameter file if k_points_file is None: # default k-points if len(params['primitive_cell']) == 3: sym_points = ['L', 'GAMMA', 'X', 'W', 'K', 'L', 'W', 'X', 'K', 'GAMMA'] num_points = [15, 20, 15, 10, 15, 15, 15, 15, 20] wave_vector = tb.get_k_coords(sym_points, num_points, 'Si') else: wave_vector = [[0.0, 0.0, 0.0]] else: # read k-points file if its path is provided from the command line arguments wave_vector = np.loadtxt(k_points_file) # read xyz file if its path is provided from the command line arguments if isinstance(xyz, str): with open(xyz, 'r') as myfile: params['xyz'] = myfile.read() if not isinstance(code_name, str): code_name = 'band_structure' return params, wave_vector, code_name
[a1, -a2, 0.0]]) # --------------------------- wave vectors ------------------------- lat_const_rec = 2 * np.pi / (3 * np.sqrt(3) * lat_const) special_k_points = { 'GAMMA': [0, 0, 0], 'K': [lat_const_rec * np.sqrt(3), lat_const_rec, 0], 'K_prime': [lat_const_rec * np.sqrt(3), -lat_const_rec, 0], 'M': [lat_const_rec * np.sqrt(3), 0, 0] } sym_points = ['GAMMA', 'M', 'K', 'GAMMA'] num_points = [25, 25, 25] k_points = get_k_coords(sym_points, num_points, special_k_points) # ------------------------------------------------------------------ fig_counter = 1 def graphene_first_nearest_neighbour(): coords = """2 Graphene C1 0.00 0.00 0.00 C2 {} 0.00 0.00 """.format(lat_const) # --------------------------- Basis set --------------------------