Files

76 lines
3.1 KiB
Python
Raw Permalink Normal View History

2025-12-08 10:11:12 +08:00
# 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)