Skip to content

Commit deec96c

Browse files
committed
Add auxilary steam operation to injectors
1 parent d4acd11 commit deec96c

File tree

1 file changed

+40
-22
lines changed

1 file changed

+40
-22
lines changed

Source/Orts.Simulation/Simulation/RollingStocks/MSTSSteamLocomotive.cs

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,10 @@ public class MSTSSteamLocomotive : MSTSLocomotive
147147
float Injector2SupplementalNozzleCorrectionFactor;
148148
float Injector1PressureCorrectionFactor;
149149
float Injector2PressureCorrectionFactor;
150-
float Injector1SupplementalPressureCorrectionFactor;
151-
float Injector2SupplementalPressureCorrectionFactor;
150+
float Injector1AuxiliaryNozzleCorrectionFactor;
151+
float Injector2AuxiliaryNozzleCorrectionFactor;
152+
float Injector1AuxiliaryPressureCorrectionFactor;
153+
float Injector2AuxiliaryPressureCorrectionFactor;
152154

153155
float ActualInjector1FlowRateLBpS; // Current injector 1 flow rate - based upon current boiler pressure
154156
float ActualInjector2FlowRateLBpS; // Current injector 2 flow rate - based upon current boiler pressure
@@ -158,6 +160,8 @@ public class MSTSSteamLocomotive : MSTSLocomotive
158160

159161
float ActualInjector1NozzleSizeMM;
160162
float ActualInjector2NozzleSizeMM;
163+
float ActualSupplementalInjector1NozzleSizeMM;
164+
float ActualSupplementalInjector2NozzleSizeMM;
161165
float ActualInjector1SteamUsedLBpS;
162166
float ActualInjector2SteamUsedLBpS;
163167
float LiveSteamInjector1SupplementSteamUsedLBpS;
@@ -2134,7 +2138,9 @@ public override void Initialize()
21342138
else // Exhaust steam injector
21352139
{
21362140
Injector1PressureCorrectionFactor = 1.0f;
2137-
Injector1SupplementalNozzleCorrectionFactor = RefLiveSteamInjector1OptimalBoilerPressurePSI / MaxBoilerPressurePSI;
2141+
Injector1AuxiliaryPressureCorrectionFactor = RefLiveSteamInjector1OptimalBoilerPressurePSI / MaxBoilerPressurePSI;
2142+
if (Simulator.Settings.VerboseConfigurationMessages)
2143+
Trace.TraceInformation("Injector1 Auxiliary Pressure Correction Factor of {0} applied for a Maximum Boiler Pressure of {1}", Injector1NozzleCorrectionFactor, MaxBoilerPressurePSI);
21382144
}
21392145

21402146
if (Injector2Type == "Live")
@@ -2146,13 +2152,17 @@ public override void Initialize()
21462152
else // Exhaust steam injector
21472153
{
21482154
Injector2PressureCorrectionFactor = 1.0f;
2149-
Injector1SupplementalNozzleCorrectionFactor = RefLiveSteamInjector1OptimalBoilerPressurePSI / MaxBoilerPressurePSI;
2155+
Injector2AuxiliaryPressureCorrectionFactor = RefLiveSteamInjector2OptimalBoilerPressurePSI / MaxBoilerPressurePSI;
2156+
if (Simulator.Settings.VerboseConfigurationMessages)
2157+
Trace.TraceInformation("Injector2 Auxiliary Pressure Correction Factor of {0} applied for a Maximum Boiler Pressure of {1}", Injector2NozzleCorrectionFactor, MaxBoilerPressurePSI);
21502158
}
21512159
}
21522160
else
21532161
{
21542162
Injector1PressureCorrectionFactor = 1.0f;
21552163
Injector2PressureCorrectionFactor = 1.0f;
2164+
Injector1AuxiliaryPressureCorrectionFactor = 1.0f;
2165+
Injector2AuxiliaryPressureCorrectionFactor = 1.0f;
21562166
}
21572167

21582168
// Calculate Injector sizing, a single injector should be able to cope with 75% of the maximum water delivery rate required at full steam usage.
@@ -2216,7 +2226,9 @@ public override void Initialize()
22162226
if (Injector1Type == "Exhaust")
22172227
{
22182228
Injector1NozzleCorrectionFactor = (float)Math.Pow(ActualInjector1NozzleSizeMM / RefExhaustSteamInjectorNozzleSizeMM, 2);
2219-
Injector1SupplementalNozzleCorrectionFactor = (float)Math.Pow((ActualInjector1NozzleSizeMM - 1) / RefLiveSteamInjectorNozzleSizeMM, 2);
2229+
ActualSupplementalInjector1NozzleSizeMM = ActualInjector1NozzleSizeMM - 1.0f; // assume supplemental nozzle is 1mm smaller
2230+
Injector1SupplementalNozzleCorrectionFactor = (float)Math.Pow((ActualSupplementalInjector1NozzleSizeMM) / RefLiveSteamInjectorNozzleSizeMM, 2);
2231+
Injector1AuxiliaryNozzleCorrectionFactor = (float)Math.Pow((ActualInjector1NozzleSizeMM) / RefLiveSteamInjectorNozzleSizeMM, 2);
22202232
MaxInjector1FlowRateLBpH = Injector1NozzleCorrectionFactor * ExhaustSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(RefFeedwaterTempF, maxExhaustPressure);
22212233
}
22222234
else // live steam injector
@@ -2228,7 +2240,9 @@ public override void Initialize()
22282240
if (Injector2Type == "Exhaust")
22292241
{
22302242
Injector2NozzleCorrectionFactor = (float)Math.Pow(ActualInjector2NozzleSizeMM / RefExhaustSteamInjectorNozzleSizeMM, 2);
2231-
Injector2SupplementalNozzleCorrectionFactor = (float)Math.Pow((ActualInjector2NozzleSizeMM - 1) / RefLiveSteamInjectorNozzleSizeMM, 2);
2243+
ActualSupplementalInjector2NozzleSizeMM = ActualInjector2NozzleSizeMM - 1.0f; // assume supplemental nozzle is 1mm smaller
2244+
Injector2SupplementalNozzleCorrectionFactor = (float)Math.Pow((ActualSupplementalInjector2NozzleSizeMM) / RefLiveSteamInjectorNozzleSizeMM, 2);
2245+
Injector2AuxiliaryNozzleCorrectionFactor = (float)Math.Pow((ActualInjector2NozzleSizeMM) / RefLiveSteamInjectorNozzleSizeMM, 2);
22322246
MaxInjector2FlowRateLBpH = Injector2NozzleCorrectionFactor * ExhaustSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(RefFeedwaterTempF, maxExhaustPressure);
22332247
}
22342248
else // live steam injector
@@ -7592,6 +7606,8 @@ private void UpdateWaterInjection(float elapsedClockSeconds)
75927606
ActualInjector2FlowRateLBpS = 0.0f; // If the tender water is empty, stop flow into boiler
75937607
Inject1SteamHeatLossBTUpS = 0;
75947608
Inject2SteamHeatLossBTUpS = 0;
7609+
ActualInjector1SteamUsedLBpS = 0;
7610+
ActualInjector2SteamUsedLBpS = 0;
75957611
}
75967612
else
75977613
{
@@ -7639,25 +7655,25 @@ private void UpdateWaterInjection(float elapsedClockSeconds)
76397655

76407656
// calculate the supplemental steam used to overcome boiler pressure
76417657
// Use Napier's formula - Steam (lb/s) = Pressure(abspsi) * Area(in2) / 70
7642-
var Injector1SupplemenatalNozzleSizeM = Injector1SupplementalNozzleCorrectionFactor * (ActualInjector1NozzleSizeMM - 1.0f) / 1000;
7643-
var NozzleAreaIn2 = (float)Math.PI * Me.ToIn(Injector1SupplemenatalNozzleSizeM) * Me.ToIn(Injector1SupplemenatalNozzleSizeM) / 4.0f;
7658+
var NozzleSizeIn = Me.ToIn(ActualSupplementalInjector1NozzleSizeMM / 1000f); // Convert mm to in
7659+
var NozzleAreaIn2 = (float)Math.PI * NozzleSizeIn * NozzleSizeIn / 4.0f;
76447660
LiveSteamInjector1SupplementSteamUsedLBpS = (BoilerPressurePSI + OneAtmospherePSI) * NozzleAreaIn2 / 70.0f;
76457661

76467662
// No additional heat loss for exhaust steam injection - steam loss already taken into account for use by steam cylinders
76477663
// A small amount of supplemental steam will be added to live steam injectors to maintain pressure, hence a small heat loss
76487664
Inject1SteamHeatLossBTUpS = LiveSteamInjector1SupplementSteamUsedLBpS * (BoilerSteamHeatBTUpLB - WaterHeatPSItoBTUpLB[Injector1WaterTempPressurePSI]); // Calculate heat loss for injection steam, ie steam heat to water delivery temperature
76497665
}
7650-
else
7666+
else // Auxiliary live steam supply when no throttle
76517667
{
7652-
Injector1CorrectedPressurePSI = Injector1SupplementalPressureCorrectionFactor * BoilerPressurePSI;
7653-
ActualInjector1FlowRateLBpS = Injector1Fraction * Injector1SupplementalNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector1CorrectedPressurePSI));
7654-
Inj1MinimaFlowRateLBpS = Injector1Fraction * Injector1SupplementalNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMinimaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector1CorrectedPressurePSI));
7668+
Injector1CorrectedPressurePSI = Injector1AuxiliaryPressureCorrectionFactor * BoilerPressurePSI;
7669+
ActualInjector1FlowRateLBpS = Injector1Fraction * Injector1AuxiliaryNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector1CorrectedPressurePSI));
7670+
Inj1MinimaFlowRateLBpS = Injector1Fraction * Injector1AuxiliaryNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMinimaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector1CorrectedPressurePSI));
76557671

76567672
// Calculate delivery temperature of water from injector
7657-
Injector1WaterDelTempF = LiveSteamInjectorWaterDeliveryTemperatureFatLBSandPSI.Get(Injector1CorrectedPressurePSI, pS.TopH(ActualInjector1FlowRateLBpS / Injector1SupplementalNozzleCorrectionFactor));
7673+
Injector1WaterDelTempF = LiveSteamInjectorWaterDeliveryTemperatureFatLBSandPSI.Get(Injector1CorrectedPressurePSI, pS.TopH(ActualInjector1FlowRateLBpS / Injector1AuxiliaryNozzleCorrectionFactor));
76587674
Injector1WaterDelTempF = MathHelper.Clamp(Injector1WaterDelTempF, 0.0f, 500.0f);
76597675

7660-
ActualInjector1SteamUsedLBpS = Injector1SupplementalNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector1CorrectedPressurePSI) / LiveSteamInjectorWaterUsedForSteamUsedAtPressurePSI[Injector1CorrectedPressurePSI]); // Lbs of steam injected into boiler to inject water.
7676+
ActualInjector1SteamUsedLBpS = Injector1AuxiliaryNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector1CorrectedPressurePSI) / LiveSteamInjectorWaterUsedForSteamUsedAtPressurePSI[Injector1CorrectedPressurePSI]); // Lbs of steam injected into boiler to inject water.
76617677

76627678
// No supplemental steam used on live steam injector
76637679
LiveSteamInjector1SupplementSteamUsedLBpS = 0;
@@ -7688,6 +7704,7 @@ private void UpdateWaterInjection(float elapsedClockSeconds)
76887704
else
76897705
{
76907706
Injector1WaterDelTempF = 65.0f;
7707+
ActualInjector1FlowRateLBpS = 0f;
76917708
ActualInjector1SteamUsedLBpS = 0f;
76927709
LiveSteamInjector1SupplementSteamUsedLBpS = 0;
76937710

@@ -7736,25 +7753,25 @@ private void UpdateWaterInjection(float elapsedClockSeconds)
77367753

77377754
// calculate the supplemental steam used to overcome boiler pressure
77387755
// Use Napier's formula - Steam (lb/s) = Pressure(abspsi) * Area(in2) / 70
7739-
var Injector2SupplemenatalNozzleSizeM = Injector2SupplementalNozzleCorrectionFactor * (ActualInjector2NozzleSizeMM - 1.0f) / 1000;
7740-
var NozzleAreaIn2 = (float)Math.PI * Me.ToIn(Injector2SupplemenatalNozzleSizeM) * Me.ToIn(Injector2SupplemenatalNozzleSizeM) / 4.0f;
7756+
var NozzleSizeIn = Me.ToIn(ActualSupplementalInjector2NozzleSizeMM / 1000f); // Convert mm to in
7757+
var NozzleAreaIn2 = (float)Math.PI * NozzleSizeIn * NozzleSizeIn / 4.0f;
77417758
LiveSteamInjector2SupplementSteamUsedLBpS = (BoilerPressurePSI + OneAtmospherePSI) * NozzleAreaIn2 / 70.0f;
77427759

77437760
// No additional heat loss for exhaust steam injection - steam loss already taken into account for use by steam cylinders
77447761
// A small amount of supplemental steam will be added to live steam injectors to maintain pressure, hence a small heat loss
77457762
Inject2SteamHeatLossBTUpS = LiveSteamInjector2SupplementSteamUsedLBpS * (BoilerSteamHeatBTUpLB - WaterHeatPSItoBTUpLB[Injector1WaterTempPressurePSI]); // Calculate heat loss for injection steam, ie steam heat to water delivery temperature
77467763
}
7747-
else
7764+
else // Auxiliary live steam supply when no throttle
77487765
{
7749-
Injector2CorrectedPressurePSI = Injector2SupplementalPressureCorrectionFactor * BoilerPressurePSI;
7750-
ActualInjector2FlowRateLBpS = Injector2Fraction * Injector2SupplementalNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector2CorrectedPressurePSI));
7751-
Inj2MinimaFlowRateLBpS = Injector2Fraction * Injector2SupplementalNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMinimaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector2CorrectedPressurePSI));
7766+
Injector2CorrectedPressurePSI = Injector2AuxiliaryPressureCorrectionFactor * BoilerPressurePSI;
7767+
ActualInjector2FlowRateLBpS = Injector2Fraction * Injector2AuxiliaryNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector2CorrectedPressurePSI));
7768+
Inj2MinimaFlowRateLBpS = Injector2Fraction * Injector2AuxiliaryNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMinimaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector2CorrectedPressurePSI));
77527769

77537770
// Calculate delivery temperature of water from injector
7754-
Injector2WaterDelTempF = LiveSteamInjectorWaterDeliveryTemperatureFatLBSandPSI.Get(Injector2CorrectedPressurePSI, pS.TopH(ActualInjector2FlowRateLBpS / Injector2SupplementalNozzleCorrectionFactor));
7771+
Injector2WaterDelTempF = LiveSteamInjectorWaterDeliveryTemperatureFatLBSandPSI.Get(Injector2CorrectedPressurePSI, pS.TopH(ActualInjector2FlowRateLBpS / Injector2AuxiliaryNozzleCorrectionFactor));
77557772
Injector1WaterDelTempF = MathHelper.Clamp(Injector1WaterDelTempF, 0.0f, 500.0f);
77567773

7757-
ActualInjector2SteamUsedLBpS = Injector2SupplementalNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector1CorrectedPressurePSI) / LiveSteamInjectorWaterUsedForSteamUsedAtPressurePSI[Injector2CorrectedPressurePSI]); // Lbs of steam injected into boiler to inject water.
7774+
ActualInjector2SteamUsedLBpS = Injector2AuxiliaryNozzleCorrectionFactor * pS.FrompH(LiveSteamInjectorMaximaWaterDeliveryLBatPSIandF.Get(tenderTemperatureF, Injector1CorrectedPressurePSI) / LiveSteamInjectorWaterUsedForSteamUsedAtPressurePSI[Injector2CorrectedPressurePSI]); // Lbs of steam injected into boiler to inject water. // Lbs of steam injected into boiler to inject water.
77587775

77597776
// No supplemental steam used on live steam injector
77607777
LiveSteamInjector2SupplementSteamUsedLBpS = 0;
@@ -7783,6 +7800,7 @@ private void UpdateWaterInjection(float elapsedClockSeconds)
77837800
else
77847801
{
77857802
Injector2WaterDelTempF = 65.0f;
7803+
ActualInjector2FlowRateLBpS = 0f;
77867804
ActualInjector2SteamUsedLBpS = 0f;
77877805
LiveSteamInjector2SupplementSteamUsedLBpS = 0;
77887806
}

0 commit comments

Comments
 (0)