Let's construct a simulation model of a one-dimensional spring-mass-damper system. Two methods to model a spring-damper are discussed. One is a method that uses "structural internal force" in combination with "plugin variable," which is discussed in this chapter. The other is a method that uses "deformable displacement joint," which is discussed in the next chapter.
Consider a spring-mass-damper system that is hung from the ceiling as shown in Figure 1. The mass is M=1(kg), the natural length of the spring is L=1(m), and the spring constant is K=20(N/m). The damper applies drag force that is proportional to the magnitude of the velocity with the proportional constant (damping constant) C=1(Ns/m). Construct a simulation model to simulate the motion of the mass when it is released from rest at the position of the spring's natural length. Suppose that the gravity constant is g=9.81(m/s2) and the mass moves along a vertical line.
A plan of the simulation model of a spring-mass-damper system for Problem 8 is shown in Figure 2. We construct the model in the configuration where the length of the spring takes its natural length.
The static node "Node_Ground" is defined and is fixed to the origin of the global frame with a clamp joint. The dynamic node "Node_Mass" for the mass is defined at z=-L=-1 and is constrained on the global Z-axis with an in-line joint and a prismatic joint. We define a structural internal force "Force_SpringDamper," between "Node_Ground" and "Node_Mass" and have it express the spring and damper forces.
Structural internal force is an element that can express force acting between two nodes. The syntax for the statement that defines a structural internal force is as follows.
force: <label>,
{ absolute | follower } internal,
<node1 label>,
position, <relative arm 1>,
<node2 label>,
position, <relative arm 2>,
<force value>;
Here, <relative arm 1(2)> is the position of the point of application of the force relative to each node and <force value> is a template drive caller that defines the value of the force. The force defined by <force value> acts on node1 and the reaction force is applied to node2. If absolute is selected, the direction of the force is kept unchanged with respect to the global frame. On the other hand, if follower is selected, the direction of the force changes with node1.
Let z be the Z-position and vz be the Z-velocity of "Node_Mass." Then, the force that "Foce_SpringDamper" must apply in order to express the spring-damper force is given by the following equation.
This force can be defined in the model as follows.
First, we define the plugin variables "DZ" and "VZ" for z and vz, respectively, as follows.
set: [node, DZ, Node_Mass, structural, string="X[3]"]; set: [node, VZ, Node_Mass, structural, string="XP[3]"];
The values of plugin variables are updated at each simulation step; therefore they are useful if we want to use dynamic variables in a model. In general, what we can substitute in plugin variables are "private data" of nodes and elements. For information about "private data" of each node and element, refer to the official "Input manual."
Next, "Force_SpringDamper" is defined using a string drive as follows.
force: Force_SpringDamper,
follower internal,
Node_Mass,
position, null, # relative arm
Node_Ground,
position, null, # relative arm
single, 0., 0., 1., string, "-K*(DZ-(-L))-C*VZ"; # force value
Code 1 below shows an example input file for the analysis of a spring-mass-damper system for Problem 8.
# spring_mass_damper.mbd
#-----------------------------------------------------------------------------
# [Data Block]
begin: data;
problem: initial value;
end: data;
#-----------------------------------------------------------------------------
# [<Problem> Block]
begin: initial value;
initial time: 0.;
final time: 5.;
time step: 1.e-3;
max iterations: 10;
tolerance: 1.e-6;
end: initial value;
#-----------------------------------------------------------------------------
# [Control Data Block]
begin: control data;
output frequency: 10;
structural nodes: 2;
rigid bodies: 1;
joints: 3;
forces: 1;
gravity;
end: control data;
#-----------------------------------------------------------------------------
# Design Variables
set: real M = 1.; #[kg] Mass
set: real L = 1.; #[m] Spring Natural Length
set: real K = 20.; #[N/m] Spring Stiffness Coefficient
set: real C = 1; #[Ns/m] Damper Damping Coefficient
#-----------------------------------------------------------------------------
# Node Labels
set: integer Node_Ground = 1;
set: integer Node_Mass = 2;
# Body Labels
set: integer Body_Mass = 1;
# Joint Labels
set: integer JoClamp_Ground = 1;
set: integer JoInLin_Ground_Mass = 2;
set: integer JoPrism_Ground_Mass = 3;
# Force Labels
set: integer Force_SpringDamper = 1;
#-----------------------------------------------------------------------------
# [Nodes Block]
begin: nodes;
#-----------------------------------------------------------------------------
# Nodes
structural: Node_Ground, static,
null, # absolute position
eye, # absolute orientation
null, # absolute velocity
null; # absolute angular velocity
structural: Node_Mass, dynamic,
0., 0., -L, # absolute position
eye, # absolute orientation
null, # absolute velocity
null; # absolute angular velocity
end: nodes;
#-----------------------------------------------------------------------------
# Plugin Variables
set: [node, DZ, Node_Mass, structural, string="X[3]"];
set: [node, VZ, Node_Mass, structural, string="XP[3]"];
#-----------------------------------------------------------------------------
# [Elements Block]
begin: elements;
#-----------------------------------------------------------------------------
# Bodies
body: Body_Mass, Node_Mass,
M, # mass
null, # relative center of mass
eye; # inertia matrix
#-----------------------------------------------------------------------------
# Joints
joint: JoClamp_Ground,
clamp,
Node_Ground,
null, # absolute position
eye; # absolute orientation
joint: JoInLin_Ground_Mass,
in line,
Node_Ground,
null, # relative line position
eye, # relative line orientation
Node_Mass;
joint: JoPrism_Ground_Mass,
prismatic,
Node_Ground,
Node_Mass;
#-----------------------------------------------------------------------------
# Forces
force: Force_SpringDamper,
follower internal,
Node_Mass,
position, null, # relative arm
Node_Ground,
position, null, # relative arm
single, 0., 0., 1., string, "-K*(DZ-(-L))-C*VZ"; # force value
#-----------------------------------------------------------------------------
# Gravity
gravity: 0., 0., -1., const, 9.81;
end: elements;
An animation of the simulation result is shown in Movie 1.