Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS will be completely phased out by mid-2025. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 3a0d2eb2 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

fix testcases for AT measured speed: use default TC in case the cycle does not contain engine speed

parent f0949b06
No related branches found
No related tags found
No related merge requests found
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/ */
using System.Linq;
using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
...@@ -54,7 +55,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -54,7 +55,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected bool? TorqueConverterActive; protected bool? TorqueConverterActive;
protected internal readonly CycleTorqueConverter TorqueConverter; protected internal readonly TorqueConverterWrapper TorqueConverter;
public CycleGearbox(IVehicleContainer container, VectoRunData runData) public CycleGearbox(IVehicleContainer container, VectoRunData runData)
: base(container, runData) : base(container, runData)
...@@ -64,7 +65,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -64,7 +65,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
} }
var strategy = new CycleShiftStrategy(ModelData, null); var strategy = new CycleShiftStrategy(ModelData, null);
TorqueConverter = new CycleTorqueConverter(container, ModelData.TorqueConverterData);
TorqueConverter = new TorqueConverterWrapper(runData.Cycle.Entries.All(x => x.EngineSpeed != null),
new CycleTorqueConverter(container, ModelData.TorqueConverterData),
new TorqueConverter(this, strategy, container, ModelData.TorqueConverterData, runData));
if (TorqueConverter == null) { if (TorqueConverter == null) {
throw new VectoException("Torque Converter required for AT transmission!"); throw new VectoException("Torque Converter required for AT transmission!");
} }
...@@ -536,69 +541,4 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -536,69 +541,4 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
} }
} }
} }
public class CycleTorqueConverter : StatefulVectoSimulationComponent<TorqueConverter.TorqueConverterComponentState>
{
protected internal ITnOutPort NextComponent;
private TorqueConverterData ModelData;
public CycleTorqueConverter(IVehicleContainer container, TorqueConverterData modelData) : base(container)
{
ModelData = modelData;
}
public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity)
{
var operatingPoint = ModelData.LookupOperatingPoint(outAngularVelocity, inAngularVelocity, outTorque);
PreviousState.OperatingPoint = operatingPoint;
return NextComponent.Initialize(operatingPoint.InTorque, inAngularVelocity);
}
public IResponse Request(
Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity,
bool dryRun = false)
{
var operatingPoint = ModelData.LookupOperatingPoint(outAngularVelocity, inAngularVelocity, outTorque);
if (!dryRun) {
CurrentState.OperatingPoint = operatingPoint;
}
return NextComponent.Request(absTime, dt, operatingPoint.InTorque, inAngularVelocity, dryRun);
}
public void Locked(
NewtonMeter inTorque, PerSecond inAngularVelocity, NewtonMeter outTorque,
PerSecond outAngularVelocity) { }
#region Overrides of VectoSimulationComponent
protected override void DoWriteModalResults(IModalDataContainer container)
{
if (CurrentState.OperatingPoint == null) {
container[ModalResultField.TorqueConverterTorqueRatio] = 1.0;
container[ModalResultField.TorqueConverterSpeedRatio] = 1.0;
} else {
container[ModalResultField.TorqueConverterTorqueRatio] = CurrentState.OperatingPoint.TorqueRatio;
container[ModalResultField.TorqueConverterSpeedRatio] = CurrentState.OperatingPoint.SpeedRatio;
}
container[ModalResultField.TC_TorqueIn] = CurrentState.InTorque;
container[ModalResultField.TC_TorqueOut] = CurrentState.OutTorque;
container[ModalResultField.TC_angularSpeedIn] = CurrentState.InAngularVelocity;
container[ModalResultField.TC_angularSpeedOut] = CurrentState.OutAngularVelocity;
var avgOutVelocity = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
var avgInVelocity = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
container[ModalResultField.P_TC_out] = CurrentState.OutTorque * avgOutVelocity;
container[ModalResultField.P_TC_loss] = CurrentState.InTorque * avgInVelocity -
CurrentState.OutTorque * avgOutVelocity;
}
protected override void DoCommitSimulationStep()
{
AdvanceState();
}
#endregion
}
} }
\ No newline at end of file
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.OutputData;
namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
public class CycleTorqueConverter : StatefulVectoSimulationComponent<TorqueConverter.TorqueConverterComponentState>
{
protected internal ITnOutPort NextComponent;
private TorqueConverterData ModelData;
public CycleTorqueConverter(IVehicleContainer container, TorqueConverterData modelData) : base(container)
{
ModelData = modelData;
}
public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity)
{
var operatingPoint = ModelData.LookupOperatingPoint(outAngularVelocity, inAngularVelocity, outTorque);
PreviousState.OperatingPoint = operatingPoint;
return NextComponent.Initialize(operatingPoint.InTorque, inAngularVelocity);
}
public IResponse Request(
Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity,
bool dryRun = false)
{
var operatingPoint = ModelData.LookupOperatingPoint(outAngularVelocity, inAngularVelocity, outTorque);
if (!dryRun) {
CurrentState.OperatingPoint = operatingPoint;
}
return NextComponent.Request(absTime, dt, operatingPoint.InTorque, inAngularVelocity, dryRun);
}
public void Locked(
NewtonMeter inTorque, PerSecond inAngularVelocity, NewtonMeter outTorque,
PerSecond outAngularVelocity) { }
#region Overrides of VectoSimulationComponent
protected override void DoWriteModalResults(IModalDataContainer container)
{
if (CurrentState.OperatingPoint == null) {
container[ModalResultField.TorqueConverterTorqueRatio] = 1.0;
container[ModalResultField.TorqueConverterSpeedRatio] = 1.0;
} else {
container[ModalResultField.TorqueConverterTorqueRatio] = CurrentState.OperatingPoint.TorqueRatio;
container[ModalResultField.TorqueConverterSpeedRatio] = CurrentState.OperatingPoint.SpeedRatio;
}
container[ModalResultField.TC_TorqueIn] = CurrentState.InTorque;
container[ModalResultField.TC_TorqueOut] = CurrentState.OutTorque;
container[ModalResultField.TC_angularSpeedIn] = CurrentState.InAngularVelocity;
container[ModalResultField.TC_angularSpeedOut] = CurrentState.OutAngularVelocity;
var avgOutVelocity = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
var avgInVelocity = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
container[ModalResultField.P_TC_out] = CurrentState.OutTorque * avgOutVelocity;
container[ModalResultField.P_TC_loss] = CurrentState.InTorque * avgInVelocity -
CurrentState.OutTorque * avgOutVelocity;
}
protected override void DoCommitSimulationStep()
{
AdvanceState();
}
#endregion
}
}
\ No newline at end of file
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Connector.Ports;
namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
public class TorqueConverterWrapper
{
protected internal CycleTorqueConverter CycleTorqueConverter;
protected internal TorqueConverter TorqueConverter;
protected bool UseCycleTorqueConverter;
public TorqueConverterWrapper(bool useCycle, CycleTorqueConverter cycleTorqueConverter, TorqueConverter torqueConverter)
{
UseCycleTorqueConverter = useCycle;
if (useCycle) {
CycleTorqueConverter = cycleTorqueConverter;
} else {
TorqueConverter = torqueConverter;
}
}
public ITnOutPort NextComponent
{
set {
if (UseCycleTorqueConverter) {
CycleTorqueConverter.NextComponent = value;
} else {
TorqueConverter.NextComponent = value;
}
}
}
public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity)
{
return UseCycleTorqueConverter
? CycleTorqueConverter.Initialize(outTorque, outAngularVelocity, inAngularVelocity)
: TorqueConverter.Initialize(outTorque, outAngularVelocity);
}
public IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, PerSecond inAngularVelocity, bool dryRun = false)
{
return UseCycleTorqueConverter
? CycleTorqueConverter.Request(absTime, dt, outTorque, outAngularVelocity, inAngularVelocity, dryRun)
: TorqueConverter.Request(absTime, dt, outTorque, outAngularVelocity, dryRun);
}
public void Locked(NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque, PerSecond inAngularVelocity)
{
if (UseCycleTorqueConverter) {
CycleTorqueConverter.Locked(outTorque, outAngularVelocity, inTorque, inAngularVelocity);
} else {
TorqueConverter.Locked(outTorque, outAngularVelocity, inTorque, inAngularVelocity);
}
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment