rigidPendulum.py

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

 1#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2# This is an EXUDYN example
 3#
 4# Details:  Example 2D rigid pendulum
 5#
 6# Author:   Johannes Gerstmayr
 7# Date:     2019-08-15
 8#
 9# 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.
10#
11#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12
13import exudyn as exu
14from exudyn.utilities import *
15
16SC = exu.SystemContainer()
17mbs = SC.AddSystem()
18
19
20#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
21#rigid pendulum:
22L = 1    #x-dim of pendulum
23b = 0.1  #y-dim of pendulum
24background = GraphicsDataCheckerBoard(point=[-1,0.5,0],size=2)
25oGround=mbs.AddObject(ObjectGround(referencePosition= [0,0,0], visualization=VObjectGround(graphicsData= [background])))
26massRigid = 12
27inertiaRigid = massRigid/12*(L)**2
28g = 9.81    # gravity
29
30graphicsCube = GraphicsDataOrthoCubePoint(size= [L,b,b], color= color4dodgerblue, addEdges=True)
31graphicsJoint = GraphicsDataCylinder(pAxis=[-0.5*L,0,-0.6*b], vAxis= [0,0,1.2*b], radius = 0.55*b, color=color4darkgrey, addEdges=True)
32nRigid = mbs.AddNode(Rigid2D(referenceCoordinates=[-0.5*L,L,0], initialVelocities=[0,0,2]));
33oRigid = mbs.AddObject(RigidBody2D(physicsMass=massRigid, physicsInertia=inertiaRigid,nodeNumber=nRigid,
34                                   visualization=VObjectRigidBody2D(graphicsData= [graphicsCube, graphicsJoint])))
35
36mR1 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=oRigid, localPosition=[-0.5*L,0.,0.])) #support point
37mR2 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=oRigid, localPosition=[ 0.,0.,0.])) #end point
38
39mG0 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=oGround, localPosition=[-L,L,0.]))
40mbs.AddObject(RevoluteJoint2D(markerNumbers=[mG0,mR1]))
41
42mbs.AddLoad(Force(markerNumber = mR2, loadVector = [0, -massRigid*g, 0]))
43
44mbs.Assemble()
45print(mbs)
46
47simulationSettings = exu.SimulationSettings() #takes currently set values or default values
48
49simulationSettings.timeIntegration.numberOfSteps = 1000000
50simulationSettings.timeIntegration.endTime = 2000
51simulationSettings.timeIntegration.startTime = 0
52simulationSettings.timeIntegration.newton.relativeTolerance = 1e-8*100 #10000
53simulationSettings.timeIntegration.newton.absoluteTolerance = 1e-10
54simulationSettings.timeIntegration.verboseMode = 1
55
56simulationSettings.timeIntegration.newton.useModifiedNewton = False
57simulationSettings.timeIntegration.newton.numericalDifferentiation.minimumCoordinateSize = 1
58simulationSettings.timeIntegration.generalizedAlpha.spectralRadius = 0.5
59simulationSettings.displayStatistics = True
60
61#SC.visualizationSettings.nodes.defaultSize = 0.05
62
63simulationSettings.solutionSettings.solutionInformation = "Rigid pendulum"
64SC.visualizationSettings.openGL.multiSampling = 4
65SC.visualizationSettings.openGL.lineWidth = 2
66
67exu.StartRenderer()
68
69
70mbs.SolveDynamic(simulationSettings)
71
72SC.WaitForRenderEngineStopFlag()
73exu.StopRenderer() #safely close rendering window!