# rack_pinion.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-4; max iterations: 10; tolerance: 1.e-7; end: initial value; #----------------------------------------------------------------------------- # [Control Data Block] begin: control data; output frequency: 100; structural nodes: 3; rigid bodies: 2; joints: 5; forces: 2; end: control data; #----------------------------------------------------------------------------- # Design Variables set: real M_Pinion = 0.1; #[kg] Mass of Pinion set: real M_Rack = 0.1; #[kg] Mass of Rack set: real R_Pinion = 0.1; #[m] Radius of Pinion set: real K_Pinion_Rack = 100000.; #[N/m] Stiffness Coefficient of Contact set: real C_Pinion_Rack = 100.; #[Ns/m] Damping Coefficient of Contact #----------------------------------------------------------------------------- # Intermediate Variables set: real I_Pinion = M_Pinion*R_Pinion^2./2.; #[kgm^2] Moment of Inertia of Pinion #----------------------------------------------------------------------------- # Node Labels set: integer Node_Ground = 1; set: integer Node_Pinion = 2; set: integer Node_Rack = 3; # Body Labels set: integer Body_Pinion = 1; set: integer Body_Rack = 2; # Joint Labels set: integer JoClamp_Ground = 1; set: integer JoRevp_Pinion = 2; set: integer JoInlin_Ground_Rack = 3; set: integer JoPrism_Ground_Rack = 4; set: integer JoTotp_Pinion_Input = 5; # Force Labels set: integer CoStr_Pinion = 1; set: integer FoStr_Rack = 2; #----------------------------------------------------------------------------- # 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; #----------------------------------------------------------------------------- # [Nodes Block] begin: nodes; #----------------------------------------------------------------------------- # Nodes structural: Node_Ground, static, null, # absolute position eye, # absolute orientation null, # absolute velocity null; # absolute angular velocity structural: Node_Pinion, dynamic, null, # absolute position euler, pi/2., 0., 0., # absolute orientation null, # absolute velocity null; # absolute angular velocity structural: Node_Rack, dynamic, 0., 0., -R_Pinion, # absolute position eye, # absolute orientation null, # absolute velocity null; # absolute angular velocity end: nodes; #----------------------------------------------------------------------------- # [Elements Block] begin: elements; #----------------------------------------------------------------------------- # Bodies body: Body_Pinion, Node_Pinion, M_Pinion, # mass null, # relative center of mass diag, 1., 1., I_Pinion; # inertia matrix body: Body_Rack, Node_Rack, M_Rack, # mass null, # relative center of mass diag, 1., 1., 1.; # inertia matrix #----------------------------------------------------------------------------- # Joints joint: JoClamp_Ground, clamp, Node_Ground, null, # absolute position eye; # absolute orientation joint: JoRevp_Pinion, revolute pin, Node_Pinion, null, # relative offset hinge, eye, # relative orientation null, # absolute pin position hinge, euler, pi/2., 0., 0.; # absolute pin orientation joint: JoInlin_Ground_Rack, in line, Node_Ground, 0., 0., -R_Pinion, # relative line position 1, 0., 0., -1., 3, 1., 0., 0., # relative orientation Node_Rack; joint: JoPrism_Ground_Rack, prismatic, Node_Ground, Node_Rack; joint: JoTotp_Pinion_Input, total pin joint, Node_Pinion, position, null, # relative offset position, null, # absolute position rotation orientation, euler, pi/2., 0., 0., # absolute rotation orientation position constraint, inactive, inactive, inactive, null, orientation constraint, inactive, inactive, active, single, 0., 0., 1., string, "2.*pi*sin(2.*pi*Time/4.)*model::sf::cubstep(Time)"; #----------------------------------------------------------------------------- # Plugin Variables set: [element, AZ_Pinion, JoRevp_Pinion, joint, string="rz"]; set: [element, WZ_Pinion, JoRevp_Pinion, joint, string="wz"]; set: [node, X_Rack, Node_Rack, structural, string="X[1]"]; set: [node, VX_Rack, Node_Rack, structural, string="XP[1]"]; #----------------------------------------------------------------------------- # Forces couple: CoStr_Pinion, follower, Node_Pinion, single, 0., 0., 1., string, "-K_Pinion_Rack*(AZ_Pinion*R_Pinion-X_Rack)*R_Pinion\ -C_Pinion_Rack*(WZ_Pinion*R_Pinion-VX_Rack)*R_Pinion"; force: FoStr_Rack, follower, Node_Rack, position, null, # relative arm single, 1., 0., 0., string, "K_Pinion_Rack*(AZ_Pinion*R_Pinion-X_Rack)\ C_Pinion_Rack*(WZ_Pinion*R_Pinion-VX_Rack)"; end: elements;