Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

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

Merge pull request #690 in VECTO/vecto-sim from...

Merge pull request #690 in VECTO/vecto-sim from ~EMQUARIMA/vecto-sim:feature/VECTO-809-declaration-data-for-construction-always-use-default-values to develop

* commit 'd694532a':
  refactor creating mission/segment (extract methods)
  always use default value for construction cycle
  move default airdrag area from segment to mission
  correct testcases for segment lookups: compare with body weight of municipal body, update max load
  using the same cargo volume for municipal bodies
parents 86baf4c9 d694532a
Branches
Tags
No related merge requests found
...@@ -500,9 +500,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -500,9 +500,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
} }
var retVal = SetCommonAirdragData(airdragInputData); var retVal = SetCommonAirdragData(airdragInputData);
var aerodynamicDragArea = airdragInputData.AirDragArea + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
retVal.DeclaredAirdragArea = airdragInputData.AirDragArea; retVal.DeclaredAirdragArea = mission.MissionType == MissionType.Construction ? mission.DefaultCDxA : airdragInputData.AirDragArea;
var aerodynamicDragArea = retVal.DeclaredAirdragArea + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
retVal.CrossWindCorrectionCurve = retVal.CrossWindCorrectionCurve =
new CrosswindCorrectionCdxALookup(aerodynamicDragArea, new CrosswindCorrectionCdxALookup(aerodynamicDragArea,
GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight), GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight),
...@@ -512,13 +514,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -512,13 +514,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
private AirdragData DefaultAirdragData(Mission mission, Segment segment) private AirdragData DefaultAirdragData(Mission mission, Segment segment)
{ {
var aerodynamicDragArea = mission.MissionType == MissionType.Construction var aerodynamicDragArea = mission.DefaultCDxA + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
? segment.CdAConstruction
: segment.CdADefault + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
return new AirdragData() { return new AirdragData() {
CertificationMethod = CertificationMethod.StandardValues, CertificationMethod = CertificationMethod.StandardValues,
DeclaredAirdragArea = mission.MissionType == MissionType.Construction ? segment.CdAConstruction : segment.CdADefault, DeclaredAirdragArea = mission.DefaultCDxA,
CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(aerodynamicDragArea, CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(aerodynamicDragArea,
GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight), GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight),
CrossWindCorrectionMode.DeclarationModeCorrection) CrossWindCorrectionMode.DeclarationModeCorrection)
......
...@@ -54,13 +54,15 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -54,13 +54,15 @@ namespace TUGraz.VectoCore.Models.Declaration
public Stream CycleFile; public Stream CycleFile;
public List<MissionTrailer> Trailer; public IList<MissionTrailer> Trailer;
public Kilogram MinLoad; public Kilogram MinLoad;
public Kilogram LowLoad; public Kilogram LowLoad;
public Kilogram RefLoad; public Kilogram RefLoad;
public Kilogram MaxLoad; public Kilogram MaxLoad;
public SquareMeter DefaultCDxA;
public CubicMeter TotalCargoVolume; public CubicMeter TotalCargoVolume;
public Dictionary<LoadingType, Kilogram> Loadings public Dictionary<LoadingType, Kilogram> Loadings
......
...@@ -59,9 +59,5 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -59,9 +59,5 @@ namespace TUGraz.VectoCore.Models.Declaration
public MeterPerSecond DesignSpeed { get; internal set; } public MeterPerSecond DesignSpeed { get; internal set; }
public SquareMeter CdADefault { get; internal set; }
public SquareMeter CdAConstruction { get; internal set; }
} }
} }
\ No newline at end of file
...@@ -104,10 +104,6 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -104,10 +104,6 @@ namespace TUGraz.VectoCore.Models.Declaration
VehicleHeight = LookupHeight(vehicleCategory, axleConfiguration, grossVehicleMassRating, vocational), VehicleHeight = LookupHeight(vehicleCategory, axleConfiguration, grossVehicleMassRating, vocational),
DesignSpeed = row.ParseDouble("designspeed").KMPHtoMeterPerSecond(), DesignSpeed = row.ParseDouble("designspeed").KMPHtoMeterPerSecond(),
GrossVehicleMassRating = grossVehicleMassRating, GrossVehicleMassRating = grossVehicleMassRating,
CdADefault = string.IsNullOrEmpty(row["cdxa_default"].ToString()) ? null : row.ParseDouble("cdxa_default").SI<SquareMeter>(),
CdAConstruction = string.IsNullOrEmpty(row["cdxa_construction"].ToString())
? null
: row.ParseDouble("cdxa_construction").SI<SquareMeter>(),
}; };
return segment; return segment;
...@@ -180,58 +176,26 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -180,58 +176,26 @@ namespace TUGraz.VectoCore.Models.Declaration
var missionTypes = Enum.GetValues(typeof(MissionType)).Cast<MissionType>(); var missionTypes = Enum.GetValues(typeof(MissionType)).Cast<MissionType>();
var missions = new List<Mission>(); var missions = new List<Mission>();
foreach (var missionType in missionTypes.Where(m => m.IsDeclarationMission() && m != MissionType.ExemptedMission && row.Field<string>(m.ToString()) != "-")) { foreach (var missionType in missionTypes.Where(m => m.IsDeclarationMission() && m != MissionType.ExemptedMission && row.Field<string>(m.ToString()) != "-")) {
var bodyColumn = "body";
switch (missionType) {
case MissionType.Construction: bodyColumn = "bodyconstruction";
break;
case MissionType.MunicipalUtility: bodyColumn = "bodymunicipalutility";
break;
}
var body = DeclarationData.StandardBodies.Lookup(row.Field<string>(bodyColumn));
var maxGVW = Constants.SimulationSettings.MaximumGrossVehicleWeight; var body = GetBody(row, missionType);
var trailers = new List<MissionTrailer>(); var trailers = GetTrailers(row, missionType);
if (missionType.IsEMS()) {
maxGVW = Constants.SimulationSettings.MaximumGrossVehicleWeightEMS; var maxGVW = missionType.IsEMS()? Constants.SimulationSettings.MaximumGrossVehicleWeightEMS : Constants.SimulationSettings.MaximumGrossVehicleWeight;
var trailerList = row.Field<string>("ems").Split('+');
var trailerWeightShares = row.Field<string>("traileraxles" + GetMissionSuffix(missionType)).Split('/');
if (trailerList.Length != trailerWeightShares.Length) {
throw new VectoException(
"Error in segmentation table: number of trailers and list of weight shares does not match!");
}
trailers.AddRange(
trailerWeightShares.Select((t, i) => CreateTrailer(trailerList[i], t.ToDouble() / 100.0, i == 0)));
} else {
if (ShouldTrailerBeUsed(row, missionType)) {
var trailerColumn = missionType == MissionType.Construction ? "trailerconstruction" : "trailer";
var trailerValue = row.Field<string>(trailerColumn);
if (string.IsNullOrWhiteSpace(trailerValue)) {
throw new VectoException("Error in segmentation table: trailer weight share is defined but not trailer type!");
}
trailers.Add(CreateTrailer(trailerValue, GetTrailerAxleWeightDistribution(row, missionType), true));
}
}
// limit gvw to MaxGVW (40t) // limit gvw to MaxGVW (40t)
var gvw = var gvw = VectoMath.Min(
VectoMath.Min(
grossVehicleWeight + trailers.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0), grossVehicleWeight + trailers.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0),
maxGVW); maxGVW);
var maxLoad = gvw - curbWeight - body.CurbWeight - var vehicleWeight = curbWeight + body.CurbWeight;
var maxLoad = gvw - vehicleWeight -
trailers.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0); trailers.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0);
var payloads = row.Field<string>(missionType.ToString()).Split('/');
var vehicleWeight = curbWeight + body.CurbWeight;
Kilogram refLoad, lowLoad = 0.SI<Kilogram>();
if (payloads.Length == 2) {
lowLoad = GetLoading(payloads[0], grossVehicleWeight, vehicleWeight, trailers, true);
refLoad = GetLoading(payloads[1], grossVehicleWeight, vehicleWeight, trailers, false);
} else {
refLoad = GetLoading(row.Field<string>(missionType.ToString()), grossVehicleWeight, vehicleWeight, trailers, false);
}
refLoad = refLoad.LimitTo(0.SI<Kilogram>(), maxLoad); var payloads = row.Field<string>(missionType.ToString());
lowLoad = lowLoad.LimitTo(0.SI<Kilogram>(), maxLoad);
Kilogram refLoad, lowLoad;
var weight = grossVehicleWeight;
GetLoadings(out lowLoad, out refLoad, payloads, (p, l) => GetLoading(p, weight, vehicleWeight, trailers, l), maxLoad);
var mission = new Mission { var mission = new Mission {
MissionType = missionType, MissionType = missionType,
...@@ -248,12 +212,86 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -248,12 +212,86 @@ namespace TUGraz.VectoCore.Models.Declaration
RefLoad = refLoad, RefLoad = refLoad,
LowLoad = lowLoad, LowLoad = lowLoad,
TotalCargoVolume = body.CargoVolume + trailers.Sum(t => t.CargoVolume).DefaultIfNull(0), TotalCargoVolume = body.CargoVolume + trailers.Sum(t => t.CargoVolume).DefaultIfNull(0),
DefaultCDxA = ReadDefaultAirDragValue(row, missionType)
}; };
missions.Add(mission); missions.Add(mission);
} }
return missions.ToArray(); return missions.ToArray();
} }
private static void GetLoadings(
out Kilogram lowLoad, out Kilogram refLoad, string payloadStr, Func<string, bool, Kilogram> loadingParser, Kilogram maxLoad)
{
var payloads = payloadStr.Split('/');
if (payloads.Length == 2) {
lowLoad = loadingParser(payloads[0], true);
refLoad = loadingParser(payloads[1], false);
} else {
lowLoad = 0.SI<Kilogram>();
refLoad = loadingParser(payloadStr, false);
}
refLoad = refLoad.LimitTo(0.SI<Kilogram>(), maxLoad);
lowLoad = lowLoad.LimitTo(0.SI<Kilogram>(), maxLoad);
}
private static IList<MissionTrailer> GetTrailers(DataRow row, MissionType missionType)
{
var trailers = new List<MissionTrailer>();
if (missionType.IsEMS()) {
//maxGVW = Constants.SimulationSettings.MaximumGrossVehicleWeightEMS;
var trailerList = row.Field<string>("ems").Split('+');
var trailerWeightShares = row.Field<string>("traileraxles" + GetMissionSuffix(missionType)).Split('/');
if (trailerList.Length != trailerWeightShares.Length) {
throw new VectoException(
"Error in segmentation table: number of trailers and list of weight shares does not match!");
}
trailers.AddRange(
trailerWeightShares.Select((t, i) => CreateTrailer(trailerList[i], t.ToDouble() / 100.0, i == 0)));
} else {
if (ShouldTrailerBeUsed(row, missionType)) {
var trailerColumn = missionType == MissionType.Construction ? "trailerconstruction" : "trailer";
var trailerValue = row.Field<string>(trailerColumn);
if (string.IsNullOrWhiteSpace(trailerValue)) {
throw new VectoException("Error in segmentation table: trailer weight share is defined but not trailer type!");
}
trailers.Add(CreateTrailer(trailerValue, GetTrailerAxleWeightDistribution(row, missionType), true));
}
}
return trailers;
}
private static StandardBody GetBody(DataRow row, MissionType missionType)
{
var bodyColumn = "body";
switch (missionType) {
case MissionType.Construction:
bodyColumn = "bodyconstruction";
break;
case MissionType.MunicipalUtility:
bodyColumn = "bodymunicipalutility";
break;
}
var body = DeclarationData.StandardBodies.Lookup(row.Field<string>(bodyColumn));
return body;
}
private static SquareMeter ReadDefaultAirDragValue(DataRow row, MissionType missionType)
{
var airDragColumn = "cdxa_default";
if (missionType == MissionType.Construction) {
airDragColumn = "cdxa_construction";
}
var cdxA = string.IsNullOrEmpty(row[airDragColumn].ToString())
? null
: row.ParseDouble(airDragColumn).SI<SquareMeter>();
return cdxA;
}
private static Kilogram GetLoading(string payloadStr, Kilogram grossVehicleWeight, Kilogram vehicleWeight, private static Kilogram GetLoading(string payloadStr, Kilogram grossVehicleWeight, Kilogram vehicleWeight,
IEnumerable<MissionTrailer> trailers, bool lowLoading) IEnumerable<MissionTrailer> trailers, bool lowLoading)
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment