# coin.mbd #----------------------------------------------------------------------------- # [Data Block] begin: data; problem: initial value; end: data; #----------------------------------------------------------------------------- # [<Problem> Block] begin: initial value; initial time: 0.; final time: 1.; time step: 1.e-4; max iterations: 500; tolerance: 1.e-7; end: initial value; #----------------------------------------------------------------------------- # [Control Data Block] begin: control data; output frequency: 10; structural nodes: 4; abstract nodes: 12; rigid bodies: 1; joints: 1; forces: 16; genels: 12; gravity; end: control data; #----------------------------------------------------------------------------- # Design Variables set: real m = 5.0e-3; #[kg] Mass of the coin set: real d = 1.5e-3; #[m] Thickness of the coin set: real R = 6.8e-3; #[m] Radius of the coin set: real X0 = 0.; #[m] Initial X position set: real Y0 = 0.; #[m] Initial Y position set: real Z0 = 5.e-2; #[m] Initial Z position set: real E1 = 45.*deg2rad; #[rad] Initial Euler angle 1 set: real E2 = 0.; #[rad] Initial Euler angle 2 set: real E3 = 0.; #[rad] Initial Euler angle 3 set: real VX0 = 0.; #[m/s] Initial X velocity set: real VY0 = 0.; #[m/s] Initial Y velocity set: real VZ0 = 0.; #[m/s] Initial Z velocity set: real wx0 = 0.; #[rad/s] Initial angular velocity about x axis of the coin set: real wy0 = 5.; #[rad/s] Initial angular velocity about y axis of the coin set: real wz0 = 0.; #[rad/s] Initial angular velocity about z axis of the coin set: real Kc = 100000.; #[N/m] Contact stiffness set: real Ec = 1.2; #[-] Contact stiffness exponent set: real Cc = 10.; #[Ns/m] Contact damping set: real Dc = 0.0005; #[m] Contact damping activation depth set: real mu = 0.1; #[-] Friction coefficient set: real Vt = 0.05; #[m/s] Friction threshold velocity set: real eps = 1e-6; #----------------------------------------------------------------------------- # Intermediate Variables set: real Ixx = 1./12.*m*(3*R^2+d^2); set: real Iyy = 1./12.*m*(3*R^2+d^2); set: real Izz = m*R^2/2.; #----------------------------------------------------------------------------- # Reference Labels set: integer Ref_Coin = 1; set: integer Ref_Top = 2; set: integer Ref_Bottom = 3; # Structural Node Labels set: integer NoSta_Ground = 1; set: integer NoDyn_Coin = 2; set: integer NoDum_Top = 3; set: integer NoDum_Bottom = 4; # Abstract Node Labels set: integer NoAbs_X_Normal = 1; set: integer NoAbs_Y_Normal = 2; set: integer NoAbs_Z_Normal = 3; set: integer NoAbs_X_Contact = 4; set: integer NoAbs_Y_Contact = 5; set: integer NoAbs_Z_Contact = 6; set: integer NoAbs_FN_Top = 7; set: integer NoAbs_FX_Top = 8; set: integer NoAbs_FY_Top = 9; set: integer NoAbs_FN_Bottom = 10; set: integer NoAbs_FX_Bottom = 11; set: integer NoAbs_FY_Bottom = 12; # Body Labels set: integer Body_Coin = 1; # Joint Labels set: integer JoClamp_Ground = 1; # Force Labels set: integer FoStr_NormalFN_Top = 1; set: integer CoStr_NormalTX_Top = 2; set: integer CoStr_NormalTY_Top = 3; set: integer FoStr_FrictionFX_Top = 4; set: integer FoStr_FrictionFY_Top = 5; set: integer CoStr_FrictionTX_Top = 6; set: integer CoStr_FrictionTY_Top = 7; set: integer CoStr_FrictionTZ_Top = 8; set: integer FoStr_NormalFN_Bottom = 9; set: integer CoStr_NormalTX_Bottom = 10; set: integer CoStr_NormalTY_Bottom = 11; set: integer FoStr_FrictionFX_Bottom = 12; set: integer FoStr_FrictionFY_Bottom = 13; set: integer CoStr_FrictionTX_Bottom = 14; set: integer CoStr_FrictionTY_Bottom = 15; set: integer CoStr_FrictionTZ_Bottom = 16; # Genel Labels set: integer GeClamp_X_Normal = 1; set: integer GeClamp_Y_Normal = 2; set: integer GeClamp_Z_Normal = 3; set: integer GeClamp_X_Contact = 4; set: integer GeClamp_Y_Contact = 5; set: integer GeClamp_Z_Contact = 6; set: integer GeClamp_FN_Top = 7; set: integer GeClamp_FX_Top = 8; set: integer GeClamp_FY_Top = 9; set: integer GeClamp_FN_Bottom = 10; set: integer GeClamp_FX_Bottom = 11; set: integer GeClamp_FY_Bottom = 12; #----------------------------------------------------------------------------- # 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_Coin, X0, Y0, Z0, # absolute position euler, E1, E2, E3, # absolute orientation VX0, VY0, VZ0, # absolute velocity null; # absolute angular velocity reference: Ref_Top, reference, Ref_Coin, 0., 0., d/2., # absolute position reference, Ref_Coin, eye, # absolute orientation reference, Ref_Coin, null, # absolute velocity reference, Ref_Coin, null; # absolute angular velocity reference: Ref_Bottom, reference, Ref_Coin, 0., 0., -d/2., # absolute position reference, Ref_Coin, eye, # absolute orientation reference, Ref_Coin, null, # absolute velocity reference, Ref_Coin, null; # absolute angular velocity #----------------------------------------------------------------------------- # [Nodes Block] begin: nodes; #----------------------------------------------------------------------------- # Structural Nodes structural: NoSta_Ground, static, null, # absolute position eye, # absolute orientation null, # absolute velocity null; # absolute angular velocity structural: NoDyn_Coin, dynamic, reference, Ref_Coin, null, # absolute position reference, Ref_Coin, eye, # absolute orientation reference, Ref_Coin, null, # absolute velocity reference, Ref_Coin, wx0, wy0, wz0, # absolute angular velocity accelerations, yes; structural: NoDum_Top, dummy, NoDyn_Coin, offset, reference, Ref_Top, null, # relative offset reference, Ref_Top, eye; # relative orientation structural: NoDum_Bottom, dummy, NoDyn_Coin, offset, reference, Ref_Bottom, null, # relative offset reference, Ref_Bottom, eye; # relative orientation #----------------------------------------------------------------------------- # Intermediate Variables set: real DX0_Top = model::xposition(NoDum_Top); set: real DY0_Top = model::yposition(NoDum_Top); set: real DZ0_Top = model::zposition(NoDum_Top); set: real DX0_Bottom = model::xposition(NoDum_Bottom); set: real DY0_Bottom = model::yposition(NoDum_Bottom); set: real DZ0_Bottom = model::zposition(NoDum_Bottom); set: real X0_Normal = (DX0_Top-DX0_Bottom)/d; set: real Y0_Normal = (DY0_Top-DY0_Bottom)/d; set: real Z0_Normal = (DZ0_Top-DZ0_Bottom)/d; set: real X0_Contact = R*X0_Normal*Z0_Normal /sqrt(max(eps,X0_Normal^2+Y0_Normal^2)); set: real Y0_Contact = R*Y0_Normal*Z0_Normal /sqrt(max(eps,X0_Normal^2+Y0_Normal^2)); set: real Z0_Contact = -R*sqrt(X0_Normal^2+Y0_Normal^2); #----------------------------------------------------------------------------- # Abstract Nodes abstract: NoAbs_X_Normal, algebraic, value, X0_Normal; abstract: NoAbs_Y_Normal, algebraic, value, Y0_Normal; abstract: NoAbs_Z_Normal, algebraic, value, Z0_Normal; abstract: NoAbs_X_Contact, algebraic, value, X0_Contact; abstract: NoAbs_Y_Contact, algebraic, value, Y0_Contact; abstract: NoAbs_Z_Contact, algebraic, value, Z0_Contact; abstract: NoAbs_FN_Top, algebraic; abstract: NoAbs_FX_Top, algebraic; abstract: NoAbs_FY_Top, algebraic; abstract: NoAbs_FN_Bottom, algebraic; abstract: NoAbs_FX_Bottom, algebraic; abstract: NoAbs_FY_Bottom, algebraic; end: nodes; #----------------------------------------------------------------------------- # Plugin Variables set: [node, DX_Top, NoDum_Top, structural, string="X[1]"]; set: [node, DY_Top, NoDum_Top, structural, string="X[2]"]; set: [node, DZ_Top, NoDum_Top, structural, string="X[3]"]; set: [node, VX_Top, NoDum_Top, structural, string="XP[1]"]; set: [node, VY_Top, NoDum_Top, structural, string="XP[2]"]; set: [node, VZ_Top, NoDum_Top, structural, string="XP[3]"]; set: [node, DX_Bottom, NoDum_Bottom, structural, string="X[1]"]; set: [node, DY_Bottom, NoDum_Bottom, structural, string="X[2]"]; set: [node, DZ_Bottom, NoDum_Bottom, structural, string="X[3]"]; set: [node, VX_Bottom, NoDum_Bottom, structural, string="XP[1]"]; set: [node, VY_Bottom, NoDum_Bottom, structural, string="XP[2]"]; set: [node, VZ_Bottom, NoDum_Bottom, structural, string="XP[3]"]; set: [node, WX, NoDyn_Coin, structural, string="Omega[1]"]; set: [node, WY, NoDyn_Coin, structural, string="Omega[2]"]; set: [node, WZ, NoDyn_Coin, structural, string="Omega[3]"]; set: [dof, X_Normal, NoAbs_X_Normal, abstract, algebraic]; set: [dof, Y_Normal, NoAbs_Y_Normal, abstract, algebraic]; set: [dof, Z_Normal, NoAbs_Z_Normal, abstract, algebraic]; set: [dof, X_Contact, NoAbs_X_Contact, abstract, algebraic]; set: [dof, Y_Contact, NoAbs_Y_Contact, abstract, algebraic]; set: [dof, Z_Contact, NoAbs_Z_Contact, abstract, algebraic]; set: [dof, FN_Top, NoAbs_FN_Top, abstract, algebraic]; set: [dof, FX_Top, NoAbs_FX_Top, abstract, algebraic]; set: [dof, FY_Top, NoAbs_FY_Top, abstract, algebraic]; set: [dof, FN_Bottom, NoAbs_FN_Bottom, abstract, algebraic]; set: [dof, FX_Bottom, NoAbs_FX_Bottom, abstract, algebraic]; set: [dof, FY_Bottom, NoAbs_FY_Bottom, abstract, algebraic]; #----------------------------------------------------------------------------- # [Elements Block] begin: elements; #----------------------------------------------------------------------------- # Bodies body: Body_Coin, NoDyn_Coin, m, # mass null, # relative center of mass diag, Ixx, Iyy, Izz; # inertia matrix #----------------------------------------------------------------------------- # Genels genel: GeClamp_X_Normal, clamp, NoAbs_X_Normal, abstract, string, "(DX_Top-DX_Bottom)/d"; genel: GeClamp_Y_Normal, clamp, NoAbs_Y_Normal, abstract, string, "(DY_Top-DY_Bottom)/d"; genel: GeClamp_Z_Normal, clamp, NoAbs_Z_Normal, abstract, string, "(DZ_Top-DZ_Bottom)/d"; genel: GeClamp_X_Contact, clamp, NoAbs_X_Contact, abstract, string, "R*X_Normal*Z_Normal\ /sqrt(max(eps,X_Normal^2+Y_Normal^2))"; genel: GeClamp_Y_Contact, clamp, NoAbs_Y_Contact, abstract, string, "R*Y_Normal*Z_Normal\ /sqrt(max(eps,X_Normal^2+Y_Normal^2))"; genel: GeClamp_Z_Contact, clamp, NoAbs_Z_Contact, abstract, string, "-R*sqrt(X_Normal^2+Y_Normal^2)"; genel: GeClamp_FN_Top, clamp, NoAbs_FN_Top, abstract, string, "max(0.,Kc*sign(-Z_Contact-DZ_Top)*abs(-Z_Contact-DZ_Top)^Ec\ +Cc*(0-(VZ_Top+WX*Y_Contact-WY*X_Contact))\ *model::sf::cubstep((-Z_Contact-DZ_Top)/Dc))"; genel: GeClamp_FX_Top, clamp, NoAbs_FX_Top, abstract, string, "-model::sf::cubsign((VX_Top+WY*Z_Contact-WZ*Y_Contact)/Vt)*mu*FN_Top"; genel: GeClamp_FY_Top, clamp, NoAbs_FY_Top, abstract, string, "-model::sf::cubsign((VY_Top+WZ*X_Contact-WX*Z_Contact)/Vt)*mu*FN_Top"; genel: GeClamp_FN_Bottom, clamp, NoAbs_FN_Bottom, abstract, string, "max(0.,Kc*sign(-Z_Contact-DZ_Bottom)*abs(-Z_Contact-DZ_Bottom)^Ec\ +Cc*(0-(VZ_Bottom+WX*Y_Contact-WY*X_Contact))\ *model::sf::cubstep((-Z_Contact-DZ_Bottom)/Dc))"; genel: GeClamp_FX_Bottom, clamp, NoAbs_FX_Bottom, abstract, string, "-model::sf::cubsign((VX_Bottom+WY*Z_Contact-WZ*Y_Contact)/Vt)*mu*FN_Bottom"; genel: GeClamp_FY_Bottom, clamp, NoAbs_FY_Bottom, abstract, string, "-model::sf::cubsign((VY_Bottom+WZ*X_Contact-WX*Z_Contact)/Vt)*mu*FN_Bottom"; #----------------------------------------------------------------------------- # Joints joint: JoClamp_Ground, clamp, NoSta_Ground, position, node, orientation, node; #----------------------------------------------------------------------------- # Forces force: FoStr_NormalFN_Top, absolute, NoDyn_Coin, position, reference, Ref_Top, null, # relative arm single, 0., 0., 1., string, "FN_Top"; # force value couple: CoStr_NormalTX_Top, absolute, NoDyn_Coin, position, reference, Ref_Top, null, # relative arm single, 1., 0., 0., string, "Y_Contact*FN_Top"; # couple value couple: CoStr_NormalTY_Top, absolute, NoDyn_Coin, position, reference, Ref_Top, null, # relative arm single, 0., 1., 0., string, "-X_Contact*FN_Top"; # couple value force: FoStr_FrictionFX_Top, absolute, NoDyn_Coin, position, reference, Ref_Top, null, # relative arm single, 1., 0., 0., string, "FX_Top"; # force value force: FoStr_FrictionFY_Top, absolute, NoDyn_Coin, position, reference, Ref_Top, null, # relative arm single, 0., 1., 0., string, "FY_Top"; # force value couple: CoStr_FrictionTX_Top, absolute, NoDyn_Coin, position, reference, Ref_Top, null, # relative arm single, 1., 0., 0., string, "-Z_Contact*FY_Top"; # couple value couple: CoStr_FrictionTY_Top, absolute, NoDyn_Coin, position, reference, Ref_Top, null, # relative arm single, 0., 1., 0., string, "Z_Contact*FX_Top"; # couple value couple: CoStr_FrictionTZ_Top, absolute, NoDyn_Coin, position, reference, Ref_Top, null, # relative arm single, 0., 0., 1., string, "-Y_Contact*FX_Top + X_Contact*FY_Top"; # couple value force: FoStr_NormalFN_Bottom, absolute, NoDyn_Coin, position, reference, Ref_Bottom, null, # relative arm single, 0., 0., 1., string, "FN_Bottom"; # force value couple: CoStr_NormalTX_Bottom, absolute, NoDyn_Coin, position, reference, Ref_Bottom, null, # relative arm single, 1., 0., 0., string, "Y_Contact*FN_Bottom"; # couple value couple: CoStr_NormalTY_Bottom, absolute, NoDyn_Coin, position, reference, Ref_Bottom, null, # relative arm single, 0., 1., 0., string, "-X_Contact*FN_Bottom"; # couple value force: FoStr_FrictionFX_Bottom, absolute, NoDyn_Coin, position, reference, Ref_Bottom, null, # relative arm single, 1., 0., 0., string, "FX_Bottom"; # force value force: FoStr_FrictionFY_Bottom, absolute, NoDyn_Coin, position, reference, Ref_Bottom, null, # relative arm single, 0., 1., 0., string, "FY_Bottom"; # force value couple: CoStr_FrictionTX_Bottom, absolute, NoDyn_Coin, position, reference, Ref_Bottom, null, # relative arm single, 1., 0., 0., string, "-Z_Contact*FY_Bottom"; # couple value couple: CoStr_FrictionTY_Bottom, absolute, NoDyn_Coin, position, reference, Ref_Bottom, null, # relative arm single, 0., 1., 0., string, "Z_Contact*FX_Bottom"; # couple value couple: CoStr_FrictionTZ_Bottom, absolute, NoDyn_Coin, position, reference, Ref_Bottom, null, # relative arm single, 0., 0., 1., string, "-Y_Contact*FX_Bottom + X_Contact*FY_Bottom"; # couple value #----------------------------------------------------------------------------- # Gravity gravity: 0., 0., -1., const, 9.81; end: elements;