# 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)