# spinning_top.mbd
#-----------------------------------------------------------------------------
# [Data Block]
begin: data;
problem: initial value;
end: data;
#-----------------------------------------------------------------------------
# [<Problem> Block]
begin: initial value;
initial time: 0.;
final time: 12;
time step: 1.e-3;
max iterations: 10;
tolerance: 1.e-7;
end: initial value;
#-----------------------------------------------------------------------------
# [Control Data Block]
begin: control data;
output frequency: 10;
structural nodes: 3;
rigid bodies: 1;
joints: 2;
forces: 3;
gravity;
end: control data;
#-----------------------------------------------------------------------------
# Design Variables
set: real m = 0.1; #[kg] Mass of the top
set: real Ixx = 4.3e-5; #[kg*m^2] Moment of inertia of the top
set: real Iyy = 4.3e-5; #[kg*m^2] Moment of inertia of the top
set: real Izz = 8.0e-5; #[kg*m^2] Moment of inertia of the top
set: real h = 0.05; #[m] Height of the center of mass of the top
set: real Ff = 0.001; #[N] Translational friction
set: real Mf = 0.001; #[Nm] Rotational friction
set: real phi0 = pi/6.; #[rad] Initial tilt angle of the top
set: real w0 = 2*pi*30; #[rad/s] Initial spin velocity of the top
#-----------------------------------------------------------------------------
# Reference Labels
set: integer Ref_TopTip = 1;
# Node Labels
set: integer NoSta_Ground = 1;
set: integer NoDyn_Top = 2;
set: integer NoDum_TopTip = 3;
# Body Labels
set: integer Body_Top = 1;
# Joint Labels
set: integer JoClamp_Ground = 1;
set: integer JoInp_Ground_Top = 2;
# Force Labels
set: integer FoStr_Friction_X = 1;
set: integer FoStr_Friction_Y = 2;
set: integer CoStr_Friction_z = 3;
#-----------------------------------------------------------------------------
# Scalar Functions
scalar function: "cubsign",
cubicspline, do not extrapolate,
-1.03, -1.00,
-1.02, -1.00,
-1.01, -1.00,
-1.00, -1.00,
1.00, 1.00,
1.01, 1.00,
1.02, 1.00,
1.03, 1.00;
#-----------------------------------------------------------------------------
# References
reference: Ref_TopTip,
reference, global, null, # absolute position
reference, global, euler, 0., phi0, 0., # absolute orientation
reference, global, null, # absolute velocity
reference, global, null; # absolute angular velocity
#-----------------------------------------------------------------------------
# [Nodes Block]
begin: nodes;
#-----------------------------------------------------------------------------
# Nodes
structural: NoSta_Ground, static,
null, # absolute position
eye, # absolute orientation
null, # absolute velocity
null; # absolute angular velocity
structural: NoDyn_Top, dynamic,
reference, Ref_TopTip, 0., 0., h, # absolute position
reference, Ref_TopTip, eye, # absolute orientation
reference, Ref_TopTip, null, # absolute velocity
reference, Ref_TopTip, 0., 0., w0; # absolute angular velocity
structural: NoDum_TopTip, dummy, NoDyn_Top,
offset,
reference, Ref_TopTip, null, # relative offset
reference, Ref_TopTip, eye; # relative orientation
end: nodes;
#-----------------------------------------------------------------------------
# Plugin Variables
set: [node, VX_Tip, NoDum_TopTip, structural, string="XP[1]"];
set: [node, VY_Tip, NoDum_TopTip, structural, string="XP[2]"];
set: [node, w, NoDyn_Top, structural, string="omega[3]"];
#-----------------------------------------------------------------------------
# [Elements Block]
begin: elements;
#-----------------------------------------------------------------------------
# Bodies
body: Body_Top, NoDyn_Top,
m, # mass
null, # relative center of mass
diag, Ixx, Iyy, Izz; # inertia matrix
#-----------------------------------------------------------------------------
# Joints
joint: JoClamp_Ground,
clamp,
NoSta_Ground,
null, # absolute position
eye; # absolute orientation
joint: JoInp_Ground_Top,
in plane,
NoSta_Ground,
null, # relative plane position
0., 0., 1., # relative normal direction
NoDyn_Top,
offset, reference, Ref_TopTip, null; # relative offset
#-----------------------------------------------------------------------------
# Forces
force: FoStr_Friction_X,
absolute,
NoDyn_Top,
position, reference, Ref_TopTip, null, # relative arm
single, 1., 0., 0.,
string, "-model::sf::cubsign(VX_Tip/0.001)*Ff"; # force value
force: FoStr_Friction_Y,
absolute,
NoDyn_Top,
position, reference, Ref_TopTip, null, # relative arm
single, 0., 1., 0.,
string, "-model::sf::cubsign(VY_Tip/0.001)*Ff"; # force value
couple: CoStr_Friction_z,
follower,
NoDyn_Top,
single, reference, node, 0., 0., 1.,
string, "-model::sf::cubsign(w/0.001)*Mf"; # couple value
#-----------------------------------------------------------------------------
# Gravity
gravity: 0., 0., -1., const, 9.81;
end: elements;