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

Skip to content
Snippets Groups Projects
Commit a8c4182b authored by Michael KRISPER's avatar Michael KRISPER
Browse files

new max and reference weight calculation

parent c2105b6a
No related branches found
No related tags found
No related merge requests found
......@@ -94,20 +94,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdaper
}
var retVal = SetCommonVehicleData(data);
retVal.GrossVehicleMassRating = data.GrossVehicleMassRating;
retVal.TrailerGrossVehicleMassRating = mission.TrailerGrossVehicleMassRating;
retVal.CurbWeigthExtra = mission.MassExtra;
retVal.TrailerGrossVehicleMassRating = mission.TrailerGrossVehicleWeight;
retVal.CurbWeigthExtra = mission.BodyCurbWeight + mission.TrailerCurbWeight;
retVal.Loading = loading;
retVal.DynamicTyreRadius =
DeclarationData.DynamicTyreRadius(data.Axles[DeclarationData.PoweredAxle()].Wheels, data.Rim);
var aerodynamicDragAera = mission.UseCdA2
? data.AirDragAreaRigidTruck
: data.AirDragArea;
var aerodynamicDragArea = data.AirDragArea + mission.DeltaCdA;
retVal.CrossWindCorrectionCurve =
new CrosswindCorrectionCdxALookup(GetDeclarationAirResistanceCurve(retVal.VehicleCategory, aerodynamicDragAera),
new CrosswindCorrectionCdxALookup(GetDeclarationAirResistanceCurve(retVal.VehicleCategory, aerodynamicDragArea),
CrossWindCorrectionMode.DeclarationModeCorrection);
var axles = data.Axles;
if (axles.Count < mission.AxleWeightDistribution.Length) {
......
......@@ -29,6 +29,7 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System;
using System.Collections.Generic;
using System.IO;
using TUGraz.VectoCommon.Utils;
......@@ -46,23 +47,37 @@ namespace TUGraz.VectoCore.Models.Declaration
{
public static string GetShortName(this LoadingType loadingType)
{
return loadingType.ToString().Substring(0, 1);
switch (loadingType) {
case LoadingType.FullLoading:
return "F";
case LoadingType.ReferenceLoad:
return "R";
case LoadingType.EmptyLoading:
return "E";
default:
throw new ArgumentOutOfRangeException("loadingType", loadingType, null);
}
}
}
public class Mission
{
public MissionType MissionType { get; set; }
public string CrossWindCorrection { get; set; }
public double[] AxleWeightDistribution { get; set; }
public double[] TrailerAxleWeightDistribution { get; set; }
public MissionType MissionType;
public string CrossWindCorrection;
public double[] AxleWeightDistribution;
public double[] TrailerAxleWeightDistribution;
public Kilogram MassExtra { get; set; }
public Kilogram TrailerGrossVehicleMassRating { get; set; }
public Kilogram CurbWeight;
public Kilogram BodyCurbWeight;
public Kilogram BodyGrossVehicleWeight;
public Kilogram TrailerCurbWeight;
public Kilogram TrailerGrossVehicleWeight;
public Stream CycleFile;
public SquareMeter DeltaCdA;
public Kilogram MinLoad { get; set; }
public Kilogram RefLoad { get; set; }
public Kilogram MaxLoad { get; set; }
public Kilogram MinLoad;
public Kilogram RefLoad;
public Kilogram MaxLoad;
public Dictionary<LoadingType, Kilogram> Loadings
{
......@@ -75,15 +90,5 @@ namespace TUGraz.VectoCore.Models.Declaration
};
}
}
public Stream CycleFile { get; set; }
public bool UseCdA2 { get; set; }
public class LoadingEntry
{
public Kilogram LoadingWeight;
public string Name;
}
}
}
\ No newline at end of file
......@@ -102,78 +102,78 @@ namespace TUGraz.VectoCore.Models.Declaration
return segment;
}
//mk 2016-06-28 remove param curbWeight
private static Mission[] CreateMissions(ref Kilogram grossVehicleWeight, Kilogram curbWeight, DataRow row)
{
var trailerOnlyInLongHaul = row.Field<string>("vehiclecategory") == VehicleCategory.RigidTruck.ToString() &&
!string.IsNullOrWhiteSpace(row.Field<string>("traileraxles-longhaul")) &&
string.IsNullOrWhiteSpace(row.Field<string>("traileraxles-other"));
var missionTypes = Enum.GetValues(typeof(MissionType)).Cast<MissionType>();
var missions = new List<Mission>();
foreach (var missionType in missionTypes.Where(m => row.Field<string>(m.ToString()) == "1")) {
string vcdvField;
string axleField;
string trailerField;
var body = DeclarationData.StandardWeights.Lookup(row.Field<string>("body"));
var trailer = ShouldTrailerBeUsed(row, missionType)
? DeclarationData.StandardWeights.Lookup(row.Field<string>("trailer"))
: DeclarationData.StandardWeights.Empty;
if (missionType == MissionType.LongHaul) {
vcdvField = "crosswindcorrection-longhaul";
axleField = "truckaxles-longhaul";
trailerField = "traileraxles-longhaul";
} else {
vcdvField = "crosswindcorrection-other";
axleField = "truckaxles-other";
trailerField = "traileraxles-other";
}
var gvw = VectoMath.Min(grossVehicleWeight + trailer.GrossVehicleWeight, DeclarationData.MaximumGrossVehicleWeight);
var maxLoad = gvw - curbWeight - body.CurbWeight - trailer.CurbWeight;
var refLoadValue =
row.Field<string>("payload-" + missionType.GetName()).Replace("+T", "").ToDouble(double.NaN);
var refLoad = VectoMath.Min(!double.IsNaN(refLoadValue)
? refLoadValue.SI<Kilogram>()
: DeclarationData.PayloadForGVW(grossVehicleWeight, missionType) +
DeclarationData.PayloadForTrailer(trailer.GrossVehicleWeight, trailer.CurbWeight), maxLoad);
var mission = new Mission {
MissionType = missionType,
CrossWindCorrection = row.Field<string>(vcdvField),
MassExtra = row.ParseDouble("massextra-" + missionType.ToString().ToLower()).SI<Kilogram>(),
CrossWindCorrection = row.Field<string>("crosswindcorrection" + GetMissionSuffix(missionType)),
CycleFile = RessourceHelper.ReadStream(RessourceHelper.Namespace + "MissionCycles." + missionType + ".vdri"),
AxleWeightDistribution = row.Field<string>(axleField).Split('/').ToDouble().Select(x => x / 100.0).ToArray(),
UseCdA2 = trailerOnlyInLongHaul && missionType != MissionType.LongHaul,
AxleWeightDistribution = GetAxleWeightDistribution(row, missionType),
CurbWeight = curbWeight,
BodyCurbWeight = body.CurbWeight,
BodyGrossVehicleWeight = grossVehicleWeight,
TrailerCurbWeight = trailer.CurbWeight,
TrailerGrossVehicleWeight = trailer.GrossVehicleWeight,
DeltaCdA = trailer.DeltaCrossWindArea,
MinLoad = 0.SI<Kilogram>(),
MaxLoad = maxLoad,
RefLoad = refLoad,
TrailerAxleWeightDistribution = GetTrailerAxleWeightDistribution(row, missionType),
};
missions.Add(mission);
}
return missions.ToArray();
}
var trailerAxles = row.Field<string>(trailerField).Split('/');
var count = 0;
var weightPercent = 0.0;
if (!string.IsNullOrWhiteSpace(trailerAxles[0])) {
count = int.Parse(trailerAxles[1]);
weightPercent = trailerAxles[0].ToDouble();
}
mission.TrailerAxleWeightDistribution = (weightPercent / 100.0 / count).Repeat(count).ToArray();
mission.TrailerGrossVehicleMassRating = 0.SI<Kilogram>();
mission.MinLoad = 0.SI<Kilogram>();
mission.MaxLoad = grossVehicleWeight - curbWeight - mission.MassExtra;
var refLoadField = row.Field<string>("payload-" + missionType.ToString().ToLower());
switch (refLoadField) {
case "pc(R)":
mission.RefLoad = VectoMath.Min(DeclarationData.PayloadForGVW(grossVehicleWeight, missionType), mission.MaxLoad);
break;
case "pc(R)+T":
// VECTO-262
var trailerCurbWeight = DeclarationData.StandardWeights.Lookup(row.Field<string>("Trailer")).CurbWeight;
mission.TrailerGrossVehicleMassRating =
DeclarationData.StandardWeights.Lookup(row.Field<string>("Trailer")).GrossVehicleWeight;
mission.MaxLoad += mission.TrailerGrossVehicleMassRating - trailerCurbWeight;
/// <summary>
/// Checks if a trailer should be used for the current missionType.
/// </summary>
private static bool ShouldTrailerBeUsed(DataRow row, MissionType missionType)
{
var payloadText = row.Field<string>("payload-" + missionType.GetName());
return payloadText.Contains("+T");
}
// mass extra doesn't need to be changed: trailer curb weight already included in segment table!
//mission.MassExtra += trailerCurbWeight;
private static double[] GetTrailerAxleWeightDistribution(DataRow row, MissionType missionType)
{
var trailerAxles =
row.Field<string>("traileraxles" + GetMissionSuffix(missionType)).Split('/');
if (!string.IsNullOrWhiteSpace(trailerAxles[0])) {
var count = int.Parse(trailerAxles[1]);
return (trailerAxles[0].ToDouble() / 100.0 / count).Repeat(count).ToArray();
}
return new double[0];
}
var payload = DeclarationData.PayloadForGVW(grossVehicleWeight, missionType) +
(mission.TrailerGrossVehicleMassRating - trailerCurbWeight) * 3 / 4;
private static double[] GetAxleWeightDistribution(DataRow row, MissionType missionType)
{
return
row.Field<string>("truckaxles" + GetMissionSuffix(missionType))
.Split('/').ToDouble().Select(x => x / 100.0).ToArray();
}
mission.RefLoad = VectoMath.Min(payload, mission.MaxLoad);
break;
default:
mission.RefLoad = VectoMath.Min(refLoadField.ToDouble().SI<Kilogram>(), mission.MaxLoad);
break;
}
missions.Add(mission);
}
return missions.ToArray();
private static string GetMissionSuffix(MissionType missionType)
{
return (missionType == MissionType.LongHaul ? "-longhaul" : "-other");
}
}
}
\ 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