76 lines
3.1 KiB
Python
76 lines
3.1 KiB
Python
|
|
# Copyright 2013 DEVSIM LLC
|
||
|
|
#
|
||
|
|
# SPDX-License-Identifier: Apache-2.0
|
||
|
|
|
||
|
|
from devsim.python_packages.model_create import (
|
||
|
|
CreateEdgeModel,
|
||
|
|
CreateEdgeModelDerivatives,
|
||
|
|
InEdgeModelList,
|
||
|
|
EnsureEdgeFromNodeModelExists,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def CreateBernoulli(device, region):
|
||
|
|
"""
|
||
|
|
Creates the Bernoulli function for Scharfetter Gummel
|
||
|
|
"""
|
||
|
|
#### test for requisite models here
|
||
|
|
EnsureEdgeFromNodeModelExists(device, region, "Potential")
|
||
|
|
vdiffstr = "(Potential@n0 - Potential@n1)/V_t"
|
||
|
|
CreateEdgeModel(device, region, "vdiff", vdiffstr)
|
||
|
|
CreateEdgeModel(device, region, "vdiff:Potential@n0", "V_t^(-1)")
|
||
|
|
CreateEdgeModel(device, region, "vdiff:Potential@n1", "-vdiff:Potential@n0")
|
||
|
|
CreateEdgeModel(device, region, "Bern01", "B(vdiff)")
|
||
|
|
CreateEdgeModel(
|
||
|
|
device, region, "Bern01:Potential@n0", "dBdx(vdiff) * vdiff:Potential@n0"
|
||
|
|
)
|
||
|
|
CreateEdgeModel(device, region, "Bern01:Potential@n1", "-Bern01:Potential@n0")
|
||
|
|
# identity of Bernoulli functions
|
||
|
|
|
||
|
|
|
||
|
|
# CreateEdgeModel(device, region, "Bern10", "Bern01 + vdiff")
|
||
|
|
# CreateEdgeModel(device, region, "Bern10:Potential@n0", "Bern01:Potential@n0 + vdiff:Potential@n0")
|
||
|
|
# CreateEdgeModel(device, region, "Bern10:Potential@n1", "Bern01:Potential@n1 + vdiff:Potential@n1")
|
||
|
|
|
||
|
|
|
||
|
|
def CreateElectronCurrent(device, region, mu_n):
|
||
|
|
"""
|
||
|
|
Electron current
|
||
|
|
"""
|
||
|
|
EnsureEdgeFromNodeModelExists(device, region, "Potential")
|
||
|
|
EnsureEdgeFromNodeModelExists(device, region, "Electrons")
|
||
|
|
EnsureEdgeFromNodeModelExists(device, region, "Holes")
|
||
|
|
# Make sure the bernoulli functions exist
|
||
|
|
if not InEdgeModelList(device, region, "Bern01"):
|
||
|
|
CreateBernoulli(device, region)
|
||
|
|
#### test for requisite models here
|
||
|
|
# Jn = "ElectronCharge*{0}*EdgeInverseLength*V_t*(Electrons@n1*Bern10 - Electrons@n0*Bern01)".format(mu_n)
|
||
|
|
Jn = "ElectronCharge*{0}*EdgeInverseLength*V_t*kahan3(Electrons@n1*Bern01, Electrons@n1*vdiff, -Electrons@n0*Bern01)".format(
|
||
|
|
mu_n
|
||
|
|
)
|
||
|
|
# Jn = "ElectronCharge*{0}*EdgeInverseLength*V_t*((Electrons@n1-Electrons@n0)*Bern01 + Electrons@n1*vdiff)".format(mu_n)
|
||
|
|
|
||
|
|
CreateEdgeModel(device, region, "ElectronCurrent", Jn)
|
||
|
|
for i in ("Electrons", "Potential", "Holes"):
|
||
|
|
CreateEdgeModelDerivatives(device, region, "ElectronCurrent", Jn, i)
|
||
|
|
|
||
|
|
|
||
|
|
def CreateHoleCurrent(device, region, mu_p):
|
||
|
|
"""
|
||
|
|
Hole current
|
||
|
|
"""
|
||
|
|
EnsureEdgeFromNodeModelExists(device, region, "Potential")
|
||
|
|
EnsureEdgeFromNodeModelExists(device, region, "Holes")
|
||
|
|
# Make sure the bernoulli functions exist
|
||
|
|
if not InEdgeModelList(device, region, "Bern01"):
|
||
|
|
CreateBernoulli(device, region)
|
||
|
|
##### test for requisite models here
|
||
|
|
# Jp ="-ElectronCharge*{0}*EdgeInverseLength*V_t*(Holes@n1*Bern01 - Holes@n0*Bern10)".format(mu_p)
|
||
|
|
Jp = "-ElectronCharge*{0}*EdgeInverseLength*V_t*kahan3(Holes@n1*Bern01, -Holes@n0*Bern01, -Holes@n0*vdiff)".format(
|
||
|
|
mu_p
|
||
|
|
)
|
||
|
|
# Jp ="-ElectronCharge*{0}*EdgeInverseLength*V_t*((Holes@n1 - Holes@n0)*Bern01 - Holes@n0*vdiff)".format(mu_p)
|
||
|
|
CreateEdgeModel(device, region, "HoleCurrent", Jp)
|
||
|
|
for i in ("Holes", "Potential", "Electrons"):
|
||
|
|
CreateEdgeModelDerivatives(device, region, "HoleCurrent", Jp, i)
|