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 *
 17import exudyn
 18import numpy as np
 19from exudyn.utilities import * #includes itemInterface and rigidBodyUtilities
 20import exudyn.graphics as graphics
 21
 22SC = exu.SystemContainer()
 23mbs = SC.AddSystem()
 24
 25useGraphics = False
 26
 27nBodies = 8
 28nBodies2 = 4#3
 29
 30bodyMarkerList=[]
 31for j in range(nBodies2): 
 32    body = mbs.AddObject({'objectType': 'Ground', 'referencePosition': [0,j,0]})
 33    mbs.AddMarker({'markerType': 'BodyPosition',  'bodyNumber': body,  'localPosition': [0.0, 0.0, 0.0], 'bodyFixed': False})
 34    for i in range(nBodies-1): 
 35        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.],})
 36        body = mbs.AddObject({'objectType': 'MassPoint', 'mass': 10, 'nodeNumber': node})
 37        mBody = mbs.AddMarker({'markerType': 'BodyPosition',  'bodyNumber': body,  'localPosition': [0.0, 0.0, 0.0], 'bodyFixed': False})
 38        bodyMarkerList += [mBody]
 39
 40#add spring-dampers:
 41springList=[]
 42for j in range(nBodies2-1): 
 43    for i in range(nBodies-1): 
 44        nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 45                        'referenceLength':1, 'markerNumbers': [j*nBodies + i,j*nBodies + i+1]})
 46        springList += [nSpring]
 47        nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 48                        'referenceLength':1, 'markerNumbers': [j*nBodies + i,(j+1)*nBodies + i]})
 49        springList += [nSpring]
 50        #diagonal spring: l*sqrt(2)
 51        nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 52                        'referenceLength':sqrt2, 'markerNumbers': [j*nBodies + i,(j+1)*nBodies + i+1]})
 53        springList += [nSpring]
 54
 55for i in range(nBodies-1): 
 56    j = nBodies2-1
 57    nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 58                            'referenceLength':1, 'markerNumbers': [j*nBodies + i,j*nBodies + i+1]})
 59    springList += [nSpring]
 60for j in range(nBodies2-1): 
 61    i = nBodies-1
 62    nSpring = mbs.AddObject({'objectType': 'ConnectorSpringDamper', 'stiffness': 4000, 'damping': 10, 'force': 0,
 63                            'referenceLength':1, 'markerNumbers': [j*nBodies + i,(j+1)*nBodies + i]})
 64    springList += [nSpring]
 65
 66#add loads:
 67#mbs.AddLoad({'loadType': 'ForceVector',  'markerNumber': nBodies*nBodies2-1,  'loadVector': [0, -50*2, 0]})
 68for marker in bodyMarkerList:
 69    mbs.AddLoad({'loadType': 'ForceVector',  'markerNumber': marker,  'loadVector': [0, -16, 0]})
 70
 71#add constraints for testing:
 72nGround = mbs.AddNode(NodePointGround(referenceCoordinates=[-0.5,0,0])) #ground node for coordinate constraint
 73mGround = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber = nGround, coordinate=0)) #Ground node ==> no action
 74
 75
 76mbs.Assemble()
 77
 78if useGraphics: 
 79 SC.renderer.Start()
 80
 81simulationSettings = exu.SimulationSettings()
 82simulationSettings.timeIntegration.numberOfSteps = 20
 83simulationSettings.timeIntegration.endTime = 0.005
 84simulationSettings.timeIntegration.verboseMode = 0
 85simulationSettings.timeIntegration.newton.useModifiedNewton = True
 86
 87simulationSettings.timeIntegration.generalizedAlpha.useNewmark = True
 88simulationSettings.timeIntegration.generalizedAlpha.useIndex2Constraints = True
 89
 90SC.visualizationSettings.nodes.defaultSize = 0.05
 91SC.visualizationSettings.openGL.multiSampling = 4
 92
 93nSteps = 10
 94if useGraphics: 
 95    nSteps = 800
 96
 97for i in range(nSteps): #1000
 98    # print('iteration '+str(i)+':')
 99    mbs.SolveDynamic(simulationSettings, solverType = exudyn.DynamicSolverType.DOPRI5)
100
101    for spring in springList:
102        dist = mbs.GetObjectOutput(spring, exu.OutputVariableType.Distance)
103        force = np.linalg.norm(mbs.GetObjectOutput(spring, exu.OutputVariableType.Force))
104
105        dist0= mbs.GetObjectParameter(spring, 'referenceLength')
106        #print('spring '+str(spring)+' length = ' + str(dist) + ', elongation = ' + str(dist-dist0))
107        #print('spring '+str(spring)+' force = ' + str(force))
108        
109        if force > 400:
110            # if mbs.GetObjectParameter(spring, 'activeConnector'):
111            #     print('BREAK spring '+str(spring))
112            mbs.SetObjectParameter(spring, 'activeConnector', False)
113            mbs.SetObjectParameter(spring, 'Vshow', False)
114
115    u = mbs.systemData.GetODE2Coordinates()
116    v = mbs.systemData.GetODE2Coordinates_t()
117    mbs.systemData.SetODE2Coordinates(u,configuration = exu.ConfigurationType.Initial)
118    mbs.systemData.SetODE2Coordinates_t(v,configuration = exu.ConfigurationType.Initial)
119
120u = mbs.GetNodeOutput(nBodies-2, exu.OutputVariableType.Position) #tip node
121print('dynamic tip displacement (y)=', u[1])
122
123if useGraphics: 
124    SC.renderer.DoIdleTasks()
125    SC.renderer.Stop()