# No. 452 (Brown 1868): "Double-acting pump. Cylinder closed at each end, and piston-rod passes through stuffing-box on one end, and
# the cylinder has four openings covered by valves, two for admitting water and like number for discharge. A is suction-pipe, and B
# discharge-pipe. When piston moves down, water rushes in at suction-valve, 1, on upper end of cylinder, and that below piston is forced
# through valve, 3, and discharge-pipe, B; on the piston ascending again, water is forced through discharge-valve, 4, on upper end of
# cylinder, and water enters lower suction-valve, 2."
# Model (cm, gravity on, Brown's section from in front). The piston-rod is worked up and down through the stuffing-box (the only drive).
# Each end of the cylinder opens into a head; partitions in the heads carry the four valves, flaps hung by their top edges: 1 (upper)
# and 2 (lower) let water in from the suction passage A on the right, 3 (lower) and 4 (upper) let it out into the discharge passage B
# on the left. The water is lumped vessels (src/fluid/vessels.c): the cylinder under the piston with the lower head, and over it with
# the upper head, are two closed chambers the piston sweeps (98.5203 cm^2 under, 96.981 cm^2 over, less the rod); A from the
# well and B are passages full of water; B delivers 60 cm up, out of the picture, through a pipe with inertia. Each flap is moved
# only by its weight and the pressures on its two faces and passes water as it swings open (fully at 0.5 rad).
# Generator: opencode-runs/water/gen452.py.
number: 452
slug: double-acting-pump
name: Double-acting pump
brown: "Double-acting pump. Cylinder closed at each end, and piston-rod passes through stuffing-box on one end, and the cylinder has four openings covered by valves, two for admitting water and like number for discharge. A is suction-pipe, and B discharge-pipe. When piston moves down, water rushes in at suction-valve, 1, on upper end of cylinder, and that below piston is forced through valve, 3, and discharge-pipe, B; on the piston ascending again, water is forced through discharge-valve, 4, on upper end of cylinder, and water enters lower suction-valve, 2."
units: cm
sim:
  timestep: 0.0001
  integrator: implicitfast
  iterations: 60
  duration_s: 12
  floor: false
bodies:
  - id: piston
    shape: part
    pos: [0, 0, 14]
    mass: 0.4
    color: "#8a8478"
    pieces:
      - {kind: loft, a: [[5.55, 0, 19], [5.2784, 1.715, 19], [4.49, 3.2622, 19], [3.2622, 4.49, 19], [1.715, 5.2784, 19], [0, 5.55, 19], [-1.715, 5.2784, 19], [-3.2622, 4.49, 19], [-4.49, 3.2622, 19], [-5.2784, 1.715, 19], [-5.55, 0, 19], [-5.2784, -1.715, 19], [-4.49, -3.2622, 19], [-3.2622, -4.49, 19], [-1.715, -5.2784, 19], [-0, -5.55, 19], [1.715, -5.2784, 19], [3.2622, -4.49, 19], [4.49, -3.2622, 19], [5.2784, -1.715, 19]], b: [[5.55, 0, 14], [5.2784, 1.715, 14], [4.49, 3.2622, 14], [3.2622, 4.49, 14], [1.715, 5.2784, 14], [0, 5.55, 14], [-1.715, 5.2784, 14], [-3.2622, 4.49, 14], [-4.49, 3.2622, 14], [-5.2784, 1.715, 14], [-5.55, 0, 14], [-5.2784, -1.715, 14], [-4.49, -3.2622, 14], [-3.2622, -4.49, 14], [-1.715, -5.2784, 14], [-0, -5.55, 14], [1.715, -5.2784, 14], [3.2622, -4.49, 14], [4.49, -3.2622, 14], [5.2784, -1.715, 14]], collide: 0, color: "#8a8478"}
      - {kind: loft, a: [[5.58, 0, 17.6], [5.3069, 1.7243, 17.6], [4.5143, 3.2798, 17.6], [3.2798, 4.5143, 17.6], [1.7243, 5.3069, 17.6], [0, 5.58, 17.6], [-1.7243, 5.3069, 17.6], [-3.2798, 4.5143, 17.6], [-4.5143, 3.2798, 17.6], [-5.3069, 1.7243, 17.6], [-5.58, 0, 17.6], [-5.3069, -1.7243, 17.6], [-4.5143, -3.2798, 17.6], [-3.2798, -4.5143, 17.6], [-1.7243, -5.3069, 17.6], [-0, -5.58, 17.6], [1.7243, -5.3069, 17.6], [3.2798, -4.5143, 17.6], [4.5143, -3.2798, 17.6], [5.3069, -1.7243, 17.6]], b: [[5.58, 0, 15.4], [5.3069, 1.7243, 15.4], [4.5143, 3.2798, 15.4], [3.2798, 4.5143, 15.4], [1.7243, 5.3069, 15.4], [0, 5.58, 15.4], [-1.7243, 5.3069, 15.4], [-3.2798, 4.5143, 15.4], [-4.5143, 3.2798, 15.4], [-5.3069, 1.7243, 15.4], [-5.58, 0, 15.4], [-5.3069, -1.7243, 15.4], [-4.5143, -3.2798, 15.4], [-3.2798, -4.5143, 15.4], [-1.7243, -5.3069, 15.4], [-0, -5.58, 15.4], [1.7243, -5.3069, 15.4], [3.2798, -4.5143, 15.4], [4.5143, -3.2798, 15.4], [5.3069, -1.7243, 15.4]], collide: 0, color: "#3d2e20"}
      - {kind: rod, from: [0, 0, 19], to: [0, 0, 43], radius: 0.7, collide: 0}
  - id: v1
    shape: part
    pos: [6.6, 0, 33.5]
    mass: 0.004
    color: "#e0a030"
    pieces:
      - {kind: loft, a: [[6.25, -0.3, 33.5], [6.75, -0.3, 33.5], [6.75, 2.6, 33.5], [6.25, 2.6, 33.5]], b: [[6.25, -0.3, 30.7], [6.75, -0.3, 30.7], [6.75, 2.6, 30.7], [6.25, 2.6, 30.7]], collide: 0, color: "#c8781e"}
      - {kind: rod, from: [6.6, -0.3, 33.5], to: [6.6, 2.8, 33.5], radius: 0.18, collide: 0}
  - id: v2
    shape: part
    pos: [6.6, 0, 2.7]
    mass: 0.004
    color: "#e0a030"
    pieces:
      - {kind: loft, a: [[6.25, -0.3, 2.7], [6.75, -0.3, 2.7], [6.75, 2.6, 2.7], [6.25, 2.6, 2.7]], b: [[6.25, -0.3, -0.1], [6.75, -0.3, -0.1], [6.75, 2.6, -0.1], [6.25, 2.6, -0.1]], collide: 0, color: "#c8781e"}
      - {kind: rod, from: [6.6, -0.3, 2.7], to: [6.6, 2.8, 2.7], radius: 0.18, collide: 0}
  - id: v3
    shape: part
    pos: [-7.4, 0, 2.7]
    mass: 0.004
    color: "#e0a030"
    pieces:
      - {kind: loft, a: [[-7.75, -0.3, 2.7], [-7.25, -0.3, 2.7], [-7.25, 2.6, 2.7], [-7.75, 2.6, 2.7]], b: [[-7.75, -0.3, -0.1], [-7.25, -0.3, -0.1], [-7.25, 2.6, -0.1], [-7.75, 2.6, -0.1]], collide: 0, color: "#c8781e"}
      - {kind: rod, from: [-7.4, -0.3, 2.7], to: [-7.4, 2.8, 2.7], radius: 0.18, collide: 0}
  - id: v4
    shape: part
    pos: [-7.4, 0, 33.5]
    mass: 0.004
    color: "#e0a030"
    pieces:
      - {kind: loft, a: [[-7.75, -0.3, 33.5], [-7.25, -0.3, 33.5], [-7.25, 2.6, 33.5], [-7.75, 2.6, 33.5]], b: [[-7.75, -0.3, 30.7], [-7.25, -0.3, 30.7], [-7.25, 2.6, 30.7], [-7.75, 2.6, 30.7]], collide: 0, color: "#c8781e"}
      - {kind: rod, from: [-7.4, -0.3, 33.5], to: [-7.4, 2.8, 33.5], radius: 0.18, collide: 0}
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#d6cdb8"
    pieces:
      - {kind: loft, a: [[-16, 0, 0], [14.6, 0, 0], [14.6, 3, 0], [-16, 3, 0]], b: [[-16, 0, -0.8], [14.6, 0, -0.8], [14.6, 3, -0.8], [-16, 3, -0.8]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-12.2, 0, 35], [10.8, 0, 35], [10.8, 3, 35], [-12.2, 3, 35]], b: [[-12.2, 0, 33.8], [10.8, 0, 33.8], [10.8, 3, 33.8], [-12.2, 3, 33.8]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-16, 0, 41], [-15.2, 0, 41], [-15.2, 3, 41], [-16, 3, 41]], b: [[-16, 0, -0.8], [-15.2, 0, -0.8], [-15.2, 3, -0.8], [-16, 3, -0.8]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-12.2, 0, 41], [-11.4, 0, 41], [-11.4, 3, 41], [-12.2, 3, 41]], b: [[-12.2, 0, 34.2], [-11.4, 0, 34.2], [-11.4, 3, 34.2], [-12.2, 3, 34.2]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[13.8, 0, 35], [14.6, 0, 35], [14.6, 3, 35], [13.8, 3, 35]], b: [[13.8, 0, -4.5], [14.6, 0, -4.5], [14.6, 3, -4.5], [13.8, 3, -4.5]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[10, 0, 35], [14.6, 0, 35], [14.6, 3, 35], [10, 3, 35]], b: [[10, 0, 33.8], [14.6, 0, 33.8], [14.6, 3, 33.8], [10, 3, 33.8]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[10, 0, -0.8], [10.8, 0, -0.8], [10.8, 3, -0.8], [10, 3, -0.8]], b: [[10, 0, -4.5], [10.8, 0, -4.5], [10.8, 3, -4.5], [10, 3, -4.5]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[13.8, 0, -0.8], [14.6, 0, -0.8], [14.6, 3, -0.8], [13.8, 3, -0.8]], b: [[13.8, 0, -4.5], [14.6, 0, -4.5], [14.6, 3, -4.5], [13.8, 3, -4.5]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-16, 0, -0.8], [10, 0, -0.8], [10, 3, -0.8], [-16, 3, -0.8]], b: [[-16, 0, -0.81], [10, 0, -0.81], [10, 3, -0.81], [-16, 3, -0.81]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-12.2, 0, 3.8], [-5.6, 0, 3.8], [-5.6, 3, 3.8], [-12.2, 3, 3.8]], b: [[-12.2, 0, 3], [-5.6, 0, 3], [-5.6, 3, 3], [-12.2, 3, 3]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-12.2, 0, 30], [-5.6, 0, 30], [-5.6, 3, 30], [-12.2, 3, 30]], b: [[-12.2, 0, 29.2], [-5.6, 0, 29.2], [-5.6, 3, 29.2], [-12.2, 3, 29.2]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-12.2, 0, 30], [-11.4, 0, 30], [-11.4, 3, 30], [-12.2, 3, 30]], b: [[-12.2, 0, 3], [-11.4, 0, 3], [-11.4, 3, 3], [-12.2, 3, 3]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-6.4, 0, 30], [-5.6, 0, 30], [-5.6, 3, 30], [-6.4, 3, 30]], b: [[-6.4, 0, 3], [-5.6, 0, 3], [-5.6, 3, 3], [-6.4, 3, 3]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-12.2, 2.6, 30], [-5.6, 2.6, 30], [-5.6, 3, 30], [-12.2, 3, 30]], b: [[-12.2, 2.6, 3], [-5.6, 2.6, 3], [-5.6, 3, 3], [-12.2, 3, 3]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[5.6, 0, 3.8], [10.8, 0, 3.8], [10.8, 3, 3.8], [5.6, 3, 3.8]], b: [[5.6, 0, 3], [10.8, 0, 3], [10.8, 3, 3], [5.6, 3, 3]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[5.6, 0, 30], [10.8, 0, 30], [10.8, 3, 30], [5.6, 3, 30]], b: [[5.6, 0, 29.2], [10.8, 0, 29.2], [10.8, 3, 29.2], [5.6, 3, 29.2]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[5.6, 0, 30], [6.4, 0, 30], [6.4, 3, 30], [5.6, 3, 30]], b: [[5.6, 0, 3], [6.4, 0, 3], [6.4, 3, 3], [5.6, 3, 3]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[10, 0, 30], [10.8, 0, 30], [10.8, 3, 30], [10, 3, 30]], b: [[10, 0, 3], [10.8, 0, 3], [10.8, 3, 3], [10, 3, 3]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[5.6, 2.6, 30], [10.8, 2.6, 30], [10.8, 3, 30], [5.6, 3, 30]], b: [[5.6, 2.6, 3], [10.8, 2.6, 3], [10.8, 3, 3], [5.6, 3, 3]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-7.25, 0, 3], [-6.75, 0, 3], [-6.75, 3, 3], [-7.25, 3, 3]], b: [[-7.25, 0, 2.7], [-6.75, 0, 2.7], [-6.75, 3, 2.7], [-7.25, 3, 2.7]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-7.25, 0, 31.1], [-6.75, 0, 31.1], [-6.75, 3, 31.1], [-7.25, 3, 31.1]], b: [[-7.25, 0, 30], [-6.75, 0, 30], [-6.75, 3, 30], [-7.25, 3, 30]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-7.25, 2.4, 33.8], [-6.75, 2.4, 33.8], [-6.75, 3, 33.8], [-7.25, 3, 33.8]], b: [[-7.25, 2.4, 0], [-6.75, 2.4, 0], [-6.75, 3, 0], [-7.25, 3, 0]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[6.75, 0, 3], [7.25, 0, 3], [7.25, 3, 3], [6.75, 3, 3]], b: [[6.75, 0, 2.7], [7.25, 0, 2.7], [7.25, 3, 2.7], [6.75, 3, 2.7]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[6.75, 0, 31.1], [7.25, 0, 31.1], [7.25, 3, 31.1], [6.75, 3, 31.1]], b: [[6.75, 0, 30], [7.25, 0, 30], [7.25, 3, 30], [6.75, 3, 30]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[6.75, 2.4, 33.8], [7.25, 2.4, 33.8], [7.25, 3, 33.8], [6.75, 3, 33.8]], b: [[6.75, 2.4, 0], [7.25, 2.4, 0], [7.25, 3, 0], [6.75, 3, 0]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-2.6, 0, 38.2], [-0.75, 0, 38.2], [-0.75, 2.6, 38.2], [-2.6, 2.6, 38.2]], b: [[-2.6, 0, 35], [-0.75, 0, 35], [-0.75, 2.6, 35], [-2.6, 2.6, 35]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[0.75, 0, 38.2], [2.6, 0, 38.2], [2.6, 2.6, 38.2], [0.75, 2.6, 38.2]], b: [[0.75, 0, 35], [2.6, 0, 35], [2.6, 2.6, 35], [0.75, 2.6, 35]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-3.4, 0, 38.2], [-0.75, 0, 38.2], [-0.75, 2.6, 38.2], [-3.4, 2.6, 38.2]], b: [[-3.4, 0, 37.4], [-0.75, 0, 37.4], [-0.75, 2.6, 37.4], [-3.4, 2.6, 37.4]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[0.75, 0, 38.2], [3.4, 0, 38.2], [3.4, 2.6, 38.2], [0.75, 2.6, 38.2]], b: [[0.75, 0, 37.4], [3.4, 0, 37.4], [3.4, 2.6, 37.4], [0.75, 2.6, 37.4]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[3.2, 0, -10], [21.4, 0, -10], [21.4, 6.6, -10], [3.2, 6.6, -10]], b: [[3.2, 0, -10.6], [21.4, 0, -10.6], [21.4, 6.6, -10.6], [3.2, 6.6, -10.6]], collide: 0, color: "#9c9282"}
      - {kind: loft, a: [[3.2, 6, -4], [21.4, 6, -4], [21.4, 6.6, -4], [3.2, 6.6, -4]], b: [[3.2, 6, -10], [21.4, 6, -10], [21.4, 6.6, -10], [3.2, 6.6, -10]], collide: 0, color: "#9c9282"}
      - {kind: loft, a: [[3.2, 0, -4], [3.8, 0, -4], [3.8, 6, -4], [3.2, 6, -4]], b: [[3.2, 0, -10], [3.8, 0, -10], [3.8, 6, -10], [3.2, 6, -10]], collide: 0, color: "#9c9282"}
      - {kind: loft, a: [[20.8, 0, -4], [21.4, 0, -4], [21.4, 6, -4], [20.8, 6, -4]], b: [[20.8, 0, -10], [21.4, 0, -10], [21.4, 6, -10], [20.8, 6, -10]], collide: 0, color: "#9c9282"}
      - {kind: loft, a: [[-23.2, 0, -4], [3.2, 0, -4], [3.2, 8, -4], [-23.2, 8, -4]], b: [[-23.2, 0, -5.2], [3.2, 0, -5.2], [3.2, 8, -5.2], [-23.2, 8, -5.2]], collide: 0, color: "#8b7d66"}
      - {kind: loft, a: [[21.4, 0, -4], [28.8, 0, -4], [28.8, 8, -4], [21.4, 8, -4]], b: [[21.4, 0, -5.2], [28.8, 0, -5.2], [28.8, 8, -5.2], [21.4, 8, -5.2]], collide: 0, color: "#8b7d66"}
      - {kind: loft, a: [[10, 0, -4.5], [10.8, 0, -4.5], [10.8, 3, -4.5], [10, 3, -4.5]], b: [[10, 0, -8.5], [10.8, 0, -8.5], [10.8, 3, -8.5], [10, 3, -8.5]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[13.8, 0, -4.5], [14.6, 0, -4.5], [14.6, 3, -4.5], [13.8, 3, -4.5]], b: [[13.8, 0, -8.5], [14.6, 0, -8.5], [14.6, 3, -8.5], [13.8, 3, -8.5]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[10.8, 2.6, 33.8], [13.8, 2.6, 33.8], [13.8, 3, 33.8], [10.8, 3, 33.8]], b: [[10.8, 2.6, -8.5], [13.8, 2.6, -8.5], [13.8, 3, -8.5], [10.8, 3, -8.5]], collide: 0, color: "#b9ae98"}
      - {kind: loft, a: [[-15.2, 2.6, 41], [-12.2, 2.6, 41], [-12.2, 3, 41], [-15.2, 3, 41]], b: [[-15.2, 2.6, 0], [-12.2, 2.6, 0], [-12.2, 3, 0], [-15.2, 3, 0]], collide: 0, color: "#b9ae98"}
joints:
  - {id: j_p, type: slide, body: piston, axis: [0, 0, 1], range: [-10, 10], damping: 0.05}   # the piston and rod (the hand's)
  - {id: j_1, type: hinge, body: v1, axis: [0, 1, 0], range: [0, 0.9], damping: 0.00002}   # valve 1: 0 hanging shut on its port, + swings left, open
  - {id: j_2, type: hinge, body: v2, axis: [0, 1, 0], range: [0, 0.9], damping: 0.00002}   # valve 2: 0 hanging shut on its port, + swings left, open
  - {id: j_3, type: hinge, body: v3, axis: [0, 1, 0], range: [0, 0.9], damping: 0.00002}   # valve 3: 0 hanging shut on its port, + swings left, open
  - {id: j_4, type: hinge, body: v4, axis: [0, 1, 0], range: [0, 0.9], damping: 0.00002}   # valve 4: 0 hanging shut on its port, + swings left, open
vessels:
  substeps: 4
  nodes:
    - {id: ground, kind: source, p: 343.35}   # the ground water feeding the well, keeping its level
    - {id: well, kind: tank, area: 102, z: -10, level: 3.5,
       draw: {section: [[3.8, -10], [20.8, -10], [20.8, -4], [3.8, -4]], y: [0.05, 6]}}
    - {id: apipe, kind: chamber, fixed: -8.5, sections: [[-8.5, 7.2]], volume: 366.576, water: 366.576, K: 2e+06,
       draw: {sections: [[[7.25, 0], [10.8, 0], [10.8, 3], [7.25, 3]], [[7.25, 30], [10.8, 30], [10.8, 33.8], [7.25, 33.8]], [[10.8, -8.5], [13.8, -8.5], [13.8, 33.8], [10.8, 33.8]]], y: [0, 2.4]}}   # the suction passage A and its pockets by valves 1, 2
    - {id: lower, kind: chamber, fixed: 0, sections: [[0, 33.6], [3, 98.5203]], volume: 1184.52, water: 1184.52, K: 2e+06,
       draw: {sections: [[[-6.75, 0], [6.75, 0], [6.75, 3], [-6.75, 3]], [[-5.55, 3], [5.55, 3], [5.55, 30], [-5.55, 30]]], y: [0, 2.4]}}   # the lower head and the cylinder under the piston
    - {id: upper, kind: chamber, fixed: 33.8, moving: bottom, sections: [[0, 96.981], [30, 33.6]], volume: 1194.47, water: 1194.47, K: 2e+06,
       draw: {sections: [[[-5.55, 3], [5.55, 3], [5.55, 30], [-5.55, 30]], [[-6.75, 30], [6.75, 30], [6.75, 33.8], [-6.75, 33.8]]], y: [0, 2.4]}}   # over the piston and the upper head
    - {id: bpipe, kind: chamber, fixed: 0, sections: [[0, 7.2]], volume: 380.064, water: 380.064, K: 2e+06,
       draw: {sections: [[[-12.2, 0], [-7.25, 0], [-7.25, 3], [-12.2, 3]], [[-12.2, 30], [-7.25, 30], [-7.25, 33.8], [-12.2, 33.8]], [[-15.2, 0], [-12.2, 0], [-12.2, 41], [-15.2, 41]]], y: [0, 2.4]}}   # the discharge passage B and its pockets by valves 3, 4
    - {id: air, kind: source, p: 0}
  links:
    - {id: spring, from: ground, to: well, area: 30, cd: 0.62, z: -10}
    - {id: suck, from: well, to: apipe, area: 7.2, cd: 0.8, z: -8.3, length: 42.3,
       draw: {from: [12.3, 0.6, -8.2], to: [12.3, 0.6, 33.2], width: 2.7, flow: 0.2}}   # up the suction passage A
    - {id: v1, from: apipe, to: upper, area: 5.76, cd: 0.62, z: 32.1, zTo: 32.1, open: {joint: j_1, q: [0, 0.5], frac: [0, 1]}}
    - {id: v2, from: apipe, to: lower, area: 5.76, cd: 0.62, z: 1.5, zTo: 1.5, open: {joint: j_2, q: [0, 0.5], frac: [0, 1]}}
    - {id: v3, from: lower, to: bpipe, area: 5.76, cd: 0.62, z: 1.5, zTo: 1.5, open: {joint: j_3, q: [0, 0.5], frac: [0, 1]}}
    - {id: v4, from: upper, to: bpipe, area: 5.76, cd: 0.62, z: 32.1, zTo: 32.1, open: {joint: j_4, q: [0, 0.5], frac: [0, 1]}}
    - {id: deliver, from: bpipe, to: air, area: 2, cd: 0.9, z: 0.5, zTo: 60, check: true, length: 60,
       draw: {from: [-13.7, 0.6, 0.6], to: [-13.7, 0.6, 41], width: 2.7, flow: 0.2}}   # up the discharge passage B and on out of the picture
  pistons:
    - {node: lower, joint: j_p, area: 98.5203, sign: 1}
    - {node: upper, joint: j_p, area: 96.981, sign: -1}
    - {node: apipe, joint: j_1, area: 5.76, arm: 1.4, sign: 1, z: 32.1}
    - {node: upper, joint: j_1, area: 5.76, arm: 1.4, sign: -1, z: 32.1}
    - {node: apipe, joint: j_2, area: 5.76, arm: 1.4, sign: 1, z: 1.5}
    - {node: lower, joint: j_2, area: 5.76, arm: 1.4, sign: -1, z: 1.5}
    - {node: lower, joint: j_3, area: 5.76, arm: 1.4, sign: 1, z: 1.5}
    - {node: bpipe, joint: j_3, area: 5.76, arm: 1.4, sign: -1, z: 1.5}
    - {node: upper, joint: j_4, area: 5.76, arm: 1.4, sign: 1, z: 32.1}
    - {node: bpipe, joint: j_4, area: 5.76, arm: 1.4, sign: -1, z: 32.1}
driver: {joint: j_p, kind: velocity, rpm: 0, swing: {amplitude: 0.03, hz: 0.27}, kv: 30000, max_torque: 600}
checks:
  - {type: amplitude, joint: j_p, min: 0.0255, max: 0.0345, settle_s: 1.0, window_s: 10.5}
  - {type: amplitude, joint: j_1, min: 0.05, max: 0.5, settle_s: 1.0, window_s: 10.5}
  - {type: amplitude, joint: j_2, min: 0.05, max: 0.5, settle_s: 1.0, window_s: 10.5}
  - {type: amplitude, joint: j_3, min: 0.05, max: 0.5, settle_s: 1.0, window_s: 10.5}
  - {type: amplitude, joint: j_4, min: 0.05, max: 0.5, settle_s: 1.0, window_s: 10.5}
  - {type: penetration, max: 0.003}
camera: {target: [0, 0, 7.5], position: [0, -200, 10.5], fov: 23}
display:
  output: j_3
  labels: {j_p: "Piston (driver)", j_1: "Valve 1 (suction, upper)", j_2: "Valve 2 (suction, lower)", j_3: "Valve 3 (discharge, lower)", j_4: "Valve 4 (discharge, upper)"}
