# half_cylinder.mbd
#-----------------------------------------------------------------------------
# [Data Block]
begin: data;
problem: initial value;
end: data;
#-----------------------------------------------------------------------------
# [<Problem> Block]
begin: initial value;
initial time: 0.;
final time: 2.;
time step: 1.e-4;
max iterations: 10;
tolerance: 1.e-6;
end: initial value;
#-----------------------------------------------------------------------------
# [Control Data Block]
begin: control data;
output frequency: 50;
structural nodes: 7;
abstract nodes: 3;
rigid bodies: 1;
joints: 3;
forces: 7;
genels: 3;
gravity;
end: control data;
#-----------------------------------------------------------------------------
# Design Variables
set: real m = 5.; #[kg] Mass of the half-cylinder
set: real R = 0.4; #[m] Radius of the half-cylinder
set: real theta = pi/6.; #[rad] Surface angle
set: real Kc = 100000.; #[N/m] Contact stiffness
set: real Ec = 1.2; #[-] Contact stiffness exponent
set: real Cc = 100.; #[Ns/m] Contact damping
set: real Dc = 0.0001; #[m] Contact damping activation depth
set: real mu = 0.3; #[-] Friction coefficient
set: real Vt = 0.005; #[m/s] Friction threshold velocity
#-----------------------------------------------------------------------------
# Intermediate Variables
set: real Ic = 1./2.*m*R^2.; #[kg-m^2] Moment of inertia about the cylinder axis
set: real d = 4./3.*R/pi; #[m] Distance from the cylinder axis to the center of mass
set: real I = Ic-m*d^2; #[kg-m~2] Moment of inertia about the axis through the center of mass
#-----------------------------------------------------------------------------
# Reference Labels
set: integer Ref_Surface = 1;
set: integer Ref_CylinderCenter = 2;
set: integer Ref_CylinderEdgeR = 3;
set: integer Ref_CylinderEdgeL = 4;
# Structural Node Labels
set: integer NoSta_Surface = 1;
set: integer NoDyn_Cylinder = 2;
set: integer NoDum_Cylinder_RelTo_Surface = 3;
set: integer NoDum_CylinderEdgeR = 4;
set: integer NoDum_CylinderEdgeL = 5;
set: integer NoDum_CylinderEdgeR_RelTo_Surface = 6;
set: integer NoDum_CylinderEdgeL_RelTo_Surface = 7;
# Abstract Node Labels
set: integer NoAbs_FN_Cylinder = 1;
set: integer NoAbs_FN_CylinderEdgeR = 2;
set: integer NoAbs_FN_CylinderEdgeL = 3;
# Body Labels
set: integer Body_Cylinder = 1;
# Joint Labels
set: integer JoClamp_Surface = 1;
set: integer JoInp_Surface_Cylinder = 2;
set: integer JoRevrot_Surface_Cylinder = 3;
# Force Labels
set: integer FoStrin_Normal_Cylinder_Surface = 1;
set: integer FoStrin_Friction_Cylinder_Surface = 2;
set: integer CoStrin_Friction_Cylinder_Surface = 3;
set: integer FoStrin_Normal_CylinderEdgeR_Surface = 4;
set: integer FoStrin_Normal_CylinderEdgeL_Surface = 5;
set: integer FoStrin_Friction_CylinderEdgeR_Surface = 6;
set: integer FoStrin_Friction_CylinderEdgeL_Surface = 7;
# Genel Labels
set: integer GeClamp_FN_Cylinder = 1;
set: integer GeClamp_FN_CylinderEdgeR = 2;
set: integer GeClamp_FN_CylinderEdgeL = 3;
#-----------------------------------------------------------------------------
# Scalar Functions
scalar function: "cubstep",
cubicspline, do not extrapolate,
-0.03, 0.00,
-0.02, 0.00,
-0.01, 0.00,
0.00, 0.00,
1.00, 1.00,
1.01, 1.00,
1.02, 1.00,
1.03, 1.00;
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_Surface,
null, # absolute position
euler, theta, 0., 0., # absolute orientation
null, # absolute velocity
null; # absolute angular velocity
reference: Ref_CylinderCenter,
reference, Ref_Surface, 0., 0., R, # absolute position
reference, global, eye, # absolute orientation
reference, global, null, # absolute velocity
reference, global, null; # absolute angular velocity
reference: Ref_CylinderEdgeR,
reference, Ref_CylinderCenter, 0., -R, 0., # absolute position
reference, Ref_CylinderCenter, eye, # absolute orientation
reference, Ref_CylinderCenter, null, # absolute velocity
reference, Ref_CylinderCenter, null; # absolute angular velocity
reference: Ref_CylinderEdgeL,
reference, Ref_CylinderCenter, 0., R, 0., # absolute position
reference, Ref_CylinderCenter, eye, # absolute orientation
reference, Ref_CylinderCenter, null, # absolute velocity
reference, Ref_CylinderCenter, null; # absolute angular velocity
#-----------------------------------------------------------------------------
# [Nodes Block]
begin: nodes;
#-----------------------------------------------------------------------------
# Nodes
structural: NoSta_Surface, static,
reference, Ref_Surface, null, # absolute position
reference, Ref_Surface, eye, # absolute orientation
reference, Ref_Surface, null, # absolute velocity
reference, Ref_Surface, null; # absolute angular velocity
structural: NoDyn_Cylinder, dynamic,
reference, Ref_CylinderCenter, null, # absolute position
reference, Ref_CylinderCenter, eye, # absolute orientation
reference, Ref_CylinderCenter, null, # absolute velocity
reference, Ref_CylinderCenter, null, # absolute angular velocity
accelerations, yes;
structural: NoDum_Cylinder_RelTo_Surface, dummy, NoDyn_Cylinder,
relative frame, NoSta_Surface;
structural: NoDum_CylinderEdgeR, dummy, NoDyn_Cylinder,
offset,
reference, Ref_CylinderEdgeR, null, # relative offset
reference, Ref_CylinderEdgeR, eye; # relative orientation
structural: NoDum_CylinderEdgeL, dummy, NoDyn_Cylinder,
offset,
reference, Ref_CylinderEdgeL, null, # relative offset
reference, Ref_CylinderEdgeL, eye; # relative orientation
structural: NoDum_CylinderEdgeR_RelTo_Surface, dummy, NoDum_CylinderEdgeR,
relative frame, NoSta_Surface;
structural: NoDum_CylinderEdgeL_RelTo_Surface, dummy, NoDum_CylinderEdgeL,
relative frame, NoSta_Surface;
abstract: NoAbs_FN_Cylinder, algebraic;
abstract: NoAbs_FN_CylinderEdgeR, algebraic;
abstract: NoAbs_FN_CylinderEdgeL, algebraic;
end: nodes;
#-----------------------------------------------------------------------------
# Plugin Variables
set: [node, DZ, NoDum_Cylinder_RelTo_Surface, structural, string="X[3]"];
set: [node, VY, NoDum_Cylinder_RelTo_Surface, structural, string="XP[2]"];
set: [node, VZ, NoDum_Cylinder_RelTo_Surface, structural, string="XP[3]"];
set: [node, WX, NoDum_Cylinder_RelTo_Surface, structural, string="omega[1]"];
set: [node, RX, NoDum_Cylinder_RelTo_Surface, structural, string="E[1]"];
set: [node, DZ_R, NoDum_CylinderEdgeR_RelTo_Surface, structural, string="X[3]"];
set: [node, VY_R, NoDum_CylinderEdgeR_RelTo_Surface, structural, string="XP[2]"];
set: [node, VZ_R, NoDum_CylinderEdgeR_RelTo_Surface, structural, string="XP[3]"];
set: [node, DZ_L, NoDum_CylinderEdgeL_RelTo_Surface, structural, string="X[3]"];
set: [node, VY_L, NoDum_CylinderEdgeL_RelTo_Surface, structural, string="XP[2]"];
set: [node, VZ_L, NoDum_CylinderEdgeL_RelTo_Surface, structural, string="XP[3]"];
#-----------------------------------------------------------------------------
# [Elements Block]
begin: elements;
#-----------------------------------------------------------------------------
# Bodies
body: Body_Cylinder, NoDyn_Cylinder,
m, # mass
0., 0., -d, # relative center of mass
diag, I, 1., 1.; # inertia matrix
#-----------------------------------------------------------------------------
# Joints
joint: JoClamp_Surface,
clamp,
NoSta_Surface,
position, node,
orientation, node;
joint: JoInp_Surface_Cylinder,
in plane,
NoSta_Surface,
null, # relative plane position
1., 0., 0., # relative normal direction
NoDyn_Cylinder;
joint: JoRevrot_Surface_Cylinder,
revolute rotation,
NoSta_Surface,
hinge,
euler, 0., pi/2., 0., # relative orientation
NoDyn_Cylinder,
hinge,
euler, 0., pi/2., 0.; # relative orientation
#-----------------------------------------------------------------------------
# Genels
genel: GeClamp_FN_Cylinder,
clamp,
NoAbs_FN_Cylinder, abstract,
string, "max(0,Kc*sign(R-DZ)*abs(R-DZ)^Ec-Cc*VZ*model::sf::cubstep((R-DZ)/Dc))\
*step(RX+pi/2.)*step(-RX+pi/2.)";
genel: GeClamp_FN_CylinderEdgeR,
clamp,
NoAbs_FN_CylinderEdgeR, abstract,
string, "max(0,Kc*sign(0-DZ_R)*abs(0-DZ_R)^Ec-Cc*VZ_R*model::sf::cubstep((0-DZ_R)/Dc))\
*(1-step(RX+pi/2.)*step(-RX+pi/2.))";
genel: GeClamp_FN_CylinderEdgeL,
clamp,
NoAbs_FN_CylinderEdgeL, abstract,
string, "max(0,Kc*sign(0-DZ_L)*abs(0-DZ_L)^Ec-Cc*VZ_L*model::sf::cubstep((0-DZ_L)/Dc))\
*(1-step(RX+pi/2.)*step(-RX+pi/2.))";
#-----------------------------------------------------------------------------
# Plugin Variables
set: [dof, FN, NoAbs_FN_Cylinder, abstract, algebraic];
set: [dof, FN_R, NoAbs_FN_CylinderEdgeR, abstract, algebraic];
set: [dof, FN_L, NoAbs_FN_CylinderEdgeL, abstract, algebraic];
#-----------------------------------------------------------------------------
# Forces
force: FoStrin_Normal_Cylinder_Surface,
absolute internal,
NoDyn_Cylinder,
position, null, # relative arm
NoSta_Surface,
position, null, # relative arm
single, reference, Ref_Surface, 0., 0., 1., string, "FN"; # force value
force: FoStrin_Friction_Cylinder_Surface,
absolute internal,
NoDyn_Cylinder,
position, null, # relative arm
NoSta_Surface,
position, null, # relative arm
single, reference, Ref_Surface, 0., 1., 0.,
string, "-model::sf::cubsign((VY+R*WX)/Vt)*mu*FN"; # force value
couple: CoStrin_Friction_Cylinder_Surface,
absolute internal,
NoDyn_Cylinder,
NoSta_Surface,
single, reference, Ref_Surface, 1., 0., 0.,
string, "-R*model::sf::cubsign((VY+R*WX)/Vt)*mu*FN"; # couple value
force: FoStrin_Normal_CylinderEdgeR_Surface,
absolute internal,
NoDyn_Cylinder,
position, reference, Ref_CylinderEdgeR, null, # relative arm
NoSta_Surface,
position, null, # relative arm
single, reference, Ref_Surface, 0., 0., 1., string, "FN_R"; # force value
force: FoStrin_Normal_CylinderEdgeL_Surface,
absolute internal,
NoDyn_Cylinder,
position, reference, Ref_CylinderEdgeL, null, # relative arm
NoSta_Surface,
position, null, # relative arm
single, reference, Ref_Surface, 0., 0., 1., string, "FN_L"; # force value
force: FoStrin_Friction_CylinderEdgeR_Surface,
absolute internal,
NoDyn_Cylinder,
position, reference, Ref_CylinderEdgeR, null, # relative arm
NoSta_Surface,
position, null, # relative arm
single, reference, Ref_Surface, 0., 1., 0.,
string, "-model::sf::cubsign(VY_R/Vt)*mu*FN_R"; # force value
force: FoStrin_Friction_CylinderEdgeL_Surface,
absolute internal,
NoDyn_Cylinder,
position, reference, Ref_CylinderEdgeL, null, # relative arm
NoSta_Surface,
position, null, # relative arm
single, reference, Ref_Surface, 0., 1., 0.,
string, "-model::sf::cubsign(VY_L/Vt)*mu*FN_L"; # force value
#-----------------------------------------------------------------------------
# Gravity
gravity: 0., 0., -1., const, 9.81;
end: elements;