Defining Your Band Terms
Jump to navigation
Jump to search
Quick and Easy Method: Boltzmann Statistics Only, Though
Set material constants
set Vt 0.025;# this is kT/q
set Chi_Si <val>;# fill in these values similar to Vt above set Nc_Si <val> set Nv_Si <val>
set Chi_ox <val> set Chi_ox <val> set Chi_ox <val>
Set the band terms for each material (replace $Mat and <mat> for each)
#set Boltzmann and band diagram relations (ref. Taur) solution add name=Ec solve $Mat const val = "(-(DevPsi)-($Chi_<mat>))";#match to variable above, eg. Chi_Si solution add name=Ev solve $Mat const val = "(-(DevPsi)-($Chi_<mat>)-(Eg))" solution add name=nQFL solve $Mat const val = "(Ec+($Vt)*log((Elec+1.0)/($Nc_<mat>)))";#log is approx solution add name=pQFL solve $Mat const val = "(Ev-($Vt)*log((Hole+1.0)/($Nv_<mat>)))";#log is approx
#set equilibrium Hole and Elec, i.e. at zero bias, i.e. QFL=Efm==0, use this for initial guess solution add name=Elec0 solve $Mat const val = "(($Nc_<mat>)*exp(-(Ec-0.0)/($Vt)))" solution add name=Hole0 solve $Mat const val = "(($Nv_<mat>)*exp(-(0.0-(Ev))/($Vt)))"
A More General Method
Add and call this procedure below to avoid typing the above out for each material. This procedure also allows the user to choose between FD vs MB statistics. The proc defines the const solution variables Ec, Ev, nQFL, pQFL, Elec0, Hole0. Mat can be any material you have added, and Type can be Semiconductor, Insulator, or Metal.
proc BandTerms {Mat Type} { global small smaller set sm $smaller Puts "\nCongratulations! You are adding band terms for $Mat" if {[string compare $Type "Semiconductor"] == 0} { Puts "Congratulations! $Mat is a Semiconductor" solution add name=Ec solve $Mat const val = "(-(DevPsi)-(Chi))" solution add name=Ev solve $Mat const val = "(-(DevPsi)-(Chi)-(Eg))" if {[pdbGetBoolean $Mat FD] == "0"} { #Boltzmann statistics: gamma=1, quasi fermi levels from Taur (2.11) and (2.12) solution add name=Gamma_n solve $Mat const val = "1.0" solution add name=Gamma_p solve $Mat const val = "1.0" solution add name=nQFL solve $Mat const val = "(Ec+(Vt)*log((Elec+$sm)/(Nc)))"; solution add name=pQFL solve $Mat const val = "(Ev-(Vt)*log((Hole+$sm)/(Nv)))"; #set equilibrium Hole and Elec, i.e. at zero bias, i.e. QFL=Efm==0 solution add name=Elec0 solve $Mat const val = "((Nc)*exp(-(Ec-0.0)/(Vt)))" solution add name=Hole0 solve $Mat const val = "((Nv)*exp(-(0.0-(Ev))/(Vt)))" } else { #Fermi-Dirac statistics with Joyce-Dixon power series approx solution add name=nQFL solve $Mat const val = "Ec+Vt*(Eta_n_rev)";#log + error solution add name=pQFL solve $Mat const val = "Ev-Vt*(Eta_p_rev)";#log + error #set equilibrium Hole and Elec, i.e. at zero bias, i.e. QFL=Efm==0 solution add name=Elec0 solve $Mat const val = "(Nc*Gamma_n0*exp(-(Ec-0.0)/Vt))" solution add name=Hole0 solve $Mat const val = "(Nv*Gamma_p0*exp(-(0.0-(Ev))/Vt))" } } if {[string compare $Type "Insulator"] == 0} { Puts "Congratulations! $Mat is an Insulator" #quasi fermi levels, Taur (2.11) and (2.12) defn of Ef solution add name=Ec solve $Mat const val = "(-(DevPsi)-(Chi))" solution add name=Ev solve $Mat const val = "(-(DevPsi)-(Chi)-(Eg))" solution add name=nQFL solve $Mat const val = $small;#meaningless anyway solution add name=pQFL solve $Mat const val = $small solution add name=Elec0 solve $Mat const val = $small solution add name=Hole0 solve $Mat const val = $small } if {[string compare $Type "Metal"] == 0} { Puts "Congratulations! $Mat is a Metal!" set WFN [pdbGetDouble $Mat WFN] solution add name=Ec solve $Mat const val = $small;#meaningless - plot looks better solution add name=Ev solve $Mat const val = $small;#meaningless solution add name=nQFL solve $Mat const val = "(-(DevPsi)-$WFN)" solution add name=pQFL solve $Mat const val = "(-(DevPsi)-$WFN)" solution add name=Elec0 solve $Mat const val = $small solution add name=Hole0 solve $Mat const val = $small } } #Example Calls: BandTerms Silicon Semiconductor BandTerms Oxide Insulator
Notes
Prior to calling, you must set the solution variables Chi, Eg, Nc, Nv and Vt. For example, use the procedure SetT to do this, e.g.:
SetT 300.0;#this value is the temperature in Kelvin
If you want to use Fermi-Dirac statistics, you must add and call the FermiDirac procedure prior to using this one, e.g.:
FermiDirac
The procedure uses the variable $small as a small ~0, or "epsilon" type value, as 0.0 values do not simulate well. You must specify it, e.g.:
set small 1.0e-10