add zero-length springs for point connections and connection-to-member

This commit is contained in:
Jesusbill
2020-07-14 21:48:54 +02:00
parent 6c22894a93
commit a8d261f271
2 changed files with 122 additions and 26 deletions
+102 -16
View File
@@ -1,5 +1,8 @@
import json
import numpy as np
import itertools
flatten = itertools.chain.from_iterable
class COMMANDFILE:
def __init__(self, dataFilename, asterFilename):
@@ -32,6 +35,7 @@ class COMMANDFILE:
conn = [c for c in connections if c['ifcName'] == rel['relatedConnection']][0]
if conn['geometryType'] == 'point':
rel['groupName'] = self.getGroupName(rel['relatingElement']) + '_0DC_' + self.getGroupName(rel['relatedConnection'])
rel['springGroupName'] = self.getGroupName(rel['relatingElement']) + '_1DS_' + self.getGroupName(rel['relatedConnection'])
self.calculateConstraints(rel)
conn['relatedElements'].append(rel)
# End <--
@@ -42,6 +46,7 @@ class COMMANDFILE:
edgeGroupNames = tuple([self.getGroupName(el['ifcName']) for el in elements if el['geometryType'] == 'line'])
faceGroupNames = tuple([self.getGroupName(el['ifcName']) for el in elements if el['geometryType'] == 'surface'])
point0DGroupNames = tuple([self.getGroupName(el['ifcName']) for el in connections if el['geometryType'] == 'point'])
spring1DGroupNames = tuple(flatten([[rel['springGroupName'] for rel in el['connections']] for el in elements]))
unifiedConnection = False
rigidLinkGroupNames = []
@@ -138,7 +143,7 @@ model = AFFE_MODELE(
),'''
context = {
'groupNames': point0DGroupNames
'groupNames': tuple(flatten([point0DGroupNames, spring1DGroupNames]))
}
f.write(template.format(**context))
@@ -347,16 +352,36 @@ element = AFFE_CARA_ELEM(
_F(
GROUP_MA = '{groupName}',
CARA = 'K_TR_D_N',
VALE = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
VALE = {stiffnesses},
REPERE = 'LOCAL'
),'''
context = {
'groupName': self.getGroupName(conn['ifcName'])
'groupName': self.getGroupName(conn['ifcName']),
'stiffnesses': conn['stiffnesses']
}
f.write(template.format(**context))
for rel in conn['relatedElements']:
template = \
'''
_F(
GROUP_MA = '{groupName}',
CARA = 'K_TR_D_L',
VALE = {stiffnesses},
REPERE = 'LOCAL'
),'''
context = {
'groupName': rel['springGroupName'],
'stiffnesses': rel['stiffnesses']
}
f.write(template.format(**context))
f.write(
'''
),'''
@@ -401,6 +426,23 @@ element = AFFE_CARA_ELEM(
f.write(template.format(**context))
for rel in conn['relatedElements']:
template = \
'''
_F(
GROUP_MA = '{groupName}',
CARA = 'VECT_X_Y',
VALE = {localAxesXY}
),'''
context = {
'groupName': rel['springGroupName'],
'localAxesXY': tuple(rel['orientation'][0] + rel['orientation'][1])
}
f.write(template.format(**context))
f.write(
'''
),'''
@@ -517,7 +559,8 @@ liaisons = AFFE_CHAR_MECA(
f.write(
'''
)'''
)
'''
)
template = \
@@ -664,6 +707,7 @@ FIN()
'coeffs': [],
'dofs': []
}
stiffnesses = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
if not rel['appliedCondition']:
rel['appliedCondition'] = {
'dx': True,
@@ -673,26 +717,45 @@ FIN()
'dry': True,
'drz': True
}
if rel['appliedCondition']['dx']:
if isinstance(rel['appliedCondition']['dx'], bool) and rel['appliedCondition']['dx']:
liaisons['coeffs'].append((o[0][0], o[1][0], o[2][0], -o[0][0], -o[1][0], -o[2][0]))
liaisons['dofs'].append(('DX', 'DY', 'DZ', 'DX', 'DY', 'DZ'))
if rel['appliedCondition']['dy']:
elif isinstance(rel['appliedCondition']['dx'], float) and rel['appliedCondition']['dx'] > 0:
stiffnesses[0] = rel['appliedCondition']['dx']
if isinstance(rel['appliedCondition']['dy'], bool) and rel['appliedCondition']['dy']:
liaisons['coeffs'].append((o[0][1], o[1][1], o[2][1], -o[0][1], -o[1][1], -o[2][1]))
liaisons['dofs'].append(('DX', 'DY', 'DZ', 'DX', 'DY', 'DZ'))
if rel['appliedCondition']['dz']:
elif isinstance(rel['appliedCondition']['dy'], float) and rel['appliedCondition']['dy'] > 0:
stiffnesses[1] = rel['appliedCondition']['dy']
if isinstance(rel['appliedCondition']['dz'], bool) and rel['appliedCondition']['dz']:
liaisons['coeffs'].append((o[0][2], o[1][2], o[2][2], -o[0][2], -o[1][2], -o[2][2]))
liaisons['dofs'].append(('DX', 'DY', 'DZ', 'DX', 'DY', 'DZ'))
if rel['appliedCondition']['drx']:
elif isinstance(rel['appliedCondition']['dz'], float) and rel['appliedCondition']['dz'] > 0:
stiffnesses[2] = rel['appliedCondition']['dz']
if isinstance(rel['appliedCondition']['drx'], bool) and rel['appliedCondition']['drx']:
liaisons['coeffs'].append((o[0][0], o[1][0], o[2][0], -o[0][0], -o[1][0], -o[2][0]))
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ', 'DRX', 'DRY', 'DRZ'))
if rel['appliedCondition']['dry']:
elif isinstance(rel['appliedCondition']['drx'], float) and rel['appliedCondition']['drx'] > 0:
stiffnesses[3] = rel['appliedCondition']['drx']
if isinstance(rel['appliedCondition']['dry'], bool) and rel['appliedCondition']['dry']:
liaisons['coeffs'].append((o[0][1], o[1][1], o[2][1], -o[0][1], -o[1][1], -o[2][1]))
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ', 'DRX', 'DRY', 'DRZ'))
if rel['appliedCondition']['drz']:
elif isinstance(rel['appliedCondition']['dry'], float) and rel['appliedCondition']['dry'] > 0:
stiffnesses[4] = rel['appliedCondition']['dry']
if isinstance(rel['appliedCondition']['drz'], bool) and rel['appliedCondition']['drz']:
liaisons['coeffs'].append((o[0][2], o[1][2], o[2][2], -o[0][2], -o[1][2], -o[2][2]))
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ', 'DRX', 'DRY', 'DRZ'))
elif isinstance(rel['appliedCondition']['drz'], float) and rel['appliedCondition']['drz'] > 0:
stiffnesses[5] = rel['appliedCondition']['drz']
rel['liaisons'] = liaisons
rel['stiffnesses'] = tuple(stiffnesses)
def calculateRestraints(self, conn):
group = self.getGroupName(conn['ifcName'])
@@ -702,28 +765,51 @@ FIN()
'coeffs': [],
'dofs': []
}
stiffnesses = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
if not conn['appliedCondition']:
conn['liaisons'] = liaisons
conn['stiffnesses'] = tuple(stiffnesses)
return
if conn['appliedCondition']['dx']:
if isinstance(conn['appliedCondition']['dx'], bool) and conn['appliedCondition']['dx']:
liaisons['coeffs'].append((o[0][0], o[1][0], o[2][0]))
liaisons['dofs'].append(('DX', 'DY', 'DZ'))
if conn['appliedCondition']['dy']:
elif isinstance(conn['appliedCondition']['dx'], float) and conn['appliedCondition']['dx'] > 0:
stiffnesses[0] = conn['appliedCondition']['dx']
if isinstance(conn['appliedCondition']['dy'], bool) and conn['appliedCondition']['dy']:
liaisons['coeffs'].append((o[0][1], o[1][1], o[2][1]))
liaisons['dofs'].append(('DX', 'DY', 'DZ'))
if conn['appliedCondition']['dz']:
elif isinstance(conn['appliedCondition']['dy'], float) and conn['appliedCondition']['dy'] > 0:
stiffnesses[1] = conn['appliedCondition']['dy']
if isinstance(conn['appliedCondition']['dz'], bool) and conn['appliedCondition']['dz']:
liaisons['coeffs'].append((o[0][2], o[1][2], o[2][2]))
liaisons['dofs'].append(('DX', 'DY', 'DZ'))
if conn['appliedCondition']['drx']:
elif isinstance(conn['appliedCondition']['dz'], float) and conn['appliedCondition']['dz'] > 0:
stiffnesses[2] = conn['appliedCondition']['dz']
if isinstance(conn['appliedCondition']['drx'], bool) and conn['appliedCondition']['drx']:
liaisons['coeffs'].append((o[0][0], o[1][0], o[2][0]))
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ'))
if conn['appliedCondition']['dry']:
elif isinstance(conn['appliedCondition']['drx'], float) and conn['appliedCondition']['drx'] > 0:
stiffnesses[3] = conn['appliedCondition']['drx']
if isinstance(conn['appliedCondition']['dry'], bool) and conn['appliedCondition']['dry']:
liaisons['coeffs'].append((o[0][1], o[1][1], o[2][1]))
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ'))
if conn['appliedCondition']['drz']:
elif isinstance(conn['appliedCondition']['dry'], float) and conn['appliedCondition']['dry'] > 0:
stiffnesses[4] = conn['appliedCondition']['dry']
if isinstance(conn['appliedCondition']['drz'], bool) and conn['appliedCondition']['drz']:
liaisons['coeffs'].append((o[0][2], o[1][2], o[2][2]))
liaisons['dofs'].append(('DRX', 'DRY', 'DRZ'))
elif isinstance(conn['appliedCondition']['drz'], float) and conn['appliedCondition']['drz'] > 0:
stiffnesses[5] = conn['appliedCondition']['drz']
conn['liaisons'] = liaisons
conn['stiffnesses'] = tuple(stiffnesses)
if __name__ == '__main__':
fileNames = ['cantilever_01', 'portal_01']
+20 -10
View File
@@ -1,3 +1,5 @@
from __future__ import division
from __future__ import print_function
import os
import time
import json
@@ -5,7 +7,6 @@ import salome
import salome_notebook
import salome_version
import numpy as np
from pprint import pprint
class MODEL:
def __init__(self, dataFilename, medFilename, meshSize):
@@ -141,7 +142,7 @@ class MODEL:
### Define entities ###
start_time = time.time()
pprint('Defining Object Geometry')
print('Defining Object Geometry')
init_time = start_time
# Loop 1
@@ -202,7 +203,7 @@ class MODEL:
elapsed_time = time.time() - init_time
init_time += elapsed_time
pprint('Building Geometry Defined in %g sec' % (elapsed_time))
print('Building Geometry Defined in %g sec' % (elapsed_time))
if len([e for e in elements if e['geometryType'] == 'line']) > 0:
buildingShapeType = 'EDGE'
@@ -242,7 +243,7 @@ class MODEL:
elapsed_time = time.time() - init_time
init_time += elapsed_time
pprint('Building Geometry Groups Defined in %g sec' % (elapsed_time))
print('Building Geometry Groups Defined in %g sec' % (elapsed_time))
###
### SMESH component
@@ -251,7 +252,7 @@ class MODEL:
import SMESH
from salome.smesh import smeshBuilder
pprint('Defining Mesh Components')
print('Defining Mesh Components')
if NEW_SALOME:
smesh = smeshBuilder.New()
@@ -287,7 +288,7 @@ class MODEL:
elapsed_time = time.time() - init_time
init_time += elapsed_time
pprint('Meshing Operations Completed in %g sec' % (elapsed_time))
print('Meshing Operations Completed in %g sec' % (elapsed_time))
# Define and add groups for all curve and surface members
if len([e for e in elements if e['geometryType'] == 'line']) > 0:
@@ -310,6 +311,7 @@ class MODEL:
for j,rel in enumerate(el['connections']):
tempgroup = bldMesh.GroupOnGeom(el['connObjs'][j], self.getGroupName(el['ifcName']) + '_0DC_' + self.getGroupName(rel['relatedConnection']), SMESH.NODE)
smesh.SetName(tempgroup, self.getGroupName(el['ifcName']) + '_0DC_' + self.getGroupName(rel['relatedConnection']))
rel['node'] = (bldMesh.GetIDSource(tempgroup.GetNodeIDs(), SMESH.NODE)).GetIDs()[0]
# if rel['eccentricity']:
# tempgroup = bldMesh.GroupOnGeom(el['linkObjs'][j], self.getGroupName(el['ifcName']) + '_1DC_' + self.getGroupName(rel['relatedConnection']), SMESH.EDGE)
# smesh.SetName(tempgroup, self.getGroupName(el['ifcName']) + '_1DC_' + self.getGroupName(rel['relatedConnection']))
@@ -321,13 +323,22 @@ class MODEL:
nodesId = bldMesh.GetIDSource(tempgroup.GetNodeIDs(), SMESH.NODE)
tempgroup = bldMesh.Add0DElementsToAllNodes(nodesId, self.getGroupName(conn['ifcName']))
smesh.SetName(tempgroup, self.getGroupName(conn['ifcName']))
conn['node'] = nodesId.GetIDs()[0]
# create 1D SEG2 spring elements
for el in elements:
for j,rel in enumerate(el['connections']):
grpName = bldMesh.CreateEmptyGroup(SMESH.EDGE, self.getGroupName(el['ifcName']) + '_1DS_' + self.getGroupName(rel['relatedConnection']))
smesh.SetName(grpName, self.getGroupName(el['ifcName']) + '_1DS_' + self.getGroupName(rel['relatedConnection']))
conn = [conn for conn in connections if conn['ifcName'] == rel['relatedConnection']][0]
grpName.Add([bldMesh.AddEdge([conn['node'], rel['node']])])
self.mesh = bldMesh
self.meshNodes = bldMesh.GetNodesId()
elapsed_time = time.time() - init_time
init_time += elapsed_time
pprint('Mesh Groups Defined in %g sec' % (elapsed_time))
print('Mesh Groups Defined in %g sec' % (elapsed_time))
try:
if NEW_SALOME:
@@ -342,7 +353,7 @@ class MODEL:
else:
bldMesh.ExportMED(self.medFilename, 0, SMESH.MED_V2_2, 1, None, 0)
except:
pprint('ExportMED() failed. Invalid file name?')
print('ExportMED() failed. Invalid file name?')
if salome.sg.hasDesktop():
if NEW_SALOME:
@@ -350,9 +361,8 @@ class MODEL:
else:
salome.sg.updateObjBrowser(1)
elapsed_time = init_time - start_time
pprint('ALL Operations Completed in %g sec' % (elapsed_time))
print('ALL Operations Completed in %g sec' % (elapsed_time))
if __name__ == '__main__':
fileNames = ['cantilever_01', 'portal_01']