diff --git a/VectoCore/FileIO/Reader/Impl/DeclarationModeSimulationDataReader.cs b/VectoCore/FileIO/Reader/Impl/DeclarationModeSimulationDataReader.cs index 10708fe00f3d40a1a041b84b9b106c00254af891..24d48ca996762709dd25da74241555489e699a9f 100644 --- a/VectoCore/FileIO/Reader/Impl/DeclarationModeSimulationDataReader.cs +++ b/VectoCore/FileIO/Reader/Impl/DeclarationModeSimulationDataReader.cs @@ -37,9 +37,16 @@ namespace TUGraz.VectoCore.FileIO.Reader.Impl var resultCount = segment.Missions.Sum(m => m.Loadings.Count); var engineData = dao.CreateEngineData(Engine); + var engineTypeString = string.Format("{0} l, {1} kW", + engineData.Displacement.ConvertTo().Cubic.Dezi.Meter.ToOutputFormat(1), + engineData.FullLoadCurve.MaxPower.ConvertTo().Kilo.Watt.ToOutputFormat(0)); + var gearboxData = dao.CreateGearboxData(Gearbox, engineData); - var report = new DeclarationReport(engineData.FullLoadCurve, segment, "CREATOR", engineData.ModelName, "engineStr", - gearboxData.ModelName, "gearboxStr", Job.BasePath, Job.JobFile, resultCount); + var gearboxTypeString = string.Format("{0}-Speed {1}", gearboxData.Gears.Count, gearboxData.Type); + + // todo: set correct <USERNAME> in Report + var report = new DeclarationReport(engineData.FullLoadCurve, segment, "<USERNAME>", engineData.ModelName, + engineTypeString, gearboxData.ModelName, gearboxTypeString, Job.BasePath, Job.JobFile, resultCount); foreach (var mission in segment.Missions) { var cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased); diff --git a/VectoCore/Models/Declaration/DeclarationReport.cs b/VectoCore/Models/Declaration/DeclarationReport.cs index 82495c5d619cceb552c4cf7a96199822adaa97dc..b29f91e024aec9a22bd7a2a290d1bf5d407deb97 100644 --- a/VectoCore/Models/Declaration/DeclarationReport.cs +++ b/VectoCore/Models/Declaration/DeclarationReport.cs @@ -75,7 +75,7 @@ namespace TUGraz.VectoCore.Models.Declaration private void WriteReport() { var titlePage = CreateTitlePage(_missions); - var cyclePages = _missions.Select((m, i) => CreateCyclePage(m.Value, i + 2, _missions.Count + 1)); + var cyclePages = _missions.OrderBy(m => m.Key).Select((m, i) => CreateCyclePage(m.Value, i + 2, _missions.Count + 1)); MergeDocuments(titlePage, cyclePages, Path.Combine(_basePath, _jobFile + ".pdf")); } @@ -97,10 +97,9 @@ namespace TUGraz.VectoCore.Models.Declaration pdfFields.SetField("Date", DateTime.Now.ToString(CultureInfo.InvariantCulture)); pdfFields.SetField("Created", _creator); pdfFields.SetField("Config", - string.Format(CultureInfo.InvariantCulture, "{0:0.0}t {1} {2}", - _segment.GrossVehicleMassRating.ConvertTo().Ton.Value(), - _segment.AxleConfiguration.GetName(), - _segment.VehicleCategory)); + string.Format(CultureInfo.InvariantCulture, "{0}t {1} {2}", + _segment.GrossVehicleMassRating.ConvertTo().Ton.ToOutputFormat(1), + _segment.AxleConfiguration.GetName(), _segment.VehicleCategory)); pdfFields.SetField("HDVclass", "HDV Class " + _segment.VehicleClass.GetClassNumber()); pdfFields.SetField("Engine", _engineStr); pdfFields.SetField("EngM", _engineModel); @@ -108,6 +107,7 @@ namespace TUGraz.VectoCore.Models.Declaration pdfFields.SetField("GbxM", _gearboxModel); pdfFields.SetField("PageNr", string.Format("Page {0} of {1}", 1, missions.Count + 1)); + var i = 1; foreach (var results in missions.Values.OrderBy(m => m.Mission.MissionType)) { pdfFields.SetField("Mission" + i, results.Mission.MissionType.ToString()); @@ -119,28 +119,28 @@ namespace TUGraz.VectoCore.Models.Declaration var avgSpeed = maxDistance / maxTime; - pdfFields.SetField("Loading" + i, results.Mission.RefLoad.Value().ToString("0.0") + " t"); - pdfFields.SetField("Speed" + i, - string.Format(CultureInfo.InvariantCulture, "{0:0.0} km/h", avgSpeed.ConvertTo().Kilo.Meter.Per.Hour)); - - var loading = results.Mission.RefLoad.Value(); + pdfFields.SetField("Loading" + i, results.Mission.RefLoad.ConvertTo().Ton.ToOutputFormat(1) + " t"); + pdfFields.SetField("Speed" + i, avgSpeed.ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1) + " km/h"); var fc = m.GetValues<KilogramPerSecond>(ModalResultField.FCMap); - var fcSum = fc.Zip(dt, (fcVal, dtVal) => fcVal * dtVal).Sum(); - - var fcPerM = fcSum / maxDistance; + var fcWeight = fc.Zip(dt, (fcVal, dtVal) => fcVal * dtVal).Sum(); + var fcVolume = (fcWeight / Physics.FuelDensity).Cast<CubicMeter>(); + var co2Weight = fcWeight * Physics.CO2PerFuelWeight; + var fcAvgVolume = fcVolume / maxDistance; + var co2AvgWeight = co2Weight / maxDistance; - //var co2 = fcPerM.ConvertTo().Gramm * Physics.CO2PerFuelGram; + var loadingTon = results.Mission.RefLoad.ConvertTo().Ton; + var fc_LiterPer100km = fcAvgVolume.ConvertTo().Cubic.Dezi.Meter * 100.SI().Kilo.Meter; + var fc_LiterPer100Tonkm = fc_LiterPer100km / loadingTon; + var co2_GrammPerKm = co2AvgWeight.ConvertTo().Gramm.Per.Kilo.Meter; + var co2_GrammPerTonKm = co2_GrammPerKm / loadingTon; - // todo: calc co2 - var co2 = fc; - - pdfFields.SetField("FC" + i, fc.ToString("0.0")); - pdfFields.SetField("FCt" + i, (fc / loading).ToString("0.0")); - pdfFields.SetField("CO2" + i, co2.ToString("0.0")); - pdfFields.SetField("CO2t" + i, (co2 / loading).ToString("0.0")); + pdfFields.SetField("FC" + i, fc_LiterPer100km.ToOutputFormat(1)); + pdfFields.SetField("FCt" + i, fc_LiterPer100Tonkm.ToOutputFormat(1)); + pdfFields.SetField("CO2" + i, co2_GrammPerKm.ToOutputFormat(1)); + pdfFields.SetField("CO2t" + i, co2_GrammPerTonKm.ToOutputFormat(1)); i++; } @@ -156,10 +156,7 @@ namespace TUGraz.VectoCore.Models.Declaration img.SetAbsolutePosition(360, 75); content.AddImage(img); - img = - Image.GetInstance( - RessourceHelper.ReadStream(RessourceHelper.Namespace + "Report." + - GetHDVClassImageName(_segment, MissionType.LongHaul))); + img = GetHDVClassImage(_segment, MissionType.LongHaul); img.ScaleAbsolute(180, 50); img.SetAbsolutePosition(30, 475); content.AddImage(img); @@ -185,9 +182,9 @@ namespace TUGraz.VectoCore.Models.Declaration pdfFields.SetField("Date", DateTime.Now.ToString(CultureInfo.InvariantCulture)); pdfFields.SetField("Created", _creator); pdfFields.SetField("Config", - string.Format("{0:0.0}t {1} {2}", _segment.GrossVehicleMassRating / 1000, _segment.AxleConfiguration.GetName(), - _segment.VehicleCategory)); - pdfFields.SetField("HDVclass", "HDV Class " + _segment.VehicleClass); + string.Format("{0}t {1} {2}", _segment.GrossVehicleMassRating.ConvertTo().Ton.ToOutputFormat(1), + _segment.AxleConfiguration.GetName(), _segment.VehicleCategory)); + pdfFields.SetField("HDVclass", "HDV Class " + _segment.VehicleClass.GetClassNumber()); pdfFields.SetField("PageNr", string.Format("Page {0} of {1}", currentPageNr, pageCount)); pdfFields.SetField("Mission", results.Mission.MissionType.ToString()); @@ -196,42 +193,38 @@ namespace TUGraz.VectoCore.Models.Declaration var loadingType = pair.Key; var m = pair.Value; - var loadString = loadingType.GetShortName(); - pdfFields.SetField("Load" + loadString, results.Mission.Loadings[loadingType].Value().ToString("0.0") + " t"); - - var dt = m.GetValues<SI>(ModalResultField.simulationInterval); - var distance = m.GetValues<SI>(ModalResultField.dist).Max().Value(); - - Func<ModalResultField, double> avgWeighted = - field => m.GetValues<SI>(field).Zip(dt, (v, t) => v / t).Average().Value(); - - pdfFields.SetField("Speed" + loadString, avgWeighted(ModalResultField.v_act).ToString("0.0")); - - var fc = avgWeighted(ModalResultField.FCMap) / distance * 1000 * 100; + var dt = m.GetValues<Second>(ModalResultField.simulationInterval); + var maxDistance = m.GetValues<Meter>(ModalResultField.dist).Max(); + var maxTime = m.GetValues<Second>(ModalResultField.time).Max(); + var avgSpeed = maxDistance / maxTime; - // todo: calculate co2!! - var co2 = fc; + var fc = m.GetValues<KilogramPerSecond>(ModalResultField.FCMap); + var fcWeight = fc.Zip(dt, (fcVal, dtVal) => fcVal * dtVal).Sum(); + var fcVolume = (fcWeight / Physics.FuelDensity).Cast<CubicMeter>(); + var co2Weight = fcWeight * Physics.CO2PerFuelWeight; + var fcAvgVolume = fcVolume / maxDistance; + var co2AvgWeight = co2Weight / maxDistance; + var loadingTon = results.Mission.Loadings[loadingType].ConvertTo().Ton; - var loading = results.Mission.Loadings[loadingType].Value(); + var fc_LiterPer100km = fcAvgVolume.ConvertTo().Cubic.Dezi.Meter * 100.SI().Kilo.Meter; + var co2_GrammPerKm = co2AvgWeight.ConvertTo().Gramm.Per.Kilo.Meter; - pdfFields.SetField("FCkm" + loadString, fc.ToString("0.0")); - pdfFields.SetField("CO2km" + loadString, co2.ToString("0.0")); + var loadString = loadingType.GetShortName(); - if (loading.IsEqual(0)) { - pdfFields.SetField("FCtkm" + loadString, "-"); - pdfFields.SetField("CO2tkm" + loadString, "-"); - } else { - pdfFields.SetField("FCtkm" + loadString, (fc / loading).ToString("0.0")); - pdfFields.SetField("CO2tkm" + loadString, (fc / loading).ToString("0.0")); - } + pdfFields.SetField("Load" + loadString, + results.Mission.Loadings[loadingType].ConvertTo().Ton.ToOutputFormat(1) + " t"); + pdfFields.SetField("Speed" + loadString, avgSpeed.ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1)); + pdfFields.SetField("FCkm" + loadString, fc_LiterPer100km.ToOutputFormat(1)); + pdfFields.SetField("FCtkm" + loadString, + loadingTon.IsEqual(0) ? "-" : (fc_LiterPer100km / loadingTon).ToOutputFormat(1)); + pdfFields.SetField("CO2km" + loadString, co2_GrammPerKm.ToOutputFormat(1)); + pdfFields.SetField("CO2tkm" + loadString, + loadingTon.IsEqual(0) ? "-" : (co2_GrammPerKm / loadingTon).ToOutputFormat(1)); } var content = stamper.GetOverContent(1); - var img = - Image.GetInstance( - RessourceHelper.ReadStream(RessourceHelper.Namespace + "Report." + - GetHDVClassImageName(_segment, results.Mission.MissionType))); + var img = GetHDVClassImage(_segment, results.Mission.MissionType); img.ScaleAbsolute(180, 50); img.SetAbsolutePosition(600, 475); content.AddImage(img); @@ -306,7 +299,7 @@ namespace TUGraz.VectoCore.Models.Declaration var maxDistance = modData.GetValues<Meter>(ModalResultField.dist).Max(); var loading = missionResult.Value.Mission.Loadings[LoadingType.ReferenceLoad]; - var co2gPerTKM = fcSum.ConvertTo().Gramm * Physics.CO2PerFuelGram / + var co2gPerTKM = fcSum.ConvertTo().Gramm * Physics.CO2PerFuelWeight / (loading.ConvertTo().Ton * maxDistance.ConvertTo().Kilo.Meter); var series = new Series(missionResult.Key + " (Ref. load.)"); @@ -373,7 +366,7 @@ namespace TUGraz.VectoCore.Models.Declaration var maxTime = modData.GetValues<Second>(ModalResultField.time).Max(); var avgKMH = maxDistance.ConvertTo().Kilo.Meter / maxTime.ConvertTo().Hour; - var co2gPerKM = fcSum.ConvertTo().Gramm * Physics.CO2PerFuelGram / maxDistance.ConvertTo().Kilo.Meter; + var co2gPerKM = fcSum.ConvertTo().Gramm * Physics.CO2PerFuelWeight / maxDistance.ConvertTo().Kilo.Meter; var loading = missionResult.Value.Mission.Loadings[pair.Key].ConvertTo().Ton; @@ -434,7 +427,7 @@ namespace TUGraz.VectoCore.Models.Declaration MinorGrid = { Enabled = false }, MajorGrid = { Enabled = false } }, - Position = { X = 0f, Y = 0f, Width = 90f, Height = 100f }, + Position = { X = 0f, Y = 0f, Width = 90, Height = 100 }, }); var altitude = new Series { @@ -495,8 +488,7 @@ namespace TUGraz.VectoCore.Models.Declaration TitleFont = new Font("Helvetica", 20), LabelStyle = { Font = new Font("Helvetica", 20) }, LabelAutoFitStyle = LabelAutoFitStyles.None - }, - Position = { X = 0, Y = 0, Width = 70, Height = 100 } + } }); var n = flc.FullLoadEntries.Select(x => x.EngineSpeed.ConvertTo().Rounds.Per.Minute).ToDouble(); @@ -532,23 +524,32 @@ namespace TUGraz.VectoCore.Models.Declaration return tqnBitmap; } - private static string GetHDVClassImageName(Segment segment, MissionType missionType) + private static Image GetHDVClassImage(Segment segment, MissionType missionType) { + var name = "Undef.png"; switch (segment.VehicleClass) { case VehicleClass.Class1: case VehicleClass.Class2: case VehicleClass.Class3: - return "4x2r.png"; + name = "4x2r.png"; + break; case VehicleClass.Class4: - return missionType == MissionType.LongHaul ? "4x2rt.png" : "4x2r.png"; + name = missionType == MissionType.LongHaul ? "4x2rt.png" : "4x2r.png"; + break; case VehicleClass.Class5: - return "4x2tt.png"; + name = "4x2tt.png"; + break; case VehicleClass.Class9: - return missionType == MissionType.LongHaul ? "6x2rt.png" : "6x2r.png"; + name = missionType == MissionType.LongHaul ? "6x2rt.png" : "6x2r.png"; + break; case VehicleClass.Class10: - return "6x2tt.png"; + name = "6x2tt.png"; + break; } - return "Undef.png"; + + var hdvClassImagePath = RessourceHelper.Namespace + "Report." + name; + var hdvClassImage = RessourceHelper.ReadStream(hdvClassImagePath); + return Image.GetInstance(hdvClassImage); } } } \ No newline at end of file diff --git a/VectoCore/Properties/AssemblyInfo.cs b/VectoCore/Properties/AssemblyInfo.cs index df0c9973ba0b690d98d43b7ea5751b41a9141eb5..b8cf9458fc88b48c18c0fe9f6859c38a679a0867 100644 --- a/VectoCore/Properties/AssemblyInfo.cs +++ b/VectoCore/Properties/AssemblyInfo.cs @@ -6,7 +6,7 @@ using System.Runtime.InteropServices; // associated with an assembly. [assembly: AssemblyTitle("VectoCore")] -[assembly: AssemblyDescription("")] +[assembly: AssemblyDescription("Core Library for VECTO Simulations")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("VectoCore")] @@ -35,6 +35,6 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("3.0.*")] +[assembly: AssemblyFileVersion("3.0.0.0")] [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("VectoCoreTest")] \ No newline at end of file diff --git a/VectoCore/Utils/Physics.cs b/VectoCore/Utils/Physics.cs index 494ece570d915d5a2f1a7fe354d5b7758f233ecb..c814e3c0e53e058a8901faf55f7e27045914bcf1 100644 --- a/VectoCore/Utils/Physics.cs +++ b/VectoCore/Utils/Physics.cs @@ -4,11 +4,24 @@ { public static readonly MeterPerSquareSecond GravityAccelleration = 9.81.SI<MeterPerSquareSecond>(); + /// <summary> + /// Density of air. + /// </summary> public static readonly SI AirDensity = 1.188.SI().Kilo.Gramm.Per.Cubic.Meter; + /// <summary> + /// Density of fuel. + /// </summary> + public static readonly SI FuelDensity = 0.832.SI().Kilo.Gramm.Per.Cubic.Dezi.Meter; + public static readonly double RollResistanceExponent = 0.9; public static readonly MeterPerSecond BaseWindSpeed = 3.SI<MeterPerSecond>(); - public static readonly double CO2PerFuelGram = 3.16; + + + /// <summary> + /// Factor to convert from fuel weight to co2 weight. + /// </summary> + public static readonly double CO2PerFuelWeight = 3.16; } } \ No newline at end of file diff --git a/VectoCore/Utils/SI.cs b/VectoCore/Utils/SI.cs index 6b6d6ffdc7f2359851e3ce1ad01255e900555303..7fd5233607b16a0b36218e219c1a48b471b700be 100644 --- a/VectoCore/Utils/SI.cs +++ b/VectoCore/Utils/SI.cs @@ -219,9 +219,9 @@ namespace TUGraz.VectoCore.Utils protected KilogramPerSecond(double val) : base(new SI(val).Kilo.Gramm.Per.Second) {} [DebuggerHidden] - public static Kilogram operator *(KilogramPerSecond kilogramPerSecond, Second Second) + public static Kilogram operator *(KilogramPerSecond kilogramPerSecond, Second second) { - return ((kilogramPerSecond as SI) * Second).Cast<Kilogram>(); + return ((kilogramPerSecond as SI) * second).Cast<Kilogram>(); } } @@ -700,6 +700,7 @@ namespace TUGraz.VectoCore.Utils Percent, min, c, + d, h, milli, t @@ -1037,7 +1038,6 @@ namespace TUGraz.VectoCore.Utils [DebuggerHidden] get { return new SI(new SI(this, toUnit: Unit.k), 1000, Unit.t, Unit.g); } } - /// <summary> /// [N] /// </summary> @@ -1129,6 +1129,15 @@ namespace TUGraz.VectoCore.Utils [DebuggerHidden] get { return new SI(this, 1000.0, Unit.k); } } + /// <summary> + /// Quantifier for Dezi (1/10) + /// </summary> + [DebuggerHidden] + public SI Dezi + { + [DebuggerHidden] get { return new SI(this, 0.1, Unit.d); } + } + /// <summary> /// Quantifier for Centi (1/100) /// </summary>