Source code for pycalculix.components
"""This module defines the Component class, which is used to make components.
Components are collections that loads are applied to.
"""
from . import base_classes
from . import geometry
[docs]class Component(base_classes.Idobj):
"""Makes a component to store loads, boundary conditions, matl, thickness.
A component must store a list of items where the type is identical for
all items.
Args:
item_list (list): list of items to store
ctype (str): type of component. Options:
- 'nodes': all element nodes (corner and mid-side)
- 'n1': element corner nodes
- 'faces': faces
- 'elements': elements
cname (str): component name
"""
def __init__(self, item_list, ctype, cname=''):
self.items = item_list
self.ctype = ctype
self.name = cname+'_'+ctype
base_classes.Idobj.__init__(self)
def __eq__(self, other):
""" Returns bool telling if self == other."""
if isinstance(other, Component):
if self.items == other.items and self.ctype == other.ctype:
return True
return False
else:
return False
def __hash__(self):
"""Returns a hash of self instance."""
return self.id
[docs] def set_name(self, name):
"""Set the component name to the passed name.
Args:
name (str): passed name, component name is changed to this
"""
self.name = name
[docs] def get_name(self):
"""Returns the component name created with its id number."""
return 'C'+str(self.id)
[docs] def get_children(self):
"""Returns a list the child ctype items of the current component."""
res = []
for i in self.items:
children = getattr(i, self.ctype)
if isinstance(children, list):
res += children
else:
res += [children]
return res
[docs] def ccx(self):
"""Writes a component for Calculix ccx solver.
Returns a list strings, where each item is a line to write
to a Calculix .inp text file.
Note:
Only node and element components should use this.
"""
res = []
items_per_line = 6
firstline = ''
if self.ctype == 'nodes':
# node component, displacement
firstline = '*NSET,NSET='+self.name
elif self.ctype == 'elements':
# element component, materials
firstline = '*ELSET,ELSET='+self.name
elif self.ctype == 'faces':
# face component, contact surface
firstline = '*SURFACE,NAME=%s,TYPE=ELEMENT' % self.name
res.append(firstline)
items = self.get_children()
if self.ctype == 'faces':
for face in items:
enum = face.element.id
fnum = face.id
res.append("%i,S%i" % (enum, fnum))
elif self.ctype in ['nodes', 'elements']:
grouped_items = base_classes.chunk_list(items, items_per_line)
for group in grouped_items:
item_ids = [str(x.id) for x in group]
line = ', '.join(item_ids)
if group != grouped_items[-1]:
line += ','
res.append(line)
return res
[docs] def write_cgx(self):
"""Writes a component for Calculix cgx prerocessor.
Returns a list strings, where each item is a line to write
to a Calculix .fbd text file.
Note:
Only line and point node components should use this.
"""
res = []
# set the type of component
parent = 'l'
if (isinstance(self.items[0], geometry.Line) or
isinstance(self.items[0], geometry.Arc)):
parent = 'l'
elif isinstance(self.items[0], geometry.Point):
parent = 'p'
# pull the list of entities
alist = ' '.join([a.get_name() for a in self.items])
if self.ctype == 'n1':
# write component of line element first order nodes
res.append('seta '+self.name+' '+parent+' '+alist)
elif self.ctype == 'nodes':
res.append('seta '+self.name+' '+parent+' '+alist)
res.append('comp '+self.name+' do')
# write component of all line element nodes
elif self.ctype == 'f':
# write component of line element faces
res.append('seta '+self.name+' '+parent+' '+alist)
res.append('comp '+self.name+' do')
res.append('comp '+self.name+' do')
return res
[docs] def write_gmsh(self):
"""Writes a component for gmsh mesher.
Returns a list strings, where each item is a line to write
to a Calculix .geo text file.
Note:
Only line and point node components should use this.
"""
res = []
# set the type of component
parent = 'l'
if (isinstance(self.items[0], geometry.Line) or
isinstance(self.items[0], geometry.Arc)):
parent = 'l'
elif isinstance(self.items[0], geometry.Point):
parent = 'p'
# pull the list of entities
alist = ','.join([str(a.id) for a in self.items])
line = ''
if parent == 'l':
line = "Physical Line('"+self.name+"') = {" + alist + '};'
elif parent == 'p':
line = "Physical Point('"+self.name+"') = {" + alist + '};'
res.append(line)
return res