Defining Your Band Terms: Difference between revisions

From Flooxs
Jump to navigation Jump to search
(created page)
 
(No difference)

Revision as of 19:52, 28 January 2010

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: Can Choose Fermi-Dirac Statistics Here

Add and call this procedure below to avoid typing the above out for each material, and choose FD statistics if you want. It will set the 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
   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+1.0)/(Nc)))";#log is approx
           solution add name=pQFL solve $Mat const val = "(Ev-(Vt)*log((Hole+1.0)/(Nv)))";#log is approx
           #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 - makes plot look better
       #solution add name=pQFL  solve $Mat const val = $small
       #if you have a more interesting oxide
       solution add name=nQFL solve $Mat const val = "(Ec+(Vt)*log((Elec+1.0)/(Nc)))";#log is approx
       solution add name=pQFL solve $Mat const val = "(Ev-(Vt)*log((Hole+1.0)/(Nv)))";#log is approx
       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 - makes plot look 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

warnings if you use this procedure

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