Ejemplo n.º 1
0
def SetupInitialResistorSystem(device, region, net_doping=1e16):
    '''
      resistor physics
    '''
    devsim.set_parameter(device=device, region=region, name='net_doping', value=net_doping)
    devsim.node_solution(device=device, region=region, name='Potential')
    devsim.edge_from_node_model(device=device, region=region, node_model='Potential')

    # node models
    for name, equation in (
        ("NetDoping",                 "net_doping"),
      ("IntrinsicElectrons",        "NetDoping"),
      ("IntrinsicCharge",           "-IntrinsicElectrons + NetDoping"),
      ("IntrinsicCharge:Potential", "-IntrinsicElectrons:Potential"),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    # edge models
    for name, equation in (
        ("ElectricField",              "(Potential@n0 - Potential@n1)*EdgeInverseLength"),
      ("ElectricField:Potential@n0", "EdgeInverseLength"),
      ("ElectricField:Potential@n1", "-EdgeInverseLength"),
      ("PotentialEdgeFlux",              "Permittivity*ElectricField"),
      ("PotentialEdgeFlux:Potential@n0", "diff(Permittivity*ElectricField, Potential@n0)"),
      ("PotentialEdgeFlux:Potential@n1", "-PotentialEdgeFlux:Potential@n0"),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    ####
    #### PotentialEquation
    ####
    devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential", edge_model="PotentialEdgeFlux", variable_update="log_damp")
Ejemplo n.º 2
0
def setup_log_ox(device, region):

    ds.edge_from_node_model(device=device, region=region, node_model="Le")
    ds.edge_from_node_model(device=device, region=region, node_model="Lh")

    #
    # Need the V_t models
    #
    CreateVT(device, region, ())

    #
    # log_n, log_p
    #
    em = (
        # could use gradient model
        ("d_l_n", "EdgeInverseLength*(Le@n1 - Le@n0)/V_t_edge"),
        ("d_l_n:Le@n0", "-EdgeInverseLength/V_t_edge"),
        ("d_l_n:Le@n1", "EdgeInverseLength/V_t_edge"),
        #("d_l_n:Potential@n0", "0"),
        #("d_l_n:Potential@n1", "0"),
        #("d_l_n:Le@n0", "0"),
        #("d_l_n:Le@n1", "0"),
        ("d_l_p", "EdgeInverseLength*(Lh@n1 - Lh@n0)/V_t_edge"),
        ("d_l_p:Lh@n0", "-EdgeInverseLength/V_t_edge"),
        ("d_l_p:Lh@n1", "EdgeInverseLength/V_t_edge"),
        #("d_l_p:Potential@n0", "0"),
        #("d_l_p:Potential@n1", "0"),
        #("d_l_p:Lh@n0", "0"),
        #("d_l_p:Lh@n1", "0"),
    )
    for e in em:
        ds.edge_model(device=device, region=region, name=e[0], equation=e[1])
Ejemplo n.º 3
0
def createHoleCurrent(device, region):
    Jp = "-ElectronCharge*mu_p*EdgeInverseLength*V_t*(Holes@n1*Bern01 - Holes@n0*Bern10)"
    devsim.edge_model(device=device,
                      region=region,
                      name="HoleCurrent",
                      equation=Jp)
    for variable in ("Holes", "Potential"):
        der = "simplify(diff(%s, %s))" % (Jp, variable)
        devsim.edge_model(device=device,
                          region=region,
                          name="HoleCurrent",
                          equation=der)
Ejemplo n.º 4
0
def createElectronCurrent(device, region):
    Jn = "ElectronCharge*mu_n*EdgeInverseLength*V_t*(Electrons@n1*Bern10 - Electrons@n0*Bern01)"
    devsim.edge_model(device=device,
                      region=region,
                      name="ElectronCurrent",
                      equation=Jn)
    for variable in ("Electrons", "Potential"):
        der = "simplify(diff(%s, %s))" % (Jn, variable)
        devsim.edge_model(device=device,
                          region=region,
                          name="ElectronCurrent",
                          equation=der)
Ejemplo n.º 5
0
def createSiliconPotentialOnly(device, region):
    ie = devsim.node_model(device=device,
                           region=region,
                           name="IntrinsicElectrons",
                           equation="n_i*exp(Potential/V_t)")
    res = devsim.node_model(device=device,
                            region=region,
                            name="IntrinsicElectrons:Potential",
                            equation="diff(%s, Potential)" % ie)
    for name, equation in (
        ("IntrinsicHoles", "n_i^2/IntrinsicElectrons"),
        ("IntrinsicHoles:Potential",
         "diff(n_i^2/IntrinsicElectrons, Potential)"),
        ("IntrinsicCharge", "IntrinsicHoles-IntrinsicElectrons + NetDoping"),
        ("IntrinsicCharge:Potential",
         "diff(IntrinsicHoles-IntrinsicElectrons, Potential)"),
        ("PotentialIntrinsicNodeCharge", "-ElectronCharge*IntrinsicCharge"),
        ("PotentialIntrinsicNodeCharge:Potential",
         "diff(-ElectronCharge*IntrinsicCharge, Potential)"),
    ):
        devsim.node_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    for name, equation in (
        ("ElectricField", "(Potential@n0-Potential@n1)*EdgeInverseLength"),
        ("ElectricField:Potential@n0", "EdgeInverseLength"),
        ("ElectricField:Potential@n1", "-ElectricField:Potential@n0"),
        ("PotentialEdgeFlux", "Permittivity*ElectricField"),
        ("PotentialEdgeFlux:Potential@n0",
         "diff(Permittivity*ElectricField,Potential@n0)"),
        ("PotentialEdgeFlux:Potential@n1", "-PotentialEdgeFlux:Potential@n0"),
    ):
        devsim.edge_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    devsim.equation(device=device,
                    region=region,
                    name="PotentialEquation",
                    variable_name="Potential",
                    node_model="PotentialIntrinsicNodeCharge",
                    edge_model="PotentialEdgeFlux",
                    variable_update="log_damp")
Ejemplo n.º 6
0
def createBernoulli(device, region):
    #### test for requisite models here
    vdiffstr = "(Potential@n0 - Potential@n1)/V_t"
    for name, equation in (
        ("vdiff", vdiffstr),
        ("vdiff:Potential@n0", "V_t^(-1)"),
        ("vdiff:Potential@n1", "-vdiff:Potential@n0"),
        ("Bern01", "B(vdiff)"),
        ("Bern01:Potential@n0", "dBdx(vdiff) * vdiff:Potential@n0"),
        ("Bern01:Potential@n1", "-Bern01:Potential@n0"),
        ("Bern10", "Bern01 + vdiff"),
        ("Bern10:Potential@n0", "Bern01:Potential@n0 + vdiff:Potential@n0"),
        ("Bern10:Potential@n1", "Bern01:Potential@n1 + vdiff:Potential@n1"),
    ):
        devsim.edge_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)
Ejemplo n.º 7
0
def setup_log_si_potential_only(device, region):

    ds.edge_from_node_model(device=device, region=region, node_model="Le")
    ds.edge_from_node_model(device=device, region=region, node_model="Lh")
    ds.edge_from_node_model(device=device, region=region, node_model="NIE")

    #
    # Need the V_t models
    #
    CreateVT(device, region, ())

    #
    # log_n, log_p
    #
    em = (
        # could use gradient model
        #("d_l_n",           "EdgeInverseLength*((Le@n1 - Le@n0)/V_t_edge)"),
        #("d_l_n",           "EdgeInverseLength*((-V_t_edge*log(NIE_edge) + (Le@n1 - Le@n0))/V_t_edge)"),
        #("d_l_n",           "EdgeInverseLength*((-V_t_edge*log(NIE_edge) + (Potential@n0 - Potential@n1))/V_t_edge)"),
        #TODO: add band edge element later (NIE)
        ("d_l_n",
         "EdgeInverseLength*(((Potential@n1 - Potential@n0) + (Le@n0 - Le@n1))/V_t_edge)"
         ),
        #("d_l_n",           "EdgeInverseLength*((V_t_edge*log(NIE@n0/NIE@n1) + (Potential@n0 - Potential@n1) + (Le@n1 - Le@n0))/V_t_edge)"),
        #("d_l_n",           "EdgeInverseLength*((V_t_edge*log(NIE_edge) + (Potential@n0 - Potential@n1) + (Le@n1 - Le@n0))/V_t_edge)"),
        ("d_l_n:Potential@n0", "-EdgeInverseLength/V_t_edge"),
        ("d_l_n:Potential@n1", "EdgeInverseLength/V_t_edge"),
        ("d_l_n:Le@n0", "EdgeInverseLength/V_t_edge"),
        ("d_l_n:Le@n1", "-EdgeInverseLength/V_t_edge"),
        #("d_l_p",           "EdgeInverseLength*((Lh@n1 - Lh@n0)/V_t_edge)"),
        ("d_l_p",
         "EdgeInverseLength*(((Potential@n0 - Potential@n1) + (Lh@n0 - Lh@n1))/V_t_edge)"
         ),
        #("d_l_p",           "EdgeInverseLength*((Potential@n1 - Potential@n0) + (Lh@n1 - Lh@n0))/V_t_edge"),
        ("d_l_p:Potential@n0", "EdgeInverseLength/V_t_edge"),
        ("d_l_p:Potential@n1", "-EdgeInverseLength/V_t_edge"),
        ("d_l_p:Lh@n0", "EdgeInverseLength/V_t_edge"),
        ("d_l_p:Lh@n1", "-EdgeInverseLength/V_t_edge"),
    )
    for e in em:
        ds.edge_model(device=device, region=region, name=e[0], equation=e[1])
Ejemplo n.º 8
0
def createOxidePotentialOnly(device, region):
    for name, equation in (
        ("ElectricField", "(Potential@n0 - Potential@n1)*EdgeInverseLength"),
        ("ElectricField:Potential@n0", "EdgeInverseLength"),
        ("ElectricField:Potential@n1", "-EdgeInverseLength"),
        ("PotentialEdgeFlux", "Permittivity*ElectricField"),
        ("PotentialEdgeFlux:Potential@n0",
         "diff(Permittivity*ElectricField, Potential@n0)"),
        ("PotentialEdgeFlux:Potential@n1", "-PotentialEdgeFlux:Potential@n0"),
    ):
        devsim.edge_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    devsim.equation(device=device,
                    region=region,
                    name="PotentialEquation",
                    variable_name="Potential",
                    edge_model="PotentialEdgeFlux",
                    variable_update="log_damp")
Ejemplo n.º 9
0
def setup_edge_volume(device, region):
    #
    # Set edge volumes for integration
    #
    dim = ds.get_dimension(device=device)
    if dim == 1:
        ds.edge_model(device=device,
                      region=region,
                      name="EdgeNodeVolume",
                      equation="0.5*EdgeCouple*EdgeLength")
    elif dim == 2:
        ds.edge_model(device=device,
                      region=region,
                      name="EdgeNodeVolume",
                      equation="0.25*EdgeCouple*EdgeLength")
    elif dim == 3:
        ds.edge_model(device=device,
                      region=region,
                      name="EdgeNodeVolume",
                      equation="EdgeCouple*EdgeLength/6.0")
    else:
        raise NameError("Unhandled dimension %d" % (dim))
    ds.set_parameter(device=device,
                     region=region,
                     name="edge_node0_volume_model",
                     value="EdgeNodeVolume")
    ds.set_parameter(device=device,
                     region=region,
                     name="edge_node1_volume_model",
                     value="EdgeNodeVolume")
Ejemplo n.º 10
0
def CreateEdgeModel(device, region, model, expression):
    '''
      Creates an edge model
    '''
    result = ds.edge_model(device=device,
                           region=region,
                           name=model,
                           equation=expression)
    if debug:
        print("EDGEMODEL {d} {r} {m} \"{re}\"".format(d=device,
                                                      r=region,
                                                      m=model,
                                                      re=result))
Ejemplo n.º 11
0
def createPotentialOnly(device, region):
    for name, equation in (
        ("IntrinsicElectrons",                     "n_i*exp(Potential/V_t)"),
      ("IntrinsicElectrons:Potential",           "diff(n_i*exp(Potential/V_t), Potential)"),
      ("IntrinsicHoles",                         "n_i^2/IntrinsicElectrons"),
      ("IntrinsicHoles:Potential",               "diff(n_i^2/IntrinsicElectrons, Potential)"),
      ("IntrinsicCharge",                        "IntrinsicHoles-IntrinsicElectrons + NetDoping"),
      ("IntrinsicCharge:Potential",              "diff(IntrinsicHoles-IntrinsicElectrons, Potential)"),
      ("PotentialIntrinsicNodeCharge",           "-ElectronCharge*IntrinsicCharge"),
      ("PotentialIntrinsicNodeCharge:Potential", "diff(-ElectronCharge*IntrinsicCharge, Potential)"),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    for name, equation in (
        ("EField",              "(Potential@n0-Potential@n1)*EdgeInverseLength"),
      ("EField:Potential@n0", "EdgeInverseLength"),
      ("EField:Potential@n1", "-EField:Potential@n0"),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    devsim.element_from_edge_model(edge_model="EField", device=device, region=region)
    devsim.element_from_edge_model(edge_model="EField", derivative="Potential", device=device, region=region)

    foo="dot2d(EField_x, EField_y, unitx, unity)"
    for name, equation in (
        ("ElectricField", foo),
      ("ElectricField:Potential@en0", "diff(%s, Potential@en0)" % foo),
      ("ElectricField:Potential@en1", "diff(%s, Potential@en1)" % foo),
      ("ElectricField:Potential@en2", "diff(%s, Potential@en2)" % foo),
      ("PotentialEdgeFlux", "Permittivity*ElectricField"),
      ("PotentialEdgeFlux:Potential@en0", "diff(Permittivity*ElectricField,Potential@en0)"),
      ("PotentialEdgeFlux:Potential@en1", "diff(Permittivity*ElectricField,Potential@en1)"),
      ("PotentialEdgeFlux:Potential@en2", "diff(Permittivity*ElectricField,Potential@en2)"),
    ):
        devsim.element_model(device=device, region=region, name=name, equation=equation)

    devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential",
                    node_model="PotentialIntrinsicNodeCharge", element_model="PotentialEdgeFlux", variable_update="log_damp")
Ejemplo n.º 12
0
def setup_log_si(device, region):
    #
    # log_n, log_p
    #
    em = (
        ("d_l_n", "log(Electrons@n0/Electrons@n1)*EdgeInverseLength"),
        ("d_l_n:Electrons@n0", "(Electrons@n0^(-1))*EdgeInverseLength"),
        ("d_l_n:Electrons@n1", "-(Electrons@n1^(-1))*EdgeInverseLength"),
        ("d_l_p", "log(Holes@n0/Holes@n1)*EdgeInverseLength"),
        ("d_l_p:Holes@n0", "(Holes@n0^(-1))*EdgeInverseLength"),
        ("d_l_p:Holes@n1", "-(Holes@n1^(-1))*EdgeInverseLength"),
        # This is since we need to wipe out previous derivative
        ("d_l_n:Potential@n0", "0"),
        ("d_l_n:Potential@n1", "0"),
        ("d_l_n:Le@n0", "0"),
        ("d_l_n:Le@n1", "0"),
        ("d_l_p:Potential@n0", "0"),
        ("d_l_p:Potential@n1", "0"),
        ("d_l_p:Lh@n0", "0"),
        ("d_l_p:Lh@n1", "0"),
    )
    for e in em:
        ds.edge_model(device=device, region=region, name=e[0], equation=e[1])
Ejemplo n.º 13
0
def createDriftDiffusion(device, region):
    for name, equation in (
        ("PotentialNodeCharge"          , "-ElectronCharge*(Holes -Electrons + NetDoping)"),
      ("PotentialNodeCharge:Electrons", "+ElectronCharge"),
      ("PotentialNodeCharge:Holes"    , "-ElectronCharge"),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential", node_model="PotentialNodeCharge",
                    element_model="PotentialEdgeFlux", variable_update="log_damp")

    for name, equation in (
        ("vdiff"              , "(Potential@n0 - Potential@n1)/V_t"),
      ("vdiff:Potential@n0" , "V_t^(-1)"),
      ("vdiff:Potential@n1" , "-V_t^(-1)"),
      ("Bern01"             , "B(vdiff)"),
      ("Bern01:Potential@n0", "dBdx(vdiff)*vdiff:Potential@n0"),
      ("Bern01:Potential@n1", "dBdx(vdiff)*vdiff:Potential@n1"),
      ("Bern10"             , "Bern01 + vdiff"),
      ("Bern10:Potential@n0", "Bern01:Potential@n0 + vdiff:Potential@n0"),
      ("Bern10:Potential@n1", "Bern01:Potential@n1 + vdiff:Potential@n1"),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    Jn      ="ElectronCharge*mu_n*EdgeInverseLength*V_t*(Electrons@n1*Bern10 - Electrons@n0*Bern01)"
    dJndn0  ="simplify(diff( %s, Electrons@n0))" % Jn
    dJndn1  ="simplify(diff( %s, Electrons@n1))" % Jn
    dJndpot0="simplify(diff( %s, Potential@n0))" % Jn
    dJndpot1="simplify(diff( %s, Potential@n1))" % Jn
    for name, equation in (
        ("ElectronCurrent"             , Jn),
      ("ElectronCurrent:Electrons@n0", dJndn0),
      ("ElectronCurrent:Electrons@n1", dJndn1),
      ("ElectronCurrent:Potential@n0", dJndpot0),
      ("ElectronCurrent:Potential@n1", dJndpot1),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    Jp      ="-ElectronCharge*mu_p*EdgeInverseLength*V_t*(Holes@n1*Bern01 - Holes@n0*Bern10)"
    dJpdp0  ="simplify(diff(%s, Holes@n0))" % Jp
    dJpdp1  ="simplify(diff(%s, Holes@n1))" % Jp
    dJpdpot0="simplify(diff(%s, Potential@n0))" % Jp
    dJpdpot1="simplify(diff(%s, Potential@n1))" % Jp

    for name, equation in (
        ("HoleCurrent"             , Jp),
      ("HoleCurrent:Holes@n0"    , dJpdp0),
      ("HoleCurrent:Holes@n1"    , dJpdp1),
      ("HoleCurrent:Potential@n0", dJpdpot0),
      ("HoleCurrent:Potential@n1", dJpdpot1),
    ):
        devsim.edge_model(device=device, region=region, name=name, equation=equation)

    NCharge="-ElectronCharge * Electrons"
    dNChargedn="-ElectronCharge"
    for name, equation in (
        ("NCharge",           NCharge),
      ("NCharge:Electrons", dNChargedn),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    PCharge="-ElectronCharge * Holes"
    dPChargedp="-ElectronCharge"
    for name, equation in (
        ("PCharge", PCharge),
      ("PCharge:Holes", dPChargedp),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)


    ni=devsim.get_parameter(device=device, region=region, name="n_i")
    for name, value in (
        ("n1", ni),
      ("p1", ni),
      ("taun", 1e-5),
      ("taup", 1e-5),
    ):
        devsim.set_parameter(device=device, region=region, name=name, value=value)

    USRH="-ElectronCharge*(Electrons*Holes - n_i^2)/(taup*(Electrons + n1) + taun*(Holes + p1))"
    dUSRHdn="simplify(diff($USRH, Electrons))"
    dUSRHdp="simplify(diff($USRH, Holes))"
    for name, equation in (
        ("USRH", USRH),
      ("USRH:Electrons", dUSRHdn),
      ("USRH:Holes", dUSRHdp),
    ):
        devsim.node_model(device=device, region=region, name=name, equation=equation)

    devsim.equation(device=device, region=region, name="ElectronContinuityEquation", variable_name="Electrons",
                    edge_model="ElectronCurrent", variable_update="positive",
                    time_node_model="NCharge", node_model="USRH")

    devsim.equation(device=device, region=region, name="HoleContinuityEquation", variable_name="Holes",
                    edge_model="HoleCurrent", variable_update="positive",
                    time_node_model="PCharge", node_model="USRH")
Ejemplo n.º 14
0
def setup_dg_edge(device, region, carrier_name, parameter_name, variables):
    #
    # Looking at the source code, it appears that flux is added into node 0 and subtracted from node 1
    # and volume edge terms are added to node 0 and added to node 1
    # in the future we may change the source to reverse the sign on the volume edge term
    #
    #
    # Volume integration term
    #
    model_name = "del_log_%s1" % (carrier_name, )
    expression = "0.5*%s*d_l_%s" % (parameter_name, carrier_name)

    ds.edge_model(device=device,
                  region=region,
                  name=model_name,
                  equation=expression)
    for v in variables:
        m0 = ":%s@n0" % (v, )
        m1 = ":%s@n1" % (v, )
        ds.edge_model(device=device,
                      region=region,
                      name=(model_name + m0),
                      equation=(expression + m0))
        ds.edge_model(device=device,
                      region=region,
                      name=(model_name + m1),
                      equation=(expression + m1))

    model_name = "del_log_%s2" % (carrier_name, )
    expression = "0.25*%s*1e8*(1e-4*d_l_%s)^2" % (parameter_name, carrier_name)
    ds.edge_model(device=device,
                  region=region,
                  name=model_name,
                  equation=expression)
    expression = "0.50*%s*d_l_%s*d_l_%s" % (parameter_name, carrier_name,
                                            carrier_name)
    for v in variables:
        m0 = ":%s@n0" % (v, )
        m1 = ":%s@n1" % (v, )
        ds.edge_model(device=device,
                      region=region,
                      name=(model_name + m0),
                      equation=(expression + m0))
        ds.edge_model(device=device,
                      region=region,
                      name=(model_name + m1),
                      equation=(expression + m1))
Ejemplo n.º 15
0
def SetupCarrierResistorSystem(device, region):
    '''
    This adds electron continuity
  '''
    devsim.node_solution(device=device, region=region, name='Electrons')
    devsim.edge_from_node_model(device=device,
                                region=region,
                                node_model='Electrons')
    devsim.set_node_values(device=device,
                           region=region,
                           name='Electrons',
                           init_from='IntrinsicElectrons')

    ####
    #### PotentialNodeCharge
    ####
    for name, equation in (
        ("PotentialNodeCharge", "-ElectronCharge*(-Electrons + NetDoping)"),
        ("PotentialNodeCharge:Electrons", "+ElectronCharge"),
    ):
        devsim.node_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    ####
    #### PotentialEquation modified for carriers present
    ####
    devsim.equation(device=device,
                    region=region,
                    name='PotentialEquation',
                    variable_name='Potential',
                    node_model='PotentialNodeCharge',
                    edge_model="PotentialEdgeFlux",
                    variable_update="default")

    ####
    #### vdiff, Bern01, Bern10
    ####
    for name, equation in (
        ("vdiff", "(Potential@n0 - Potential@n1)/ThermalVoltage"),
        ("vdiff:Potential@n0", "ThermalVoltage^(-1)"),
        ("vdiff:Potential@n1", "-ThermalVoltage^(-1)"),
        ("Bern01", "B(vdiff)"),
        ("Bern01:Potential@n0", "dBdx(vdiff)*vdiff:Potential@n0"),
        ("Bern01:Potential@n1", "dBdx(vdiff)*vdiff:Potential@n1"),
        ("Bern10", "Bern01 + vdiff"),
        ("Bern10:Potential@n0", "Bern01:Potential@n0 + vdiff:Potential@n0"),
        ("Bern10:Potential@n1", "Bern01:Potential@n1 + vdiff:Potential@n1"),
    ):
        devsim.edge_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    ####
    #### Electron Current
    ####
    current_equation = "ElectronCharge*mu_n*EdgeInverseLength*ThermalVoltage*(Electrons@n1*Bern10 - Electrons@n0*Bern01)"
    for name, equation in (
        ("ElectronCurrent", current_equation),
        ("ElectronCurrent:Electrons@n0",
         "simplify(diff(%s, Electrons@n0))" % current_equation),
        ("ElectronCurrent:Electrons@n1",
         "simplify(diff(%s, Electrons@n1))" % current_equation),
        ("ElectronCurrent:Potential@n0",
         "simplify(diff(%s, Potential@n0))" % current_equation),
        ("ElectronCurrent:Potential@n1",
         "simplify(diff(%s, Potential@n1))" % current_equation),
    ):
        devsim.edge_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    ####
    #### Time derivative term
    ####
    for name, equation in (
        ("NCharge", "-ElectronCharge * Electrons"),
        ("NCharge:Electrons", "-ElectronCharge"),
    ):
        devsim.node_model(device=device,
                          region=region,
                          name=name,
                          equation=equation)

    ####
    #### Electron Continuity Equation
    ####
    devsim.equation(device=device,
                    region=region,
                    name="ElectronContinuityEquation",
                    variable_name="Electrons",
                    edge_model="ElectronCurrent",
                    time_node_model="NCharge",
                    variable_update="positive")
Ejemplo n.º 16
0
                                 region=region_si,
                                 name="Potential"))
    qdict['Le'] = numpy.array(
        ds.get_node_model_values(device=device, region=region_si, name="Le"))
    qdict['Lh'] = numpy.array(
        ds.get_node_model_values(device=device, region=region_si, name="Lh"))
    qdict['q'] = numpy.array(qdict['q'])
    qdict['v'] = numpy.array(qdict['v'])
    quantum_data[index] = qdict

#print max(get_node_model_values(device=device, region=region_si, name='n_classical'))
#print max(get_node_model_values(device=device, region=region_si, name='n_quantum'))

if carrier_var == 'Electrons':
    ds.edge_model(device=device,
                  region=region_si,
                  name="surface_term",
                  equation="del_log_n1*EdgeCouple")
    ds.edge_model(device=device,
                  region=region_si,
                  name="edge_volume_term",
                  equation="del_log_n2*EdgeNodeVolume")
    ds.node_model(device=device,
                  region=region_si,
                  name="volume_term",
                  equation="Le_eqn*NodeVolume")
elif carrier_var == 'Holes':
    ds.edge_model(device=device,
                  region=region_si,
                  name="surface_term",
                  equation="del_log_p1*EdgeCouple")
    ds.edge_model(device=device,
Ejemplo n.º 17
0
###
### Create the Potential solution variable
###
devsim.node_solution(device=device, region=region, name="Potential")

###
### Creates the Potential@n0 and Potential@n1 edge model
###
devsim.edge_from_node_model(device=device, region=region, node_model="Potential")

###
### Electric field on each edge, as well as its derivatives with respect to
### the potential at each node
###
devsim.edge_model(device=device, region=region, name="ElectricField",
                  equation="(Potential@n0 - Potential@n1)*EdgeInverseLength")

devsim.edge_model(device=device, region=region, name="ElectricField:Potential@n0",
                  equation="EdgeInverseLength")

devsim.edge_model(device=device, region=region, name="ElectricField:Potential@n1",
                  equation="-EdgeInverseLength")

###
### Model the D Field
###
devsim.edge_model(device=device, region=region, name="DField",
                  equation="Permittivity*ElectricField")

devsim.edge_model(device=device, region=region, name="DField:Potential@n0",
                  equation="diff(Permittivity*ElectricField, Potential@n0)")
Ejemplo n.º 18
0
###
devsim.node_solution(device=device, region=region, name="Potential")

###
### Creates the Potential@n0 and Potential@n1 edge model
###
devsim.edge_from_node_model(device=device,
                            region=region,
                            node_model="Potential")

###
### Electric field on each edge, as well as its derivatives with respect to
### the potential at each node
###
devsim.edge_model(device=device,
                  region=region,
                  name="ElectricField",
                  equation="(Potential@n0 - Potential@n1)*EdgeInverseLength")

devsim.edge_model(device=device,
                  region=region,
                  name="ElectricField:Potential@n0",
                  equation="EdgeInverseLength")

devsim.edge_model(device=device,
                  region=region,
                  name="ElectricField:Potential@n1",
                  equation="-EdgeInverseLength")

###
### Model the D Field
###