electrical.EF_T_semi_VASP のソースコード

import os
import sys
from math import exp, sqrt, log
import numpy as np
#from numpy import arange
from scipy import optimize          # newton関数はscipy.optimizeモジュールに入っている
from scipy.interpolate import interp1d
from matplotlib import pyplot as plt


from tklib.tkfile import tkFile
from tklib.tkutils import terminate, pint, pfloat, getarg, getintarg, getfloatarg, save_csv
from tklib.tksci.tksci import pi, h, hbar,c, e, kB, me

from tklib.tktransport.tkTransport import integrate_Simpson_list, fe, fh, NC2meff_FEA, meff2DC0_FEA
from tklib.tktransport.tkDOS_VASP import integrate_Simpson, integrate_Simpson_list, tkDOS



"""
VASPのDOSCARに基づいてキャリア密度とフェルミ準位を計算するモジュール。

詳細説明:
VASPのファイルからDOSを読み込み、指定されたモード(me, T, EF)に応じて状態密度、
キャリア密度の温度依存性やフェルミ準位依存性を計算・プロットする。

関連リンク:
 - :doc:`EF-T-semi_VASP_usage`
"""



#================================
# Global variables
#================================
Debug = 0

#mode: 'me', 'EF', 'T'
mode = 'me'

# For mode = 'me'. E range for fitting to me*(DOS)
dE_me_lsq = 0.5 # measured from EC/EV, eV

# EF range for mode = 'EF'
T0 = 300       # K
dEFmin = -0.5  # measured from EV, eV
dEFmax =  0.5  # measured from EC, eV
nEF    = 50
EFmin  = None
EFmax  = None
EFstep = None

# Temperature range for mode = 'T'
Tmin  = 300  # K
Tmax  = 600
nT    = 11
Tstep = None

# read from DOSCAR
dos = tkDOS()

file       = "DOSCAR"
outcsvfile = None

# Flag to specify the data to determine band edges
#dos.data_for_bandedges = 'EIGENVAL'
dos.data_for_bandedges = 'DOSCAR'

dos.dEA =  0.05   # Acceptor level measured from EV, eV
dos.NA  =  0.8e17
dos.dED = -0.28   # Donor level measured from EC, eV
dos.ND  =  0.0e17
dos.EA  = None    # Acceptor states are not considered if EA = None
dos.ED  = None    # Donor states are not considered if ED = None

# other parameters
dos.EF0  = 0.0    # EF at charge neutral
dos.Egth = 1.0e18 # Critera DOS value to search band edges, cm^-3


# Interpolation type
dos.interp_type = 'linear'
#dos.interp_type = 'cubic'

# integration parameters
# Integration range w.r.t. kBT
dos.Einteg0 = -3.0
dos.Einteg1 =  3.0
dos.nrange  =  6.0

# Relative accuracy of the quad functin
dos.eps_quad     = 1.0e-5
dos.nmaxdiv_quad = 150

# Bisection method parameters
# Initial search range
dos.dE_bisec    = 0.4
# EPS
dos.eps_bisec   = 1.0e-7
# max iteration number
dos.nmaxiter_bisec      = 200
# Output cycle
dos.iprintiterval_bisec = 1

E_raw   = None
dos_raw = None
nDOS  = None
Emin  = None
Emax  = None
Estep = None
EV = None
EC = None


#=============================
# Treat argments
#=============================
[ドキュメント] def usage(): """ コマンドライン引数の使用方法を表示する。 詳細説明: 各実行モード(me, T, EF)における引数の指定順序や意味、使用例を標準出力に表示する。 :returns: None """ global mode, dos global Vcell, T0 global file global dEFmin, dEFmax, EFmin, EFmax, nEF, EFstep global dE_me_lsq print("") print("Usage: Variables in () are optional") print(" python {} mode (file args)".format(sys.argv[0], )) print(" data_for_bandedges: Data to determine band edges [EIGENVAL|DOSCAR]") print(" (i) python {} me file dE data_for_bandedges".format(sys.argv[0])) print(" Plot DOS and fit for me*(DOS)") print(" dE: Energy range from EC/EV for fitting to m*(DOS)") print(" ex: python {} me {} {} {}".format(sys.argv[0], file, dE_me_lsq, dos.data_for_bandedges)) print(" (ii) python {} T file Tmin Tmax nT data_for_bandedges)".format(sys.argv[0])) print(" Calculate T dependences of ne, nh, ND+, NA-") print(" Tmin, Tmax, nT: T range and mesh") print(" ex: python {} T {} {} {} {} {}".format(sys.argv[0], file, Tmin, Tmax, nT, dos.data_for_bandedges)) print(" (iii) python {} EF file nEF T data_for_bandedges)".format(sys.argv[0])) print(" Calculate EF dependences of ne, nh, ND+, NA-") print(" nEF: # of EF mesh") print(" T: Temperature") print(" ex: python {} EF {} {} {} {}".format(sys.argv[0], file, nEF, T0, dos.data_for_bandedges))
[ドキュメント] def updatevars(): """ コマンドライン引数を解析し、グローバル変数を更新する。 詳細説明: 実行モード、入力ファイル名、および各モードに固有のパラメータを取得し、 出力用CSVファイル名の設定などを行う。 :returns: None """ global mode, dos global Vcell, T0 global file, outcsvfile global dEFmin, dEFmax, EFmin, EFmax, nEF, EFstep global Tmin, Tmax, nT, Tstep global dE_me_lsq argv = sys.argv if len(argv) == 1: usage() exit() mode = getarg( 1, mode) file = getarg( 2, file) if mode == 'me': dE_me_lsq = getfloatarg(3, dE_me_lsq) dos.data_for_bandedges = getarg(4, dos.data_for_bandedges) elif mode == 'EF': nEF = getintarg(3, nEF) T0 = getfloatarg(4, T0) dos.data_for_bandedges = getarg(5, dos.data_for_bandedges) elif mode == 'T': Tmin = getintarg(3, Tmin) Tmax = getintarg(4, Tmax) nT = getintarg(5, nT) Tstep = (Tmax - Tmin) / (nT - 1) dos.data_for_bandedges = getarg(6, dos.data_for_bandedges) header, ext = os.path.splitext(file) filebody = os.path.basename(header) outcsvfile = filebody + f'-EFT-{mode}.csv'
[ドキュメント] def exec_T(): """ キャリア密度やフェルミ準位の温度(T)依存性を計算してプロットする。 詳細説明: 指定された温度範囲でDOSCARデータに基づき数値積分を行い、フェルミ準位、 電子・正孔密度、不純物密度、活性化エネルギーを算出する。 計算結果はCSVファイルに保存され、Matplotlibを用いてグラフ描画される。 :returns: None """ global mode, dos, T0 print("") print("T dependence") print(" Temperature range: {} - {}, {} K step".format(Tmin, Tmax, Tstep)) xT = [Tmin + iT * Tstep for iT in range(nT)] xTinv, yEF, yNe, yNh, yNAm, yNDp, yRH, yNs, yNsabs = dos.cal_T_lists(xT, print_level = 0) print("") yEaNe = [] yEaNeTh = [] yEaNh = [] yEaNhTh = [] print ("%8s %10s %12s %12s %12s %12s %12s %12s %12s %12s %12s %12s" % ("T(K)", "EF(eV)", "Ea(Ne,meV)", "Ea(Ne,T1/2)", "Ea(Nh,meV)", "Ea(Nh,T1/2)", "Ne", "Nh", "ND+", "NA-", "RH", "Ns")) for i in range(nT): if i == 0: i1 = i i2 = i+1 elif i == nT - 1: i1 = i-1 i2 = i else: i1 = i-1 i2 = i+1 Th1 = sqrt(xT[i1]) Th2 = sqrt(xT[i2]) dT = 1.0 / (xTinv[i2] - xTinv[i1]) eps = 1.0e-300 EaNe = (log(yNe[i2]+eps) - log(yNe[i1])+eps) * dT # meV EaNeTh = (log(yNe[i2]/Th2+eps) - log(yNe[i1]/Th1)+eps) * dT # meV EaNh = (log(yNh[i2]+eps) - log(yNh[i1])+eps) * dT # meV EaNhTh = (log(yNh[i2]/Th2+eps) - log(yNh[i1]/Th1)+eps) * dT # meV yEaNe.append (-1000.0 * 1000.0 * kB / e * EaNe) yEaNeTh.append(-1000.0 * 1000.0 * kB / e * EaNeTh) yEaNh.append (-1000.0 * 1000.0 * kB / e * EaNh) yEaNhTh.append(-1000.0 * 1000.0 * kB / e * EaNhTh) print("%8.3f %10.4f %12.4g %12.4g %12.4g %12.4g " % (xT[i], yEF[i], yEaNe[i], yEaNeTh[i], yEaNh[i], yEaNhTh[i]) + "%12g %12g %12g %12g %12g %12g" % (yNe[i], yNh[i], yNDp[i], yNAm[i], yRH[i], yNs[i])) print("") print("Save fitting data to [{}]".format(outcsvfile)) save_csv(outcsvfile, ["T(K)", "EF(eV)", "Ne", "Nh", "ND+", "NA-", "RH", "Ns", "Ea(Ne,meV)", "Ea(Ne,T1/2)", "Ea(Nh,meV)", "Ea(Nh,T1/2)"], [xT, yEF, yNe, yNh, yNDp, yNAm, yRH, yNs, yEaNe, yEaNeTh, yEaNh, yEaNhTh]) #============================= # Plot graphs #============================= fig = plt.figure(figsize = (12, 8)) ax1 = fig.add_subplot(2, 3, 1) ax2 = fig.add_subplot(2, 3, 2) ax3 = fig.add_subplot(2, 3, 4) ax4 = fig.add_subplot(2, 3, 3) ax5 = fig.add_subplot(2, 3, 6) ax1.plot(xT, yEF, label = '$E_F$', color = 'black') ax1.set_xlabel("T (K)") ax1.set_ylabel("$E_F$ (eV)") ax1.legend() ax2.plot(dos.Elist, dos.DOSlist, label = 'DOS', color = 'black') ax2.plot([dos.EF0, dos.EF0], [min(dos.DOSlist), max(dos.DOSlist)], color = 'red', linestyle = 'dashed') ax2.set_xlabel("E (eV)") ax2.set_ylabel("DOS (states/cm$^3$)") ax2.legend() ax3.plot(xT, yRH, label = 'RH', color = 'black', marker = 'o') ax3.set_xlabel("T (K)") ax3.set_ylabel("R$_H$ (C$^{-1}$cm$^{-3}$)") ax3.legend() ax4.plot(xTinv, yNe, label = '$N_e$', color = 'black', marker = 'o', linewidth = 0.5, markersize = 5.0) ax4.plot(xTinv, yNh, label = '$N_h$', color = 'red', marker = 'o', linewidth = 0.5, markersize = 5.0) ax4.plot(xTinv, yNsabs, label = '|$N_s$|', color = 'purple', linewidth = 0.5, linestyle = 'dashed', marker = '^', markersize = 2.0) ax4.plot(xTinv, yNDp, label = '$N_D^+$', color = 'blue', marker = 'x', linewidth = 0.5, markersize = 5.0) ax4.plot(xTinv, yNAm, label = '$N_A^-$', color = 'green', marker = 'x', linewidth = 0.5, markersize = 5.0) ax4.set_yscale('log') minNs = [min(yNe), min(yNh), min(yNsabs)] maxNs = [max(yNe), max(yNh), max(yNsabs)] ylim = [ max([min(minNs)*0.5, 1.0e8]), min([max(maxNs)*2.0, 1.0e23]) ] ax4.set_ylim(ylim) # ax4.plot([0, 0], ax3.get_ylim(), color = 'red', linestyle = 'dashed', linewidth = 0.5) ax4.set_xlabel("1000/T (K$^{-1}$)") ax4.set_ylabel("N (cm$^{-3}$)") ax4.legend() ax5.plot(xTinv, yEaNe, label = '$E_a(N_e)$', linewidth = 0.5, color = 'black', marker = 'o', markersize = 5.0) ax5.plot(xTinv, yEaNeTh, label = '$E_a(N_e*T^{-0.5}$)', linewidth = 0.5, color = 'black', marker = 'x', markersize = 5.0) ax5.plot(xTinv, yEaNh, label = '$E_a(N_h)$', linewidth = 0.5, color = 'red', marker = 'o', markersize = 5.0) ax5.plot(xTinv, yEaNhTh, label = '$E_a(N_h*T^{-0.5}$)', linewidth = 0.5, color = 'red', marker = 'x', markersize = 5.0) ax5.set_xlabel("1000/T (K$^{-1}$)") ax5.set_ylabel("Ea (meV)") ax5.legend() # Rearange the graph axes so that they are not overlapped plt.tight_layout() plt.pause(0.1) print("") usage() print("") print("Press ENTER to exit>>", end = '') input()
[ドキュメント] def exec_EF(): """ キャリア密度等のフェルミ準位(EF)依存性を計算してプロットする。 詳細説明: 特定の温度においてフェルミ準位を変化させ、電子・正孔密度や有効状態密度(DOS)を計算する。 自由電子近似に基づく近似式との比較を行い、結果をCSV保存およびグラフ描画する。 :returns: None """ global mode, dos, T0 global EFmin, EFmax, EFstep print("") print("EF dependence at {} K".format(T0)) print(" EF range: {} - {}, {} eV step".format(EFmin, EFmax, EFstep)) xEF = [EFmin + iEF * EFstep for iEF in range(nEF)] yNh, yNe, yNAm, yNDp, yRH, yNs, yNsabs = dos.cal_EF_lists(T0, xEF, print_level = 0) yT0Ne = [] yT0Nh = [] print("") print ("%5s\t%8s\t%12s\t%12s\t%12s\t%12s\t%12s\t%12s\t%12s" % ("EF(eV)", "Ne", "Nh", "ND+", "NA-", "RH", "T0(Ne)", "T0(Nh)", "Ns")) for i in range(nEF): EF = xEF[i] if i == 0: i1 = i i2 = i+1 elif i == nEF - 1: i1 = i-1 i2 = i else: i1 = i-1 i2 = i+1 dEF = xEF[i2] - xEF[i1] dlnNedEF = (log(yNe[i2]+1.0e-300) - log(yNe[i1]+1.0e-300)) / dEF dlnNhdEF = (log(yNh[i2]+1.0e-300) - log(yNh[i1]+1.0e-300)) / dEF if dlnNedEF == 0.0: dlnNedEF = 1.0-4 T0Ne = 1.0 / kB / dlnNedEF * e if dlnNhdEF == 0.0: dlnNhdEF = 1.0-4 T0Nh = -1.0 / kB / dlnNhdEF * e yT0Ne.append(T0Ne) yT0Nh.append(T0Nh) print ("%10.4f\t%10.4g\t%10.4g\t%10.4g\t%10.4g\t%10.4g\t%10.4g\t%10.4g\t%10.4g" % (EF, yNe[i], yNh[i], yNDp[i], yNAm[i], yRH[i], T0Ne, T0Nh, yNs[i])) Emid = (dos.EV + dos.EC) / 2.0 imid = int((Emid - EFmin) / EFstep + 1.0e-5) Eimid = EFmin + imid * EFstep Ne = yNe[imid] Nh = yNh[imid] T0Ne = yT0Ne[imid] T0Nh = yT0Ne[imid] NC = Ne * exp((dos.EC - Eimid) * e / kB / T0Ne) NV = Nh * exp((Eimid - dos.EV) * e / kB / T0Nh) meeff = NC2meff_FEA(NC, T0) mheff = NC2meff_FEA(NV, T0) DC0 = meff2DC0_FEA(meeff, T0) DV0 = meff2DC0_FEA(mheff, T0) DOS_FEA = [] print("") print ("{:10}\t{:10}".format("E(eV)", "DOS,FEA(1/cm^3/eV)")) for i in range(nEF): EF = xEF[i] if EF < dos.EV: DOS_FEA.append(DV0 * sqrt(dos.EV - EF)) elif EF > dos.EC: DOS_FEA.append(DC0 * sqrt(EF - dos.EC)) else: DOS_FEA.append(0.0) print ("{:10.4g}\t{:10.4g}".format(xEF[i], DOS_FEA[i])) print("") print("Effective density of states at the mid gap {} eV (i={}, E={:8.4g}):".format(Emid, imid, Eimid)) print(" NC = {:12.6g} cm-3 (T0 = {:8.4g} K)".format(NC, T0Ne)) print(" NV = {:12.6g} cm-3 (T0 = {:8.4g} K)".format(NV, T0Nh)) print(" DC0 = {:12.6g} cm^-3/eV^1.5 (T0 = {:8.4g} K)".format(DC0, T0Ne)) print(" DV0 = {:12.6g} cm^-3/eV^1.5 (T0 = {:8.4g} K)".format(DV0, T0Nh)) print(" me* = {:8.4g} me".format(meeff)) print(" mh* = {:8.4g} me".format(mheff)) xEFapprox = [EFmin + i * EFstep for i in range(nEF)] yNeapprox = [NC * exp(-(dos.EC - xEFapprox[i]) * e / kB / T0) for i in range(nEF)] yNhapprox = [NV * exp(-(xEFapprox[i] - dos.EV) * e / kB / T0) for i in range(nEF)] print("") print("Save fitting data to [{}]".format(outcsvfile)) save_csv(outcsvfile, ["EF(eV)", "Ne", "Nh", "ND+", "NA-", "RH", "T0(Ne)", "T0(Nh)", "Ns"], [xEF, yNe, yNh, yNDp, yNAm, yRH, yT0Ne, yT0Nh, yNs]) #============================= # Plot graphs #============================= fig = plt.figure(figsize = (8, 8)) ax2 = fig.add_subplot(2, 2, 1) ax3 = fig.add_subplot(2, 2, 2) ax4 = fig.add_subplot(2, 2, 3) ax1 = fig.add_subplot(2, 2, 4) ax2.plot(dos.Elist, dos.DOSlist, label = 'DOS', color = 'black') ax2.plot(xEF, DOS_FEA, label = 'DOS$_{,FEA}$', color = 'green', linewidth = 0.5, linestyle = 'dashed') ax2.plot([dos.EF0, dos.EF0], [min(dos.DOSlist), max(dos.DOSlist)], label = '$E_{F0}$', color = 'red', linestyle = 'dashed', linewidth = 0.5) ax2.plot([dos.EV, dos.EV], [min(dos.DOSlist), max(dos.DOSlist)], label = '$E_V$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) ax2.plot([dos.EC, dos.EC], [min(dos.DOSlist), max(dos.DOSlist)], label = '$E_C$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) ax2.set_xlabel("E (eV)") ax2.set_ylabel("DOS (states/cm$^3$)") ax2.legend() ax3.plot(xEF, yNe, label = '$N_e$', color = 'black', linewidth = 0.5) #, marker = 'o') ax3.plot(xEF, yNh, label = '$N_h$', color = 'red', linewidth = 0.5) #, marker = 'x') ax3.plot(xEF, yNsabs, label = '|$N_s$|', color = 'purple', linewidth = 0.5, linestyle = 'dashed') #, marker = '^') ax3.plot(xEF, yNDp, label = '$N_D^+$', color = 'blue') #, marker = 'x') ax3.plot(xEF, yNAm, label = '$N_A^-$', color = 'green') #, marker = 'x') ax3.plot(xEFapprox, yNeapprox, label = 'Ne(Boltz)', color = 'gray', linewidth = 0.5) #, marker = 'x') ax3.plot(xEFapprox, yNhapprox, label = 'Nh(Boltz)', color = 'purple', linewidth = 0.5) #, marker = 'x') ax3.plot([dos.EV, dos.EV], ax3.get_ylim(), color = 'red', linestyle = 'dashed', linewidth = 0.5) ax3.plot([dos.EC, dos.EC], ax3.get_ylim(), color = 'red', linestyle = 'dashed', linewidth = 0.5) ax3.set_yscale('log') ax3.set_xlabel("EF (eV)") ax3.set_ylabel("N (cm$^{-3}$)") ax3.legend() ax4.plot(xEF, yRH, label = 'R$_H$', color = 'black', linewidth = 0.5, marker = 'o') ax4.set_xlabel("EF (eV)") ax4.set_ylabel("R$_H$ (C$^{-1}$cm$^{-3}$)") ax4.legend() ax1.plot(xEF, yT0Ne, label = 'T$_0$(Ne)', color = 'black') #, marker = 'o') ax1.plot(xEF, yT0Nh, label = 'T$_0$(Nh)', color = 'red') #, marker = 'x') ax1.plot([dos.EV, dos.EV], ax3.get_ylim(), color = 'red', linestyle = 'dashed', linewidth = 0.5) ax1.plot([dos.EC, dos.EC], ax3.get_ylim(), color = 'red', linestyle = 'dashed', linewidth = 0.5) ax1.set_ylim([0.0, 2.0*T0]) ax1.set_xlabel("EF (eV)") ax1.set_ylabel("T$_0$ (K)") ax1.legend() # Rearange the graph axes so that they are not overlapped plt.tight_layout() plt.pause(0.1) print("") usage() print("") print("Press ENTER to exit>>", end = '') input()
[ドキュメント] def exec_me(): """ 状態密度(DOS)をプロットし、バンド端付近の有効質量(m*)を見積もる。 詳細説明: DOSの2乗とエネルギーの関係から傾きを計算し、自由電子近似に基づく 有効質量を算出する。各エネルギーごとのDOSやm*の依存性をプロットする。 :returns: None """ global dos global file print("") print("Plot DOS and calculate m*") print(" dE_me_lsq: {:8.4g} eV".format(dE_me_lsq)) print(" EV: {:8.4g} eV dEFmin: {:8.4g} eV".format(dos.EV, dEFmin)) print(" EC: {:8.4g} eV dEFmax: {:8.4g} eV".format(dos.EC, dEFmax)) plotE0 = min([dos.EV + dEFmin, dos.EV - dE_me_lsq]) plotE1 = max([dos.EC + dEFmax, dos.EC + dE_me_lsq]) print("Plot E range: {:8.4g} - {:8.4g} eV".format(plotE0, plotE1)) ne_from_dos = integrate_Simpson_list(dos.Elist, dos.DOSlist) E_me = [] dos2 = [] Emid = (dos.EV + dos.EC) / 2.0 c = 0 for i in range(dos.nE): E = dos.Elist[i] # print("ne=", dos.Emin, E, dos.DOS(E), ne) if E < plotE0 or plotE1 < E: continue E_me.append(E) dos2.append(dos.DOSlist[i]**2) me_me = [] nme = len(E_me) for i in range(nme): if i == 0: i0 = 0 i1 = 1 elif i == nme - 1: i0 = i - 1 i1 = i else: i0 = i - 1 i1 = i + 1 DC0 = (dos2[i1] - dos2[i0]) / (E_me[i1] - E_me[i0]) if DC0 < 0.0: sign = -1.0 else: sign = 1.0 DC0 = sqrt(abs(DC0)) # DC0 = sqrt(2.0) / pi / pi * pow(me * meff, 1.5) / hbar / hbar / hbar * 1.0e-6 * pow(e, 1.5) meff = pow(DC0 / sqrt(2.0) * pi * pi * hbar * hbar * hbar / 1.0e-6 / pow(e, 1.5), 2.0/3.0) / me meff *= sign # print("m=", DC0, meff) me_me.append(meff) #============================= # Plot graphs #============================= fig = plt.figure(figsize = (8, 8)) ax1 = fig.add_subplot(2, 2, 1) ax2 = fig.add_subplot(2, 2, 2) ax3 = fig.add_subplot(2, 2, 3) ax4 = fig.add_subplot(2, 2, 4) ax1.plot(dos.Elist, dos.DOSlist, label = 'DOS', color = 'black', linewidth = 0.5) ax1.plot([dos.EF0, dos.EF0], [min(dos.DOSlist), max(dos.DOSlist)], label = '$E_{F0}$', color = 'red', linestyle = 'dashed', linewidth = 0.5) ax1.plot([dos.EV, dos.EV], [min(dos.DOSlist), max(dos.DOSlist)], label = '$E_V$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) ax1.plot([dos.EC, dos.EC], [min(dos.DOSlist), max(dos.DOSlist)], label = '$E_C$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) ax1.set_xlabel("E (eV)") ax1.set_ylabel("DOS (states/cm$^3$/eV)") ax1.legend() # print("len=", len(dos.Elist), len(ne_from_dos)) # print("ne=", ne_from_dos) ax2.plot(dos.Elist, ne_from_dos, label = 'N', color = 'black', linewidth = 0.5) ylim = [min(ne_from_dos), max(ne_from_dos)] ax2.plot([dos.EF0, dos.EF0], ylim, label = '$E_{F0}$', color = 'red', linestyle = 'dashed', linewidth = 0.5) ax2.plot([dos.EV, dos.EV], ylim, label = '$E_V$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) ax2.plot([dos.EC, dos.EC], ylim, label = '$E_C$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) ax2.set_xlabel("E (eV)") ax2.set_ylabel("N (states/cm$^3$)") ax2.legend() ax3.plot(E_me, dos2, label = 'DOS$^2$', color = 'black', linewidth = 0.5) ylim = [min(dos2), max(dos2)] ax3.plot([dos.EF0, dos.EF0], ylim, label = '$E_{F0}$', color = 'red', linestyle = 'dashed', linewidth = 0.5) ax3.plot([dos.EV, dos.EV], ylim, label = '$E_V$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) ax3.plot([dos.EC, dos.EC], ylim, label = '$E_C$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) # ax3.plot([dos.EV - dE_me_lsq, dos.EV - dE_me_lsq], ylim, label = '$E_{fit}$', color = 'green', linestyle = 'dashed', linewidth = 0.5) # ax3.plot([dos.EC + dE_me_lsq, dos.EC + dE_me_lsq], ylim, label = '$E_{fit}$', color = 'green', linestyle = 'dashed', linewidth = 0.5) ax3.set_xlabel("E (eV)") ax3.set_ylabel("DOS$^2$ (states$^2$/cm$^6$)") ax3.legend() ax4.plot(E_me, me_me, label = '$m^*$', color = 'black', linewidth = 0.5) ylim = [min(me_me), max(me_me)] ax4.plot([dos.EF0, dos.EF0], ylim, label = '$E_{F0}$', color = 'red', linestyle = 'dashed', linewidth = 0.5) ax4.plot([dos.EV, dos.EV], ylim, label = '$E_V$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) ax4.plot([dos.EC, dos.EC], ylim, label = '$E_C$', color = 'blue', linestyle = 'dashed', linewidth = 0.5) # ax4.plot([dos.EV - dE_me_lsq, dos.EV - dE_me_lsq], ylim, label = '$E_{fit}$', color = 'green', linestyle = 'dashed', linewidth = 0.5) # ax4.plot([dos.EC + dE_me_lsq, dos.EC + dE_me_lsq], ylim, label = '$E_{fit}$', color = 'green', linestyle = 'dashed', linewidth = 0.5) ax4.set_xlabel("E (eV)") ax4.set_ylabel("$m^*$") ax4.legend() # Rearange the graph axes so that they are not overlapped plt.tight_layout() plt.pause(0.1) print("") usage() print("") print("Press ENTER to exit>>", end = '') input()
[ドキュメント] def main(): """ プログラムのメインルーチンを実行する。 詳細説明: 変数の初期化と更新を行い、VASPのDOSCARファイルを読み込んだ後、 指定された実行モード(me, T, EF)に対応する処理を呼び出す。 :returns: None """ global mode, dos, T0 global Vcell, file, E_raw, dos_raw global dEFmin, dEFmax, EFmin, EFmax, nEF, EFstep updatevars() print("") print("===============================================================================") print(" Calculate T dependences of semiconductor statistics using VASP results") print("===============================================================================") print("mode: ", mode) dos.read_vaspfiles(file) EFmin = dos.EV + dEFmin EFmax = dos.EC + dEFmax EFstep = (EFmax - EFmin) / (nEF - 1) print("") print("Integration configuration") print(" Integration E range: {} - {} eV, or EF+-{}*kBT eV".format(dos.Einteg0, dos.Einteg1, dos.nrange)) print(" quad() parameters") print(" releps=", dos.eps_quad) print(" nmaxdiv=", dos.nmaxdiv_quad) print("") print("EF at 0 K = ", dos.EF0, " eV") Ne0K = dos.Ne(0.0, dos.EF0, -5.0, dos.EF0, dos.Estep) # Ne0K = Ne(0.0, EF0, Einteg0, EF0) print(" Ne at 0 K = ", Ne0K, " /u.c.") print("") if mode == 'me': exec_me() elif mode == 'T': exec_T() elif mode == 'EF': exec_EF() else: terminate("Error: Invalid mode [{}]".format(mode), usage)
if __name__ == '__main__': main()