127 lines
3.4 KiB
Python
127 lines
3.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2013 DEVSIM LLC
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
##Title: cap1.py
|
|
##Purpose: Simple example for 1D capacitor
|
|
from devsim import (
|
|
add_1d_contact,
|
|
add_1d_mesh_line,
|
|
add_1d_region,
|
|
contact_equation,
|
|
create_1d_mesh,
|
|
create_device,
|
|
edge_from_node_model,
|
|
edge_model,
|
|
equation,
|
|
finalize_mesh,
|
|
get_contact_charge,
|
|
get_parameter,
|
|
node_model,
|
|
node_solution,
|
|
set_parameter,
|
|
solve,
|
|
)
|
|
|
|
|
|
device_info = {"device": "MyDevice"}
|
|
region_info = device_info
|
|
region_info["region"] = "MyRegion"
|
|
|
|
# print region_info
|
|
device = "MyDevice"
|
|
region = "MyRegion"
|
|
|
|
create_1d_mesh(mesh="dog")
|
|
for p, s, t in ((0.0, 0.1, "top"), (1.0, 0.1, "bot")):
|
|
add_1d_mesh_line(mesh="dog", pos=p, ps=s, tag=t)
|
|
|
|
for t in ("top", "bot"):
|
|
add_1d_contact(mesh="dog", name=t, material="metal", tag=t)
|
|
|
|
add_1d_region(mesh="dog", material="Si", region=region, tag1="top", tag2="bot")
|
|
finalize_mesh(mesh="dog")
|
|
create_device(mesh="dog", device=device)
|
|
|
|
# for i in get_device_list():
|
|
# print i
|
|
|
|
|
|
set_parameter(name="Permittivity", value=(3.9 * 8.85e-14), **region_info)
|
|
set_parameter(name="ElectricCharge", value=1.6e-19, **region_info)
|
|
|
|
print((get_parameter(name="Permittivity", **region_info)))
|
|
print((get_parameter(name="ElectricCharge", **region_info)))
|
|
|
|
node_solution(name="ψ", **region_info)
|
|
edge_from_node_model(node_model="ψ", **region_info)
|
|
|
|
for n, e in (
|
|
("ElectricField", "(ψ@n0 - ψ@n1)*EdgeInverseLength;"),
|
|
("ElectricField:ψ@n0", "EdgeInverseLength;"),
|
|
("ElectricField:ψ@n1", "-EdgeInverseLength;"),
|
|
):
|
|
edge_model(name=n, equation=e, **region_info)
|
|
|
|
set_parameter(name="topbias", value=1.0e-0, **region_info)
|
|
set_parameter(name="botbias", value=0.0, **region_info)
|
|
|
|
for n, e in (
|
|
("ψEdgeFlux", "Permittivity*ElectricField;"),
|
|
("ψEdgeFlux:ψ@n0", "diff(Permittivity*ElectricField, ψ@n0);"),
|
|
("ψEdgeFlux:ψ@n1", "-ψEdgeFlux:ψ@n0;"),
|
|
):
|
|
edge_model(name=n, equation=e, **region_info)
|
|
|
|
equation(
|
|
name="ψEquation",
|
|
variable_name="ψ",
|
|
node_model="",
|
|
edge_model="ψEdgeFlux",
|
|
time_node_model="",
|
|
variable_update="default",
|
|
**region_info,
|
|
)
|
|
|
|
conteq = "Permittivity*ElectricField;"
|
|
node_model(name="topnode_model", equation="ψ - topbias;", **region_info)
|
|
node_model(name="topnode_model:ψ", equation="1;", **region_info)
|
|
edge_model(name="contactcharge_edge_top", equation=conteq, **region_info)
|
|
|
|
node_model(name="botnode_model", equation="ψ - botbias;", **region_info)
|
|
node_model(name="botnode_model:ψ", equation="1;", **region_info)
|
|
edge_model(name="contactcharge_edge_bottom", equation=conteq, **region_info)
|
|
|
|
contact_equation(
|
|
device=device,
|
|
contact="top",
|
|
name="ψEquation",
|
|
node_model="topnode_model",
|
|
edge_model="",
|
|
node_charge_model="",
|
|
edge_charge_model="contactcharge_edge_top",
|
|
node_current_model="",
|
|
edge_current_model="",
|
|
)
|
|
|
|
contact_equation(
|
|
device=device,
|
|
contact="bot",
|
|
name="ψEquation",
|
|
node_model="botnode_model",
|
|
edge_model="",
|
|
node_charge_model="",
|
|
edge_charge_model="contactcharge_edge_bottom",
|
|
node_current_model="",
|
|
edge_current_model="",
|
|
)
|
|
|
|
|
|
solve(type="dc", absolute_error=1.0, relative_error=1e-10, maximum_iterations=30)
|
|
|
|
print((get_contact_charge(device=device, contact="top", equation="ψEquation")))
|
|
print((get_contact_charge(device=device, contact="bot", equation="ψEquation")))
|
|
|
|
# write_devices(file='cap1.msh', type='devsim')
|