def CreateSolution(device, region, name): ''' Creates solution variables As well as their entries on each edge ''' ds.node_solution(name=name, device=device, region=region) ds.edge_from_node_model(node_model=name, device=device, region=region)
def set_default_models(): for r in (region_si, region_ox): ds.edge_from_node_model(device=device, region=r, node_model="x") CreateEdgeModel(device=device, region=r, model="xmid", expression="0.5*(x@n0 + x@n1)") ds.set_parameter(name="T", value=300.0) CreateSolution(device=device, region=region_si, name="Potential") CreateSolution(device=device, region=region_ox, name="Potential") # # need Le and Lh for the Si Equation # setup_dg_variable(device, region_si, "Le") setup_dg_variable(device, region_si, "Lh") setup_dg_variable(device, region_ox, "Le") setup_dg_variable(device, region_ox, "Lh") CreateNodeModel(device=device, region=region_si, model="NetDoping", expression="Nconstant") #set the bias ds.set_parameter(name=GetContactBiasName("bot"), value=0.0) ds.set_parameter(name=GetContactBiasName("top"), value=0.0) #available solution reset ds.node_solution(name='zero', device=device, region=region_ox) ds.node_solution(name='zero', device=device, region=region_si)
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")
import test_common device="MyDevice" region="MyRegion" test_common.CreateSimpleMesh(device, region) ### ### Set parameters on the region ### devsim.set_parameter(device=device, region=region, name="Permittivity", value=3.9*8.85e-14) ### ### 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")
def createSolution(device, region, name): devsim.node_solution(device=device, region=region, name=name) devsim.edge_from_node_model(device=device, region=region, node_model=name)
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")