Meco 0.3.0: Three New Missions, Better Editor Controls, and Big Stability Wins

Meco 0.3.0 is live and it is a chunky one.

This release adds three new missions:

  • Mission 4: Valve Ventures

  • Mission 5: The Combustion Catastrophe (inspired by SpaceX Merlin 1D)

  • Mission 6: The Cooling Crisis (inspired by NASA’s RS-25 for Artemis/Space Shuttle)

For Missions 5 and 6, we referenced publicly available engine information

(cycle descriptions, published performance numbers, and thermal and cooling

concepts) to pick reasonable targets and sanity-check the sim. The goal is to

capture the feel of solving real engine problems, not to perfectly clone a

specific flight engine.

Under the hood, we invested heavily in automated end-to-end testing so we can ship more missions faster without breaking your runs. A lot of this release is about making the experience feel solid: fewer interaction glitches, better selection behavior, and smoother mission flows.

Editor improvements also landed:

  • Multi-select mode

  • Copy and paste for schematic components

For Pro Content owners, we added three new soundtrack pieces to the collection: Approaching Orbital Ve, Optimus Combustus, and Temperature Gradient. All three tracks are available now and ready to download.

If you have played Meco recently, this update is a great time to jump back in. Missions 4-6 are designed to teach by doing, then let you iterate.

Thank you for being here early. Every bit of feedback shapes what gets built next. If you play, please leave a quick Steam review. It helps a ton.

Mission 4:

  • If a mission is building on a previously created model, it’d be nice if the starting state the mission expects was available in the templates, or optionally created with a button within the mission’s objective.

  • This mission may confuse players due to how valve transitions work at this moment. The way I see it, a valve going from 1% to 100% within 0.1s, centered on 0.5s should:

    • Keep a steady, solid 1% from 0.0s to 0.45s
    • Transition from 1% to 100% within the 0.45s → 0.55s timeframe
    • Keep a steady, solid 100% from 0.55s till the end

    as it stands right now, the transition is smoothed to a point, where this same exact transition hits 10% at 0.39s (!!). What’s worse, that’s about where the flow stabilizes. Imagine someone clueless about the subject setting 0.1s with 0.5s center, and seeing full flow at 0.39s in the sim. Very confusing.

  • This exact thing is why this mission should also include adding the BranchValve% readout to the chart, as “%” and “m” are never linear across the entire 0%-100% range.

  • On a related note, this is a poor example of a valve, since it permits full flow at only 10%. I got a decent example by reducing the radius to 2.5mm, and the length to 0.1m to reduce the pressure spikes. Also, 1% instead of 0.1% for the “closed” state would stabilize the whole thing too, as the current sim seems to hate fully closed valves, and doesn’t damp very tight constrictions well in general.
    [PICTURE ONE HERE]

  • On a related-related off-topic note, an extra control for linear/bezier/cubic/log/exp transition types in the “ControlParameterTransition” would be nice.

Mission 5:

  • In a scenario like this, where there’s no constriction on the “injectors”, the combustion pressure will always equalize to that of the inlets - 120bar. As-is, the first real obstacle is the throat, and that’s what’s truly keeping the mass flow in check. I don’t think this is teaching the right things.

  • I believe a mission about the static pressure drop on the injector “face/manifold” should come before this, and the next mission should build on top of that, adding the combustion chamber and the throat (Ask the player to tweak the throat while monitoring the chamber pressure and mass flow).

  • For what this mission is supposed to teach, I think you’re better off modeling this as a pressure-fed engine instead (Kestrel, if you want to keep it SpaceX related, without adding new props), as that’s what this graph represents. Don’t sweep turbopumps under the rug for no reason, at least mention that that’s what the high 120bar pressure represents.

  • I’ll attach an engine model I had in mind for teaching about the pressure budgets, it’s a decent merlin-1D clone, performance-wise:

    • 200bar post-pump prop pressures (made it up)
    • ~160bar manifold static pressures (made it up)
    • 97bar, 3500K chamber, 1:16 nozzle ratio, same ~981kN in vacuum. All like the original. Isp is too high, because there’s no gas generator losses.
    • tank/inlet valves for stabilizing initial conditions, real prop control would be on injector level IIRC
    • Fuel starts before LOX, just like in the current model, to prevent high-ox high-temp gas spikes on startup, that’s worth mentioning in the mission I think.

    [PICTURE TWO HERE]

{
  "version": "0.3.0",
  "name": "Combustion Catastrophe 1",
  "timestamp": 1766768710370,
  "selected": [],
  "selectedLinks": [],
  "dragging": null,
  "model": {
    "nodes": [
      {
        "name": "OxidizerInlet",
        "category": 1,
        "type": "NodeInlet",
        "fluid": "LOX"
      },
      {
        "name": "FuelInlet",
        "category": 1,
        "type": "NodeInlet",
        "fluid": "RP1"
      },
      {
        "name": "NodeGasGenerator",
        "category": 1,
        "type": "NodeGasGenerator",
        "dimType": "Circle",
        "dimA": 0.15,
        "dimB": null,
        "length": 0.3,
        "volume": 0.021205750411731103,
        "fluidGas": "LOX_RP1"
      },
      {
        "name": "ThroatJunction",
        "category": 1,
        "type": "NodeGasInternal",
        "dimType": "Circle",
        "dimA": 0.05,
        "dimB": null,
        "length": 0.001,
        "volume": 0.000007853981633974484
      },
      {
        "name": "NodeOutlet",
        "category": 1,
        "type": "NodeOutlet"
      },
      {
        "name": "LOX_manifold",
        "category": 1,
        "type": "NodeInternal",
        "dimType": "Circle",
        "dimA": 0.1,
        "dimB": null,
        "length": 0.1,
        "volume": 0.0031415926535897937
      },
      {
        "name": "Fuel_manifold",
        "category": 1,
        "type": "NodeInternal",
        "dimType": "Circle",
        "dimA": 0.1,
        "dimB": null,
        "length": 0.1,
        "volume": 0.0031415926535897937
      },
      {
        "name": "Nozzle",
        "category": 1,
        "type": "NodeGasInternal",
        "dimType": "Circle",
        "dimA": 0.05,
        "dimB": null,
        "length": 0.01,
        "volume": 0.00007853981633974484
      }
    ],
    "branches": [
      {
        "name": "OxidizerBranch",
        "category": 2,
        "type": "BranchValve",
        "dimType": "Circle",
        "dimA": 0.03,
        "dimB": null,
        "length": 1,
        "volume": 0.0028274333882308137,
        "node_i": "OxidizerInlet",
        "node_j": "LOX_manifold",
        "roughness": 0.0000015,
        "n": 1,
        "fittings": []
      },
      {
        "name": "ChamberBranch",
        "category": 2,
        "type": "BranchGas",
        "dimType": "Circle",
        "dimA": 0.2,
        "dimB": null,
        "length": 0.45,
        "volume": 0.056548667764616284,
        "node_i": "NodeGasGenerator",
        "node_j": "ThroatJunction",
        "roughness": 0.0000015,
        "fittings": [],
        "n": 1
      },
      {
        "name": "ThroatBranch",
        "category": 2,
        "type": "BranchGas",
        "dimType": "Circle",
        "dimA": 0.1388,
        "dimB": null,
        "length": 0.05,
        "volume": 0.0030262082386087476,
        "node_i": "ThroatJunction",
        "node_j": "Nozzle",
        "roughness": 0.0000015,
        "fittings": [],
        "n": 1
      },
      {
        "name": "LOX_injector",
        "category": 2,
        "type": "Branch",
        "dimType": "Circle",
        "dimA": 0.00211,
        "dimB": null,
        "length": 0.04,
        "volume": 5.594673861218846e-7,
        "node_i": "LOX_manifold",
        "node_j": "NodeGasGenerator",
        "roughness": 0.0000015,
        "fittings": [],
        "n": 50
      },
      {
        "name": "Fuel_Injector",
        "category": 2,
        "type": "Branch",
        "dimType": "Circle",
        "dimA": 0.001735,
        "dimB": null,
        "length": 0.04,
        "volume": 3.782760298260934e-7,
        "node_i": "Fuel_manifold",
        "node_j": "NodeGasGenerator",
        "roughness": 0.0000015,
        "fittings": [],
        "n": 50
      },
      {
        "name": "FuelBranch",
        "category": 2,
        "type": "BranchValve",
        "dimType": "Circle",
        "dimA": 0.023,
        "dimB": null,
        "length": 1,
        "volume": 0.0016619025137490004,
        "node_i": "FuelInlet",
        "node_j": "Fuel_manifold",
        "roughness": 0.0000015,
        "n": 1,
        "fittings": []
      },
      {
        "name": "Nozzle_Expansion",
        "category": 2,
        "type": "BranchGas",
        "dimType": "Circle",
        "dimA": 0.554,
        "dimB": null,
        "length": 0.8,
        "volume": 0.7713640406953322,
        "node_i": "Nozzle",
        "node_j": "NodeOutlet",
        "roughness": 0.0000015,
        "fittings": [],
        "n": 1
      }
    ],
    "machineries": [],
    "transmissions": [],
    "solids": [],
    "control_parameters": [
      {
        "name": "ControlParameter",
        "category": 6,
        "type": "ControlParameter",
        "component": "OxidizerInlet",
        "component_category": 1,
        "component_port": "cp",
        "value": 20000000
      },
      {
        "name": "ControlParameter 2",
        "category": 6,
        "type": "ControlParameter",
        "component": "FuelInlet",
        "component_category": 1,
        "component_port": "cp",
        "value": 20000000
      },
      {
        "name": "ControlParameterTransition",
        "category": 6,
        "type": "ControlParameterTransition",
        "component": "OxidizerBranch",
        "component_category": 2,
        "component_port": "c",
        "startValue": 0.01,
        "endValue": 1,
        "midpoint": 0.5,
        "width": 0.2,
        "value": null
      },
      {
        "name": "ControlParameter1",
        "category": 6,
        "type": "ControlParameter",
        "component": "NodeOutlet",
        "component_category": 1,
        "component_port": "cp",
        "value": 1
      },
      {
        "name": "ControlParameterTransition1",
        "category": 6,
        "type": "ControlParameterTransition",
        "component": "FuelBranch",
        "component_category": 2,
        "component_port": "c",
        "startValue": 0.01,
        "endValue": 1,
        "midpoint": 0.3,
        "width": 0.1,
        "value": null
      }
    ]
  },
  "modelPositions": {
    "nodes": {
      "OxidizerInlet": {
        "x": 610,
        "y": 250
      },
      "FuelInlet": {
        "x": 950,
        "y": 250
      },
      "NodeGasGenerator": {
        "x": 780,
        "y": 660
      },
      "ThroatJunction": {
        "x": 780,
        "y": 840
      },
      "NodeOutlet": {
        "x": 740,
        "y": 1230
      },
      "LOX_manifold": {
        "x": 610,
        "y": 420
      },
      "Fuel_manifold": {
        "x": 950,
        "y": 420
      },
      "Nozzle": {
        "x": 780,
        "y": 1000
      }
    },
    "branches": {
      "OxidizerBranch": {
        "x": 610,
        "y": 340
      },
      "ChamberBranch": {
        "x": 780,
        "y": 750
      },
      "ThroatBranch": {
        "x": 780,
        "y": 920
      },
      "LOX_injector": {
        "x": 610,
        "y": 510
      },
      "Fuel_Injector": {
        "x": 950,
        "y": 510
      },
      "FuelBranch": {
        "x": 950,
        "y": 340
      },
      "Nozzle_Expansion": {
        "x": 780,
        "y": 1090
      }
    },
    "machineries": {},
    "transmissions": {},
    "solids": {},
    "control_parameters": {
      "ControlParameter": {
        "x": 450,
        "y": 200
      },
      "ControlParameter 2": {
        "x": 790,
        "y": 200
      },
      "ControlParameterTransition": {
        "x": 370,
        "y": 340
      },
      "ControlParameter1": {
        "x": 520,
        "y": 1230
      },
      "ControlParameterTransition1": {
        "x": 800,
        "y": 290
      }
    }
  },
  "charts": {
    "currentResponsiveBreakpoint": "lg",
    "currentNumCols": null,
    "layouts": {
      "lg": [
        {
          "i": "Chart 1",
          "x": 0,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 2",
          "x": 2,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 3",
          "x": 4,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 4",
          "x": 6,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Thrust - Nozzle_Expansion",
          "x": 8,
          "y": 0,
          "w": 2,
          "h": 4,
          "minW": 2,
          "minH": 2
        }
      ],
      "md": [
        {
          "i": "Chart 1",
          "x": 0,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 2",
          "x": 2,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 3",
          "x": 4,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 4",
          "x": 6,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Thrust - Nozzle_Expansion",
          "x": 8,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        }
      ],
      "sm": [
        {
          "i": "Chart 1",
          "x": 0,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 2",
          "x": 2,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 3",
          "x": 4,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 4",
          "x": 0,
          "y": 2,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Thrust - Nozzle_Expansion",
          "x": 2,
          "y": 2,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        }
      ],
      "xs": [
        {
          "i": "Chart 1",
          "x": 0,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 2",
          "x": 2,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 3",
          "x": 0,
          "y": 2,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 4",
          "x": 2,
          "y": 2,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Thrust - Nozzle_Expansion",
          "x": 0,
          "y": 4,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        }
      ],
      "xxs": [
        {
          "i": "Chart 1",
          "x": 0,
          "y": 0,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 2",
          "x": 0,
          "y": 2,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 3",
          "x": 0,
          "y": 4,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Chart 4",
          "x": 0,
          "y": 6,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        },
        {
          "i": "Thrust - Nozzle_Expansion",
          "x": 0,
          "y": 8,
          "w": 2,
          "h": 2,
          "minW": 2,
          "minH": 2
        }
      ]
    },
    "chartInfos": {
      "Chart 1": {
        "title": "Chart 1",
        "axes": {
          "P": {
            "label": "P",
            "variableName": "P",
            "components": [
              {
                "name": "LOX_manifold",
                "category": 1,
                "type": "NodeInternal"
              },
              {
                "name": "Fuel_manifold",
                "category": 1,
                "type": "NodeInternal"
              }
            ]
          }
        },
        "isSelected": false
      },
      "Chart 2": {
        "title": "Chart 2",
        "axes": {
          "P": {
            "label": "P",
            "variableName": "P",
            "components": [
              {
                "name": "NodeGasGenerator",
                "category": 1,
                "type": "NodeGasGenerator"
              }
            ]
          },
          "T": {
            "label": "T",
            "variableName": "T",
            "components": [
              {
                "name": "NodeGasGenerator",
                "category": 1,
                "type": "NodeGasGenerator"
              }
            ]
          }
        },
        "isSelected": false
      },
      "Chart 3": {
        "title": "Chart 3",
        "axes": {
          "ṁ": {
            "label": "ṁ",
            "variableName": "ṁ",
            "components": [
              {
                "name": "LOX_injector",
                "category": 2,
                "type": "Branch"
              },
              {
                "name": "Fuel_Injector",
                "category": 2,
                "type": "Branch"
              }
            ]
          }
        },
        "isSelected": false
      },
      "Chart 4": {
        "title": "Chart 4",
        "axes": {
          "M": {
            "label": "M",
            "variableName": "M",
            "components": [
              {
                "name": "ThroatBranch",
                "category": 2,
                "type": "BranchGas"
              }
            ]
          }
        },
        "isSelected": true
      }
    },
    "samplers": {
      "Thrust - Nozzle_Expansion": {
        "title": "Thrust - Nozzle_Expansion",
        "branchName": "Nozzle_Expansion"
      }
    }
  },
  "simulation": {
    "simulationState": "ended",
    "maxTime": 5,
    "signature": {}
  }
}

This took a while, I’ll take a look at Mission 6 at another time.

As a new user to the forum, I can only embed one picture per post.

[PICTURE ONE]

[PICTURE TWO]


Mission 6:

  • I liked this one. Finally feels more like a challenge, not a tutorial. Makes me feel like these two categories should be separate from each other.
  • “Run a baseline” objective - small typo: “ThroatWall T:0 should be > 800K”, this inequality sign should be flipped: “(…) should be <800K”
  • Good scenario overall, I just wish there was also an upper bound on the coolant inlet pressure, similar to the 0.7mm thickness constraint. This scenario can be easily gamed by making the channels tiny, and just cranking the pressure to the moon.
  • ~410bar seems like a decent upper bound, as that’s SSME’s fuel-side turbine outlet pressure. I managed to pass the scenario with:
    • 0.7mm and 354bar (exactly 13.15kg/s)
    • 0.8mm and 410bar. (exactly 13.15kg/s)

New users are temporarily limited to 3 replies in the same topic. Please consider visiting other topics to keep getting to know the community.

ugh