Defining Your Band Terms

From Flooxs
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