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")
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])
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)
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)
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")
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)
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])
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")
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")
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))
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")
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])
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")
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))
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")
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,
### ### 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)")
### 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 ###