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 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 SetupCarrierResistorContact(device, contact, use_circuit_bias=False, circuit_node=""): ''' Electron continuity equation at contact ''' if circuit_node: bias_name = circuit_node else: bias_name = contact + "bias" region = devsim.get_region_list(device=device, contact=contact)[0] if 'celec' not in devsim.get_node_model_list(device=device, region=region): devsim.node_model( device=device, region=region, name="celec", equation= "0.5*(NetDoping+(NetDoping^2 + 4 * IntrinsicDensity^2)^(0.5))") for name, equation in ( ("%snodeelectrons" % contact, "Electrons - celec"), ("%snodeelectrons:Electrons" % contact, "1."), ): devsim.contact_node_model(device=device, contact=contact, name=name, equation=equation) if use_circuit_bias: devsim.contact_equation(device=device, contact=contact, name="ElectronContinuityEquation", variable_name="Electrons", node_model="%snodeelectrons" % contact, edge_current_model="ElectronCurrent", circuit_node=bias_name) else: devsim.contact_equation(device=device, contact=contact, name="ElectronContinuityEquation", variable_name="Electrons", node_model="%snodeelectrons" % contact, edge_current_model="ElectronCurrent")
def setup_dg_volume(device, region, normalized=False): # # Lambda Equations # #em = ( # ("Le_eqn", "Le/b_n"), # ("Le_eqn:Le", "1/b_n"), # ("Lh_eqn", "Lh/b_p"), # ("Lh_eqn:Lh", "1/b_p"), #) em = ( # ("Le_eqn", "Le - AtOx*1e2"), ("Le_eqn", "Le - AtOx*b_nox*SurfaceArea/(NodeVolume*x_np)"), ("Le_eqn:Le", "1"), # ("Lh_eqn", "Lh"), ("Lh_eqn", "Lh - AtOx*b_pox*SurfaceArea/(NodeVolume*x_pp)"), ("Lh_eqn:Lh", "1"), ) for e in em: ds.node_model(device=device, region=region, name=e[0], equation=e[1])
def CreateNodeModel(device, region, model, expression): ''' Creates a node model ''' result = ds.node_model(device=device, region=region, name=model, equation=expression) if debug: print(("NODEMODEL {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")
devsim.edge_from_node_model(device=device, region=region, node_model="Potential") 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") devsim.set_parameter(device=device, region=region, name="topbias", value=1.0e-0) devsim.set_parameter(device=device, region=region, name="botbias", value=0.0) devsim.edge_model(device=device, region=region, name="PotentialEdgeFlux", equation="Permittivity*ElectricField") devsim.edge_model(device=device, region=region, name="PotentialEdgeFlux:Potential@n0", equation="diff(Permittivity*ElectricField, Potential@n0)") devsim.edge_model(device=device, region=region, name="PotentialEdgeFlux:Potential@n1", equation="-PotentialEdgeFlux:Potential@n0") devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential", edge_model="PotentialEdgeFlux", variable_update="default") devsim.node_model(device=device, region=region, name="topnode_model" , equation="Potential - topbias") devsim.node_model(device=device, region=region, name="topnode_model:Potential", equation="1") devsim.node_model(device=device, region=region, name="botnode_model" , equation="Potential - botbias") devsim.node_model(device=device, region=region, name="botnode_model:Potential", equation="1") devsim.contact_equation(device=device, contact="top", name="PotentialEquation", variable_name="Potential", node_model="topnode_model", edge_charge_model="PotentialEdgeFlux") devsim.contact_equation(device=device, contact="bot", name="PotentialEquation", variable_name="Potential", node_model="botnode_model", edge_charge_model="PotentialEdgeFlux") devsim.solve(type="dc", absolute_error=1.0, relative_error=1e-10, maximum_iterations=30) print(devsim.get_contact_charge(device=device, contact="top", equation="PotentialEquation")) print(devsim.get_contact_charge(device=device, contact="bot", equation="PotentialEquation")) devsim.write_devices(file="trimesh3.msh", type="devsim_data")
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 set_dg_parameters(device, region): ##From Cogenda default Si physics: #TODO: parameter units ds.set_parameter(device=device, region=region, name="h", value=6.62606876e-34) # J*s ds.set_parameter(device=device, region=region, name="hbar", value=1.054571596e-34) # J*s ds.set_parameter(device=device, region=region, name="Gamman", value=1) ds.set_parameter(device=device, region=region, name="Gammap", value=1) ds.set_parameter(device=device, region=region, name="Gammanox", value=1) ds.set_parameter(device=device, region=region, name="Gammapox", value=1) ds.set_parameter(device=device, region=region, name="mass_electron", value=9.10938188e-31) # kg ds.node_model(device=device, region=region, name="meff_elec", equation="1.0903*mass_electron") ds.node_model(device=device, region=region, name="meff_hole", equation="1.1525*mass_electron") ds.node_model(device=device, region=region, name="b_n", equation="(1e4*Gamman*hbar^2)/(q*6*meff_elec)") # eV*cm^2 ds.node_model(device=device, region=region, name="b_p", equation="(1e4*Gammap*hbar^2)/(q*6*meff_hole)") # eV*cm^2 # Oxide # #ds.node_model(device=device, region=region, name="b_nox", equation="1e-100") # eV*cm^2 ds.node_model( device=device, region=region, name="b_nox", equation="1e4*Gammanox*hbar^2/(6*q*0.14*mass_electron)") # eV*cm^2 ds.node_model( device=device, region=region, name="b_pox", equation="1e4*Gammapox*hbar^2/(6*q*1.0*mass_electron)") # eV*cm^2 #ds.node_model(device=device, region=region, name="b_nox", equation="10*hbar^2/(6*q*0.14*mass_electron)") # eV*cm^2 #ds.node_model(device=device, region=region, name="b_pox", equation="10*hbar^2/(6*q*0.14*mass_electron)") # eV*cm^2 #ds.node_model(device=device, region=region, name="b_nox", equation="(1e4*Gammanox*hbar^2)/(q*6*meff_elec)") # eV*cm^2 #ds.node_model(device=device, region=region, name="b_pox", equation="(1e4*Gammapox*hbar^2)/(q*6*meff_hole)") # eV*cm^2 ds.node_model(device=device, region=region, name="x_np", equation="1e2*hbar/(2*0.4*mass_electron*q*3.15)^0.5") # cm ds.node_model(device=device, region=region, name="x_pp", equation="1e2*hbar/(2*0.4*mass_electron*q*4.50)^0.5") # cm #const PetscScalar b_nox = hbar*hbar/(6*e*0.14*me); #const PetscScalar b_pox = hbar*hbar/(6*e*1.0*me); #const PetscScalar bn = mt->band->Gamman()*hbar*hbar/(6*e*mt->band->EffecElecMass(T)); #const PetscScalar bp = mt->band->Gammap()*hbar*hbar/(6*e*mt->band->EffecHoleMass(T)); # const PetscScalar x_np = hbar/sqrt(2*0.4*me*3.15*eV); # const PetscScalar x_pp = hbar/sqrt(2*0.4*me*4.50*eV); # eV = 1.602176462e-19*J; # e = 1.602176462e-19*C; # ELECMASS = 1.0903*me; # HOLEMASS = 1.1525*me; # # Edge Integration # em = ( ("b_n", "b_ne", "arithmetic", ()), ("b_p", "b_pe", "arithmetic", ()), ) for e in em: ds.edge_average_model(device=device, region=region, node_model=e[0], edge_model=e[1], average_type=e[2]) for d in e[3]: ds.edge_average_model(device=device, region=region, node_model=e[0], edge_model=e[1], average_type=e[2], derivative=d)
device="MyDevice" region="MyRegion" # basic linear circuit solved by itself devsim.circuit_element(name="V1", n1=1, n2=0, value=1.0) devsim.circuit_element(name="R1", n1=1, n2="cnode1", value=5.0) devsim.circuit_element(name="R2", n1="cnode1", n2=0, value=5.0) devsim.solve(type="dc", absolute_error=1.0, relative_error=1e-14, maximum_iterations=3) devsim.circuit_alter(name="V1", value=2.0) devsim.solve(type="dc", absolute_error=1.0, relative_error=1e-14, maximum_iterations=30) test_common.CreateSimpleMesh(device, region) devsim.node_model(device=device, region=region, name="erf", equation="erf(x);") devsim.print_node_values(device=device, region=region, name="erf") devsim.node_model(device=device, region=region, name="d_erf_dx", equation="diff(erf(x),x);") devsim.print_node_values(device=device, region=region, name="d_erf_dx") devsim.node_model(device=device, region=region, name="erfc", equation="erfc(x);") devsim.print_node_values(device=device, region=region, name="erfc") devsim.node_model(device=device, region=region, name="d_erfc_dx", equation="diff(erfc(x),x);") devsim.print_node_values(device=device, region=region, name="d_erfc_dx") devsim.node_model(device=device, region=region, name="d_abs_dx", equation="diff(abs(x),x);") devsim.print_node_values(device=device, region=region, name="d_abs_dx") devsim.set_parameter(name="param", value=-1.0) devsim.node_model(device=device, region=region, name="deptest", equation="param;") devsim.print_node_values(device=device, region=region, name="deptest") devsim.set_parameter(name="param", value=1.0)
def createSiliconDriftDiffusion(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", edge_model="PotentialEdgeFlux", variable_update="log_damp") createBernoulli(device, region) createElectronCurrent(device, region) createHoleCurrent(device, region) NCharge = "-ElectronCharge * Electrons" dNChargedn = "-ElectronCharge" devsim.node_model(device=device, region=region, name="NCharge", equation=NCharge) devsim.node_model(device=device, region=region, name="NCharge:Electrons", equation=dNChargedn) PCharge = "-ElectronCharge * Holes" dPChargedp = "-ElectronCharge" devsim.node_model(device=device, region=region, name="PCharge", equation=PCharge) devsim.node_model(device=device, region=region, name="PCharge:Holes", equation=dPChargedp) ni = devsim.get_parameter(device=device, region=region, name="n_i") devsim.set_parameter(device=device, region=region, name="n1", value=ni) devsim.set_parameter(device=device, region=region, name="p1", value=ni) devsim.set_parameter(device=device, region=region, name="taun", value=1e-5) devsim.set_parameter(device=device, region=region, name="taup", value=1e-5) USRH = "-ElectronCharge*(Electrons*Holes - n_i^2)/(taup*(Electrons + n1) + taun*(Holes + p1))" dUSRHdn = "simplify(diff(%s, Electrons))" % USRH dUSRHdp = "simplify(diff(%s, Holes))" % USRH devsim.node_model(device=device, region=region, name="USRH", equation=USRH) devsim.node_model(device=device, region=region, name="USRH:Electrons", equation=dUSRHdn) devsim.node_model(device=device, region=region, name="USRH:Holes", equation=dUSRHdp) 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")
devsim.add_2d_interface(mesh="mos", name="gate_oxide", region0="gate", region1="oxide") devsim.add_2d_interface(mesh="mos", name="bulk_oxide", region0="bulk", region1="oxide") devsim.finalize_mesh(mesh="mos") devsim.create_device(mesh="mos", device=device) format_dict= { 'gate_doping' : gate_doping, 'source_doping' : source_doping, 'drain_doping' : drain_doping, 'body_doping' : body_doping, 'bulk_doping' : bulk_doping, 'x_gate_left' : x_gate_left, 'x_gate_right' : x_gate_right, 'x_diffusion_decay' : x_diffusion_decay, 'y_diffusion' : y_diffusion, 'y_diffusion_decay' : y_diffusion_decay, 'y_bulk_bottom' : y_bulk_bottom, } devsim.node_model(name="NetDoping" , device=device, region="gate", equation="%(gate_doping)s" % format_dict) devsim.node_model(name="DrainDoping" , device=device, region="bulk", equation="0.25*%(drain_doping)s*erfc((x-%(x_gate_left)s)/%(x_diffusion_decay)s)*erfc((y-%(y_diffusion)s)/%(y_diffusion_decay)s)" % format_dict) devsim.node_model(name="SourceDoping", device=device, region="bulk", equation="0.25*%(source_doping)s*erfc(-(x-%(x_gate_right)s)/%(x_diffusion_decay)s)*erfc((y-%(y_diffusion)s)/%(y_diffusion_decay)s)" % format_dict) devsim.node_model(name="BodyDoping", device=device, region="bulk", equation="0.5*%(body_doping)s*erfc(-(y-%(y_bulk_bottom)s)/%(y_diffusion_decay)s)" % format_dict) devsim.node_model(name="NetDoping" , device=device, region="bulk", equation="DrainDoping + SourceDoping + %(bulk_doping)s + BodyDoping" % format_dict) devsim.write_devices( file="mos_2d", type="vtk") devsim.write_devices( file="mos_2d.flps", type="floops")
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")
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, region=region_si, name="edge_volume_term", equation="del_log_p2*EdgeNodeVolume") ds.node_model(device=device, region=region_si, name="volume_term", equation="Lh_eqn*NodeVolume") else:
devsim.add_2d_region( mesh="dog", material="gas", region="gas2", yl=1.0, yh=1.001) devsim.add_2d_region( mesh="dog", material="Oxide", region="r0", xl=xmin, xh=xmax, yl=ymid1, yh=ymin) devsim.add_2d_region( mesh="dog", material="Silicon", region="r1", xl=xmin, xh=xmax, yl=ymid2, yh=ymid1) devsim.add_2d_region( mesh="dog", material="Silicon", region="r2", xl=xmin, xh=xmax, yl=ymid2, yh=ymax) #warn when leftover triangles are not encapsulated by region # not specifying bounding box means all intersecting nodes #bounding box is optional devsim.add_2d_interface( mesh="dog", name="i0", region0="r0", region1="r1") devsim.add_2d_interface( mesh="dog", name="i1", region0="r1", region1="r2", xl=0, xh=1, yl=ymid2, yh=ymid2, bloat=1.0e-10) devsim.add_2d_contact( mesh="dog", name="top", region="r0", yl=ymin, yh=ymin, bloat=1.0e-10, material="metal") devsim.add_2d_contact( mesh="dog", name="bot", region="r2", yl=ymax, yh=ymax, bloat=1.0e-10, material="metal") #contact can only apply interface devsim.finalize_mesh( mesh="dog") devsim.create_device(mesh="dog", device=device) devsim.node_model(device=device, name="NetDoping", region="gas1", equation="1e18") devsim.node_model(device=device, name="NetDoping", region="r0", equation="1e18") devsim.node_model(device=device, name="NetDoping", region="r1", equation="-1e15") devsim.node_model(device=device, name="NetDoping", region="r2", equation="-1e15") devsim.node_model(device=device, name="NetDoping", region="gas2", equation="-1e15") devsim.interface_normal_model(device=device, region="r0", interface="i0") devsim.interface_normal_model(device=device, region="r1", interface="i0") devsim.interface_normal_model(device=device, region="r1", interface="i1") devsim.interface_normal_model(device=device, region="r2", interface="i1") devsim.set_parameter(name="raxis_zero", value=0.0) devsim.set_parameter(name="raxis_variable", value="x") for region in ("r0", "r1", "r2"): devsim.cylindrical_node_volume( device=device, region=region)
### Create the bulk equation ### devsim.equation(device=device, region=region, name="PotentialEquation", variable_name="Potential", edge_model="DField", variable_update="default") # the topbias is a circuit node, and we want to prevent it from being overridden by a parameter devsim.set_parameter(device=device, region=region, name="botbias", value=0.0) for name, equation in ( ("topnode_model", "Potential - topbias"), ("topnode_model:Potential", "1"), ("topnode_model:topbias", "-1"), ("botnode_model", "Potential - botbias"), ("botnode_model:Potential", "1"), ): devsim.node_model(device=device, region=region, name=name, equation=equation) # attached to circuit node devsim.contact_equation(device=device, contact="top", name="PotentialEquation", variable_name="Potential", node_model="topnode_model", edge_charge_model="DField", circuit_node="topbias") # attached to ground devsim.contact_equation(device=device, contact="bot", name="PotentialEquation", variable_name="Potential", node_model="botnode_model", edge_charge_model="DField") # # Voltage source # devsim.circuit_element(name="V1", n1=1, n2=0, value=1.0, acreal=1.0) devsim.circuit_element(name="R1", n1="topbias", n2=1, value=1e3) #
# See the License for the specific language governing permissions and # limitations under the License. #Purpose: Fermi integral and inverse import devsim import test_common device = "MyDevice" region = "MyRegion" test_common.CreateSimpleMesh(device, region) devsim.set_parameter(name="Nc", value=1e22) devsim.node_model(device=device, region=region, name="Electrons", equation="2e15*(1 - x) + 1e10;") devsim.node_model(device=device, region=region, name="r", equation="Electrons/Nc;") devsim.node_model(device=device, region=region, name="Eta", equation="InvFermi(r);") devsim.node_model(device=device, region=region, name="r2", equation="Fermi(Eta);") devsim.node_model(device=device,