-
Notifications
You must be signed in to change notification settings - Fork 79
Expand file tree
/
Copy pathsimple_dd.py
More file actions
75 lines (65 loc) · 3.15 KB
/
simple_dd.py
File metadata and controls
75 lines (65 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 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)