cms.EffectiveMass のソースコード

import sys
import numpy as np
from numpy import sqrt, exp, sin, cos, tan, pi
import numpy.linalg as LA 
import csv
from matplotlib import pyplot as plt


#===================================
# physical constants
#===================================
pi   = 3.14159265358979323846
pi2  = 2.0 * pi
h    = 6.6260755e-34    # Js";
hbar = 1.05459e-34      # "Js";
c    = 2.99792458e8     # m/s";
e    = 1.60218e-19      # C";
e0   = 8.854418782e-12; # C<sup>2</sup>N<sup>-1</sup>m<sup>-2</sup>";
kB   = 1.380658e-23     # JK<sup>-1</sup>";
me   = 9.1093897e-31    # kg";
R    = 8.314462618      # J/K/mol
a0   = 5.29177e-11      # m";


#===================================
# parameters
#===================================
a = 4.0e-10 #m

infile = 'band.csv'
cutline = 1

#===================================
# figure configuration
#===================================
fontsize        = 12
legend_fontsize = 8


#=============================
# other functions
#=============================
[ドキュメント] def savecsv(outfile, header, datalist): try: print("Write to [{}]".format(outfile)) f = open(outfile, 'w') except: # except IOError: print("Error: Can not write to [{}]".format(outfile)) else: fout = csv.writer(f, lineterminator='\n') fout.writerow(header) # fout.writerows(data) for i in range(0, len(datalist[0])): a = [] for j in range(len(datalist)): a.append(datalist[j][i]) fout.writerow(a) f.close()
[ドキュメント] def read_csv(fname): x = [] y = [] with open(fname) as f: fin = csv.reader(f) aa = next(fin) xlabel = aa[0] ylabel = aa[1] for row in fin: try: x.append(float(row[0])) y.append(float(row[1])) except: print("Warning: Invalid float data [{}] or [{}]".format(row[0], row[1])) return xlabel, ylabel, x, y
[ドキュメント] def main(): klabel, Elabel, k, E = read_csv(infile) print("k=", k) print("E=", E) nk = len(k) dk = k[1] - k[0] km = hbar * hbar * (pi2 / a)**2.0 nskip = 1 xk = [] ymc = [] signprev = None print("") print("Differentiate for nskip = ", nskip) print("i E[i-1] E[i] E[i+1] 1.0/m*") for i in range(nskip, nk - nskip, nskip): d2Edk2c = (E[i+nskip] + E[i-nskip] - 2 * E[i]) * e / pow(nskip * dk, 2.0) minv = d2Edk2c / km print(i, E[i-1], E[i], E[i+1], minv) if abs(minv) <= 1.0e20: # << 1.0/me ~ 1e30 if cutline: xk.append(k[i]) ymc.append(None) signprev = -signprev continue else: m = km / d2Edk2c if signprev is None: signprev = m elif signprev * m < 0.0: if cutline: xk.append(k[i]) ymc.append(None) signprev = m xk.append(k[i]) ymc.append(m / me) nskip = 4 xk2 = [] ymc2 = [] signprev = None print("") print("Differentiate for nskip = ", nskip) print("i E[i-1] E[i] E[i+1] 1.0/m*") for i in range(nskip, nk - nskip, nskip): d2Edk2c = (E[i+nskip] + E[i-nskip] - 2 * E[i]) * e / pow(nskip * dk, 2.0) minv = d2Edk2c / km print(i, E[i-1], E[i], E[i+1], minv) if abs(minv) <= 1.0e20: # << 1.0/me ~ 1e30 if cutline: xk2.append(k[i]) ymc2.append(None) signprev = -signprev continue else: m = km / d2Edk2c if signprev is None: signprev = m elif signprev * m < 0.0: if cutline: xk2.append(k[i]) ymc2.append(None) signprev = m xk2.append(k[i]) ymc2.append(m / me) plt.plot(xk, ymc, linewidth = 0.5, marker = 'o', markersize = 1.0, label = 'nskip = 1') plt.plot(xk2, ymc2, linewidth = 0.5, marker = 'o', markersize = 1.0, label = 'nskip = 2') plt.xlabel(klabel) plt.ylabel("m$_e$ / m$_e^0$") plt.xlim([-0.5, 0.5]) # plt.ylim([-0.5, 0.5]) plt.tight_layout() plt.pause(0.1) print("Press ENTER to exit>>", end = '') input()
if __name__ == "__main__": main()