From a8d261f2711453ce10172a6e64c43ffc4921018d Mon Sep 17 00:00:00 2001 From: Jesusbill Date: Tue, 14 Jul 2020 21:48:54 +0200 Subject: [PATCH] add zero-length springs for point connections and connection-to-member --- src/ifc2ca/scriptCodeAster.py | 118 +++++++++++++++++++++++++++++----- src/ifc2ca/scriptSalome.py | 30 ++++++--- 2 files changed, 122 insertions(+), 26 deletions(-) diff --git a/src/ifc2ca/scriptCodeAster.py b/src/ifc2ca/scriptCodeAster.py index 59e1f99063..8c8a8ca233 100644 --- a/src/ifc2ca/scriptCodeAster.py +++ b/src/ifc2ca/scriptCodeAster.py @@ -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'] diff --git a/src/ifc2ca/scriptSalome.py b/src/ifc2ca/scriptSalome.py index 64df3a0f80..3679e609e8 100644 --- a/src/ifc2ca/scriptSalome.py +++ b/src/ifc2ca/scriptSalome.py @@ -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']