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.