@@ -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