1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| import numpy as np import pandas as pd
pi = 3.14159265 pi2 = 6.28318531 echarge = -1.0 ecoulom = -1.60217653e-19 kb = 8.61734318e-05 hbar = 6.58211915e-16 m0 = 5.68562975e-16 eps0 = 5.52634972e05
class Valley(object): def __init__(self, px0, py0, pz0, mx, my, mz, T, alpha, PQMAX, number_of_electrons): self.px0 = px0 self.py0 = py0 self.pz0 = pz0 self.mx = mx self.my = my self.mz = mz self.T = T self.alpha = alpha self.PQMAX = PQMAX self.number_of_electrons = number_of_electrons electrons = [] E = [] for i in range(self.number_of_electrons): electron = self.create_electron(T) electrons.append(electron) E.append(self.energy(electron)) self.electrons = pd.DataFrame(np.hstack([np.array(electrons), np.array(E).reshape(-1, 1)]), columns=['px', 'py', 'pz', 'E']) def create_electron(self, T): px = py = pz = 100 while (px > self.PQMAX or py > self.PQMAX or pz > self.PQMAX): px = np.random.normal() * np.sqrt(kb * T * self.mx) + self.px0 py = np.random.normal() * np.sqrt(kb * T * self.my) + self.py0 pz = np.random.normal() * np.sqrt(kb * T * self.mz) + self.pz0 electron = np.array([px, py, pz]) return electron
def gamma(self, electron): return 0.5 * ( (electron[0] - self.px0) ** 2 / self.mx + (electron[1] - self.py0) ** 2 / self.my + (electron[2] - self.pz0) ** 2 / self.mz ) def energy(self, electron): return (-1 + np.sqrt(1 + 4 * self.alpha * self.gamma(electron))) / (2 * self.alpha) class Silicon(object): def __init__(self, T=300, number_of_electrons=600): electrons_per_valley = int(number_of_electrons / 6) self.number_of_electrons = 6 * electrons_per_valley self.T = T
self.asi = 5.411e-8
self.ml = 0.9163 * m0 self.mt = 0.1880 * self.E_gap(0) * m0 / self.E_gap(self.T)
self.md = 6 ** (2 / 3) * (self.ml * self.mt**2) ** (1 / 3)
self.QMIN = 1.0 self.QMAX = 2 * pi / self.asi self.PQMAX = hbar * self.QMAX
self.alpha = 0.5 * self.E_gap(0) / self.E_gap(self.T) self.valley_kx0 = Valley(-0.85 * self.PQMAX, 0, 0, self.ml, self.mt, self.mt, self.T, self.alpha, self.PQMAX, electrons_per_valley) self.valley_kx1 = Valley(0.85 * self.PQMAX, 0, 0, self.ml, self.mt, self.mt, self.T, self.alpha, self.PQMAX, electrons_per_valley) self.valley_ky0 = Valley(0, -0.85 * self.PQMAX, 0, self.mt, self.ml, self.mt, self.T, self.alpha, self.PQMAX, electrons_per_valley) self.valley_ky1 = Valley(0, 0.85 * self.PQMAX, 0, self.mt, self.ml, self.mt, self.T, self.alpha, self.PQMAX, electrons_per_valley) self.valley_kz0 = Valley(0, 0, -0.85 * self.PQMAX, self.mt, self.mt, self.ml, self.T, self.alpha, self.PQMAX, electrons_per_valley) self.valley_kz1 = Valley(0, 0, 0.85 * self.PQMAX, self.mt, self.mt, self.ml, self.T, self.alpha, self.PQMAX, electrons_per_valley)
def E_gap(self, T): return 1.1756 - 8.8131e-5 * T - 2.6814e-7 * T**2
def DoS(self, E): return ( self.md ** (3 / 2) * np.sqrt(2) / (pi**2 * hbar**3) * np.sqrt(E * (1 + self.alpha * E)) * (1 + 2 * self.alpha * E) )
def DoS_para(self, E): return ( self.md ** (3 / 2) * np.sqrt(2) / (pi**2 * hbar**3) * np.sqrt(E) )
si = Silicon()
|