Code development platform for open source projects from the European Union institutions

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

Merge branch 'develop' of...

parents 9242b810 73d1445e
No related branches found
No related tags found
No related merge requests found
......@@ -179,9 +179,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
private Second GetStopTimeInterval()
{
if (!Left.PTOActive || IdleController == null) {
return Left.StoppingTime.IsGreater(3 * Constants.SimulationSettings.TargetTimeInterval)
? GetStopTimeIntervalThreePhases()
: Left.StoppingTime;
if ((Left.StoppingTime - PreviousState.WaitTime).IsGreater(2 * Constants.SimulationSettings.TargetTimeInterval,
0.1 * Constants.SimulationSettings.TargetTimeInterval)) {
return 2 * Constants.SimulationSettings.TargetTimeInterval;
}
return Left.StoppingTime - PreviousState.WaitTime;
}
if (Left.StoppingTime.IsGreater(6 * Constants.SimulationSettings.TargetTimeInterval)) {
// 7 phases
......@@ -196,20 +198,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return IdleController.GetNextCycleTime();
}
private Second GetStopTimeIntervalThreePhases()
{
switch (CurrentState.WaitPhase) {
case 1:
case 3:
CurrentState.WaitPhase++;
return Constants.SimulationSettings.TargetTimeInterval;
case 2:
CurrentState.WaitPhase++;
return Left.StoppingTime - 2 * Constants.SimulationSettings.TargetTimeInterval;
}
return null;
}
private Second GetStopTimeIntervalThreePhasesPTO()
{
switch (CurrentState.WaitPhase) {
......@@ -390,8 +378,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
/// </summary>
public double Progress
{
get
{
get {
return Data.Entries.Count > 0
? (CurrentState.Distance.Value() - Data.Entries.First().Distance.Value()) /
(Data.Entries.Last().Distance.Value() - Data.Entries.First().Distance.Value())
......@@ -448,8 +435,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public CycleData CycleData
{
get
{
get {
return new CycleData {
AbsTime = CurrentState.AbsTime,
AbsDistance = CurrentState.Distance,
......@@ -552,4 +538,4 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
CycleIntervalIterator.Dispose();
}
}
}
\ No newline at end of file
}
......@@ -29,91 +29,91 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{
public abstract class TransmissionComponent :
StatefulVectoSimulationComponent<TransmissionComponent.TransmissionState>, IPowerTrainComponent, ITnInPort,
ITnOutPort
{
protected ITnOutPort NextComponent;
[ValidateObject] internal readonly TransmissionData ModelData;
public class TransmissionState : SimpleComponentState
{
public TransmissionLossMap.LossMapResult TorqueLossResult;
//public NewtonMeter TorqueLoss = 0.SI<NewtonMeter>();
}
protected TransmissionComponent(IVehicleContainer container, TransmissionData modelData) : base(container)
{
ModelData = modelData;
}
public virtual ITnInPort InPort()
{
return this;
}
public virtual ITnOutPort OutPort()
{
return this;
}
public virtual void Connect(ITnOutPort other)
{
NextComponent = other;
}
public virtual IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
bool dryRun = false)
{
Log.Debug("request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
var inAngularVelocity = outAngularVelocity * ModelData.Ratio;
var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
var torqueLossResult = ModelData.LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value;
CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
CurrentState.TorqueLossResult = torqueLossResult;
var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun);
return retVal;
}
public virtual IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var inAngularVelocity = outAngularVelocity * ModelData.Ratio;
var torqueLossResult = ModelData.LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value;
PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
PreviousState.TorqueLossResult = torqueLossResult;
return NextComponent.Initialize(inTorque, inAngularVelocity);
}
protected override void DoCommitSimulationStep()
{
if (CurrentState.TorqueLossResult.Extrapolated) {
Log.Warn("{2} LossMap data was extrapolated: range for loss map is not sufficient: n:{0}, torque:{1}",
CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name);
if (DataBus.ExecutionMode == ExecutionMode.Declaration) {
throw new VectoException(
"{2} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{0}, torque:{1}",
CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name);
}
}
AdvanceState();
}
}
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{
public abstract class TransmissionComponent :
StatefulVectoSimulationComponent<TransmissionComponent.TransmissionState>, IPowerTrainComponent, ITnInPort,
ITnOutPort
{
protected ITnOutPort NextComponent;
[ValidateObject] internal readonly TransmissionData ModelData;
public class TransmissionState : SimpleComponentState
{
public TransmissionLossMap.LossMapResult TorqueLossResult;
//public NewtonMeter TorqueLoss = 0.SI<NewtonMeter>();
}
protected TransmissionComponent(IVehicleContainer container, TransmissionData modelData) : base(container)
{
ModelData = modelData;
}
public virtual ITnInPort InPort()
{
return this;
}
public virtual ITnOutPort OutPort()
{
return this;
}
public virtual void Connect(ITnOutPort other)
{
NextComponent = other;
}
public virtual IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
bool dryRun = false)
{
Log.Debug("request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
var inAngularVelocity = outAngularVelocity * ModelData.Ratio;
var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
var torqueLossResult = ModelData.LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value;
CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
CurrentState.TorqueLossResult = torqueLossResult;
var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun);
return retVal;
}
public virtual IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var inAngularVelocity = outAngularVelocity * ModelData.Ratio;
var torqueLossResult = ModelData.LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value;
PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
PreviousState.TorqueLossResult = torqueLossResult;
return NextComponent.Initialize(inTorque, inAngularVelocity);
}
protected override void DoCommitSimulationStep()
{
if (CurrentState.TorqueLossResult.Extrapolated) {
Log.Warn("{2} LossMap data was extrapolated: range for loss map is not sufficient: n:{0}, torque:{1}",
CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name);
if (DataBus.ExecutionMode == ExecutionMode.Declaration) {
throw new VectoException(
"{2} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{0}, torque:{1}",
CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque, GetType().Name);
}
}
AdvanceState();
}
}
}
\ No newline at end of file
......@@ -29,23 +29,23 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System;
using System.IO;
using System.Xml;
namespace TUGraz.VectoCore.Utils
{
public class XmlResourceResolver : XmlUrlResolver
{
internal const string BaseUri = "schema://";
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
if (absoluteUri.Scheme == "schema") {
return RessourceHelper.LoadResourceAsStream(RessourceHelper.ResourceType.XMLSchema,
Path.GetFileName(absoluteUri.LocalPath));
}
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
}
using System;
using System.IO;
using System.Xml;
namespace TUGraz.VectoCore.Utils
{
public class XmlResourceResolver : XmlUrlResolver
{
internal const string BaseUri = "schema://";
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
if (absoluteUri.Scheme == "schema") {
return RessourceHelper.LoadResourceAsStream(RessourceHelper.ResourceType.XMLSchema,
Path.GetFileName(absoluteUri.LocalPath));
}
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
}
}
\ No newline at end of file
......@@ -49,10 +49,10 @@ namespace TUGraz.VectoCore.Tests.Integration
@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 0, 0.00040262, 5652.5200,
TestName = "Ethanol LH Low"),
TestCase(FuelType.DieselCI,
@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0007971, 10877.1820,
@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0007971, 10876.9518,
TestName = "Diesel LH Ref"),
TestCase(FuelType.EthanolCI,
@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0004660, 6546.6880,
@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0004660, 6546.5494,
TestName = "Ethanol LH Ref"),]
public void TestFuelTypesCO2(FuelType fuelType, string jobName, int runIdx, double expectedCo2, double expectedMJ)
{
......@@ -85,4 +85,4 @@ namespace TUGraz.VectoCore.Tests.Integration
Assert.AreEqual(expectedMJ, modContainer.EnergyPerMeter().Value(), 1e-3);
}
}
}
\ No newline at end of file
}
......@@ -164,30 +164,19 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
var startDistance = container.CycleStartDistance.Value();
var absTime = 0.SI<Second>();
// waiting time of 40 seconds is split up to 3 steps: 0.5, 39, 0.5
var response = cycle.OutPort().Request(absTime, 1.SI<Meter>());
Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
Assert.AreEqual(0, driver.LastRequest.TargetVelocity.Value(), Tolerance);
Assert.AreEqual(0.028416069495827, driver.LastRequest.Gradient.Value(), 1E-12);
Assert.AreEqual(0.5, driver.LastRequest.dt.Value(), Tolerance);
container.CommitSimulationStep(absTime, response.SimulationInterval);
absTime += response.SimulationInterval;
response = cycle.OutPort().Request(absTime, 1.SI<Meter>());
Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
Assert.AreEqual(0, driver.LastRequest.TargetVelocity.Value(), Tolerance);
Assert.AreEqual(0.028416069495827, driver.LastRequest.Gradient.Value(), 1E-12);
Assert.AreEqual(39, driver.LastRequest.dt.Value(), Tolerance);
container.CommitSimulationStep(absTime, response.SimulationInterval);
absTime += response.SimulationInterval;
IResponse response;
response = cycle.OutPort().Request(absTime, 1.SI<Meter>());
Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
Assert.AreEqual(0, driver.LastRequest.TargetVelocity.Value(), Tolerance);
Assert.AreEqual(0.028416069495827, driver.LastRequest.Gradient.Value(), 1E-12);
Assert.AreEqual(0.5, driver.LastRequest.dt.Value(), Tolerance);
container.CommitSimulationStep(absTime, response.SimulationInterval);
absTime += response.SimulationInterval;
// waiting 40s in 1s steps
for (var i = 0; i < 40; i++) {
response = cycle.OutPort().Request(absTime, 1.SI<Meter>());
Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
Assert.AreEqual(0, driver.LastRequest.TargetVelocity.Value(), Tolerance);
Assert.AreEqual(0.028416069495827, driver.LastRequest.Gradient.Value(), 1E-12);
Assert.AreEqual(1, driver.LastRequest.dt.Value(), Tolerance);
container.CommitSimulationStep(absTime, response.SimulationInterval);
absTime += response.SimulationInterval;
}
response = cycle.OutPort().Request(absTime, 1.SI<Meter>());
......@@ -231,4 +220,4 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
absTime += response.SimulationInterval;
}
}
}
\ 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