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()