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