# No. 472 (Brown 1868): "Grimshaw's compressed air hammer. The head of this hammer is attached to a piston, A, which works in a cylinder, B, into which air is admitted, like steam to a steam engine, above and below the piston by a slide-valve on top. The air is received from a reservoir, C, in the framing, supplied by an air pump, D, driven by a crank on the rotary driving-shaft, E."
# Model (cm, gravity on, the cylinders, valve chest and reservoir cut away in half section, seen from in front). The shaft E turns at
# 120 rpm (the only drive). Its crank works the air pump D (8 cm bore): its piston draws air in by a suction valve in its
# cover and forces it by a delivery valve (both check valves) into the reservoir C, a hollow column of the framing. An eccentric pin on
# the same crank works the slide valve on top of the hammer's cylinder B (6 cm bore) by a long rod: one way, it lets the
# reservoir's air in over the piston A and the air under it out; the other way, under it and out from over it. So the hammer
# (4 kg) is driven up and down by the air, like steam in a steam engine, and strikes the work on the anvil. Every air space (the
# pump, the reservoir, over and under the piston) is a lumped gas vessel (src/fluid/vessels.c, isothermal air); the pistons sweep
# theirs. All four are drawn (src/fluid/vdraw.ts), shaded by their pressures. Generator: opencode-runs/water/gen472.py.
number: 472
slug: grimshaw-compressed-air-hammer
name: Grimshaw's compressed air hammer
brown: "Grimshaw's compressed air hammer. The head of this hammer is attached to a piston, A, which works in a cylinder, B, into which air is admitted, like steam to a steam engine, above and below the piston by a slide-valve on top. The air is received from a reservoir, C, in the framing, supplied by an air pump, D, driven by a crank on the rotary driving-shaft, E."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 60
  duration_s: 12
  floor: false
bodies:
  - id: hammer
    shape: part
    pos: [0, 0, 13.52]
    mass: 4
    color: "#4f4a43"
    pieces:
      - {kind: loft, a: [[-4, -3, 17.02], [4, -3, 17.02], [4, 3, 17.02], [-4, 3, 17.02]], b: [[-4, -3, 10.02], [4, -3, 10.02], [4, 3, 10.02], [-4, 3, 10.02]], collide: 1, color: "#4f4a43"}
      - {kind: rod, from: [0, 0, 17.02], to: [0, 0, 43.6], radius: 0.6, collide: 0}
      - {kind: loft, a: [[2.95, 0, 44.6], [2.7254, 1.1289, 44.6], [2.086, 2.086, 44.6], [1.1289, 2.7254, 44.6], [0, 2.95, 44.6], [-1.1289, 2.7254, 44.6], [-2.086, 2.086, 44.6], [-2.7254, 1.1289, 44.6], [-2.95, 0, 44.6], [-2.7254, -1.1289, 44.6], [-2.086, -2.086, 44.6], [-1.1289, -2.7254, 44.6], [-0, -2.95, 44.6], [1.1289, -2.7254, 44.6], [2.086, -2.086, 44.6], [2.7254, -1.1289, 44.6]], b: [[2.95, 0, 42.6], [2.7254, 1.1289, 42.6], [2.086, 2.086, 42.6], [1.1289, 2.7254, 42.6], [0, 2.95, 42.6], [-1.1289, 2.7254, 42.6], [-2.086, 2.086, 42.6], [-2.7254, 1.1289, 42.6], [-2.95, 0, 42.6], [-2.7254, -1.1289, 42.6], [-2.086, -2.086, 42.6], [-1.1289, -2.7254, 42.6], [-0, -2.95, 42.6], [1.1289, -2.7254, 42.6], [2.086, -2.086, 42.6], [2.7254, -1.1289, 42.6]], collide: 0, color: "#8a8478"}
  - id: pumppis
    shape: part
    pos: [-24, 0, 20]
    mass: 0.3
    color: "#8a8478"
    pieces:
      - {kind: loft, a: [[-20.05, 0, 28], [-20.3507, 1.5116, 28], [-21.2069, 2.7931, 28], [-22.4884, 3.6493, 28], [-24, 3.95, 28], [-25.5116, 3.6493, 28], [-26.7931, 2.7931, 28], [-27.6493, 1.5116, 28], [-27.95, 0, 28], [-27.6493, -1.5116, 28], [-26.7931, -2.7931, 28], [-25.5116, -3.6493, 28], [-24, -3.95, 28], [-22.4884, -3.6493, 28], [-21.2069, -2.7931, 28], [-20.3507, -1.5116, 28]], b: [[-20.05, 0, 26], [-20.3507, 1.5116, 26], [-21.2069, 2.7931, 26], [-22.4884, 3.6493, 26], [-24, 3.95, 26], [-25.5116, 3.6493, 26], [-26.7931, 2.7931, 26], [-27.6493, 1.5116, 26], [-27.95, 0, 26], [-27.6493, -1.5116, 26], [-26.7931, -2.7931, 26], [-25.5116, -3.6493, 26], [-24, -3.95, 26], [-22.4884, -3.6493, 26], [-21.2069, -2.7931, 26], [-20.3507, -1.5116, 26]], collide: 0, color: "#8a8478"}
      - {kind: rod, from: [-24, 0, 20], to: [-24, 0, 26], radius: 0.5, collide: 0}
      - {kind: rod, from: [-24, -0.6, 20], to: [-24, 0.6, 20], radius: 0.4, collide: 0}
  - id: pumprod
    shape: part
    mount: pumppis
    pos: [-24, 0, 20]
    mass: 0.1
    color: "#6d675c"
    pieces:
      - {kind: rod, from: [-24, 0, 8], to: [-24, 0, 20], radius: 0.45, capsule: true, collide: 0}
  - id: crank
    shape: part
    pos: [-24, 0, 12]
    mass: 6
    color: "#7a6a4f"
    pieces:
      - {kind: loft, a: [[-21.4, -0.2, 12], [-21.5979, -0.2, 12.995], [-22.1615, -0.2, 13.8385], [-23.005, -0.2, 14.4021], [-24, -0.2, 14.6], [-24.995, -0.2, 14.4021], [-25.8385, -0.2, 13.8385], [-26.4021, -0.2, 12.995], [-26.6, -0.2, 12], [-26.4021, -0.2, 11.005], [-25.8385, -0.2, 10.1615], [-24.995, -0.2, 9.5979], [-24, -0.2, 9.4], [-23.005, -0.2, 9.5979], [-22.1615, -0.2, 10.1615], [-21.5979, -0.2, 11.005]], b: [[-21.4, -0.9, 12], [-21.5979, -0.9, 12.995], [-22.1615, -0.9, 13.8385], [-23.005, -0.9, 14.4021], [-24, -0.9, 14.6], [-24.995, -0.9, 14.4021], [-25.8385, -0.9, 13.8385], [-26.4021, -0.9, 12.995], [-26.6, -0.9, 12], [-26.4021, -0.9, 11.005], [-25.8385, -0.9, 10.1615], [-24.995, -0.9, 9.5979], [-24, -0.9, 9.4], [-23.005, -0.9, 9.5979], [-22.1615, -0.9, 10.1615], [-21.5979, -0.9, 11.005]], collide: 0, color: "#7a6a4f"}
      - {kind: rod, from: [-24, -0.5, 12], to: [-24, -0.5, 8], radius: 0.7, capsule: true, collide: 0}
      - {kind: rod, from: [-24, -0.9, 12], to: [-24, 1.2, 12], radius: 0.8, collide: 0}
      - {kind: rod, from: [-23.5568, -1.4, 12.0781], to: [-23.5568, -0.9, 12.0781], radius: 0.5, collide: 0}
  - id: valve
    shape: part
    pos: [0, 0, 60.3]
    mass: 0.05
    color: "#c8781e"
    pieces:
      - {kind: loft, a: [[-2.8, 0.1, 60.3], [2.8, 0.1, 60.3], [2.8, 2.3, 60.3], [-2.8, 2.3, 60.3]], b: [[-2.8, 0.1, 58.75], [2.8, 0.1, 58.75], [2.8, 2.3, 58.75], [-2.8, 2.3, 58.75]], collide: 0, color: "#c8781e"}
      - {kind: rod, from: [-2.8, 0, 60.3], to: [-6.5, 0, 60.3], radius: 0.3, collide: 0}
      - {kind: rod, from: [-6.5, -0.4, 60.3], to: [-6.5, -1.6, 60.3], radius: 0.35, collide: 0}
  - id: vrod
    shape: part
    mount: valve
    pos: [-6.5, 0, 60.3]
    mass: 0.05
    color: "#6d675c"
    pieces:
      - {kind: rod, from: [-6.5, -1.6, 60.3], to: [-23.5568, -1.6, 12.0781], radius: 0.35, capsule: true, collide: 0}
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#d6cdb8"
    pieces:
      - {kind: loft, a: [[-34, -6, 0], [18, -6, 0], [18, 10, 0], [-34, 10, 0]], b: [[-34, -6, -1.5], [18, -6, -1.5], [18, 10, -1.5], [-34, 10, -1.5]], collide: 0, color: "#8b7d66"}
      - {kind: loft, a: [[-8, -5, 3], [8, -5, 3], [8, 5, 3], [-8, 5, 3]], b: [[-8, -5, 0], [8, -5, 0], [8, 5, 0], [-8, 5, 0]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-5.5, -4, 7], [5.5, -4, 7], [5.5, 4, 7], [-5.5, 4, 7]], b: [[-5.5, -4, 3], [5.5, -4, 3], [5.5, 4, 3], [-5.5, 4, 3]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-6, -2.5, 10], [6, -2.5, 10], [6, 2.5, 10], [-6, 2.5, 10]], b: [[-6, -2.5, 7], [6, -2.5, 7], [6, 2.5, 7], [-6, 2.5, 7]], collide: 2, color: "#c0582c"}
      - {kind: loft, a: [[-16.8, 0, 48], [-16, 0, 48], [-16, 3, 48], [-16.8, 3, 48]], b: [[-16.8, 0, 4], [-16, 0, 4], [-16, 3, 4], [-16.8, 3, 4]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-9, 0, 48], [-8.2, 0, 48], [-8.2, 3, 48], [-9, 3, 48]], b: [[-9, 0, 4], [-8.2, 0, 4], [-8.2, 3, 4], [-9, 3, 4]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-16.8, 0, 4], [-8.2, 0, 4], [-8.2, 3, 4], [-16.8, 3, 4]], b: [[-16.8, 0, 3.2], [-8.2, 0, 3.2], [-8.2, 3, 3.2], [-16.8, 3, 3.2]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-16.8, 0, 48.8], [-8.2, 0, 48.8], [-8.2, 3, 48.8], [-16.8, 3, 48.8]], b: [[-16.8, 0, 48], [-8.2, 0, 48], [-8.2, 3, 48], [-16.8, 3, 48]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-16.8, 3, 48.8], [-8.2, 3, 48.8], [-8.2, 4, 48.8], [-16.8, 4, 48.8]], b: [[-16.8, 3, 3.2], [-8.2, 3, 3.2], [-8.2, 4, 3.2], [-16.8, 4, 3.2]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-18, -3, 3.2], [-7, -3, 3.2], [-7, 4, 3.2], [-18, 4, 3.2]], b: [[-18, -3, 0], [-7, -3, 0], [-7, 4, 0], [-18, 4, 0]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[12, -2, 39.5], [14.5, -2, 39.5], [14.5, 2, 39.5], [12, 2, 39.5]], b: [[12, -2, 0], [14.5, -2, 0], [14.5, 2, 0], [12, 2, 0]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[10.5, -3, 1.5], [16, -3, 1.5], [16, 3, 1.5], [10.5, 3, 1.5]], b: [[10.5, -3, 0], [16, -3, 0], [16, 3, 0], [10.5, 3, 0]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-16.8, -3, 41.3], [14.5, -3, 41.3], [14.5, 3, 41.3], [-16.8, 3, 41.3]], b: [[-16.8, -3, 39.5], [14.5, -3, 39.5], [14.5, 3, 39.5], [-16.8, 3, 39.5]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-4.3, -1, 39.5], [-5.1, -1, 39.5], [-5.1, 1, 39.5], [-4.3, 1, 39.5]], b: [[-4.3, -1, 11.5], [-5.1, -1, 11.5], [-5.1, 1, 11.5], [-4.3, 1, 11.5]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[4.3, -1, 39.5], [5.1, -1, 39.5], [5.1, 1, 39.5], [4.3, 1, 39.5]], b: [[4.3, -1, 11.5], [5.1, -1, 11.5], [5.1, 1, 11.5], [4.3, 1, 11.5]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[3, 0, 58], [2.7716, 1.1481, 58], [3.4184, 1.4159, 58], [3.7, 0, 58]], b: [[3, 0, 42], [2.7716, 1.1481, 42], [3.4184, 1.4159, 42], [3.7, 0, 42]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[2.7716, 1.1481, 58], [2.1213, 2.1213, 58], [2.6163, 2.6163, 58], [3.4184, 1.4159, 58]], b: [[2.7716, 1.1481, 42], [2.1213, 2.1213, 42], [2.6163, 2.6163, 42], [3.4184, 1.4159, 42]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[2.1213, 2.1213, 58], [1.1481, 2.7716, 58], [1.4159, 3.4184, 58], [2.6163, 2.6163, 58]], b: [[2.1213, 2.1213, 42], [1.1481, 2.7716, 42], [1.4159, 3.4184, 42], [2.6163, 2.6163, 42]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[1.1481, 2.7716, 58], [0, 3, 58], [0, 3.7, 58], [1.4159, 3.4184, 58]], b: [[1.1481, 2.7716, 42], [0, 3, 42], [0, 3.7, 42], [1.4159, 3.4184, 42]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[0, 3, 58], [-1.1481, 2.7716, 58], [-1.4159, 3.4184, 58], [0, 3.7, 58]], b: [[0, 3, 42], [-1.1481, 2.7716, 42], [-1.4159, 3.4184, 42], [0, 3.7, 42]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-1.1481, 2.7716, 58], [-2.1213, 2.1213, 58], [-2.6163, 2.6163, 58], [-1.4159, 3.4184, 58]], b: [[-1.1481, 2.7716, 42], [-2.1213, 2.1213, 42], [-2.6163, 2.6163, 42], [-1.4159, 3.4184, 42]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-2.1213, 2.1213, 58], [-2.7716, 1.1481, 58], [-3.4184, 1.4159, 58], [-2.6163, 2.6163, 58]], b: [[-2.1213, 2.1213, 42], [-2.7716, 1.1481, 42], [-3.4184, 1.4159, 42], [-2.6163, 2.6163, 42]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-2.7716, 1.1481, 58], [-3, 0, 58], [-3.7, 0, 58], [-3.4184, 1.4159, 58]], b: [[-2.7716, 1.1481, 42], [-3, 0, 42], [-3.7, 0, 42], [-3.4184, 1.4159, 42]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-3.7, 0, 42], [3.7, 0, 42], [3.7, 3.7, 42], [-3.7, 3.7, 42]], b: [[-3.7, 0, 41.3], [3.7, 0, 41.3], [3.7, 3.7, 41.3], [-3.7, 3.7, 41.3]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-3.7, 0, 58.7], [3.7, 0, 58.7], [3.7, 3.7, 58.7], [-3.7, 3.7, 58.7]], b: [[-3.7, 0, 58], [3.7, 0, 58], [3.7, 3.7, 58], [-3.7, 3.7, 58]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[0.7, 0, 41.3], [0.495, 0.495, 41.3], [0.9899, 0.9899, 41.3], [1.4, 0, 41.3]], b: [[0.7, 0, 39.6], [0.495, 0.495, 39.6], [0.9899, 0.9899, 39.6], [1.4, 0, 39.6]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[0.495, 0.495, 41.3], [0, 0.7, 41.3], [0, 1.4, 41.3], [0.9899, 0.9899, 41.3]], b: [[0.495, 0.495, 39.6], [0, 0.7, 39.6], [0, 1.4, 39.6], [0.9899, 0.9899, 39.6]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[0, 0.7, 41.3], [-0.495, 0.495, 41.3], [-0.9899, 0.9899, 41.3], [0, 1.4, 41.3]], b: [[0, 0.7, 39.6], [-0.495, 0.495, 39.6], [-0.9899, 0.9899, 39.6], [0, 1.4, 39.6]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-0.495, 0.495, 41.3], [-0.7, 0, 41.3], [-1.4, 0, 41.3], [-0.9899, 0.9899, 41.3]], b: [[-0.495, 0.495, 39.6], [-0.7, 0, 39.6], [-1.4, 0, 39.6], [-0.9899, 0.9899, 39.6]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-4.5, 0, 62.7], [4.5, 0, 62.7], [4.5, 2.5, 62.7], [-4.5, 2.5, 62.7]], b: [[-4.5, 0, 61.9], [4.5, 0, 61.9], [4.5, 2.5, 61.9], [-4.5, 2.5, 61.9]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-4.5, 0, 61.9], [-3.8, 0, 61.9], [-3.8, 2.5, 61.9], [-4.5, 2.5, 61.9]], b: [[-4.5, 0, 58.7], [-3.8, 0, 58.7], [-3.8, 2.5, 58.7], [-4.5, 2.5, 58.7]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[3.8, 0, 61.9], [4.5, 0, 61.9], [4.5, 2.5, 61.9], [3.8, 2.5, 61.9]], b: [[3.8, 0, 58.7], [4.5, 0, 58.7], [4.5, 2.5, 58.7], [3.8, 2.5, 58.7]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[3.7, 0, 58.7], [5.3, 0, 58.7], [5.3, 2, 58.7], [3.7, 2, 58.7]], b: [[3.7, 0, 41.3], [5.3, 0, 41.3], [5.3, 2, 41.3], [3.7, 2, 41.3]], collide: 0, color: "#6d675c"}
      - {kind: rod, from: [-4.5, 1.2, 60.7], to: [-8.6, 1.2, 60.7], radius: 0.7, collide: 0, color: "#5f5a52"}
      - {kind: rod, from: [-8.6, 1.2, 60.7], to: [-8.6, 1.2, 48.4], radius: 0.7, collide: 0, color: "#5f5a52"}
      - {kind: rod, from: [4.5, 1.2, 59.7], to: [8, 1.2, 59.7], radius: 0.6, collide: 0, color: "#5f5a52"}
      - {kind: loft, a: [[-26.5, 2, 14.5], [-21.5, 2, 14.5], [-21.5, 4, 14.5], [-26.5, 4, 14.5]], b: [[-26.5, 2, 0], [-21.5, 2, 0], [-21.5, 4, 0], [-26.5, 4, 0]], collide: 0, color: "#6d675c"}
      - {kind: rod, from: [-24, 1, 12], to: [-24, 4, 12], radius: 1.2, collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-20, 0, 38], [-20.3045, 1.5307, 38], [-19.7502, 1.7603, 38], [-19.4, 0, 38]], b: [[-20, 0, 27], [-20.3045, 1.5307, 27], [-19.7502, 1.7603, 27], [-19.4, 0, 27]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-20.3045, 1.5307, 38], [-21.1716, 2.8284, 38], [-20.7473, 3.2527, 38], [-19.7502, 1.7603, 38]], b: [[-20.3045, 1.5307, 27], [-21.1716, 2.8284, 27], [-20.7473, 3.2527, 27], [-19.7502, 1.7603, 27]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-21.1716, 2.8284, 38], [-22.4693, 3.6955, 38], [-22.2397, 4.2498, 38], [-20.7473, 3.2527, 38]], b: [[-21.1716, 2.8284, 27], [-22.4693, 3.6955, 27], [-22.2397, 4.2498, 27], [-20.7473, 3.2527, 27]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-22.4693, 3.6955, 38], [-24, 4, 38], [-24, 4.6, 38], [-22.2397, 4.2498, 38]], b: [[-22.4693, 3.6955, 27], [-24, 4, 27], [-24, 4.6, 27], [-22.2397, 4.2498, 27]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-24, 4, 38], [-25.5307, 3.6955, 38], [-25.7603, 4.2498, 38], [-24, 4.6, 38]], b: [[-24, 4, 27], [-25.5307, 3.6955, 27], [-25.7603, 4.2498, 27], [-24, 4.6, 27]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-25.5307, 3.6955, 38], [-26.8284, 2.8284, 38], [-27.2527, 3.2527, 38], [-25.7603, 4.2498, 38]], b: [[-25.5307, 3.6955, 27], [-26.8284, 2.8284, 27], [-27.2527, 3.2527, 27], [-25.7603, 4.2498, 27]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-26.8284, 2.8284, 38], [-27.6955, 1.5307, 38], [-28.2498, 1.7603, 38], [-27.2527, 3.2527, 38]], b: [[-26.8284, 2.8284, 27], [-27.6955, 1.5307, 27], [-28.2498, 1.7603, 27], [-27.2527, 3.2527, 27]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-27.6955, 1.5307, 38], [-28, 0, 38], [-28.6, 0, 38], [-28.2498, 1.7603, 38]], b: [[-27.6955, 1.5307, 27], [-28, 0, 27], [-28.6, 0, 27], [-28.2498, 1.7603, 27]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-28.6, 0, 38.8], [-19.4, 0, 38.8], [-19.4, 4.6, 38.8], [-28.6, 4.6, 38.8]], b: [[-28.6, 0, 38], [-19.4, 0, 38], [-19.4, 4.6, 38], [-28.6, 4.6, 38]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-28.6, 0, 40.2], [-26.6, 0, 40.2], [-26.6, 1.6, 40.2], [-28.6, 1.6, 40.2]], b: [[-28.6, 0, 38.8], [-26.6, 0, 38.8], [-26.6, 1.6, 38.8], [-28.6, 1.6, 38.8]], collide: 0, color: "#6d675c"}
      - {kind: loft, a: [[-21.4, 0, 40.2], [-19.4, 0, 40.2], [-19.4, 1.6, 40.2], [-21.4, 1.6, 40.2]], b: [[-21.4, 0, 38.8], [-19.4, 0, 38.8], [-19.4, 1.6, 38.8], [-21.4, 1.6, 38.8]], collide: 0, color: "#6d675c"}
      - {kind: rod, from: [-19.4, 0.8, 39.5], to: [-16.4, 0.8, 39.5], radius: 0.5, collide: 0, color: "#5f5a52"}
      - {kind: loft, a: [[-28.6, -2, 27], [-28, -2, 27], [-28, 2, 27], [-28.6, 2, 27]], b: [[-28.6, -2, 21], [-28, -2, 21], [-28, 2, 21], [-28.6, 2, 21]], collide: 0, color: "#6d675c"}
joints:
  - {id: j_h, type: slide, body: hammer, axis: [0, 0, 1], range: [-0.4, 13.1], damping: 0.5}   # the hammer and piston A
  - {id: j_d, type: slide, body: pumppis, axis: [0, 0, 1], range: [-1, 9], damping: 0.1}   # the pump D's piston
  - {id: j_dr, type: hinge, body: pumprod, axis: [0, 1, 0], damping: 0.001}
  - {id: j_k, type: hinge, body: crank, axis: [0, 1, 0], damping: 0.01}   # the shaft E (the drive)
  - {id: j_v, type: slide, body: valve, axis: [1, 0, 0], range: [-4, 4], damping: 0.01}   # the slide valve
  - {id: j_vr, type: hinge, body: vrod, axis: [0, 1, 0], damping: 0.0005}
pins:
  - {id: p_d, a: crank, b: pumprod, at: [-24, 0, 8]}
  - {id: p_v, a: crank, b: vrod, at: [-23.5568, 0, 12.0781]}
vessels:
  substeps: 4
  nodes:
    - {id: air, kind: source, p: 0, gas: true}
    - {id: pump, kind: gas, volume: 510.655, p: 0,
       draw: {sections: [[[-27.95, 21], [-20.05, 21], [-20.05, 38], [-27.95, 38]]], y: [0, 3.7], face: {body: pumppis, z: 28, side: above}, pref: 100000}}   # the pump D's barrel over its piston
    - {id: res, kind: gas, volume: 1848, p: 0,
       draw: {sections: [[[-16, 4], [-9, 4], [-9, 48], [-16, 48]]], y: [0, 3], pref: 100000}}   # the reservoir C
    - {id: top, kind: gas, volume: 381.876, p: 0,
       draw: {sections: [[[-2.95, 42], [2.95, 42], [2.95, 58], [-2.95, 58]]], y: [0, 2.7], face: {body: hammer, z: 44.6, side: above}, pref: 100000}}   # over the piston A
    - {id: bot, kind: gas, volume: 25.286, p: 0,
       draw: {sections: [[[-2.95, 42], [2.95, 42], [2.95, 58], [-2.95, 58]], [[3.8, 42], [5.2, 42], [5.2, 58.7], [3.8, 58.7]]], y: [0, 1.9], face: {body: hammer, z: 42.6, side: below}, pref: 100000}}   # under it and its passage
  links:
    - {id: suction, from: air, to: pump, area: 0.6, cd: 0.62, check: true}
    - {id: delivery, from: pump, to: res, area: 0.6, cd: 0.62, check: true}
    - {id: in_top, from: res, to: top, area: 0.5, cd: 0.62, open: {joint: j_v, q: [-1.92, -0.97], frac: [1, 0]}}
    - {id: out_bot, from: bot, to: air, area: 0.8, cd: 0.62, open: {joint: j_v, q: [-1.92, -0.97], frac: [1, 0]}}
    - {id: in_bot, from: res, to: bot, area: 0.5, cd: 0.62, open: {joint: j_v, q: [-0.47, 0.48], frac: [0, 1]}}
    - {id: out_top, from: top, to: air, area: 0.8, cd: 0.62, open: {joint: j_v, q: [-0.47, 0.48], frac: [0, 1]}}
  pistons:
    - {node: pump, joint: j_d, area: 50.2655, sign: -1}
    - {node: bot, joint: j_h, area: 27.1434, sign: 1}
    - {node: top, joint: j_h, area: 28.2743, sign: -1}
driver: {joint: j_k, kind: velocity, rpm: 120, kv: 100, max_torque: 200}
checks:
  - {type: amplitude, joint: j_h, min: 0.025, max: 0.07, settle_s: 3, window_s: 8}
  - {type: penetration, max: 0.01}
camera: {target: [-8, 0, 23], position: [-8, -260, 27], fov: 21}
display:
  output: j_h
  labels: {j_h: "Hammer and piston A", j_d: "Air pump D", j_dr: "Pump rod", j_k: "Shaft E (driver)", j_v: "Slide valve", j_vr: "Valve rod"}
