Skip to content

Latest commit

 

History

History
137 lines (105 loc) · 5.44 KB

pendulum.rst

File metadata and controls

137 lines (105 loc) · 5.44 KB

pendulum.py

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

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This is an EXUDYN example
#
# Details:  Mathematical pendulum with constraint or spring-damper;
#           Remark: uses old style definition of items
#
# Author:   Johannes Gerstmayr
# Date:     2019-08-15
#
# 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

import time #for sleep()
SC = exu.SystemContainer()
mbs = SC.AddSystem()

nBodies = 2

L = 0.8 #distance


#phi = -0.7853981633974483 #-np.pi/8*2
n1=mbs.AddNode({'nodeType': 'Point',
                'referenceCoordinates': [L,0,0],
                'initialCoordinates':   [0,0,0]})
                #'initialCoordinates':   [-0.23431457505076192, -0.565685424949238, 0]})
                #'initialCoordinates':   [-(L-L*np.cos(phi)),L*np.sin(phi),0]})

Lo=L*0.3 #graphics
mass = 2.5
g = 9.81
graphics1 = {'type':'Line', 'color':[0.1,0.1,0.8,1], 'data':[-(L+Lo),-(L+Lo),0, (L+Lo),-(L+Lo),0, (L+Lo),Lo,0, -(L+Lo),Lo,0, -(L+Lo),-(L+Lo), 0]} #background

#add mass points and ground object:
mbs.AddObject({'objectType': 'Ground', 'referencePosition': [0,0,0], 'VgraphicsData': [graphics1]})
mbs.AddObject({'objectType': 'MassPoint', 'physicsMass': mass, 'nodeNumber': n1, 'VdrawSize':0.05*L})

#add markers (needed for connectors and loads):
for i in range(nBodies): mbs.AddMarker({'markerType': 'BodyPosition',  'bodyNumber': i,  'localPosition': [0.0, 0.0, 0.0], 'bodyFixed': False})

k = 4000 #spring stiffness
d = 200  #damping coefficient

useConstraint = False
if useConstraint:
    mbs.AddObject({'objectType': 'ConnectorDistance',
                   'distance': L,
                   'markerNumbers': [0,1],
                   'drawSize': 0.01,
                   'color': [1,0,0,1]})
else:
    mbs.AddObject({'objectType': 'ConnectorSpringDamper',
                   'stiffness': k,
                   'damping': d,
                   'force': 0,
                   'referenceLength':L,
                   'markerNumbers': [0,1],
                   'drawSize': 0.05})
#add loads:
#mbs.AddLoad({'loadType': 'ForceVector',  'markerNumber': nBodies-1,  'loadVector': [0, 20, 0]}) #gives 20N tension in Distance constraint
mbs.AddLoad({'loadType': 'ForceVector',  'markerNumber': nBodies-1,  'loadVector': [0, -mass*g, 0]}) #gives approx. 0.001 deformation in x-direction

print(mbs)

mbs.Assemble()
exu.StartRenderer()

#time.sleep(10)

simulationSettings = exu.SimulationSettings()

computeDynamic = True
if computeDynamic:
    f = 4400000
    simulationSettings.timeIntegration.numberOfSteps = 1*f
    simulationSettings.timeIntegration.endTime = 0.005*f
    simulationSettings.solutionSettings.writeSolutionToFile = True
    simulationSettings.solutionSettings.solutionWritePeriod = simulationSettings.timeIntegration.endTime/5000
    simulationSettings.displayComputationTime = True
    simulationSettings.timeIntegration.verboseMode = 1

    simulationSettings.timeIntegration.newton.relativeTolerance = 1e-8
    simulationSettings.timeIntegration.newton.absoluteTolerance = 1e-10
    simulationSettings.timeIntegration.newton.useModifiedNewton = False
    simulationSettings.timeIntegration.newton.numericalDifferentiation.minimumCoordinateSize = 1
    simulationSettings.timeIntegration.newton.numericalDifferentiation.relativeEpsilon = 6.055454452393343e-06 #eps^(1/3)
    # simulationSettings.timeIntegration.generalizedAlpha.useIndex2Constraints = True
    simulationSettings.displayStatistics = True

    SC.visualizationSettings.nodes.showNumbers = True
    SC.visualizationSettings.bodies.showNumbers = True
    #mbs.visualizationSettings.connectors.showNumbers = True
    SC.visualizationSettings.nodes.defaultSize = 0.05

    exu.InfoStat()
    mbs.SolveDynamic(simulationSettings,
                     solverType=exu.DynamicSolverType.TrapezoidalIndex2)
    exu.InfoStat()

else:
    simulationSettings.solutionSettings.coordinatesSolutionFileName = "staticSolution.txt"
    simulationSettings.solutionSettings.appendToFile = False
    simulationSettings.staticSolver.newton.numericalDifferentiation.relativeEpsilon = 1e-4
    #simulationSettings.staticSolver.newton.relativeTolerance = 1e-6
    simulationSettings.staticSolver.newton.absoluteTolerance = 1e-1
    simulationSettings.staticSolver.verboseMode = 2
    #simulationSettings.staticSolver.newton.maxIterations = 5

    SC.visualizationSettings.nodes.showNumbers = True
    SC.visualizationSettings.bodies.showNumbers = True
    SC.visualizationSettings.connectors.showNumbers = True
    SC.visualizationSettings.nodes.defaultSize = 0.05

    mbs.SolveStatic(simulationSettings)

#time.sleep(0.5)

SC.WaitForRenderEngineStopFlag()
exu.StopRenderer() #safely close rendering window!