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