diff --git a/VectoCommon/VectoCommon/Models/IResponse.cs b/VectoCommon/VectoCommon/Models/IResponse.cs index 7147210f835c2e675d96476bd6174dbf4fee645e..15c927f90a4459ed28aec6c61162cbc393e0c62d 100644 --- a/VectoCommon/VectoCommon/Models/IResponse.cs +++ b/VectoCommon/VectoCommon/Models/IResponse.cs @@ -63,5 +63,6 @@ namespace TUGraz.VectoCommon.Models NewtonMeter EngineDynamicFullLoadTorque { get; set; } MeterPerSecond VehicleSpeed { get; set; } NewtonMeter CardanTorque { get; set; } + PerSecond GearboxInputSpeed { get; set; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs index c2abc75a5e5275c781776c1a3e3787581a938a38..682ee9a1c4bdf643bf5bf3f79d8d707828ca7816 100644 --- a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs +++ b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs @@ -71,9 +71,13 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl public NewtonMeter CardanTorque { get; set; } + public PerSecond GearboxInputSpeed { get; set; } + public TorqueConverterOperatingPoint TorqueConverterOperatingPoint { get; set; } + public NewtonMeter TorqueConverterTorqueDemand { get; set; } + public override string ToString() { var t = GetType(); @@ -132,7 +136,6 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl public class ResponseDryRun : AbstractResponse { - public Watt DeltaFullLoad { get; set; } public Watt DeltaDragLoad { get; set; } public PerSecond DeltaEngineSpeed { get; set; } diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs index 7448e0f13304e95fe9e61f6e7489deb7a17d7f0f..dfc5c0ae21e05c142f8f4973e0fca55a402dff74 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs @@ -44,7 +44,8 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus ExecutionMode ExecutionMode { get; } Second AbsTime { get; set; } - + + ITorqueConverterControl TorqueConverter { get; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IEngineInfo.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IEngineInfo.cs index bf46097424b2b1b54b2093b84cd3fac23abe8305..def5398f941e960cb451e9063a9cfa7ef6c73257 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IEngineInfo.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IEngineInfo.cs @@ -47,8 +47,13 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus Watt EngineStationaryFullPower(PerSecond angularSpeed); + Watt EngineDynamicFullLoadPower(PerSecond avgEngineSpeed, Second dt); + Watt EngineDragPower(PerSecond angularSpeed); + Watt EngineAuxDemand(PerSecond avgEngineSpeed, Second dt); + + PerSecond EngineIdleSpeed { get; } PerSecond EngineRatedSpeed { get; } diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IGearboxInfo.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IGearboxInfo.cs index 696f0a97976c9c4817f098fd54f0d1255afbb29c..5ce86d919bc03a3ce379155891208c6f7fb9af24 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IGearboxInfo.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IGearboxInfo.cs @@ -29,6 +29,7 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.SimulationComponent; @@ -76,4 +77,10 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus { bool DisengageGearbox { set; } } + + public interface ITorqueConverterControl + { + Tuple<TorqueConverterOperatingPoint, NewtonMeter> CalculateOperatingPoint(PerSecond inSpeed, PerSecond outSpeed); + TorqueConverterOperatingPoint SetOperatingPoint { get; set; } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index 30a650220c3191eb77be58df9e3f3fc926550041..85f68fbd9cc44151e87062410fbf75c0604ef086 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -187,11 +187,21 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl return Engine.EngineStationaryFullPower(angularSpeed); } + public Watt EngineDynamicFullLoadPower(PerSecond avgEngineSpeed, Second dt) + { + return Engine.EngineDynamicFullLoadPower(avgEngineSpeed, dt); + } + public Watt EngineDragPower(PerSecond angularSpeed) { return Engine.EngineDragPower(angularSpeed); } + public Watt EngineAuxDemand(PerSecond avgEngineSpeed, Second dt) + { + return Engine.EngineAuxDemand(avgEngineSpeed, dt); + } + public PerSecond EngineIdleSpeed { get { return Engine.EngineIdleSpeed; } @@ -286,6 +296,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public virtual Second AbsTime { get; set; } + public ITorqueConverterControl TorqueConverter { get; private set; } + public void AddComponent(VectoSimulationComponent component) { var commitPriority = 0; @@ -304,6 +316,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl commitPriority = 4; }) .If<IGearboxControl>(c => GearboxCtl = c) + .If<ITorqueConverterControl>(c => TorqueConverter = c) .If<IAxlegearInfo>(c => Axlegear = c) .If<IWheelsInfo>(c => Wheels = c) .If<IVehicleInfo>(c => { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/IAuxPort.cs b/VectoCore/VectoCore/Models/SimulationComponent/IAuxPort.cs index 5a313f1faeba9499150414e3a6fb6609ae88d318..3574b1494107089a62144b209aa4483886bb713f 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/IAuxPort.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/IAuxPort.cs @@ -47,8 +47,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent { NewtonMeter Initialize(NewtonMeter torque, PerSecond angularSpeed); - NewtonMeter TorqueDemand(Second absTime, Second dt, NewtonMeter torquePowerTrain, NewtonMeter torqueEngine, - PerSecond angularSpeed, bool dryRun = false); + NewtonMeter TorqueDemand(Second absTime, Second dt, NewtonMeter torquePowerTrain, PerSecond angularSpeed, bool dryRun = false); Watt PowerDemandEngineOn(Second time, Second simulationInterval, PerSecond engineSpeed); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs index 4edeb2ac9e39b0ebf64d27db78fba6f15bc31bab..240cf62e8c239ae698762d2aed1b2d512e8df9ae 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs @@ -341,6 +341,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (response is ResponseGearShift) { //RequestAfterGearshift = false; } + response.GearboxInputSpeed = inAngularVelocity; + return response; } var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun); @@ -350,6 +352,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl retVal = new ResponseGearShift { Source = this }; //RequestAfterGearshift = false; } + retVal.GearboxInputSpeed = inAngularVelocity; return retVal; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs index d4ca2148cf23aa5fa58c46db248e71b1738cfc29..6ccde6852042fc9cf1407fb5f992282b75249059 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs @@ -96,14 +96,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (AdditionalAux != null) { AdditionalAux.Initialize(torque, angularSpeed); } - PreviousState.PowerDemand = GetBusAuxPowerDemand(0.SI<Second>(), 1.SI<Second>(), torque, torque, angularSpeed); + PreviousState.PowerDemand = GetBusAuxPowerDemand(0.SI<Second>(), 1.SI<Second>(), torque, angularSpeed); return PreviousState.PowerDemand / angularSpeed; } - public NewtonMeter TorqueDemand( - Second absTime, Second dt, NewtonMeter torquePowerTrain, NewtonMeter torqueEngine, - PerSecond angularSpeed, bool dryRun = false) + public NewtonMeter TorqueDemand(Second absTime, Second dt, NewtonMeter torquePowerTrain, PerSecond angularSpeed, bool dryRun = false) { CurrentState.AngularSpeed = angularSpeed; CurrentState.dt = dt; @@ -113,7 +111,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl signals.EngineStopped = false; signals.VehicleStopped = false; - CurrentState.PowerDemand = GetBusAuxPowerDemand(absTime, dt, torquePowerTrain, torqueEngine, angularSpeed, dryRun); + CurrentState.PowerDemand = GetBusAuxPowerDemand(absTime, dt, torquePowerTrain, angularSpeed, dryRun); var avgAngularSpeed = (CurrentState.AngularSpeed + PreviousState.AngularSpeed) / 2.0; return CurrentState.PowerDemand / avgAngularSpeed; @@ -124,7 +122,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var signals = Auxiliaries.Signals; signals.EngineStopped = false; signals.VehicleStopped = false; - var retVal = GetBusAuxPowerDemand(time, simulationInterval, 0.SI<NewtonMeter>(), 0.SI<NewtonMeter>(), engineSpeed, true); + var retVal = GetBusAuxPowerDemand(time, simulationInterval, 0.SI<NewtonMeter>(), engineSpeed, true); if (!SmartElectricSystem) { return retVal; @@ -154,7 +152,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl signals.VehicleStopped = false; var busAuxPowerDemand = GetBusAuxPowerDemand( - absTime, dt, 0.SI<NewtonMeter>(), 0.SI<NewtonMeter>(), DataBus.EngineIdleSpeed); + absTime, dt, 0.SI<NewtonMeter>(), DataBus.EngineIdleSpeed); AdditionalAux = conventionalAux; CurrentState.PowerDemand = ((AdditionalAux?.PowerDemandEngineOn(absTime, dt, DataBus.EngineIdleSpeed) ?? 0.SI<Watt>()) + @@ -166,7 +164,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl signals.VehicleStopped = DataBus.VehicleStopped; busAuxPowerDemand = GetBusAuxPowerDemand( - absTime, dt, 0.SI<NewtonMeter>(), 0.SI<NewtonMeter>(), DataBus.EngineIdleSpeed); + absTime, dt, 0.SI<NewtonMeter>(), DataBus.EngineIdleSpeed); AdditionalAux = conventionalAux; return EngineStopStartUtilityFactor * (busAuxPowerDemand + AdditionalAux?.PowerDemandEngineOff(absTime, dt)); @@ -231,9 +229,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl CurrentState = new BusAuxState(); } - protected virtual Watt GetBusAuxPowerDemand( - Second absTime, Second dt, NewtonMeter torquePowerTrain, NewtonMeter torqueEngine, - PerSecond angularSpeed, bool dryRun = false) + protected virtual Watt GetBusAuxPowerDemand(Second absTime, Second dt, NewtonMeter torquePowerTrain, PerSecond angularSpeed, bool dryRun = false) { Auxiliaries.ResetCalculations(); @@ -248,7 +244,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl signals.PreExistingAuxPower = AdditionalAux != null - ? AdditionalAux.TorqueDemand(absTime, dt, torquePowerTrain, torqueEngine, angularSpeed, dryRun) * avgAngularSpeed + ? AdditionalAux.TorqueDemand(absTime, dt, torquePowerTrain, angularSpeed, dryRun) * avgAngularSpeed : 0.SI<Watt>(); var drivetrainPower = torquePowerTrain * avgAngularSpeed; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs index 88a9cc41e2a67fcdb0a232c0c6f3083e50a1be20..3ea854218a4380cf020e7a667b231227cac22e82 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs @@ -100,11 +100,25 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(angularSpeed) * angularSpeed; } + public Watt EngineDynamicFullLoadPower(PerSecond avgEngineSpeed, Second dt) + { + return ComputeFullLoadPower( + avgEngineSpeed, ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(avgEngineSpeed), dt, true); + } + public Watt EngineDragPower(PerSecond angularSpeed) { return ModelData.FullLoadCurves[DataBus.Gear].DragLoadStationaryPower(angularSpeed); } + public Watt EngineAuxDemand(PerSecond avgEngineSpeed, Second dt) + { + return EngineAux == null + ? 0.SI<Watt>() + : EngineAux.TorqueDemand( + 0.SI<Second>(), dt, 0.SI<NewtonMeter>(), avgEngineSpeed, true) * avgEngineSpeed; + } + public PerSecond EngineIdleSpeed { get { return ModelData.IdleSpeed; } @@ -194,8 +208,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var auxTorqueDemand = EngineAux == null ? 0.SI<NewtonMeter>() - : EngineAux.TorqueDemand(absTime, dt, torqueOut, - torqueOut + inertiaTorqueLoss, angularVelocity, dryRun); + : EngineAux.TorqueDemand(absTime, dt, torqueOut, angularVelocity, dryRun); // compute the torque the engine has to provide. powertrain + aux + its own inertia var totalTorqueDemand = torqueOut + auxTorqueDemand + inertiaTorqueLoss; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs index 56ede55d48aa8ba07ae4d8d9f1f9cac2c1afa224..d8d24b3db41e21a869a162d225a2fc6bb1c0c21a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs @@ -39,6 +39,8 @@ using TUGraz.VectoCore.Models.Connector.Ports.Impl; using TUGraz.VectoCore.Models.Simulation; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.DataBus; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.Utils; using DriverData = TUGraz.VectoCore.Models.SimulationComponent.Data.DriverData; @@ -421,16 +423,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl OperatingPoint searchedOperatingPoint; try { - searchedOperatingPoint = SearchOperatingPoint(absTime, requestedOperatingPoint.SimulationDistance, + searchedOperatingPoint = SearchOperatingPoint( + absTime, requestedOperatingPoint.SimulationDistance, gradient, requestedOperatingPoint.Acceleration, initialResponse, coastingOrRoll: true); } catch (VectoEngineSpeedTooLowException) { // in case of an exception during search the engine-speed got too low - gear disengaged --> try again with disengaged gear. - searchedOperatingPoint = SearchOperatingPoint(absTime, requestedOperatingPoint.SimulationDistance, + searchedOperatingPoint = SearchOperatingPoint( + absTime, requestedOperatingPoint.SimulationDistance, gradient, requestedOperatingPoint.Acceleration, initialResponse, coastingOrRoll: true); } + if (searchedOperatingPoint == null && DataBus.GearboxType.AutomaticTransmission()) { + // we end up here if no valid operating point for the engine and torque converter can be found. + // a likely reason is that the torque converter opereating point 'jumps' between two different operating points + // or that no valid operating point can be found by reverse calcualtion. This method is a kind of fal-back + // solution where a torque converter operating point is searched by forward calculation first and then the remaining + // powertrain is adjusted to this operating point. + searchedOperatingPoint = SetTCOperatingPointATGbxCoastOrRoll(absTime, gradient, requestedOperatingPoint, initialResponse as ResponseDryRun); + } + if (!ds.IsEqual(searchedOperatingPoint.SimulationDistance)) { // vehicle is at low speed, coasting would lead to stop before ds is reached: reduce simulated distance to stop distance. Log.Debug( @@ -495,6 +508,148 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return response; } + // Fallback solution for calculating operating point with TC in semi-forward way. + private OperatingPoint SetTCOperatingPointATGbxCoastOrRoll(Second absTime, Radian gradient, OperatingPoint operatingPoint, ResponseDryRun dryRunResp) + { + var tc = DataBus.TorqueConverter; + if (tc == null) { + throw new VectoException("NO TorqueConverter Available!"); + } + + if (dryRunResp == null) { + throw new VectoException("dry-run response expected!"); + } + + + // first attempt: set TC to an input speed slightly above idle speed + // calculate TC opPt using n_in and n_out, estimate ICE max and drag torque. + // if ICE torque is within valid range, search an acceleration that results in the required + // out-torque at the torque converter + var engineSpeed = DataBus.EngineIdleSpeed * 1.01; + var tcOp = EstimateTCOpPoint(operatingPoint, dryRunResp, engineSpeed, tc); + + if (tcOp.Item1.Item2.IsBetween(tcOp.Item2, tcOp.Item3)) { + if (!dryRunResp.TorqueConverterOperatingPoint.OutTorque.IsEqual(tcOp.Item1.Item1.OutTorque)) { + tc.SetOperatingPoint = tcOp.Item1.Item1; + } + try { + var acceleration = SearchAccelerationFixedTC(absTime, gradient, operatingPoint, tcOp.Item1, dryRunResp); + return ComputeTimeInterval(acceleration, operatingPoint.SimulationDistance); + } catch (Exception e) { + Log.Error(e, "Failed to find acceleration for tc operating point! absTime: {0}", absTime); + throw; + } + } + + + // Attempt 2: search for an input speed (ICE speed) so that a valid operating point for + // the torque converter and the engine are found. Estimate max torque, drag torque. calculate delta + // based on over-/underload of torque and too high or too low engine speed + PerSecond nextICESpeed; + try { + nextICESpeed = SearchAlgorithm.Search( + engineSpeed, GetTCDelta(tcOp.Item1, tcOp.Item2, tcOp.Item3), engineSpeed * 0.1, + getYValue: tOp => { + var t = (Tuple<Tuple<TorqueConverterOperatingPoint, NewtonMeter>, NewtonMeter, NewtonMeter>)tOp; + return GetTCDelta(t.Item1, t.Item2, t.Item3); + }, + evaluateFunction: engSpeed => { return EstimateTCOpPoint(operatingPoint, dryRunResp, engSpeed, tc); }, + criterion: tOp => { + var t = (Tuple<Tuple<TorqueConverterOperatingPoint, NewtonMeter>, NewtonMeter, NewtonMeter>)tOp; + return GetTCDelta(t.Item1, t.Item2, t.Item3).Value(); + }); + } catch (Exception e) { + Log.Error(e, "Failed to find engine speed for valid torque converter operating point! absTime: {0}", absTime); + throw; + } + + // a suitable engine sped was found - search acceleration to match TC out-torque + try { + tcOp = EstimateTCOpPoint(operatingPoint, dryRunResp, nextICESpeed, tc); + tc.SetOperatingPoint = tcOp.Item1.Item1; + + var acceleration = SearchAccelerationFixedTC(absTime, gradient, operatingPoint, tcOp.Item1, dryRunResp); + + return ComputeTimeInterval(acceleration, operatingPoint.SimulationDistance); + } catch (Exception e) { + Log.Error(e, "Failed to find acceleration for tc operating point! absTime: {0}", absTime); + throw; + } + + //return null; + } + + // estimate a torque converter operating point via forward calculation for a certain engine speed. + // furthermore, estimates the max/min torque at ICE out-shaft including estimates for ICE inertia & aux torque + private Tuple<Tuple<TorqueConverterOperatingPoint, NewtonMeter>, NewtonMeter, NewtonMeter> EstimateTCOpPoint( + OperatingPoint operatingPoint, IResponse response, PerSecond engSpeed, ITorqueConverterControl tc) + { + var avgICDSpeed = (DataBus.EngineSpeed + engSpeed) / 2.0; + var drTq = (DataBus.EngineDragPower(avgICDSpeed)) / avgICDSpeed; + var maxTq = DataBus.EngineDynamicFullLoadPower(avgICDSpeed, operatingPoint.SimulationInterval) / + avgICDSpeed; + var inTq = Formulas.InertiaPower( + engSpeed, DataBus.EngineSpeed, + (DataBus as VehicleContainer)?.RunData.EngineData.Inertia ?? 0.SI<KilogramSquareMeter>(), + operatingPoint.SimulationInterval) / avgICDSpeed; + var auxTq = DataBus.EngineAuxDemand(avgICDSpeed, operatingPoint.SimulationInterval) / avgICDSpeed; + + return Tuple.Create( + tc.CalculateOperatingPoint(engSpeed, response.GearboxInputSpeed), drTq - inTq - auxTq, maxTq - inTq - auxTq); + } + + + // Search vehicle acceleration to match the torque converter out-torque for a fixed TC opPt + private MeterPerSquareSecond SearchAccelerationFixedTC( + Second absTime, Radian gradient, OperatingPoint operatingPoint, Tuple<TorqueConverterOperatingPoint, NewtonMeter> tcOp, ResponseDryRun dryRun) + { + var acceleration = SearchAlgorithm.Search( + operatingPoint.Acceleration, tcOp.Item1.OutTorque - dryRun.TorqueConverterTorqueDemand, + Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating, + getYValue: resp => { + var r = (ResponseDryRun)resp; + return tcOp.Item1.OutTorque - r.TorqueConverterTorqueDemand; + }, + evaluateFunction: + acc => { + var tmp = ComputeTimeInterval(acc, operatingPoint.SimulationDistance); + if (tmp.SimulationInterval.IsEqual(0.SI<Second>(), 1e-9.SI<Second>())) { + throw new VectoSearchAbortedException( + "next TimeInterval is 0. a: {0}, v: {1}, dt: {2}", acc, + DataBus.VehicleSpeed, tmp.SimulationInterval); + } + + DriverAcceleration = acc; + var tmpResponse = NextComponent.Request(absTime, tmp.SimulationInterval, acc, gradient, true); + tmpResponse.OperatingPoint = tmp; + return tmpResponse; + }, + criterion: resp => { + var r = (ResponseDryRun)resp; + + return (tcOp.Item1.OutTorque - r.TorqueConverterTorqueDemand).Value(); + } + ); + return acceleration; + } + + private NewtonMeter GetTCDelta(Tuple<TorqueConverterOperatingPoint, NewtonMeter> tqOp, NewtonMeter dragTorque, NewtonMeter maxTorque) + { + var deltaSpeed = VectoMath.Min(0.RPMtoRad(), tqOp.Item1.InAngularVelocity - DataBus.EngineIdleSpeed) + + VectoMath.Max(0.RPMtoRad(), tqOp.Item1.InAngularVelocity - DataBus.EngineRatedSpeed); + var tqDiff = 0.SI<NewtonMeter>(); + if (tqOp.Item2.IsSmaller(dragTorque)) { + tqDiff = tqOp.Item2 - dragTorque; + + } + + if (tqOp.Item2.IsGreater(maxTorque)) { + tqDiff = tqOp.Item2 - maxTorque; + } + return ((tqDiff.Value() * tqDiff.Value()) + (deltaSpeed.Value() * deltaSpeed.Value())).SI<NewtonMeter>(); + + } + public IResponse DrivingActionBrake(Second absTime, Meter ds, MeterPerSecond nextTargetSpeed, Radian gradient, IResponse previousResponse = null, Meter targetDistance = null, DrivingAction? overrideAction = null) { DrivingAction = overrideAction ?? DrivingAction.Brake; @@ -559,10 +714,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } catch (VectoSearchAbortedException vsa) { Log.Warn("Search braking power aborted {0}", vsa); if (DataBus.GearboxType.AutomaticTransmission()) { - (DataBus as IGearboxControl).DisengageGearbox = true; - operatingPoint = SearchBrakingPower( - absTime, operatingPoint.SimulationDistance, gradient, - operatingPoint.Acceleration, response); + operatingPoint = SetTCOperatingPointATGbxBraking(absTime, gradient, operatingPoint, response); } } if (!ds.IsEqual(operatingPoint.SimulationDistance, 1E-15.SI<Meter>())) { @@ -666,6 +818,37 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return retVal; } + private OperatingPoint SetTCOperatingPointATGbxBraking( + Second absTime, Radian gradient, OperatingPoint operatingPoint, IResponse response) + { + var tc = DataBus.TorqueConverter; + if (tc == null) { + throw new VectoException("NO TorqueConverter Available!"); + } + + var avgEngineSpeed = (DataBus.EngineSpeed + DataBus.EngineIdleSpeed) / 2.0; + var dragTorque = (DataBus.EngineDragPower(avgEngineSpeed)) / avgEngineSpeed; + var maxTorque = DataBus.EngineDynamicFullLoadPower(avgEngineSpeed, operatingPoint.SimulationInterval) / avgEngineSpeed; + var inertiaTq = Formulas.InertiaPower( + DataBus.EngineIdleSpeed, DataBus.EngineSpeed, + (DataBus as VehicleContainer)?.RunData.EngineData.Inertia ?? 0.SI<KilogramSquareMeter>(), + operatingPoint.SimulationInterval) / avgEngineSpeed; + var auxTqDemand = DataBus.EngineAuxDemand(avgEngineSpeed, operatingPoint.SimulationInterval) / avgEngineSpeed; + //var maxTorque = DataBus.e + var tcOp = tc.CalculateOperatingPoint(DataBus.EngineIdleSpeed * 1.01, response.GearboxInputSpeed); + + if (!tcOp.Item2.IsBetween(dragTorque - inertiaTq - auxTqDemand, maxTorque - inertiaTq - auxTqDemand)) { + + (DataBus as IGearboxControl).DisengageGearbox = true; + operatingPoint = SearchBrakingPower( + absTime, operatingPoint.SimulationDistance, gradient, + operatingPoint.Acceleration, response); + return operatingPoint; + } + + return null; + } + private OperatingPoint AdaptDecelerationToTargetDistance(Meter ds, MeterPerSecond nextTargetSpeed, Meter targetDistance, MeterPerSquareSecond acceleration) { @@ -843,6 +1026,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var delta = origDelta; try { + var nanCount = 0; retVal.Acceleration = SearchAlgorithm.Search(acceleration, delta, Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating, getYValue: response => { @@ -893,6 +1077,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl abortCriterion: (response, cnt) => { var r = (ResponseDryRun)response; + if (DataBus.GearboxType.AutomaticTransmission() && + r.DeltaDragLoad.Value().IsSmallerOrEqual(-double.MaxValue / 20)) { + nanCount++; + } + if (nanCount > 10) { + return true; + } return r != null && !actionRoll && !ds.IsEqual(r.OperatingPoint.SimulationDistance); }); return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs index 48717f62728268d64a1a1430bdaf9132454a914c..d70ba4e3c3ce8d83d3f3daaea359a0152930596b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs @@ -136,12 +136,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// <param name="absTime"></param> /// <param name="dt"></param> /// <param name="torquePowerTrain"></param> - /// <param name="torqueEngine"></param> /// <param name="angularSpeed"></param> /// <param name="dryRun"></param> /// <returns></returns> - public NewtonMeter TorqueDemand(Second absTime, Second dt, NewtonMeter torquePowerTrain, NewtonMeter torqueEngine, - PerSecond angularSpeed, bool dryRun = false) + public NewtonMeter TorqueDemand(Second absTime, Second dt, NewtonMeter torquePowerTrain, PerSecond angularSpeed, bool dryRun = false) { var avgAngularSpeed = PreviousState.AngularSpeed != null ? (angularSpeed + PreviousState.AngularSpeed) / 2.0 diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs index 77252b159d64e2e9c1b11a7c7bd02b9e6228a29e..86946b405195d3002a4523dbfd25b56a04b20d80 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs @@ -61,8 +61,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var auxTorqueDemand = EngineAux == null ? 0.SI<NewtonMeter>() - : EngineAux.TorqueDemand(absTime, dt, CurrentState.EngineTorqueOut, - CurrentState.EngineTorqueOut + CurrentState.InertiaTorqueLoss, angularVelocity, dryRun); + : EngineAux.TorqueDemand(absTime, dt, CurrentState.EngineTorqueOut, angularVelocity, dryRun); var totalTorqueDemand = CurrentState.EngineTorqueOut + auxTorqueDemand + CurrentState.InertiaTorqueLoss; CurrentState.EngineTorque = totalTorqueDemand; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs index 0dc24b6d7c140171f33d7d7842cfc517f0fcafd7..efb7e558e56c6330df4824c80b0313024cfcb0f4 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs @@ -47,7 +47,7 @@ using TUGraz.VectoCore.OutputData; namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { public class TorqueConverter : StatefulVectoSimulationComponent<TorqueConverter.TorqueConverterComponentState>, - ITnInPort, ITnOutPort + ITnInPort, ITnOutPort, ITorqueConverterControl { protected readonly IGearboxInfo Gearbox; protected readonly IShiftStrategy ShiftStrategy; @@ -105,7 +105,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var inTorque = CalculateAverageInTorque(operatingPoint); if (dryRun) { - return HandleDryRun(absTime, dt, outTorque, outAngularVelocity, inTorque, operatingPoint); + var retValD = HandleDryRun(absTime, dt, outTorque, outAngularVelocity, inTorque, operatingPoint); + retValD.TorqueConverterTorqueDemand = outTorque; + return retValD; } // normal request @@ -127,7 +129,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl CurrentState.IgnitionOn = DataBus.IgnitionOn; var retVal = NextComponent.Request(absTime, dt, inTorque, operatingPoint.InAngularVelocity); - + //retVal.TorqueConverterOperatingPoint = operatingPoint; // check if shift is required var ratio = Gearbox.GetGearData(Gearbox.Gear).TorqueConverterRatio; if (!Gearbox.DisengageGearbox && absTime > DataBus.LastShift && retVal is ResponseSuccess) { @@ -156,7 +158,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return inTorque; } - private IResponse HandleDryRun( + private ResponseDryRun HandleDryRun( Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque, TorqueConverterOperatingPoint operatingPoint) { @@ -334,6 +336,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl NewtonMeter outTorque, PerSecond outAngularVelocity) { + if (SetOperatingPoint != null) { + return SetOperatingPoint; + } var operatingPointList = ModelData.FindOperatingPoint(outTorque, outAngularVelocity, DataBus.EngineIdleSpeed); if (operatingPointList.Count == 0) { Log.Debug("TorqueConverter: Failed to find torque converter operating point, fallback: creeping"); @@ -409,6 +414,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected override void DoCommitSimulationStep() { + SetOperatingPoint = null; AdvanceState(); } @@ -425,5 +431,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public TorqueConverterOperatingPoint OperatingPoint; public bool IgnitionOn; } + + #region Implementation of ITorqueConverterControl + + public Tuple<TorqueConverterOperatingPoint, NewtonMeter> CalculateOperatingPoint(PerSecond inSpeed, PerSecond outSpeed) + { + var tcOps = ModelData.FindOperatingPoint(inSpeed, outSpeed); + + return Tuple.Create(tcOps, CalculateAverageInTorque(tcOps)); + } + + public TorqueConverterOperatingPoint SetOperatingPoint { get; set; } + + + #endregion } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCombustionEngine.cs index 2644fa0286dc03d9b9142e7a09553620ee31ff10..601940a451bf12aaae335ba7a8eda1214b9518cf 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCombustionEngine.cs @@ -96,8 +96,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } var auxTorqueDemand = EngineAux == null ? 0.SI<NewtonMeter>() - : EngineAux.TorqueDemand(absTime, dt, torqueOut, - torqueOut + inertiaTorqueLoss, avgEngineSpeed, dryRun); + : EngineAux.TorqueDemand(absTime, dt, torqueOut, avgEngineSpeed, dryRun); // compute the torque the engine has to provide. powertrain + aux + its own inertia var totalTorqueDemand = torqueOut + auxTorqueDemand + inertiaTorqueLoss; diff --git a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs index b48074fe15e729b86a70a0b7fd8c28de8ef569dd..d8a869a134f1c2ff210c921b3a1a545d8787977a 100644 --- a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs +++ b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs @@ -71,8 +71,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var engineSpeed = engineSpeedRpm.RPMtoRad(); busAux.Initialize(engineDrivelinePower / engineSpeed, engineSpeed); - var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, - (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); + var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, engineSpeed); Assert.AreEqual(expectedPowerDemand, (torque * engineSpeed).Value(), 1e-2); } @@ -94,8 +93,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var modalData = new MockModalDataContainer(); for (int i = 0; i < 10; i++) { - var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, - (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); + var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, engineSpeed); Assert.AreEqual(6087.03221, (torque * engineSpeed).Value(), 1e-3); busAux.DoWriteModalResults(0.SI<Second>(), 1.SI<Second>(), modalData); busAux.DoCommitSimulationStep(); @@ -107,8 +105,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries internalPower = -20; for (int i = 0; i < 10; i++) { - var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, - (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); + var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, engineSpeed); Assert.AreEqual(8954.1429, (torque * engineSpeed).Value(), 1e-3); busAux.DoWriteModalResults(0.SI<Second>(), 1.SI<Second>(), modalData); busAux.DoCommitSimulationStep(); @@ -120,8 +117,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries internalPower = 148; for (int i = 0; i < 10; i++) { - var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, - (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); + var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, engineSpeed); Assert.AreEqual(6087.03221, (torque * engineSpeed).Value(), 1e-3); busAux.DoWriteModalResults(0.SI<Second>(), 1.SI<Second>(), modalData); busAux.DoCommitSimulationStep(); diff --git a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/BusAdapterTest.cs b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/BusAdapterTest.cs index 5caa081141eae5383e19446cc6cda43c33709dcf..44f9d40c8ea3bc6b014da6370234f7b11f3c58e4 100644 --- a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/BusAdapterTest.cs +++ b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/BusAdapterTest.cs @@ -70,8 +70,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var engineSpeed = engineSpeedRpm.RPMtoRad(); busAux.Initialize(engineDrivelinePower / engineSpeed, engineSpeed); - var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, - (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); + var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, engineSpeed); Assert.AreEqual(expectedPowerDemand, (torque * engineSpeed).Value(), 1e-2); } @@ -103,8 +102,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var engineSpeed = engineSpeedRpm.RPMtoRad(); busAux.Initialize(engineDrivelinePower / engineSpeed, engineSpeed); - var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, - (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); + var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, engineSpeed); Assert.AreEqual(expectedPowerDemand, (torque * engineSpeed).Value(), 1e-2); } @@ -127,8 +125,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var engineSpeed = engineSpeedRpm.RPMtoRad(); busAux.Initialize(engineDrivelinePower / engineSpeed, engineSpeed); - var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, - (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); + var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, engineSpeed); Assert.AreEqual(expectedPowerDemand, (torque * engineSpeed).Value(), 1e-3); } @@ -156,8 +153,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var engineSpeed = engineSpeedRpm.RPMtoRad(); busAux.Initialize(engineDrivelinePower / engineSpeed, engineSpeed); - var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, - (internalPower).SI<Watt>() / engineSpeed, engineSpeed); + var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, engineSpeed); var row = table.NewRow(); row["engineSpeed"] = engineSpeed.Value() / Constants.RPMToRad; diff --git a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs index 70101f15f5efde6ac029fb750df94c63c2f08ea8..f8142faa213cdf1e54a20fdb3efdd37a90530183 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs @@ -108,7 +108,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation aux.Initialize(torque, speed); for (var i = 0; i < 11; i++) { - aux.TorqueDemand(t, dt, torque, torque, speed); + aux.TorqueDemand(t, dt, torque, speed); modData[ModalResultField.dist] = i.SI<Meter>(); modData[ModalResultField.P_ice_out] = 0.SI<Watt>(); modData[ModalResultField.acc] = 0.SI<MeterPerSquareSecond>(); @@ -144,19 +144,19 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation var t = 0.SI<Second>(); aux.Initialize(torque, speed); - var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed); + var auxDemand = aux.TorqueDemand(t, t, torque, speed); AssertHelper.AreRelativeEqual(constPower / speed, auxDemand); speed = 2358.RPMtoRad(); torque = 1500.SI<NewtonMeter>(); aux.Initialize(torque, speed); - auxDemand = aux.TorqueDemand(t, t, torque, torque, speed); + auxDemand = aux.TorqueDemand(t, t, torque, speed); AssertHelper.AreRelativeEqual(constPower / speed, auxDemand); speed = 1500.RPMtoRad(); torque = 1500.SI<NewtonMeter>(); aux.Initialize(torque, speed); - auxDemand = aux.TorqueDemand(t, t, torque, torque, speed); + auxDemand = aux.TorqueDemand(t, t, torque, speed); AssertHelper.AreRelativeEqual(constPower / speed, auxDemand); } @@ -182,7 +182,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation var expected = new[] { 6100, 3100, 2300, 4500, 6100 }; foreach (var e in expected) { aux.Initialize(torque, speed); - var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed); + var auxDemand = aux.TorqueDemand(t, t, torque, speed); AssertHelper.AreRelativeEqual((e.SI<Watt>() / speed).Value(), auxDemand.Value()); cycle.CommitSimulationStep(t, t, null); @@ -246,7 +246,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation foreach (var e in expected) { aux.Initialize(torque, speed); - var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed); + var auxDemand = aux.TorqueDemand(t, t, torque, speed); AssertHelper.AreRelativeEqual((e.SI<Watt>() / speed).Value(), auxDemand.Value()); @@ -307,7 +307,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation foreach (var e in expected) { aux.Initialize(torque, speed); - var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed); + var auxDemand = aux.TorqueDemand(t, t, torque, speed); AssertHelper.AreRelativeEqual((e.SI<Watt>() / speed).Value(), auxDemand); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs index e6bd409937b0feb5497546644713e1660b7a9526..9513779c45f2fc5bac0ed3398b6d65b244d39290 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs @@ -171,11 +171,21 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent throw new System.NotImplementedException(); } + public Watt EngineDynamicFullLoadPower(PerSecond avgEngineSpeed, Second dt) + { + throw new System.NotImplementedException(); + } + public Watt EngineDragPower(PerSecond angularSpeed) { throw new System.NotImplementedException(); } + public Watt EngineAuxDemand(PerSecond avgEngineSpeed, Second dt) + { + throw new System.NotImplementedException(); + } + public PerSecond EngineIdleSpeed { get; set; } public PerSecond EngineRatedSpeed { get; set; } public PerSecond EngineN95hSpeed { get; set; } diff --git a/VectoCore/VectoCoreTest/Utils/MockPorts.cs b/VectoCore/VectoCoreTest/Utils/MockPorts.cs index df755033403c198fdb8e0e174fb5ef3e4743c072..e954122cb73612ecf8eeda867661d0642c461b62 100644 --- a/VectoCore/VectoCoreTest/Utils/MockPorts.cs +++ b/VectoCore/VectoCoreTest/Utils/MockPorts.cs @@ -112,11 +112,21 @@ namespace TUGraz.VectoCore.Tests.Utils return 2300.SI<NewtonMeter>() * angularSpeed; } + public Watt EngineDynamicFullLoadPower(PerSecond avgEngineSpeed, Second dt) + { + throw new NotImplementedException(); + } + public Watt EngineDragPower(PerSecond angularSpeed) { return -1000.SI<NewtonMeter>() * angularSpeed; } + public Watt EngineAuxDemand(PerSecond avgEngineSpeed, Second dt) + { + throw new NotImplementedException(); + } + public PerSecond EngineIdleSpeed { get { return 560.RPMtoRad(); } diff --git a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs index 4567f706bbd8f5931f3de023a9a22253faa911d6..b80c9df46ee5c9c14f72ece9c27bee8d422d26e7 100644 --- a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs @@ -53,6 +53,7 @@ namespace TUGraz.VectoCore.Tests.Utils public List<VectoSimulationComponent> Components = new List<VectoSimulationComponent>(); private Watt _axlegearLoss = 0.SI<Watt>(); private bool _clutchClosed = true; + private ITorqueConverterControl _torqueConverter; public IEngineInfo Engine { get; set; } @@ -80,6 +81,11 @@ namespace TUGraz.VectoCore.Tests.Utils public Second AbsTime { get; set; } + public ITorqueConverterControl TorqueConverter + { + get { return _torqueConverter; } + } + public Watt GearboxLoss() { throw new System.NotImplementedException(); @@ -100,11 +106,21 @@ namespace TUGraz.VectoCore.Tests.Utils return Engine.EngineStationaryFullPower(angularSpeed); } + public Watt EngineDynamicFullLoadPower(PerSecond avgEngineSpeed, Second dt) + { + throw new NotImplementedException(); + } + public Watt EngineDragPower(PerSecond angularSpeed) { return Engine.EngineStationaryFullPower(angularSpeed); } + public Watt EngineAuxDemand(PerSecond avgEngineSpeed, Second dt) + { + throw new NotImplementedException(); + } + public PerSecond EngineIdleSpeed { get { return Engine.EngineIdleSpeed; }