Files
tcad-devsim_triac/physics/model_create.py
T

184 lines
7.6 KiB
Python
Raw Normal View History

# 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.
from devsim import *
debug = False
def CreateSolution(device, region, name):
'''
Creates solution variables
As well as their entries on each edge
'''
node_solution(name=name, device=device, region=region)
edge_from_node_model(node_model=name, device=device, region=region)
def CreateNodeModel(device, region, model, expression):
'''
Creates a node model
'''
result=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 CreateNodeModelDerivative(device, region, model, expression, *vars):
'''
Create a node model derivative
'''
for v in vars:
CreateNodeModel(device, region,
"{m}:{v}".format(m=model, v=v),
"diff({e},{v})".format(e=expression, v=v))
#"simplify(diff({e},{v}))".format(e=expression, v=v))
def CreateContactNodeModel(device, contact, model, expression):
'''
Creates a contact node model
'''
result=contact_node_model(device=device, contact=contact, name=model, equation=expression)
if debug:
print(("CONTACTNODEMODEL {d} {c} {m} \"{re}\"".format(d=device, c=contact, m=model, re=result)))
def CreateContactNodeModelDerivative(device, contact, model, expression, variable):
'''
Creates a contact node model derivative
'''
CreateContactNodeModel(device, contact,
"{m}:{v}".format(m=model, v=variable),
"diff({e}, {v})".format(e=expression, v=variable))
#"simplify(diff({e}, {v}))".format(e=expression, v=variable))
def CreateEdgeModel (device, region, model, expression):
'''
Creates an edge model
'''
result=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 CreateEdgeModelDerivatives(device, region, model, expression, variable):
'''
Creates edge model derivatives
'''
CreateEdgeModel(device, region,
"{m}:{v}@n0".format(m=model, v=variable),
"diff({e}, {v}@n0)".format(e=expression, v=variable))
#"simplify(diff({e}, {v}@n0))".format(e=expression, v=variable))
CreateEdgeModel(device, region,
"{m}:{v}@n1".format(m=model, v=variable),
"diff({e}, {v}@n1)".format(e=expression, v=variable))
#"simplify(diff({e}, {v}@n1))".format(e=expression, v=variable))
def CreateContactEdgeModel(device, contact, model, expression):
'''
Creates a contact edge model
'''
result=contact_edge_model(device=device, contact=contact, name=model, equation=expression)
if debug:
print(("CONTACTEDGEMODEL {d} {c} {m} \"{re}\"".format(d=device, c=contact, m=model, re=result)))
def CreateContactEdgeModelDerivative(device, contact, model, expression, variable):
'''
Creates contact edge model derivatives with respect to variable on node
'''
CreateContactEdgeModel(device, contact, "{m}:{v}".format(m=model, v=variable), "diff({e}, {v})".format(e=expression, v=variable))
#CreateContactEdgeModel(device, contact, "{m}:{v}".format(m=model, v=variable), "simplify(diff({e}, {v}))".format(e=expression, v=variable))
def CreateInterfaceModel(device, interface, model, expression):
'''
Creates a interface node model
'''
result=interface_model(device=device, interface=interface, name=model, equation=expression)
if debug:
print(("INTERFACEMODEL {d} {i} {m} \"{re}\"".format(d=device, i=interface, m=model, re=result)))
#def CreateInterfaceModelDerivative(device, interface, model, expression, variable):
# '''
# Creates interface edge model derivatives with respect to variable on node
# '''
# CreateInterfaceModel(device, interface, "{m}:{v}".format(m=model, v=variable), "simplify(diff({e}, {v}))".format(e=expression, v=variable))
def CreateContinuousInterfaceModel(device, interface, variable):
mname = "continuous{0}".format(variable)
meq = "{0}@r0 - {0}@r1".format(variable)
mname0 = "{0}:{1}@r0".format(mname, variable)
mname1 = "{0}:{1}@r1".format(mname, variable)
CreateInterfaceModel(device, interface, mname, meq)
CreateInterfaceModel(device, interface, mname0, "1")
CreateInterfaceModel(device, interface, mname1, "-1")
return mname
def InEdgeModelList(device, region, model):
'''
Checks to see if this edge model is available on device and region
'''
return model in get_edge_model_list(device=device, region=region)
def InNodeModelList(device, region, model):
'''
Checks to see if this node model is available on device and region
'''
return model in get_node_model_list(device=device, region=region)
#### Make sure that the model exists, as well as it's node model
def EnsureEdgeFromNodeModelExists(device, region, nodemodel):
'''
Checks if the edge models exists
'''
if not InNodeModelList(device, region, nodemodel):
raise "{} must exist"
emlist = get_edge_model_list(device=device, region=region)
emtest = ("{0}@n0".format(nodemodel) and "{0}@n1".format(nodemodel))
if not emtest:
if debug:
print("INFO: Creating ${0}@n0 and ${0}@n1".format(nodemodel))
edge_from_node_model(device=device, region=region, node_model=nodemodel)
def CreateElementModel2d(device, region, model, expression):
result=element_model(device=device, region=region, name=model, equation=expression)
if debug:
print(("ELEMENTMODEL {d} {r} {m} \"{re}\"".format(d=device, r=region, m=model, re=result)))
def CreateElementModelDerivative2d(device, region, model_name, expression, *args):
if len(args) == 0:
raise ValueError("Must specify a list of variable names")
for i in args:
for j in ("@en0", "@en1", "@en2"):
CreateElementModel2d(device, region, "{0}:{1}{2}".format(model_name, i, j), "diff({0}, {1}{2})".format(expression, i, j))
### edge_model is the name of the edge model to be created
def CreateGeometricMean(device, region, nmodel, emodel):
edge_average_model(device=device, region=region, edge_model=emodel, node_model=nmodel, average_type="geometric")
def CreateGeometricMeanDerivative(device, region, nmodel, emodel, *args):
if len(args) == 0:
raise ValueError("Must specify a list of variable names")
for i in args:
edge_average_model(device=device, region=region, edge_model=emodel, node_model=nmodel,
derivative=i, average_type="geometric")
def CreateArithmeticMean(device, region, nmodel, emodel):
edge_average_model(device=device, region=region, edge_model=emodel, node_model=nmodel, average_type="arithmetic")
def CreateArithmeticMeanDerivative(device, region, nmodel, emodel, *args):
if len(args) == 0:
raise ValueError("Must specify a list of variable names")
for i in args:
edge_average_model(device=device, region=region, edge_model=emodel, node_model=nmodel,
derivative=i, average_type="arithmetic")