Temperature-Dependent Bands
Set Temperature Dependencies - works down to 50K
Put this procedure in your deck and use it to define T-dep solution variables and also pdb values for temperature, thermal voltage, bandgap, electron affinity, conduction band density of states, and valence band density of states (T, Vt, Eg, Chi, Nc, Nv) for each variable in your $matstring. Retrieve pdb values via:
pdbGetDouble $mat $var
Reference: S. M. Sze, Physics of Semiconductor Devices, 2nd ed. (New York: John Wiley & Sons, 1981).
Call this procedure to set the temperature for your T-dep models
proc SetT {temp} { global matstring puts "\nsetting T to $temp K for $matstring" #Calculate Vt global k q foreach mat $matstring { solution add name=T solve $mat const val = $temp;#use sol for later, Te maybe solution add name=Vt solve $mat const val = "($k*T/$q)";;# Volts (just kT for eV) pdbSetDouble $mat T $temp;#not spatially dependent, so really just a const pdbSetDouble $mat Vt [expr {$k*$temp/$q}] #If T=300.0, use simple constants if {$temp == 300.0} { puts "T is 300.0, just using constants" solution add name=Chi solve $mat const val = [pdbGetDouble $mat Chi300] solution add name=Eg solve $mat const val = [pdbGetDouble $mat Eg300] solution add name=Nc solve $mat const val = [pdbGetDouble $mat Nc300] solution add name=Nv solve $mat const val = [pdbGetDouble $mat Nv300] pdbSetDouble $mat Chi [pdbGetDouble $mat Chi300] pdbSetDouble $mat Eg [pdbGetDouble $mat Eg300] pdbSetDouble $mat Nc [pdbGetDouble $mat Nc300] pdbSetDouble $mat Nv [pdbGetDouble $mat Nv300] } else { #else use model puts "T is not 300.0, using advanced models for Eg, Nc, Nv" foreach var {Chi300 Eg300 Nc300 Nv300 ALPHA BETA} {set $var [pdbGetDouble $mat $var]} set Chi_eqn "($Chi300+$ALPHA*((300.0*300.0/(300.0+$BETA))-((T*T)/(2*(T+$BETA)))))" set Eg_eqn "($Eg300+$ALPHA*((300.0*300.0/(300.0+$BETA))-((T*T)/(T+$BETA))))" solution add name=Chi solve $mat const val = $Chi_eqn solution add name=Eg solve $mat const val = $Eg_eqn solution add name=Nc solve $mat const val = "($Nc300*((T/300.0)^(1.5)))" solution add name=Nv solve $mat const val = "($Nv300*((T/300.0)^(1.5)))" pdbSetDouble $mat Chi [expr {($Chi300+$ALPHA*((300.0*300.0/(300.0+$BETA))\ -(($temp*$temp)/(2.0*($temp+$BETA)))))}] pdbSetDouble $mat Eg [expr {($Eg300+$ALPHA*((300.0*300.0/(300.0+$BETA))\ -(($temp*$temp)/($temp+$BETA))))}] pdbSetDouble $mat Nc [expr {($Nc300*(pow(($temp/300.0),(1.5))))}] pdbSetDouble $mat Nv [expr {($Nv300*(pow(($temp/300.0),(1.5))))}] } }
}
warnings
You must define a string listing all the materials you have in your structure, e.g.:
set matstring "Silicon Oxide"
You must define Boltzmann's constant k, and elementary charge q:
set k 1.38066e-23;#J/K - Boltzmann's constant - this is SI units set q 1.60218e-19;#C - elementary unit of charge - this is SI units
You must have the material specific values for Chi, Eg, Nc, and Nv at 300 Kelvin defined in the parameter database:
pdbSetDouble Silicon Chi300 4.17;#room temperature electron affinity pdbSetDouble Silicon Eg300 1.08;#room temperature band gap pdbSetDouble Silicon Nc300 3.2e19;#room temperature conduction-band density of states pdbSetDouble Silicon Nv300 1.8e19;#room temperature valence-band density of states pdbSetDouble Oxide Chi300 0.97;#V pdbSetDouble Oxide Eg300 9.0;#eV pdbSetDouble Oxide Nc300 [pdbGetDouble Silicon Nc300];#irrelevant pdbSetDouble Oxide Nv300 [pdbGetDouble Silicon Nv300];#irrelevant
You must have the ALPHA and BETA model parameters defined in the pdb for the materials you are using:
pdbSetDouble Silicon ALPHA 4.73e-4;#eV/K pdbSetDouble Silicon BETA 636.0;#K pdbSetDouble Oxide ALPHA [pdbGetDouble Silicon ALPHA] pdbSetDouble Oxide BETA [pdbGetDouble Silicon BETA]