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

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
No related branches found
No related tags found
No related merge requests found
......@@ -500,9 +500,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
}
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 =
new CrosswindCorrectionCdxALookup(aerodynamicDragArea,
GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight),
......@@ -512,13 +514,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
private AirdragData DefaultAirdragData(Mission mission, Segment segment)
{
var aerodynamicDragArea = mission.MissionType == MissionType.Construction
? segment.CdAConstruction
: segment.CdADefault + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
var aerodynamicDragArea = mission.DefaultCDxA + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
return new AirdragData() {
CertificationMethod = CertificationMethod.StandardValues,
DeclaredAirdragArea = mission.MissionType == MissionType.Construction ? segment.CdAConstruction : segment.CdADefault,
DeclaredAirdragArea = mission.DefaultCDxA,
CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(aerodynamicDragArea,
GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight),
CrossWindCorrectionMode.DeclarationModeCorrection)
......
......@@ -54,13 +54,15 @@ namespace TUGraz.VectoCore.Models.Declaration
public Stream CycleFile;
public List<MissionTrailer> Trailer;
public IList<MissionTrailer> Trailer;
public Kilogram MinLoad;
public Kilogram LowLoad;
public Kilogram RefLoad;
public Kilogram MaxLoad;
public SquareMeter DefaultCDxA;
public CubicMeter TotalCargoVolume;
public Dictionary<LoadingType, Kilogram> Loadings
......
......@@ -59,9 +59,5 @@ namespace TUGraz.VectoCore.Models.Declaration
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
VehicleHeight = LookupHeight(vehicleCategory, axleConfiguration, grossVehicleMassRating, vocational),
DesignSpeed = row.ParseDouble("designspeed").KMPHtoMeterPerSecond(),
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;
......@@ -180,59 +176,27 @@ namespace TUGraz.VectoCore.Models.Declaration
var missionTypes = Enum.GetValues(typeof(MissionType)).Cast<MissionType>();
var missions = new List<Mission>();
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 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));
}
}
var body = GetBody(row, missionType);
var trailers = GetTrailers(row, missionType);
var maxGVW = missionType.IsEMS()? Constants.SimulationSettings.MaximumGrossVehicleWeightEMS : Constants.SimulationSettings.MaximumGrossVehicleWeight;
// limit gvw to MaxGVW (40t)
var gvw =
VectoMath.Min(
var gvw = VectoMath.Min(
grossVehicleWeight + trailers.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0),
maxGVW);
var maxLoad = gvw - curbWeight - body.CurbWeight -
var vehicleWeight = curbWeight + body.CurbWeight;
var maxLoad = gvw - vehicleWeight -
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);
lowLoad = lowLoad.LimitTo(0.SI<Kilogram>(), maxLoad);
var payloads = row.Field<string>(missionType.ToString());
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 {
MissionType = missionType,
CrossWindCorrectionParameters = row.Field<string>("crosswindcorrection" + GetMissionSuffix(missionType, true)),
......@@ -248,12 +212,86 @@ namespace TUGraz.VectoCore.Models.Declaration
RefLoad = refLoad,
LowLoad = lowLoad,
TotalCargoVolume = body.CargoVolume + trailers.Sum(t => t.CargoVolume).DefaultIfNull(0),
DefaultCDxA = ReadDefaultAirDragValue(row, missionType)
};
missions.Add(mission);
}
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,
IEnumerable<MissionTrailer> trailers, bool lowLoading)
{
......
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