def run(): test_opts = { "filename": "moscap2d.msh", "device": "MyDevice", "region_ox": "MyOxRegion", "region_si": "MySiRegion", "interface_siox": "MySiOx", "contact_ox": "top", "contact_si": "bot", "ox_material": "Ox", "si_material": "Si" } instantiate(**test_opts) ds.write_devices(file="moscap2d_devsim.msh", type="devsim") ds.write_devices(file="moscap2d.tec", type="tecplot")
createSiliconDriftDiffusion(device, "bulk") createSiliconDriftDiffusionAtContact(device, "bulk", "drain") createSiliconDriftDiffusionAtContact(device, "bulk", "source") createSiliconDriftDiffusionAtContact(device, "bulk", "body") devsim.solve(type="dc", absolute_error=1.0e30, relative_error=1e-5, maximum_iterations=30) devsim.element_from_edge_model(edge_model="ElectricField", device=device, region="bulk") devsim.write_devices(file="mos_2d_dd.msh", type="devsim") def format_value(value): if isinstance(value, str): ret = '"%s"' % value elif isinstance(value, float): ret = "%g" % value else: ret = value return ret with open("mos_2d_params.py", "w") as ofh: ofh.write('import devsim\n') for p in devsim.get_parameter_list():
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) devsim.cylindrical_edge_couple( device=device, region=region) devsim.cylindrical_surface_area( device=device, region=region) devsim.write_devices(file="mesh2d.flps", type="floops") devsim.write_devices(file="mesh2d.msh", type="devsim") devsim.write_devices(file="mesh2d.dat", type="tecplot")
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")
rvx = "V1.I_ElectronContinuityEquation_real_gradx" ivx = "V1.I_ElectronContinuityEquation_imag_gradx" rvy = "V1.I_ElectronContinuityEquation_real_grady" ivy = "V1.I_ElectronContinuityEquation_imag_grady" for name, equation in ( ("noisesource", "4*ElectronCharge^2 * ThermalVoltage * mu_n * Electrons"), ("vfield", "(%(rvx)s*%(rvx)s+%(ivx)s*%(ivx)s) + (%(rvy)s*%(rvy)s+%(ivy)s*%(ivy)s)" % { "rvx": rvx, "rvy": rvy, "ivx": ivx, "ivy": ivy }), ("noise", "vfield * noisesource * NodeVolume"), ): devsim.node_model(device=device, region=region, name=name, equation=equation) print( sum( devsim.get_node_model_values(device=device, region=region, name="noise"))) devsim.write_devices(file="noise_res_2d.flps", type="floops")
# # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #### Plan is to use this file for full restart, including equations import devsim device = "mymos" devsim.load_devices(file="mos_2d_dd.msh") import mos_2d_params devsim.set_parameter(name="debug_level", value="info") devsim.set_parameter(device=device, region="gate", name="debug_level", value="verbose") devsim.solve(type="dc", absolute_error=1.0e30, relative_error=1e-5, maximum_iterations=30) devsim.write_devices(file="mos_2d_restart2.msh", type="devsim") #set_parameter -device mymos -region gate -name gatebias -value 0.1 #solve -type dc -absolute_error 1.0e30 -relative_error 1e-9 -maximum_iterations 30
# Copyright 2013 Devsim LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import devsim devsim.load_devices(file="mesh2.msh") devsim.write_devices(file="mesh3.msh", type="devsim_data", device="MyDevice")
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")
qdict['Holes'] = numpy.array( ds.get_node_model_values(device=device, region=region_si, name="IntrinsicHoles")) qdict['Potential'] = numpy.array( ds.get_node_model_values(device=device, 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 ds.write_devices(file='myresult.tec', type='tecplot') # ##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': # edge_model(device=device, region=region_si, name="surface_term", equation="del_log_n1*EdgeCouple") # edge_model(device=device, region=region_si, name="edge_volume_term", equation="del_log_n2*EdgeNodeVolume") # node_model(device=device, region=region_si, name="volume_term", equation="Le_eqn*NodeVolume") #elif carrier_var == 'Holes': # edge_model(device=device, region=region_si, name="surface_term", equation="del_log_p1*EdgeCouple") # edge_model(device=device, region=region_si, name="edge_volume_term", equation="del_log_p2*EdgeNodeVolume") # node_model(device=device, region=region_si, name="volume_term", equation="Lh_eqn*NodeVolume") #else: # raise RuntimeError("Unknown Carrier Type") #
equation=equation) dio2_element_physics.createPotentialOnly(device, region) dio2_element_physics.createPotentialOnlyContact(device, region, "top") dio2_element_physics.createPotentialOnlyContact(device, region, "bot") #### #### Initial DC solution #### devsim.solve(type="dc", absolute_error=1.0, relative_error=1e-12, maximum_iterations=30) devsim.write_devices(file="dio2_element_2d_potentialonly.flps", type="floops") #### #### drift diffusion #### dio2_element_physics.createSolution(device, region, "Electrons") dio2_element_physics.createSolution(device, region, "Holes") #### #### create initial guess from dc only solution #### devsim.set_node_values(device=device, region=region, name="Electrons", init_from="IntrinsicElectrons") devsim.set_node_values(device=device,
# Copyright 2013 Devsim LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import devsim devsim.load_devices(file="mesh3.msh") devsim.write_devices(file="mesh4.msh", type="devsim_data")