Skip to content
LIBRARY
examples.Engine1b_analytic.md

examples.Engine1b_analytic

One-cylinder engine with gas force (planar loop solved analytically)

Same one-cylinder engine as Engine1b, but the central part of the planar kinematic loop is replaced by the assembly joint JointRRP (revolute - revolute

  • prismatic). JointRRP solves the non-linear loop equation analytically instead

of numerically, so no non-linear algebraic system is introduced. The crankshaft (bearing + crank1..crank4) is driven by the flywheel inertia (initial 10 rad/s); the connecting rod and piston are carried by the interior frames frame_ia/frame_ib of jointRRP, and gasForce drives the prismatic axis.

The diagram layout is preserved from the reference engine model using the same Modelica->Dyad coordinate transform as Engine1b (x_d = 500 + 5_x_m, y_d = 500 - 5_y_m, rot_d = (360 - rot_m) mod 360). Do not run dyad layout on this model.

Usage

MultibodyComponents.examples.Engine1b_analytic()

Behavior

Source

dyad
"""
# One-cylinder engine with gas force (planar loop solved analytically)

Same one-cylinder engine as `Engine1b`, but the central part of the planar
kinematic loop is replaced by the assembly joint `JointRRP` (revolute - revolute
- prismatic). `JointRRP` solves the non-linear loop equation analytically instead
of numerically, so no non-linear algebraic system is introduced. The crankshaft
(`bearing` + `crank1`..`crank4`) is driven by the flywheel `inertia` (initial
10 rad/s); the connecting rod and piston are carried by the interior frames
`frame_ia`/`frame_ib` of `jointRRP`, and `gasForce` drives the prismatic axis.

The diagram layout is preserved from the reference engine model using the same
Modelica->Dyad coordinate transform as `Engine1b` (x_d = 500 + 5*x_m,
y_d = 500 - 5*y_m, rot_d = (360 - rot_m) mod 360). Do not run `dyad layout` on
this model.
"""
example component Engine1b_analytic
  world = MultibodyComponents.World() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 0, "y1": 900, "x2": 100, "y2": 1000, "rot": 0}
      },
      "tags": []
    }
  }
  piston = MultibodyComponents.BodyCylinder(diameter = 0.1, r = [0, -0.1, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 880, "y1": 310, "x2": 980, "y2": 410, "rot": 0}
      },
      "tags": []
    }
  }
  connectingRod = MultibodyComponents.BodyBox(width_dir = [1, 0, 0], width = 0.02, height = 0.06, color = [0, 0, 0.784, 1], r = [0, -0.2, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 900, "y1": 550, "x2": 1000, "y2": 650, "rot": 270}
      },
      "tags": []
    }
  }
  bearing = MultibodyComponents.Revolute(n = [1, 0, 0], cylinder_length = 0.02, radius = 0.025) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 200, "y1": 900, "x2": 300, "y2": 1000, "rot": 0}
      },
      "tags": []
    }
  }
  inertia = RotationalComponents.Components.Inertia(J = 1) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 200, "y1": 700, "x2": 300, "y2": 800, "rot": 0}
      },
      "tags": []
    }
  }
  crank1 = MultibodyComponents.BodyCylinder(diameter = 0.05, r = [0.1, 0, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 350, "y1": 900, "x2": 450, "y2": 1000, "rot": 0}
      },
      "tags": []
    }
  }
  crank2 = MultibodyComponents.BodyBox(height = 0.05, width_dir = [1, 0, 0], width = 0.02, r = [0, 0.1, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 450, "y1": 850, "x2": 550, "y2": 950, "rot": 270}
      },
      "tags": []
    }
  }
  crank3 = MultibodyComponents.BodyCylinder(diameter = 0.03, r = [0.1, 0, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 700, "y1": 780, "x2": 800, "y2": 880, "rot": 0}
      },
      "tags": []
    }
  }
  crank4 = MultibodyComponents.BodyBox(height = 0.05, width_dir = [1, 0, 0], width = 0.02, r = [0, -0.1, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1000, "y1": 850, "x2": 900, "y2": 950, "rot": 270}
      },
      "tags": []
    }
  }
  mid = MultibodyComponents.FixedTranslation(r = [0.05, 0, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 550, "y1": 650, "x2": 650, "y2": 750, "rot": 0}
      },
      "tags": []
    }
  }
  cylPosition = MultibodyComponents.FixedTranslation(r = [0.15, 0.45, 0], render = false) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 100, "y1": 250, "x2": 200, "y2": 350, "rot": 270}
      },
      "tags": []
    }
  }
  gasForce = MultibodyComponents.GasForce2(d = 0.1, L = 0.35) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 860, "y1": 400, "x2": 960, "y2": 500, "rot": 270}
      },
      "tags": []
    }
  }
  jointRRP = MultibodyComponents.JointRRP(n_a = [1, 0, 0], n_b = [0, -1, 0], rRod1_ia = [0, 0.2, 0], rRod2_ib = [0, -0.1, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 600, "y1": 300, "x2": 800, "y2": 500, "rot": 270}
      },
      "tags": []
    }
  }
relations
  initial inertia.phi = 0
  initial inertia.w = 10
  connect(world.frame_b, bearing.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(crank2.frame_a, crank1.frame_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 950}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(bearing.frame_b, crank1.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(world.frame_b, cylPosition.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 150, "y": 950}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(crank3.frame_b, crank4.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 950, "y": 830}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(inertia.spline_b, bearing.axis) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [{"x": 350, "y": 750}, {"x": 350, "y": 850}, {"x": 250, "y": 850}],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
  connect(crank2.frame_b, crank3.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 830}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(crank2.frame_b, mid.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 700}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(mid.frame_b, jointRRP.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 700, "y": 700}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointRRP.frame_b, cylPosition.frame_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 700, "y": 200}, {"x": 150, "y": 200}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointRRP.frame_ib, piston.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 890, "y": 364}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(connectingRod.frame_b, jointRRP.frame_ia) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [
            {"x": 950, "y": 550},
            {"x": 750, "y": 550},
            {"x": 750, "y": 440},
            {"x": 700, "y": 440}
          ],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
  connect(jointRRP.axis, gasForce.flange_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 800, "y": 390}, {"x": 910, "y": 390}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointRRP.bearing, gasForce.flange_a) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [
            {"x": 800, "y": 462},
            {"x": 800, "y": 510},
            {"x": 910, "y": 510},
            {"x": 910, "y": 500}
          ],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
end
Flattened Source
dyad
"""
# One-cylinder engine with gas force (planar loop solved analytically)

Same one-cylinder engine as `Engine1b`, but the central part of the planar
kinematic loop is replaced by the assembly joint `JointRRP` (revolute - revolute
- prismatic). `JointRRP` solves the non-linear loop equation analytically instead
of numerically, so no non-linear algebraic system is introduced. The crankshaft
(`bearing` + `crank1`..`crank4`) is driven by the flywheel `inertia` (initial
10 rad/s); the connecting rod and piston are carried by the interior frames
`frame_ia`/`frame_ib` of `jointRRP`, and `gasForce` drives the prismatic axis.

The diagram layout is preserved from the reference engine model using the same
Modelica->Dyad coordinate transform as `Engine1b` (x_d = 500 + 5*x_m,
y_d = 500 - 5*y_m, rot_d = (360 - rot_m) mod 360). Do not run `dyad layout` on
this model.
"""
example component Engine1b_analytic
  world = MultibodyComponents.World() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 0, "y1": 900, "x2": 100, "y2": 1000, "rot": 0}
      },
      "tags": []
    }
  }
  piston = MultibodyComponents.BodyCylinder(diameter = 0.1, r = [0, -0.1, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 880, "y1": 310, "x2": 980, "y2": 410, "rot": 0}
      },
      "tags": []
    }
  }
  connectingRod = MultibodyComponents.BodyBox(width_dir = [1, 0, 0], width = 0.02, height = 0.06, color = [0, 0, 0.784, 1], r = [0, -0.2, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 900, "y1": 550, "x2": 1000, "y2": 650, "rot": 270}
      },
      "tags": []
    }
  }
  bearing = MultibodyComponents.Revolute(n = [1, 0, 0], cylinder_length = 0.02, radius = 0.025) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 200, "y1": 900, "x2": 300, "y2": 1000, "rot": 0}
      },
      "tags": []
    }
  }
  inertia = RotationalComponents.Components.Inertia(J = 1) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 200, "y1": 700, "x2": 300, "y2": 800, "rot": 0}
      },
      "tags": []
    }
  }
  crank1 = MultibodyComponents.BodyCylinder(diameter = 0.05, r = [0.1, 0, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 350, "y1": 900, "x2": 450, "y2": 1000, "rot": 0}
      },
      "tags": []
    }
  }
  crank2 = MultibodyComponents.BodyBox(height = 0.05, width_dir = [1, 0, 0], width = 0.02, r = [0, 0.1, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 450, "y1": 850, "x2": 550, "y2": 950, "rot": 270}
      },
      "tags": []
    }
  }
  crank3 = MultibodyComponents.BodyCylinder(diameter = 0.03, r = [0.1, 0, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 700, "y1": 780, "x2": 800, "y2": 880, "rot": 0}
      },
      "tags": []
    }
  }
  crank4 = MultibodyComponents.BodyBox(height = 0.05, width_dir = [1, 0, 0], width = 0.02, r = [0, -0.1, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1000, "y1": 850, "x2": 900, "y2": 950, "rot": 270}
      },
      "tags": []
    }
  }
  mid = MultibodyComponents.FixedTranslation(r = [0.05, 0, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 550, "y1": 650, "x2": 650, "y2": 750, "rot": 0}
      },
      "tags": []
    }
  }
  cylPosition = MultibodyComponents.FixedTranslation(r = [0.15, 0.45, 0], render = false) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 100, "y1": 250, "x2": 200, "y2": 350, "rot": 270}
      },
      "tags": []
    }
  }
  gasForce = MultibodyComponents.GasForce2(d = 0.1, L = 0.35) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 860, "y1": 400, "x2": 960, "y2": 500, "rot": 270}
      },
      "tags": []
    }
  }
  jointRRP = MultibodyComponents.JointRRP(n_a = [1, 0, 0], n_b = [0, -1, 0], rRod1_ia = [0, 0.2, 0], rRod2_ib = [0, -0.1, 0]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 600, "y1": 300, "x2": 800, "y2": 500, "rot": 270}
      },
      "tags": []
    }
  }
relations
  initial inertia.phi = 0
  initial inertia.w = 10
  connect(world.frame_b, bearing.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(crank2.frame_a, crank1.frame_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 950}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(bearing.frame_b, crank1.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(world.frame_b, cylPosition.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 150, "y": 950}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(crank3.frame_b, crank4.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 950, "y": 830}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(inertia.spline_b, bearing.axis) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [{"x": 350, "y": 750}, {"x": 350, "y": 850}, {"x": 250, "y": 850}],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
  connect(crank2.frame_b, crank3.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 830}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(crank2.frame_b, mid.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 700}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(mid.frame_b, jointRRP.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 700, "y": 700}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointRRP.frame_b, cylPosition.frame_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 700, "y": 200}, {"x": 150, "y": 200}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointRRP.frame_ib, piston.frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 890, "y": 364}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(connectingRod.frame_b, jointRRP.frame_ia) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [
            {"x": 950, "y": 550},
            {"x": 750, "y": 550},
            {"x": 750, "y": 440},
            {"x": 700, "y": 440}
          ],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
  connect(jointRRP.axis, gasForce.flange_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 800, "y": 390}, {"x": 910, "y": 390}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointRRP.bearing, gasForce.flange_a) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [
            {"x": 800, "y": 462},
            {"x": 800, "y": 510},
            {"x": 910, "y": 510},
            {"x": 910, "y": 500}
          ],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
metadata {}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses