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 5a7d2046 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

adding validation ranges as stated in the current parameter list (xls)

parent 6ba0037a
No related branches found
No related tags found
No related merge requests found
Showing
with 112 additions and 56 deletions
No preview for this file type
......@@ -285,19 +285,19 @@ namespace TUGraz.VectoCore.InputData
/// P111
/// cf. VECTO Input Parameters.xlsx
/// </summary>
KilogramPerWattSecond WHTCMotorway { get; }
double WHTCMotorway { get; }
/// <summary>
/// P110
/// cf. VECTO Input Parameters.xlsx
/// </summary>
KilogramPerWattSecond WHTCRural { get; }
double WHTCRural { get; }
/// <summary>
/// P109
/// cf. VECTO Input Parameters.xlsx
/// </summary>
KilogramPerWattSecond WHTCUrban { get; }
double WHTCUrban { get; }
/// <summary>
/// P067
......
......@@ -95,28 +95,19 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
get { return Body.GetEx<double>(JsonKeys.Engine_Inertia).SI<KilogramSquareMeter>(); }
}
public virtual KilogramPerWattSecond WHTCMotorway
public virtual double WHTCMotorway
{
get
{
return Body.GetEx<double>(JsonKeys.Engine_WHTC_Motorway).SI().Gramm.Per.Kilo.Watt.Hour.Cast<KilogramPerWattSecond>();
}
get { return Body.GetEx<double>(JsonKeys.Engine_WHTC_Motorway); }
}
public virtual KilogramPerWattSecond WHTCRural
public virtual double WHTCRural
{
get
{
return Body.GetEx<double>(JsonKeys.Engine_WHTC_Rural).SI().Gramm.Per.Kilo.Watt.Hour.Cast<KilogramPerWattSecond>();
}
get { return Body.GetEx<double>(JsonKeys.Engine_WHTC_Rural); }
}
public virtual KilogramPerWattSecond WHTCUrban
public virtual double WHTCUrban
{
get
{
return Body.GetEx<double>(JsonKeys.Engine_WHTC_Urban).SI().Gramm.Per.Kilo.Watt.Hour.Cast<KilogramPerWattSecond>();
}
get { return Body.GetEx<double>(JsonKeys.Engine_WHTC_Urban); }
}
public string Vendor
......
......@@ -113,7 +113,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
Mission = mission,
};
simulationRunData.EngineData.WHTCCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(mission.MissionType,
engineData.WHTCRural.Value(), engineData.WHTCUrban.Value(), engineData.WHTCMotorway.Value());
engineData.WHTCRural, engineData.WHTCUrban, engineData.WHTCMotorway);
simulationRunData.Cycle.Name = mission.MissionType.ToString();
simulationRunData.VehicleData.VehicleClass = segment.VehicleClass;
yield return simulationRunData;
......
......@@ -29,6 +29,7 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System.ComponentModel.DataAnnotations;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Utils;
......@@ -38,15 +39,20 @@ namespace TUGraz.VectoCore.Models.Declaration
{
public object WheelsDimension { get; internal set; }
[Required, SIRange(0, 100)]
public KilogramSquareMeter Inertia { get; internal set; }
[Required, SIRange(0.003, 0.015)]
public double RollResistanceCoefficient { get; internal set; }
[Required, SIRange(500, 100000)]
public Newton TyreTestLoad { get; internal set; }
[Required, SIRange(0, 1)]
public double AxleWeightShare { get; internal set; }
public bool TwinTyres { get; internal set; }
public AxleType AxleType { get; internal set; }
}
}
\ No newline at end of file
......@@ -42,7 +42,6 @@ using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.Simulation.Data
{
[DataContract]
[CustomValidation(typeof(VectoRunData), "ValidateRunData")]
public class VectoRunData : SimulationComponentData
{
......
......@@ -38,7 +38,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
{
public class CombustionEngineData : SimulationComponentData
{
[Required, SIRange(1000 / (Constants.Kilo * Constants.Kilo), 20000 / (Constants.Kilo * Constants.Kilo))]
[Required, SIRange(1000 * 1E-6, 20000 * 1E-6)]
public CubicMeter Displacement { get; internal set; }
[Required, SIRange(400 * Constants.RPMToRad, 1000 * Constants.RPMToRad)]
......@@ -47,14 +47,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
[Required, SIRange(0, 10)]
public KilogramSquareMeter Inertia { get; internal set; }
[Required, SIRange(double.Epsilon, 1000 / (Constants.Kilo * Constants.Kilo * Constants.SecondsPerHour))]
public KilogramPerWattSecond WHTCUrban { get; internal set; }
[Required, Range(0.9, 2)]
public double WHTCUrban { get; internal set; }
[Required, SIRange(double.Epsilon, 1000 / (Constants.Kilo * Constants.Kilo * Constants.SecondsPerHour))]
public KilogramPerWattSecond WHTCRural { get; internal set; }
[Required, Range(0.9, 2)]
public double WHTCRural { get; internal set; }
[Required, SIRange(double.Epsilon, 1000 / (Constants.Kilo * Constants.Kilo * Constants.SecondsPerHour))]
public KilogramPerWattSecond WHTCMotorway { get; internal set; }
[Required, Range(0.9, 2)]
public double WHTCMotorway { get; internal set; }
[Required, ValidateObject]
public FuelConsumptionMap ConsumptionMap { get; internal set; }
......@@ -96,9 +96,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
hashCode = (hashCode * 397) ^ (Displacement != null ? Displacement.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (IdleSpeed != null ? IdleSpeed.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (Inertia != null ? Inertia.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (WHTCUrban != null ? WHTCUrban.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (WHTCRural != null ? WHTCRural.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (WHTCMotorway != null ? WHTCMotorway.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (WHTCUrban.GetHashCode());
hashCode = (hashCode * 397) ^ (WHTCRural.GetHashCode());
hashCode = (hashCode * 397) ^ (WHTCMotorway.GetHashCode());
hashCode = (hashCode * 397) ^ (ConsumptionMap != null ? ConsumptionMap.GetHashCode() : 0);
return hashCode;
}
......
......@@ -30,6 +30,7 @@
*/
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using TUGraz.VectoCore.Models.Simulation.DataBus;
using TUGraz.VectoCore.Utils;
......
......@@ -49,6 +49,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
private PerSecond _ratedSpeed;
[Required, ValidateObject] internal List<FullLoadCurveEntry> FullLoadEntries;
[Required] internal LookupData<PerSecond, Second> PT1Data;
/// <summary>
......
......@@ -29,16 +29,23 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System.ComponentModel.DataAnnotations;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
{
public class GearData
{
[ValidateObject]
public ShiftPolygon ShiftPolygon { get; internal set; }
[ValidateObject]
public TransmissionLossMap LossMap { get; internal set; }
[ValidateObject]
public FullLoadCurve FullLoadCurve { get; internal set; }
[Required, Range(double.Epsilon, 25)]
public double Ratio { get; internal set; }
public bool TorqueConverterActive { get; internal set; } // TODO: think about refactoring...
......
......@@ -31,9 +31,11 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Linq;
using Newtonsoft.Json;
using TUGraz.VectoCore.Configuration;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Utils;
......@@ -41,7 +43,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
{
public class TransmissionLossMap : LoggingObject
{
[JsonProperty] private readonly List<GearLossMapEntry> _entries;
[ValidateObject] private readonly List<GearLossMapEntry> _entries;
private readonly double _ratio;
......@@ -116,10 +118,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
InputSpeed = row.ParseDouble(Fields.InputSpeed).RPMtoRad(),
InputTorque = row.ParseDouble(Fields.InputTorque).SI<NewtonMeter>(),
TorqueLoss = row.ParseDouble(Fields.TorqeLoss).SI<NewtonMeter>(),
Efficiency =
(!hasEfficiency || row[Fields.Efficiency] == DBNull.Value || row[Fields.Efficiency] != null)
? double.NaN
: row.ParseDouble(Fields.Efficiency)
//Efficiency =
// (!hasEfficiency || row[Fields.Efficiency] == DBNull.Value || row[Fields.Efficiency] != null)
// ? double.NaN
// : row.ParseDouble(Fields.Efficiency)
}).ToList();
}
......@@ -131,7 +133,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
InputSpeed = row.ParseDouble(0).RPMtoRad(),
InputTorque = row.ParseDouble(1).SI<NewtonMeter>(),
TorqueLoss = row.ParseDouble(2).SI<NewtonMeter>(),
Efficiency = (!hasEfficiency || row[3] == DBNull.Value || row[3] != null) ? double.NaN : row.ParseDouble(3)
//Efficiency = (!hasEfficiency || row[3] == DBNull.Value || row[3] != null) ? double.NaN : row.ParseDouble(3)
}).ToList();
}
......@@ -190,13 +192,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
public class GearLossMapEntry
{
[Required, SIRange(0, 5000 * Constants.RPMToRad)]
public PerSecond InputSpeed { get; set; }
[Required, SIRange(-50000, 50000)]
public NewtonMeter InputTorque { get; set; }
[Required, SIRange(0, double.MaxValue)]
public NewtonMeter TorqueLoss { get; set; }
public double Efficiency { get; set; }
//public double Efficiency { get; set; }
}
private static class Fields
......
......@@ -29,7 +29,9 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.Utils;
......@@ -46,17 +48,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <summary>
/// The name of the gearbox model.
/// </summary>
[Required]
public string ModelName { get; internal set; }
///// <summary>
///// The axle gear data.
///// </summary>
//public GearData AxleGearData { get; internal set; }
/// <summary>
/// The gear data.
/// </summary>
public Dictionary<uint, GearData> Gears = new Dictionary<uint, GearData>();
[Required, ValidateObject] public Dictionary<uint, GearData> Gears = new Dictionary<uint, GearData>();
/// <summary>
/// Gets the type.
......@@ -72,6 +70,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <value>
/// The inertia.
/// </value>
[Required, SIRange(0, 10)]
public KilogramSquareMeter Inertia { get; internal set; }
/// <summary>
......@@ -80,11 +79,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <value>
/// The traction interruption.
/// </value>
[Required, SIRange(0, 5)]
public Second TractionInterruption { get; internal set; }
/// <summary>
/// [%] (0-1) The torque reserve for shift strategy (early upshift, skipgears)
/// </summary>
[Required, Range(0, 0.5)]
public double TorqueReserve { get; internal set; }
/// <summary>
......@@ -95,6 +96,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <summary>
/// Gets the minimum time between shifts.
/// </summary>
[Required, SIRange(0, 5)]
public Second ShiftTime { get; internal set; }
/// <summary>
......@@ -105,6 +107,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <summary>
/// [%] (0-1) The starting torque reserve for finding the starting gear after standstill.
/// </summary>
[Required, Range(0, 0.5)]
public double StartTorqueReserve { get; internal set; }
/// <summary>
......@@ -113,6 +116,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <value>
/// The start speed.
/// </value>
[Required, SIRange(double.Epsilon, 5)]
public MeterPerSecond StartSpeed { get; internal set; }
/// <summary>
......@@ -121,6 +125,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <value>
/// The start acceleration.
/// </value>
[Required, SIRange(double.Epsilon, 2)]
public MeterPerSquareSecond StartAcceleration { get; internal set; }
/// <summary>
......
......@@ -29,8 +29,8 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System.IO;
using Newtonsoft.Json;
using System.ComponentModel.DataAnnotations;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Data
{
......@@ -44,10 +44,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
LossesIncludedInTransmission
}
[ValidateObject]
public RetarderLossMap LossMap { get; internal set; }
public RetarderType Type { get; internal set; }
[Required, SIRange(double.Epsilon, double.MaxValue)]
public double Ratio { get; internal set; }
}
}
\ No newline at end of file
......@@ -31,6 +31,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Linq;
using TUGraz.VectoCore.Exceptions;
......@@ -40,7 +41,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
{
public class RetarderLossMap : SimulationComponentData
{
private List<RetarderLossEntry> _entries;
[ValidateObject] private List<RetarderLossEntry> _entries;
public static RetarderLossMap ReadFromFile(string fileName)
{
......@@ -144,7 +145,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
private class RetarderLossEntry
{
[Required, SIRange(0, double.MaxValue)]
public PerSecond RetarderSpeed { get; set; }
[Required, SIRange(0, 500)]
public NewtonMeter TorqueLoss { get; set; }
}
......
......@@ -31,13 +31,16 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Data
{
[CustomValidation(typeof(VehicleData), "ValidateVehicleData")]
public class VehicleData : SimulationComponentData
{
//public string BasePath { get; internal set; }
......@@ -47,11 +50,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
public VehicleClass VehicleClass { get; internal set; }
//public CrossWindCorrectionMode CrossWindCorrectionMode { get; internal set; }
[Required, ValidateObject]
public ICrossWindCorrection CrossWindCorrectionCurve { get; internal set; }
/// <summary>
/// Set the properties for all axles of the vehicle
/// </summary>
[ValidateObject]
public List<Axle> AxleData
{
get { return _axleData; }
......@@ -63,15 +68,30 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
}
public AxleConfiguration AxleConfiguration { get; internal set; }
[Required, SIRange(500, 40000)]
public Kilogram CurbWeight { get; internal set; }
[Required, SIRange(0, 40000)]
public Kilogram CurbWeigthExtra { get; internal set; }
[Required, SIRange(0, 40000)]
public Kilogram Loading { get; internal set; }
[Required, SIRange(3500, 40000)]
public Kilogram GrossVehicleMassRating { get; internal set; }
[Required, SIRange(0.1, 0.7)]
public Meter DynamicTyreRadius { get; internal set; }
public KilogramSquareMeter WheelsInertia { get; internal set; }
// public Kilogram ReducedMassWheels { get; private set; }
public string Rim { get; internal set; }
[Required, SIRange(0, 1E12)]
public double TotalRollResistanceCoefficient { get; private set; }
public CrossWindCorrectionMode CrossWindCorrectionMode { get; set; }
public Kilogram TotalVehicleWeight()
......@@ -114,5 +134,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
TotalRollResistanceCoefficient = RRC;
WheelsInertia = wheelsInertia;
}
public ValidationResult ValidateVehicleData(VehicleData vehicleData, ValidationContext validationContext)
{
var weightShareSum = vehicleData.AxleData.Sum(axle => axle.AxleWeightShare);
if (!weightShareSum.IsEqual(1.0, 1E-10)) {
return new ValidationResult(
string.Format("Sum of axle weight share is not 1! sum: {0}, difference: {1}",
weightShareSum, 1 - weightShareSum));
}
if (vehicleData.TotalVehicleWeight() > vehicleData.GrossVehicleMassRating) {
return new ValidationResult(
string.Format("Total Vehicle Weight is greater than GrossVehicleMassRating! sum: {0}, GVM: {1}",
vehicleData.TotalVehicleWeight(), vehicleData.GrossVehicleMassRating));
}
return ValidationResult.Success;
}
}
}
\ No newline at end of file
......@@ -462,16 +462,13 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
{
var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine);
var motorway = engineData.WHTCMotorway;
Assert.AreEqual(motorway.Value(), 0);
Assert.IsTrue(motorway.HasEqualUnit(new SI().Kilo.Gramm.Per.Watt.Second.ConvertTo()));
Assert.AreEqual(motorway, 0);
var rural = engineData.WHTCRural;
Assert.AreEqual(rural.Value(), 0);
Assert.IsTrue(rural.HasEqualUnit(new SI().Kilo.Gramm.Per.Watt.Second.ConvertTo()));
Assert.AreEqual(rural, 0);
var urban = engineData.WHTCUrban;
Assert.AreEqual(urban.Value(), 0);
Assert.IsTrue(urban.HasEqualUnit(new SI().Kilo.Gramm.Per.Watt.Second.ConvertTo()));
Assert.AreEqual(urban, 0);
var displace = engineData.Displacement;
Assert.AreEqual(0.01273, displace.Value());
......
......@@ -77,9 +77,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
Displacement = 6374.SI().Cubic.Centi.Meter.Cast<CubicMeter>(),
IdleSpeed = 560.RPMtoRad(),
Inertia = 1.SI<KilogramSquareMeter>(),
WHTCUrban = 1.SI().Gramm.Per.Kilo.Watt.Hour.Cast<KilogramPerWattSecond>(),
WHTCRural = 1.SI().Gramm.Per.Kilo.Watt.Hour.Cast<KilogramPerWattSecond>(),
WHTCMotorway = 1.SI().Gramm.Per.Kilo.Watt.Hour.Cast<KilogramPerWattSecond>(),
WHTCUrban = 1,
WHTCRural = 1,
WHTCMotorway = 1,
FullLoadCurve = EngineFullLoadCurve.Create(fullLoad),
ConsumptionMap = FuelConsumptionMap.Create(fuelConsumption)
};
......
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