Skip to content
Snippets Groups Projects
Commit bef512cf authored by whimsial's avatar whimsial
Browse files

updated assembly

The ipMTs and connectors are properly assigned and physically linked.
parent ababb9fc
Branches
No related tags found
No related merge requests found
...@@ -63,9 +63,17 @@ def generate_partition_points(z, MTname, **kwargs): ...@@ -63,9 +63,17 @@ def generate_partition_points(z, MTname, **kwargs):
def position_connectors(pos1, pos2, z, connectornames, alpha, **kwargs): def position_connectors(pos1, pos2, z, connectornames, alpha, **kwargs):
"""
Position connectors on the associated ipMT by z coordinate
:param pos1: (x, y, zBeginPos, zEndPos, l) -> coordinates of the first mt of the pair
:param pos2: (x, y, zBeginPos, zEndPos, l) -> coordinates of the second mt of the pair
:param z: list connector positions
:param connectornames: list connector names
:param alpha: float orientation of connectors
:param kwargs: dictionary -> keyword arguments
:return: global coordinates of connectors between a pair of ipMTs
"""
a = ah.return_assembly(**kwargs) a = ah.return_assembly(**kwargs)
# Position connectors # Position connectors
x0 = pos1[0] x0 = pos1[0]
x1 = pos2[0] x1 = pos2[0]
...@@ -90,117 +98,60 @@ def position_connectors(pos1, pos2, z, connectornames, alpha, **kwargs): ...@@ -90,117 +98,60 @@ def position_connectors(pos1, pos2, z, connectornames, alpha, **kwargs):
return z_global return z_global
def pick_vertices(ConnectorData, mtname, data, **kwargs): def pick_vertices(mtname, data, **kwargs):
"""
Pick the connecting ends of all conectors associated with the current ipMT
:param mtname: string name of the ipMT
:param data: list containing all ipMTs and connectors of the model
:param kwargs: dictionary -> keyword arguments
:return: list -> connecting vertices that belong to connectors associated with the current ipMT
"""
a = return_assembly(**kwargs) a = return_assembly(**kwargs)
ConnectorDataSorted1 = sorted(ConnectorData.items(), key=lambda x: x[1][1][2]) # Store name, end_id and position of connectors attached to each ipMT
ConnectorDataSorted2 = sorted(ConnectorData.items(), key=lambda x: x[1][3][2]) connector_data = []
mt_list = []
for sublist in data: for sublist in data:
if mtname == sublist[0]: if mtname == sublist[0]:
mt_list.append(sublist) connector_data.append([a.instances[sublist[1]].vertices[sublist[3]],
sublist[3],
mt_list_sorted = sorted(mt_list, key=lambda tup: tup[2]) a.instances[sublist[1]].vertices[sublist[3]].pointOn])
connector_points = []
for sublist in mt_list_sorted:
connectorname = sublist[1]
connector_end_index = sublist[3]
connector_points.append(a.instances[connectorname].vertices[connector_end_index])
mt_points = [] # Sort connectors by position
for i in range(1, len(mt_list_sorted)-1): if int(mtname[-1]) % 2 == 0: # if ipMT is right
mt_points.append(a.instances[mtname].vertices[i]) connector_data.sort(key=lambda tup: tup[2])
else: # else ipMT is left
connector_data.sort(key=lambda tup: tup[2], reverse=True)
return mt_points, connector_points return connector_data
def attach_connectors(ConnectorData, data, **kwargs): def attach_connectors(data, **kwargs):
"""
Creates attachment wire between two vertexes and defined the properties of connection
:param data: list containing all ipMTs and connectors of the model
:param kwargs: dictionary -> keyword arguments
:return: Null
"""
a = return_assembly(**kwargs) a = return_assembly(**kwargs)
a.regenerate() a.regenerate()
# Create connector section # Create connector section
modelname = kwargs['modelname'] modelname = kwargs['modelname']
mdb.models[modelname].ConnectorSection(name='ConnSect', assembledType=BEAM) mdb.models[modelname].ConnectorSection(name='ConnSect', assembledType=BEAM)
# Loop over all ipMTs and then over all connectors on a selected ipMT # Iterate through unique ipMT names
for sublist in data: mt_names = [sublist[0] for sublist in data]
mtname = sublist[0] mt_names = set(mt_names)
print("MT NAME") for mtname in mt_names:
print(mtname) # Return all connectors associated with the current ipMT
mt_points, connector_points = pick_vertices( connector_data = pick_vertices(
ConnectorData, mtname, data, **kwargs) mtname, data, **kwargs)
# Return all points on the current ipMT
for i in range(len(mt_points)): mtdata = a.instances[mtname].vertices
# Create wired connection between each point on ipMT and each end of the adjacent connector # Link points of ipMT with connector ends
for index, vertex in enumerate(mtdata[1:-1]):
a.WirePolyLine( a.WirePolyLine(
points=((mt_points[i], connector_points[i]),), points=((vertex, connector_data[index][0]),),
mergeType=IMPRINT, meshable=False) mergeType=IMPRINT, meshable=False)
e1 = a.edges e1 = a.edges
edges1 = e1.getSequenceFromMask(mask=('[#1 ]',), ) edges1 = e1.getSequenceFromMask(mask=('[#1 ]',), )
a.Set(edges=edges1, name='Wire-' + mtname + str(i)) a.Set(edges=edges1, name='Wire-' + mtname + str(index))
region1 = mdb.models[modelname].rootAssembly.sets['Wire-' + mtname + str(i)] region1 = mdb.models[modelname].rootAssembly.sets['Wire-' + mtname + str(index)]
csa = a.SectionAssignment(sectionName='ConnSect', region=region1) csa = a.SectionAssignment(sectionName='ConnSect', region=region1)
# for index, connector in enumerate(ConnectorData):
# # Connector instance attached to the first MT
# end1 = a.instances[connector].vertices[0]
# # Connector instance attached to the second MT
# end2 = a.instances[connector].vertices[1]
# # First ipMT of the pair
# cord1 = ConnectorData[connector][1]
# print(cord1)
# v1 = a.instances[ConnectorData[connector][0]].vertices.getClosest(
# coordinates=((cord1[0], cord1[1], cord1[3]), ))
# # Second ipMT of the pair
# cord2 = ConnectorData[connector][3]
# v2 = a.instances[ConnectorData[connector][2]].vertices.getClosest(
# coordinates=((cord2[0], cord2[1], cord2[3]), ))
# a = mdb.models[modelname].rootAssembly
# a.WirePolyLine(points=((end1, v1),), mergeType=IMPRINT, meshable=False)
# e1 = a.edges
# edges1 = e1.getSequenceFromMask(mask=('[#1 ]',), )
# a.Set(edges=edges1, name='Wire-1-' + str(index))
# region1 = mdb.models[modelname].rootAssembly.sets['Wire-1-' + str(index)]
# csa = a.SectionAssignment(sectionName='ConnSect', region=region1)
# # Create connector to ipMT-2 connection
# a = mdb.models[modelname].rootAssembly
# a.WirePolyLine(points=((end2, v2),), mergeType=IMPRINT, meshable=False)
# edges2 = e1.getSequenceFromMask(mask=('[#1 ]',), )
# a.Set(edges=edges2, name='Wire-2-' + str(index))
# region2 = mdb.models[modelname].rootAssembly.sets['Wire-2-' + str(index)]
# csa = a.SectionAssignment(sectionName='ConnSect', region=region2)
def connect_nodes(MTname1, MTname2, connectorname, i, modelname, a, MTnumber):
"""
Connect node on selected ipMT with a corresponding node of a connector
:param MTname1: name of the 1-st ipMT of the pair
:param MTname2: name of the 2-nd ipMT of the pair
:param connectorname: name of connector
:param i: inde of connector
:param modelname: name of the current mdb model
:param a: current assembly object
:param MTnumber: 0 or 1: number of ipMT in a pair.
:return:
"""
# Create wire linking connector node with partition point on 1-st ipMT
if MTnumber == 0:
MTname = MTname1
ConnectionRegion = 'Wire-' + MTname1 + '-' + MTname2 + '-' + str(i)
SectionName = MTname1 + '-' + MTname2 + '-' + str(i)
elif MTnumber == 1:
MTname = MTname2
ConnectionRegion = 'Wire-' + MTname2 + '-' + MTname1 + '-' + str(i)
SectionName = MTname2 + '-' + MTname1 + '-' + str(i)
else:
raise ValueError('Only 0 and 1 are acceptable as ipMT numbers of a pair')
v1 = a.instances[MTname].vertices
v2 = a.instances[connectorname].vertices
a.WirePolyLine(points=((v1[i + 1], v2[MTnumber]),), mergeType=IMPRINT, meshable=False)
# Create connection region
a = mdb.models[modelname].rootAssembly
e1 = a.edges
edges1 = e1.getSequenceFromMask(mask=('[#1 ]',), )
a.Set(edges=edges1, name=ConnectionRegion)
region = mdb.models[modelname].rootAssembly.sets[ConnectionRegion]
csa = a.SectionAssignment(sectionName=SectionName,
region=region)
from abaqus import * from abaqus import *
from abaqusConstants import * from abaqusConstants import *
import sys import sys
from numpy import ones
from SpindleAssembly.PositionComponents import assign_aMT from SpindleAssembly.PositionComponents import assign_aMT
from SpindleAssembly.PositionConnectors import attach_connectors from SpindleAssembly.PositionConnectors import attach_connectors
...@@ -56,7 +59,7 @@ def add_and_position_interpolar_mts_and_connectors(**kwargs): ...@@ -56,7 +59,7 @@ def add_and_position_interpolar_mts_and_connectors(**kwargs):
:return: MTdata -> (dictionary) Contains ipMT names, positions and connector positions :return: MTdata -> (dictionary) Contains ipMT names, positions and connector positions
""" """
MTdata, ConnectorData, data = assign_ipMTs(**kwargs) MTdata, ConnectorData, data = assign_ipMTs(**kwargs)
attach_connectors(ConnectorData, data, **kwargs) attach_connectors(data, **kwargs)
kwargs.update(dict(MTdata=MTdata, ConnectorData=ConnectorData)) kwargs.update(dict(MTdata=MTdata, ConnectorData=ConnectorData))
return MTdata, kwargs return MTdata, kwargs
...@@ -84,6 +87,10 @@ def assign_ipMTs(**kwargs): ...@@ -84,6 +87,10 @@ def assign_ipMTs(**kwargs):
# Create ipMTs: # Create ipMTs:
NipMTs = kwargs['ipMTnumber'] NipMTs = kwargs['ipMTnumber']
# MTids = ones(NipMTs)
if NipMTs >= 1: if NipMTs >= 1:
MTname1, pos1, alpha1, kwargs = PositionIpMTs.add_first_ipMT(i=0, **kwargs) MTname1, pos1, alpha1, kwargs = PositionIpMTs.add_first_ipMT(i=0, **kwargs)
...@@ -109,7 +116,11 @@ def assign_ipMTs(**kwargs): ...@@ -109,7 +116,11 @@ def assign_ipMTs(**kwargs):
ConnectorData.update({name: [MTname1, (pos1[0], pos1[1], z12[index], z12_global[index]), ConnectorData.update({name: [MTname1, (pos1[0], pos1[1], z12[index], z12_global[index]),
MTname2, (pos2[0], pos2[1], z21[index], z21_global[index])]}) MTname2, (pos2[0], pos2[1], z21[index], z21_global[index])]})
data.append([MTname1, name, (pos1[0], pos1[1], z12_global[index]), 0]) data.append([MTname1, name, (pos1[0], pos1[1], z12_global[index]), 0])
# data.append({'MT_name': MTname1, 'Con_name': name, 'Con_pointId': 0, 'MT_pointId': MTids[0],
# 'pointCoordinate' : (pos1[0], pos1[1], z12_global[index])})
data.append([MTname2, name, (pos2[0], pos2[1], z21_global[index]), 1]) data.append([MTname2, name, (pos2[0], pos2[1], z21_global[index]), 1])
# MTids[0] += 1
# MTids[1] += 1
if NipMTs >= 3: if NipMTs >= 3:
MTname3, pos3, alpha3, kwargs = PositionIpMTs.add_third_ipMT( MTname3, pos3, alpha3, kwargs = PositionIpMTs.add_third_ipMT(
...@@ -202,6 +213,7 @@ def assign_ipMTs(**kwargs): ...@@ -202,6 +213,7 @@ def assign_ipMTs(**kwargs):
# Create partitions that correspond to connector attachment sites # Create partitions that correspond to connector attachment sites
# TODO: Think if it is possible to use lists instead of dictionaries for simplicity # TODO: Think if it is possible to use lists instead of dictionaries for simplicity
# TODO: Resolve issue with indexing
MTpoints = {} MTpoints = {}
for i in range(len(MTdata['MTnames'])): for i in range(len(MTdata['MTnames'])):
MTpoints.update({str(i+1): []}) MTpoints.update({str(i+1): []})
...@@ -215,11 +227,11 @@ def assign_ipMTs(**kwargs): ...@@ -215,11 +227,11 @@ def assign_ipMTs(**kwargs):
kwargs = {'x' : 0, 'y': 0, 'index': 0, 'modelname': 'test', 'assembly': 0, 'CentrosomeRadius': 0.06, kwargs = {'x' : 0, 'y': 0, 'index': 0, 'modelname': 'test', 'assembly': 0, 'CentrosomeRadius': 0.06,
'CentrosomeLength': 0.12, 'CentrosomeE': 1500000000.0, 'CentrosomeNu': 0.3, 'ipMTnumber': 3, 'CentrosomeLength': 0.12, 'CentrosomeE': 1500000000.0, 'CentrosomeNu': 0.3, 'ipMTnumber': 6,
'lengthInterval' : [2, 6], 'r1': 0.015, 'r2': 0.025, 'ElasticModulus': 1500000000.0, 'PoissonRatio': 0.3, 'lengthInterval' : [2, 6], 'r1': 0.015, 'r2': 0.025, 'ElasticModulus': 1500000000.0, 'PoissonRatio': 0.3,
'spindleLength' : 10, 'Nconnectors': 5, 'connectorRadius': 0.005, 'connectorE': 1500000000., 'spindleLength' : 10, 'Nconnectors': 5, 'connectorRadius': 0.005, 'connectorE': 1500000000.,
'connectorNu' : 0.3, 'aMTnumber': 50, 'aMTlength': 2, 'springStiffness': 10, 'connectorNu' : 0.3, 'aMTnumber': 50, 'aMTlength': 2, 'springStiffness': 10,
'StepName' : 'Standard_Buckling', 'CompressiveLoad': 1, 'JobName': 'Job-1'} 'StepName' : 'Standard_Buckling', 'CompressiveLoad': 1, 'JobName': 'Job-1'}
''' Call model functions ''' ''' Call model functions '''
generate_assembly(**kwargs) # generate_assembly(**kwargs)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment