Resistor example 1D - Bulk Equations explanation
This page explains the following code snippet from the 1D Resistor Example:
Bulk Equations (Poisson, Electron/Hole Continuity Equations)
set eqnP "$eps * grad(DevPsi) + $Doping - Elec + Hole" set eqnE "ddt(Elec) - ($Emob) * $Vt * sgrad(Elec, DevPsi/$Vt)" set eqnH "ddt(Hole) - ($Hmob) * $Vt * sgrad(Hole, -DevPsi/$Vt)" pdbSetDouble Silicon DevPsi DampValue $Vt pdbSetString Silicon DevPsi Equation $eqnP pdbSetString Silicon Elec Equation $eqnE pdbSetString Silicon Hole Equation $eqnH
string setting for easy readability
The first 3 lines define 3 tcl strings that express Poisson's equation (eqnP), and the electron (eqnE) and hole (eqnH) continuity equations with drift-diffusion transport implemented through the Scharfetter-Gummel discretization scheme (sgrad - stands for Scharfetter grad). These are defined this way instead of directly in the "pdbSetString" lines for easy readability.
grad - the FLOOXS Laplace operator
Poisson's equation relates the spatial variation of electrostatic potential to the charge distribution in the device. In Alagator, "grad()" is the Laplace operator, a spatial derivative.
sgrad - the Scharfetter-Gummel grad
Device simulation almost always uses the drift-diffusion model for charged particle transport. One of the most successful discretization schemes (i.e. how to break up the continuous drift-diffusion equation into a discrete representation such that floods can solve it on your discrete grid points) is the Scharfetter-Gummel method. The original paper was published in 1969. Here's the citation:
Scharfetter, D.L.; Gummel, H.K.; , "Large-signal analysis of a silicon Read diode oscillator," Electron Devices, IEEE Transactions on , vol.16, no.1, pp. 64- 77, Jan 1969 doi: 10.1109/T-ED.1969.16566 URL: http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=1475609&isnumber=31655
ddt - the time derivative
In Alagator, "ddt()" is the time-derivative operator.
"Equation" - how to read "Equation" lines
The last 3 lines of this code snippet define the 3 equations necessary to solve for the 3 unknowns (pde solution variables) in the bulk Silicon (as opposed to on a boundary):
pdbSetString Silicon DevPsi Equation $eqnP pdbSetString Silicon Elec Equation $eqnE pdbSetString Silicon Hole Equation $eqnH
The "$" means the the whole "$eqnP" expression is substitued right there on that line. The following 3 lines say exactly the same thing:
pdbSetString Silicon DevPsi Equation "$eps * grad(DevPsi) + $Doping - Elec + Hole" pdbSetString Silicon Elec Equation "ddt(Elec) - ($Emob) * $Vt * sgrad(Elec, DevPsi/$Vt)" pdbSetString Silicon Hole Equation "ddt(Hole) - ($Hmob) * $Vt * sgrad(Hole, -DevPsi/$Vt)"
You can read these 3 line as:
"use ["$eps * grad(DevPsi) + $Doping - Elec + Hole" = 0] as the Equation to solve for DevPsi in Silicon" "use ["ddt(Elec) - ($Emob) * $Vt * sgrad(Elec, DevPsi/$Vt)" = 0] as the Equation to solve for Elec in Silicon" "use ["ddt(Hole) - ($Hmob) * $Vt * sgrad(Hole, -DevPsi/$Vt)" = 0] as the Equation to solve for Hole in Silicon"
The "DampValue" line is how you set the damping value for the previously discussed damping of the DevPsi solution.
pdb - store "Equation" strings the parameter database
How is floods storing these equations and when does it use them? Floods stores these equation strings in the parameter database, a tree-like structure that has an "Equation" node reserved under each solution variable in each material. For example, here is what a cartoon of the pdb might look like:
When you use the "device" command (later), floods traverses the pdb, finds all the equation strings it needs, discretizes them, builds matrices out of them, and then uses the math packages to solve in the most efficient way.