springsDeactivateConnectors.py

You can view and download this file on Github: springsDeactivateConnectors.py

  1#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2# This is an EXUDYN example
  3#
  4# Details:  Test with spring dampers and 'activeConnector';
  5#           short-time simulations are performed and herafter, springs are deactivated
  6#           based on the size of the spring-damper force
  7#
  8# Author:   Johannes Gerstmayr
  9# Date:     2019-11-22
 10#
 11# Copyright:This file is part of Exudyn. Exudyn is free software. You can redistribute it and/or modify it under the terms of the Exudyn license. See 'LICENSE.txt' for more details.
 12#
 13#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 14
 15import exudyn as exu
 16from exudyn.itemInterface import *
 17from exudyn.utilities import *
 18
 19SC = exu.SystemContainer()
 20mbs = SC.AddSystem()
 21
 22nBodies = 8
 23nBodies2 = 4#3
 24
 25bodyMarkerList=[]
 26for j in range(nBodies2):
 27    body = mbs.AddObject({'objectType': 'Ground', 'referencePosition': [0,j,0]})
 28    mbs.AddMarker({'markerType': 'BodyPosition',  'bodyNumber': body,  'localPosition': [0.0, 0.0, 0.0], 'bodyFixed': False})
 29    for i in range(nBodies-1):
 30        node = mbs.AddNode({'nodeType': 'Point','referenceCoordinates': [i+1, j, 0.0],'initialCoordinates': [(i+1)*0.05*0, 0.0, 0.0], 'initialVelocities': [0., 0., 0.],})
 31        body = mbs.AddObject({'objectType': 'MassPoint', 'physicsMass': 10, 'nodeNumber': node})
 32        mBody = mbs.AddMarker({'markerType': 'BodyPosition',  'bodyNumber': body,  'localPosition': [0.0, 0.0, 0.0], 'bodyFixed': False})
 33        bodyMarkerList += [mBody]
 34
 35#add spring-dampers:
 36springList=[]
 37for j in range(nBodies2-1):
 38    for i in range(nBodies-1):
 39        nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 40                        'referenceLength':1, 'markerNumbers': [j*nBodies + i,j*nBodies + i+1]})
 41        springList += [nSpring]
 42        nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 43                        'referenceLength':1, 'markerNumbers': [j*nBodies + i,(j+1)*nBodies + i]})
 44        springList += [nSpring]
 45        #diagonal spring: l*sqrt(2)
 46        nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 47                        'referenceLength':sqrt2, 'markerNumbers': [j*nBodies + i,(j+1)*nBodies + i+1]})
 48        springList += [nSpring]
 49
 50for i in range(nBodies-1):
 51    j = nBodies2-1
 52    nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 53                            'referenceLength':1, 'markerNumbers': [j*nBodies + i,j*nBodies + i+1]})
 54    springList += [nSpring]
 55for j in range(nBodies2-1):
 56    i = nBodies-1
 57    nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 58                            'referenceLength':1, 'markerNumbers': [j*nBodies + i,(j+1)*nBodies + i]})
 59    springList += [nSpring]
 60
 61#add loads:
 62#mbs.AddLoad({'loadType': 'ForceVector',  'markerNumber': nBodies*nBodies2-1,  'loadVector': [0, -50*2, 0]})
 63for marker in bodyMarkerList:
 64    mbs.AddLoad({'loadType': 'ForceVector',  'markerNumber': marker,  'loadVector': [0, -16, 0]})
 65
 66#add constraints for testing:
 67nGround = mbs.AddNode(NodePointGround(referenceCoordinates=[-0.5,0,0])) #ground node for coordinate constraint
 68mGround = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber = nGround, coordinate=0)) #Ground node ==> no action
 69
 70
 71mbs.Assemble()
 72
 73exu.StartRenderer()
 74
 75simulationSettings = exu.SimulationSettings()
 76simulationSettings.timeIntegration.numberOfSteps = 20
 77simulationSettings.timeIntegration.endTime = 0.005
 78simulationSettings.timeIntegration.verboseMode = 0
 79simulationSettings.timeIntegration.newton.useModifiedNewton = True
 80
 81simulationSettings.timeIntegration.generalizedAlpha.useNewmark = True
 82simulationSettings.timeIntegration.generalizedAlpha.useIndex2Constraints = True
 83
 84SC.visualizationSettings.nodes.defaultSize = 0.05
 85SC.visualizationSettings.openGL.multiSampling = 4
 86
 87for i in range(800): #1000
 88    print('iteration '+str(i)+':')
 89    mbs.SolveDynamic(simulationSettings, solverType = exudyn.DynamicSolverType.DOPRI5)
 90
 91    for spring in springList:
 92        dist = mbs.GetObjectOutput(spring, exu.OutputVariableType.Distance)
 93        force = NormL2(mbs.GetObjectOutput(spring, exu.OutputVariableType.Force))
 94
 95        dist0= mbs.GetObjectParameter(spring, 'referenceLength')
 96        #print('spring '+str(spring)+' length = ' + str(dist) + ', elongation = ' + str(dist-dist0))
 97        #print('spring '+str(spring)+' force = ' + str(force))
 98
 99        if force > 400:
100            if mbs.GetObjectParameter(spring, 'activeConnector'):
101                print('BREAK spring '+str(spring))
102            mbs.SetObjectParameter(spring, 'activeConnector', False)
103            mbs.SetObjectParameter(spring, 'Vshow', False)
104
105    u = mbs.systemData.GetODE2Coordinates()
106    v = mbs.systemData.GetODE2Coordinates_t()
107    mbs.systemData.SetODE2Coordinates(u,configuration = exu.ConfigurationType.Initial)
108    mbs.systemData.SetODE2Coordinates_t(v,configuration = exu.ConfigurationType.Initial)
109
110u = mbs.GetNodeOutput(nBodies-2, exu.OutputVariableType.Position) #tip node
111print('dynamic tip displacement (y)=', u[1])
112
113SC.WaitForRenderEngineStopFlag()
114exu.StopRenderer()