modelicaopenmodelica

Modelica MultiBody system: Inerter (IdealGearR2T + Inertia) not damping under excitation — no rotation or damping observed


I would really, really appreciate your help with this issue.

I am trying to simulate a mechanical system in Modelica (Modelica Standard Library 4.0.0) that uses an inerter mechanism — by coupling an IdealGearR2T and an Inertia — to act like a Tuned Mass Damper-Inerter system (TMD-I). However, the system is not behaving as expected under external excitation.

Problem: When I introduce an external excitation (using a Sine position input), the inerter does not affect the model dynamics at all:

  1. The upper mass (top body) does not dampen.
  2. The Inertia does not seem to resist motion (no noticeable rotational dynamics).
  3. The BodyBox (visual representation of rotation) does not rotate at all.
  4. It behaves as if the inerter (IdealGearR2T + Inertia) is completely disconnected or ineffective.

Without excitation (removing the Sine + Position source), and with s_rel0 = -1 in the spring-damper, the system behaves somewhat correctly and slowly settles, but this is not how it should behave under dynamic excitation.

Expectation:

  1. The IdealGearR2T + Inertia block, together with the spring and damper, should provide resistance proportional to relative velocity (via the inerter effect) and relative displacement (via the spring and damper).

  2. Under a small sinusoidal excitation, the top mass should oscillate, but its motion should be damped and influenced by the inerter, just like a TMD-I.

  3. The BodyBox should show a small rotational motion proportional to the movement transferred through the IdealGearR2T.

  4. The system should ideally start with s_rel0 = 0 (spring initial relative displacement = 0) rather than -1, and behave correctly under the sinusoidal force.

System Overview:

  1. IdealGearR2T with ratio = 2π*10 ≈ 62.832

  2. Inertia with J = 13.5

  3. SpringDamper with c = 20 N/m, d = 10 N·s/m, initially set with s_rel0 = -1

  4. Sine position input with amplitude = 0.1 m, frequency = 0.2 Hz

  5. Top body mass = 100 kg

  6. No gravity (NoGravity setting)

model BuildingCase3
  inner Modelica.Mechanics.MultiBody.World world(gravityType = Modelica.Mechanics.MultiBody.Types.GravityTypes.NoGravity) annotation(
    Placement(transformation(origin = {-132, -26}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.MultiBody.Parts.FixedTranslation bar2(r = {0.3, 0, 0}) annotation(
    Placement(transformation(origin = {-108, -56}, extent = {{0, 20}, {20, 40}})));
  // Rotation angle in radians
  Modelica.Mechanics.MultiBody.Joints.Prismatic prismatic1(n = {0, 1, 0}, useAxisFlange = true, s(fixed = true)) annotation(
    Placement(transformation(origin = {-54, -26}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.MultiBody.Parts.Body body1(m = 150, sphereDiameter = 0.2) annotation(
    Placement(transformation(origin = {-16, -26}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.MultiBody.Joints.Prismatic prismatic(n = {0, 1, 0}, useAxisFlange = true) annotation(
    Placement(transformation(origin = {40, 2}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.MultiBody.Joints.Revolute revolute(cylinderLength = 0.2, n = {0, 1, 0}, useAxisFlange = true) annotation(
    Placement(transformation(origin = {76, 2}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.MultiBody.Sensors.AbsoluteSensor absoluteSensorTop(get_a = true, get_r = true, get_v = true) annotation(
    Placement(transformation(origin = {120, 28}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.MultiBody.Parts.Body body(m = 100, sphereDiameter = 0.2) annotation(
    Placement(transformation(origin = {120, 2}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.MultiBody.Parts.BodyBox bodyBox(density = 0, height = 0.06, length = 0.06, r = {0, -0.01, 0}, width = 0.2) annotation(
    Placement(transformation(origin = {98, -40}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
  Modelica.Mechanics.MultiBody.Sensors.AbsoluteSensor absoluteSensorBottom(get_a = true, get_r = true, get_v = true) annotation(
    Placement(transformation(origin = {-36, -56}, extent = {{-10, -10}, {10, 10}}, rotation = 180)));
  Modelica.Mechanics.MultiBody.Parts.FixedTranslation bar21(r = {0, 1, 0}, animation = true) annotation(
    Placement(transformation(origin = {-4, -28}, extent = {{0, 20}, {20, 40}})));
  Modelica.Mechanics.Translational.Components.SpringDamper springDamper(c = 20, d = 10, s_rel0 = -1) annotation(
    Placement(transformation(origin = {40, 30}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.Translational.Components.IdealGearR2T idealGearR2T(ratio = 62.832) annotation(
    Placement(transformation(origin = {60, 58}, extent = {{-10, -10}, {10, 10}}, rotation = 180)));
  Modelica.Mechanics.Rotational.Components.Inertia inertia(J = 13.5) annotation(
    Placement(transformation(origin = {114, 58}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.Translational.Components.Spring spring(c = 20)  annotation(
    Placement(transformation(origin = {-52, 4}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Blocks.Sources.Sine sine(amplitude = 0.1, f = 0.2) annotation(
    Placement(transformation(origin = {-106, -61}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Mechanics.Translational.Sources.Position position annotation(
    Placement(transformation(origin = {-78, -61}, extent = {{-10, -10}, {10, 10}})));
equation
  connect(world.frame_b, bar2.frame_a) annotation(
    Line(points = {{-122, -26}, {-108, -26}}, color = {95, 95, 95}));
  connect(prismatic1.frame_b, body1.frame_a) annotation(
    Line(points = {{-44, -26}, {-44, -27}, {-26, -27}, {-26, -26}}, color = {95, 95, 95}));
  connect(bar2.frame_b, prismatic1.frame_a) annotation(
    Line(points = {{-88, -26}, {-64, -26}}, color = {95, 95, 95}));
  connect(prismatic.frame_b, revolute.frame_a) annotation(
    Line(points = {{50, 2}, {66, 2}}, color = {95, 95, 95}));
  connect(absoluteSensorTop.frame_a, body.frame_a) annotation(
    Line(points = {{110, 28}, {110, 2}}, color = {95, 95, 95}));
  connect(body.frame_a, revolute.frame_b) annotation(
    Line(points = {{110, 2}, {86, 2}}, color = {95, 95, 95}));
  connect(absoluteSensorBottom.frame_a, body1.frame_a) annotation(
    Line(points = {{-26, -56}, {-26, -26}}, color = {95, 95, 95}));
  connect(prismatic.frame_a, bar21.frame_b) annotation(
    Line(points = {{30, 2}, {16, 2}}, color = {95, 95, 95}));
  connect(bar21.frame_a, body1.frame_a) annotation(
    Line(points = {{-4, 2}, {-9, 2}, {-9, -26}, {-26, -26}}, color = {95, 95, 95}));
  connect(bodyBox.frame_a, body.frame_a) annotation(
    Line(points = {{98, -30}, {98, 2}, {110, 2}}, color = {95, 95, 95}));
  connect(springDamper.flange_a, prismatic.support) annotation(
    Line(points = {{30, 30}, {30, 8}, {36, 8}}, color = {0, 127, 0}));
  connect(springDamper.flange_b, prismatic.axis) annotation(
    Line(points = {{50, 30}, {52, 30}, {52, 8}, {48, 8}}, color = {0, 127, 0}));
  connect(inertia.flange_a, idealGearR2T.flangeR) annotation(
    Line(points = {{104, 58}, {70, 58}}));
  connect(prismatic.axis, idealGearR2T.flangeT) annotation(
    Line(points = {{48, 8}, {48, 58}, {50, 58}}, color = {0, 127, 0}));
  connect(idealGearR2T.flangeR, revolute.axis) annotation(
    Line(points = {{70, 58}, {70, 43}, {76, 43}, {76, 12}}));
  connect(prismatic1.support, spring.flange_a) annotation(
    Line(points = {{-58, -20}, {-62, -20}, {-62, 4}}, color = {0, 127, 0}));
  connect(prismatic1.axis, spring.flange_b) annotation(
    Line(points = {{-46, -20}, {-42, -20}, {-42, 4}}, color = {0, 127, 0}));
  connect(sine.y, position.s_ref) annotation(
    Line(points = {{-95, -61}, {-91, -61}}, color = {0, 0, 127}));
  connect(position.flange, prismatic1.axis) annotation(
    Line(points = {{-68, -61}, {-46, -61}, {-46, -20}}, color = {0, 127, 0}));
  annotation(
    experiment(StartTime = 0, StopTime = 200, Tolerance = 1e-6, Interval = 0.002),
    uses(Modelica(version = "4.0.0")),
  Diagram(coordinateSystem(extent = {{-160, 100}, {160, -120}})),
  version = "");
end BuildingCase3;

TMDI System

I would really, really appreciate any help in understanding:

  1. Why the inerter (IdealGearR2T + Inertia) is not working in this setup?

  2. How to correctly configure this MultiBody system to have a proper TMD-I behaviour under excitation?

  3. Any mistakes in mechanical causality, frame connections, or parameter setup?

Thank you so much in advance!


Solution

  • Assuming that this is not the final answer, but it too much for a comment - so expect some editing here...

    My comments:

    1. I had to remove `prismatic1.s(start=0, fixed=true) to make the simulation start

    2. The spring does not do anything to the system, as the position of prismatic1.flange_b is set by the position component. The same is true for body1.

    3. The effect of inertia could be integrated into body by setting body.I_22 = 13.5

    4. The parameters of springDamper seem to be pretty low values for a mass of 100kg

    Besides the comments from above, and from what I understand, the system behaves as expected. The result I get for the vertical deflection is:

    Simulation result for vertical deflection

    This seems pretty reasonable to me.

    Note that the time-axis in in hours. I increased the time of simulation by a factor of 100.

    So I think the issue is a combination of simulation time with parameter values...