diff --git a/Documentation/BusAuxCases with ESS_Formatted.xlsx b/Documentation/BusAuxCases with ESS_Formatted.xlsx index 72cc0c8a566ba08c819942d25ed62c9d519ac9eb..6bdc87d0dc23f53c90b0c5e001b9061f2bb13a02 100644 Binary files a/Documentation/BusAuxCases with ESS_Formatted.xlsx and b/Documentation/BusAuxCases with ESS_Formatted.xlsx differ diff --git a/VectoCore/VectoCoreTest/Reports/ModDataPostprocessingTest.cs b/VectoCore/VectoCoreTest/Reports/ModDataPostprocessingTest.cs index 30cc2e59e57847f4e98b6a57a65f68d62c2ebc87..348323577e6277cf48d3faad4a86112386c3b6e5 100644 --- a/VectoCore/VectoCoreTest/Reports/ModDataPostprocessingTest.cs +++ b/VectoCore/VectoCoreTest/Reports/ModDataPostprocessingTest.cs @@ -64,9 +64,9 @@ namespace TUGraz.VectoCore.Tests.Reports // constant driving var n_ice = 800.RPMtoRad(); var t_ice = 400.SI<NewtonMeter>(); - var T1 = 0.SI<Second>(); - var T2 = 0.SI<Second>(); - var T3 = 0.SI<Second>(); + var T1 = 0.SI<Second>(); // 50.135121407888441 ["s"] + var T2 = 0.SI<Second>(); // 51.171787824561704 ["s"] + var T3 = 0.SI<Second>(); // 50.195047986970792 ["s"] var P_off = 300.SI<Watt>(); var P_on = 900.SI<Watt>(); @@ -221,9 +221,9 @@ namespace TUGraz.VectoCore.Tests.Reports // constant driving var n_ice = 800.RPMtoRad(); var t_ice = 400.SI<NewtonMeter>(); - var T1 = 0.SI<Second>(); - var T2 = 0.SI<Second>(); - var T3 = 0.SI<Second>(); + var T1 = 0.SI<Second>(); // 50.135121407888441 ["s"] + var T2 = 0.SI<Second>(); // 51.171787824561704 ["s"] + var T3 = 0.SI<Second>(); // 50.195047986970792 ["s"] var P_off = 300.SI<Watt>(); var P_on = 900.SI<Watt>(); @@ -355,6 +355,169 @@ namespace TUGraz.VectoCore.Tests.Reports Assert.AreEqual(fcModSum + fcEssDrivingOff + fcEssDrivingOn, f.FcFinal.Value(), 1e-6); } + [TestCase()] + public void TestAuxESSEngineStart_ModDataCorrection() + { + var runData = GetRunData(); + runData.JobName = new StackTrace().GetFrame(0).GetMethod().Name; + var writer = new FileOutputWriter("."); + var modData = new ModalDataContainer(runData, writer, null) { + WriteModalResults = true + }; + + var fuel = runData.EngineData.Fuels[0]; + + var absTime = 0.SI<Second>(); + var rnd = new Random(210629); + Second dt; + + var i = 0; + // constant driving + var n_ice = 800.RPMtoRad(); + var t_ice = 400.SI<NewtonMeter>(); + var T1 = 0.SI<Second>(); // 50.135121407888441 ["s"] + var T2 = 0.SI<Second>(); // 51.171787824561704 ["s"] + var T3 = 0.SI<Second>(); // 50.195047986970792 ["s"] + Second tStart = null; + + var P_off = 300.SI<Watt>(); + var P_on = 900.SI<Watt>(); + var P_ICEStart = 20000.SI<Watt>(); + + for (; i < 100; i++) { + dt = (rnd.NextDouble() * 0.2 + 0.4).SI<Second>(); + T1 += dt; + + modData[ModalResultField.time] = absTime + dt / 2; + modData[ModalResultField.simulationInterval] = dt; + + modData[ModalResultField.v_act] = 50.KMPHtoMeterPerSecond(); + modData[ModalResultField.ICEOn] = true; + + modData[ModalResultField.n_ice_avg] = n_ice; + modData[ModalResultField.P_ice_fcmap] = n_ice * t_ice; + var fc = fuel.ConsumptionMap.GetFuelConsumption(t_ice, n_ice).Value * + fuel.FuelConsumptionCorrectionFactor; + modData[ModalResultField.FCWHTCc] = fc; + modData[ModalResultField.FCFinal] = fc; + + modData[ModalResultField.P_aux_ESS_mech_ice_off] = 0.SI<Watt>(); + modData[ModalResultField.P_aux_ESS_mech_ice_on] = 0.SI<Watt>(); + + // WHR + modData[ModalResultField.P_WHR_el_corr] = 0.SI<Watt>(); + modData[ModalResultField.P_WHR_mech_corr] = 0.SI<Watt>(); + + modData.CommitSimulationStep(); + absTime += dt; + } + + // standstill + for (; i < 200; i++) { + dt = (rnd.NextDouble() * 0.2 + 0.4).SI<Second>(); + T2 += dt; + + modData[ModalResultField.time] = absTime + dt / 2; + modData[ModalResultField.simulationInterval] = dt; + + modData[ModalResultField.v_act] = 0.KMPHtoMeterPerSecond(); + modData[ModalResultField.ICEOn] = false; + + modData[ModalResultField.n_ice_avg] = 0.RPMtoRad(); + modData[ModalResultField.P_ice_fcmap] = 0.SI<Watt>(); + modData[ModalResultField.FCWHTCc] = 0.SI<KilogramPerSecond>(); + modData[ModalResultField.FCFinal] = 0.SI<KilogramPerSecond>(); + + modData[ModalResultField.P_aux_ESS_mech_ice_off] = P_off; + modData[ModalResultField.P_aux_ESS_mech_ice_on] = P_on; + + // WHR + modData[ModalResultField.P_WHR_el_corr] = 0.SI<Watt>(); + modData[ModalResultField.P_WHR_mech_corr] = 0.SI<Watt>(); + + modData.CommitSimulationStep(); + absTime += dt; + } + + // constant driving different speed + modData[ModalResultField.P_ice_start] = P_ICEStart; + n_ice = 1200.RPMtoRad(); + for (; i < 300; i++) { + dt = (rnd.NextDouble() * 0.2 + 0.4).SI<Second>(); + T3 += dt; + if (tStart == null) tStart = dt; + + modData[ModalResultField.time] = absTime + dt / 2; + modData[ModalResultField.simulationInterval] = dt; + + modData[ModalResultField.v_act] = 50.KMPHtoMeterPerSecond(); + modData[ModalResultField.ICEOn] = true; + + modData[ModalResultField.n_ice_avg] = n_ice; + modData[ModalResultField.P_ice_fcmap] = n_ice * t_ice; + var fc = fuel.ConsumptionMap.GetFuelConsumption(400.SI<NewtonMeter>(), n_ice).Value * + fuel.FuelConsumptionCorrectionFactor; + modData[ModalResultField.FCWHTCc] = fc; + modData[ModalResultField.FCFinal] = fc; + + + modData[ModalResultField.P_aux_ESS_mech_ice_off] = 0.SI<Watt>(); + modData[ModalResultField.P_aux_ESS_mech_ice_on] = 0.SI<Watt>(); + + // WHR + modData[ModalResultField.P_WHR_el_corr] = 0.SI<Watt>(); + modData[ModalResultField.P_WHR_mech_corr] = 0.SI<Watt>(); + + modData.CommitSimulationStep(); + absTime += dt; + } + + modData.Finish(VectoRun.Status.Success); + var corr = modData.CorrectedModalData as CorrectedModalData; + + var fcIdle = + fuel.ConsumptionMap.GetFuelConsumption(0.SI<NewtonMeter>(), runData.EngineData.IdleSpeed).Value + .Value() * fuel.FuelConsumptionCorrectionFactor; // 0.0002929177777777778 + + var k_engline = 2.6254521511724e-8; + var E_auxICEOnStandstill = (P_on * T2).Value(); // 46054.609042105534 + var E_auxICEOffStandstill = (P_off * T2).Value(); // 15351.536347368512 + var E_ICEStart = (P_ICEStart * tStart).Value(); // 11525.53891554733 + + + var fcEssStandStillOff = E_auxICEOffStandstill * k_engline * UF_ESS_Standstill; // 0.0003034945726763096 + var fcEssStandStillOn = + (E_auxICEOnStandstill * k_engline + (fcIdle * T2).Value()) * (1 - UF_ESS_Standstill); // 0.00400097222027925 + var fcEngineStart = E_ICEStart * k_engline; // 0.00030259750939244944 + + var fcModSum = 0.195725; + + Assert.AreEqual(k_engline, modData.EngineLineCorrectionFactor(fuel.FuelData).Value(), 1e-15); + Assert.AreEqual(0, corr.WorkWHREl.Value()); + Assert.AreEqual(0, corr.WorkWHRElMech.Value()); + Assert.AreEqual(0, corr.WorkWHRMech.Value()); + + Assert.AreEqual(E_auxICEOnStandstill, corr.EnergyAuxICEOnStandstill.Value(), 1e-3); + Assert.AreEqual(E_auxICEOffStandstill, corr.EnergyAuxICEOffStandstill.Value(), 1e-3); + Assert.AreEqual(E_ICEStart, modData.WorkEngineStart().Value()); + + Assert.AreEqual(0, corr.EnergyAuxICEOnDriving.Value(), 1e-3); + Assert.AreEqual(0, corr.EnergyAuxICEOffDriving.Value(), 1e-3); + + var f = corr.FuelCorrection[fuel.FuelData.FuelType] as FuelConsumptionCorrection; + + Assert.AreEqual(fcEssStandStillOff, f.FcESS_AuxStandstill_ICEOff.Value(), 1e-12); + Assert.AreEqual(fcEssStandStillOn, f.FcESS_AuxStandstill_ICEOn.Value(), 1e-12); + Assert.AreEqual(fcEngineStart, f.FcESS_EngineStart.Value(), 1e-12); + Assert.AreEqual(0, f.FcESS_AuxDriving_ICEOff.Value(), 1e-12); + Assert.AreEqual(0, f.FcESS_AuxDriving_ICEOn.Value(), 1e-12); + + Assert.AreEqual(fcModSum, modData.TotalFuelConsumption(ModalResultField.FCWHTCc, fuel.FuelData).Value(), 1e-6); + Assert.AreEqual(fcModSum + fcEssStandStillOff + fcEssStandStillOn + fcEngineStart, f.FcEssCorr.Value(), 1e-6); + + Assert.AreEqual(fcModSum + fcEssStandStillOff + fcEssStandStillOn + fcEngineStart, f.FcFinal.Value(), 1e-6); + } + [TestCase()] public void TestBusAuxPsESSStandstill_ModDataCorrection() { @@ -590,9 +753,9 @@ namespace TUGraz.VectoCore.Tests.Reports var n_ice2 = 1200.RPMtoRad(); var n_ice = n_ice1; var t_ice = 400.SI<NewtonMeter>(); - var T1 = 0.SI<Second>(); - var T2 = 0.SI<Second>(); - var T3 = 0.SI<Second>(); + var T1 = 0.SI<Second>(); // 50.135121407888441 ["s"] + var T2 = 0.SI<Second>(); // 51.171787824561704 ["s"] + var T3 = 0.SI<Second>(); // 50.195047986970792 ["s"] var Nl_consumed = 0.7.SI<NormLiterPerSecond>(); var Nl_generated = Nl_consumed; @@ -1670,10 +1833,10 @@ namespace TUGraz.VectoCore.Tests.Reports var k_engline = 2.6254521511724e-8; - var airDemand = (NlConsumedCorrected * (T1 + T2)); // + var airDemand = (NlConsumedCorrected * (T1 + T2)); // 75.750978609710458 ["Nl"] // 106.05137005359464 ["Nl"] // 121.20156577553674 ["Nl"] - var deltaAir = (airDemand - Nl_generated * (T1 + T2)).Value(); // + var deltaAir = (airDemand - Nl_generated * (T1 + T2)).Value(); // -30.30039144388418 // 0 // 15.150195721942097 @@ -1686,7 +1849,7 @@ namespace TUGraz.VectoCore.Tests.Reports var kAir = ((workCompOn - workCompOff) / airOn).Value(); // 641347.63479804085 - var E_busAuxPS = kAir * deltaAir / 1e3; // convert Nl to m^3 -19433.084385989911 + var E_busAuxPS = kAir * deltaAir / 1e3; // -19433.084385989911 convert Nl to m^3 // 0 // 9716.54219299496