diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/HeatingDistributionCasesMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/HeatingDistributionCasesMapReader.cs new file mode 100644 index 0000000000000000000000000000000000000000..5ad4d1f95e88b1ccdef4bfbf992673d1e068ad66 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/HeatingDistributionCasesMapReader.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.InputData.Reader.ComponentData +{ + public static class HeatingDistributionMapReader + { + public static HeatingDistributionMap ReadFile(string fileName) + { + if ((string.IsNullOrWhiteSpace(fileName))) { + return null; + } + + if (!File.Exists(fileName)) { + throw new FileNotFoundException(fileName); + } + + return Create(VectoCSVFile.Read(fileName)); + } + + public static HeatingDistributionMap ReadStream(Stream stream) + { + return Create(VectoCSVFile.ReadStream(stream)); + } + + public static HeatingDistributionMap Create(TableData data) + { + var requiredHeatPumps = EnumHelper.GetValues<HeatPumpType>() + .Where(x => !x.IsOneOf(HeatPumpType.none, HeatPumpType.not_applicable)).ToList(); + if (!HeaderIsValid(data.Columns, requiredHeatPumps)) { + throw new VectoException("Invalid Header vor heating distribution map"); + } + + var map = new Dictionary<Tuple<HeatingDistributionCase, int>, HeatingDistributionMap.Entry>(); + foreach (DataRow row in data.Rows) { + var heatPumpContr = new Dictionary<HeatPumpType, double>(); + foreach (var heatPumpType in requiredHeatPumps) { + var value = row.Field<string>(heatPumpType.GetLabel()).ToDouble(double.NaN) / 100.0; + if (!double.IsNaN(value)) { + heatPumpContr.Add(heatPumpType, value); + } + } + var hdCase = HeatingDistributionCaseHelper.Parse(row.Field<string>(Fields.HeatingDistributionCase)); + var envId = row.Field<string>(Fields.EnvironmentalId).ToInt(); + var elHeater = row.Field<string>(Fields.ElectricHeater).ToDouble(double.NaN) / 100.0; + var fuelHeater = row.Field<string>(Fields.FuelHeater).ToDouble(double.NaN) / 100.0; + map.Add(Tuple.Create(hdCase, envId), new HeatingDistributionMap.Entry(envId, heatPumpContr, elHeater, fuelHeater)); + } + + return new HeatingDistributionMap(map); + } + + public static bool HeaderIsValid(DataColumnCollection columns, List<HeatPumpType> requiredHeatPumps) + { + var header = requiredHeatPumps.Select(x => x.GetLabel()) + .ToList(); + header.AddRange(new[] { Fields.HeatingDistributionCase, Fields.ElectricHeater, Fields.FuelHeater }); + return header.All(h => columns.Contains(h)); + } + + public static class Fields + { + public const string HeatingDistributionCase = "HeatingDistributionCase"; + public const string EnvironmentalId = "Environmental ID"; + public const string ElectricHeater = "electric heater"; + public const string FuelHeater = "fuel heater"; + } + } + + public static class HeatingDistributionCasesMapReader + { + public static HeatingDistributionCasesMap ReadFile(string fileName) + { + if ((string.IsNullOrWhiteSpace(fileName))) { + return null; + } + + if (!File.Exists(fileName)) { + throw new FileNotFoundException(fileName); + } + + return Create(VectoCSVFile.Read(fileName)); + } + + public static HeatingDistributionCasesMap ReadStream(Stream stream) + { + return Create(VectoCSVFile.ReadStream(stream)); + } + + public static HeatingDistributionCasesMap Create(TableData data) + { + var requiredHeatPumps = EnumHelper.GetValues<HeatPumpType>() + .Where(x => !x.IsOneOf(HeatPumpType.none, HeatPumpType.not_applicable)).ToList(); + if (!HeaderIsValid(data.Columns, requiredHeatPumps)) { + throw new VectoException("Invalid Header vor heating distribution map"); + } + + var map = new List<HeatingDistributionCasesMap.Entry>(); + foreach (DataRow row in data.Rows) { + var allowedHeatPumps = new List<HeatPumpType>(); + foreach (var heatPumpType in requiredHeatPumps) { + var allowed = row.Field<string>(heatPumpType.GetLabel()).ToBoolean(); + if (allowed) { + allowedHeatPumps.Add(heatPumpType); + } + } + + if (allowedHeatPumps.Count > 1) { + throw new VectoException("One row shall not contain multiple heatpump technologies!"); + } + + if (allowedHeatPumps.Count == 0) { + allowedHeatPumps.Add(HeatPumpType.none); + } + map.Add(new HeatingDistributionCasesMap.Entry() { + HeatingDistributionCase = HeatingDistributionCaseHelper.Parse(row.Field<string>(Fields.HeatingDistributionCase)), + ElectricHeater = row.Field<string>(Fields.ElectricHeater).ToBoolean(), + FuelHeater = row.Field<string>(Fields.FuelHeater).ToBoolean(), + HeatPumpType = allowedHeatPumps.First() + }); + } + + return new HeatingDistributionCasesMap(map); + } + + public static bool HeaderIsValid(DataColumnCollection columns, List<HeatPumpType> requiredHeatPumps) + { + var header = requiredHeatPumps.Select(x => x.GetLabel()) + .ToList(); + header.AddRange(new[] {Fields.HeatingDistributionCase, Fields.ElectricHeater, Fields.FuelHeater}); + return header.All(h => columns.Contains(h)); + } + + public static class Fields + { + public const string HeatingDistributionCase = "HeatingDistributionCase"; + public const string ElectricHeater = "electric heater"; + public const string FuelHeater = "fuel heater"; + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionCase.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionCase.cs new file mode 100644 index 0000000000000000000000000000000000000000..cb59edffc02f97bf1decda29fe52069d5269b37e --- /dev/null +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionCase.cs @@ -0,0 +1,29 @@ +using TUGraz.VectoCommon.Utils; + +namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC +{ + public enum HeatingDistributionCase + { + HeatingDistribution1, + HeatingDistribution2, + HeatingDistribution3, + HeatingDistribution4, + HeatingDistribution5, + HeatingDistribution6, + HeatingDistribution7, + HeatingDistribution8, + HeatingDistribution9, + HeatingDistribution10, + HeatingDistribution11, + HeatingDistribution12, + } + + public static class HeatingDistributionCaseHelper + { + + public static HeatingDistributionCase Parse(string parse) + { + return parse.Replace("HD", "HeatingDistribution").ParseEnum<HeatingDistributionCase>(); + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionCasesMap.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionCasesMap.cs new file mode 100644 index 0000000000000000000000000000000000000000..40e0fbf3ef088848e84f3062760a304571ccd042 --- /dev/null +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionCasesMap.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Linq; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.Exceptions; + +namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC +{ + public class HeatingDistributionCasesMap + { + private List<Entry> Map; + + public HeatingDistributionCasesMap(List<Entry> map) + { + Map = map; + } + + public HeatingDistributionCase GetHeatingDistributionCase(HeatPumpType heatPump, HeaterType electricHeater, + bool fuelHeater) + { + var matching = Map.Where(x => x.IsEqual(heatPump, electricHeater, fuelHeater)).ToList(); + if (matching.Count != 1) { + throw new VectoException($"Zero or more than one matching entry! {matching.Count}"); + } + + return matching.First().HeatingDistributionCase; + } + + public class Entry + { + public HeatingDistributionCase HeatingDistributionCase; + public HeatPumpType HeatPumpType; + public bool ElectricHeater; + public bool FuelHeater; + + public bool IsEqual(HeatPumpType heatPump, HeaterType electricHeater, bool fuelHeater) + { + var hasElectricHeater = electricHeater != HeaterType.None; + var otherHeater = ElectricHeater == hasElectricHeater; + return HeatPumpType == heatPump && otherHeater && FuelHeater == fuelHeater; + } + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionMap.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionMap.cs new file mode 100644 index 0000000000000000000000000000000000000000..dcad607036f6366fb021b20763e2a129e9fd965c --- /dev/null +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionMap.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCore.Models.Declaration; + +namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC +{ + public class HeatingDistributionMap + { + protected Dictionary<Tuple<HeatingDistributionCase, int>, Entry> HeatingDistribution; + + public HeatingDistributionMap(Dictionary<Tuple<HeatingDistributionCase, int>, Entry> map) + { + HeatingDistribution = map; + } + + public Entry Lookup(HeatingDistributionCase hdCase, int environmentalId) + { + var key = Tuple.Create(hdCase, environmentalId); + if (HeatingDistribution.ContainsKey(key)) { + return HeatingDistribution[key]; + } + return null; + } + + public class Entry + { + protected int EnvironmentID; + protected Dictionary<HeatPumpType, double> HeatpumpContribution; + protected double ElectricHeaterContribution; + protected double FuelHeaterContribution; + + public Entry(int environmentID, Dictionary<HeatPumpType, double> heatpumpContribution, double electricHeaterContribution, double fuelHeaterContribution) + { + EnvironmentID = environmentID; + HeatpumpContribution = heatpumpContribution; + ElectricHeaterContribution = electricHeaterContribution; + FuelHeaterContribution = fuelHeaterContribution; + } + + public double GetHeatpumpContribution(HeatPumpType heatPump) + { + if (HeatpumpContribution.ContainsKey(heatPump)) { + return HeatpumpContribution[heatPump]; + } + + return 0; + } + + public double GetElectricHeaterContribution(HeaterType heater) + { + return double.IsNaN(ElectricHeaterContribution) ? 0 : ElectricHeaterContribution; + } + + public double GetFuelHeaterContribution() + { + return double.IsNaN(FuelHeaterContribution) ? 0 : FuelHeaterContribution; + } + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index b908450f9818320071d2bbe59819deba600113b8..f4a18a474dcde0ab23373bda2c72189ef720bf22 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -247,6 +247,8 @@ namespace TUGraz.VectoCore.Models.Declaration public static BusAlternatorTechnologies AlternatorTechnologies = new BusAlternatorTechnologies(); private static HVACCoolingPower hvacMaxCoolingPower; + private static HeatingDistributionCasesMap heatingDistributionCasesMap; + private static HeatingDistributionMap heatingDistributionMap; public static List<SSMTechnology> SSMTechnologyList => ssmTechnologies ?? (ssmTechnologies = SSMTechnologiesReader.ReadFromStream( @@ -256,6 +258,13 @@ namespace TUGraz.VectoCore.Models.Declaration envMap ?? (envMap = EnvironmentalContidionsMapReader.ReadStream( RessourceHelper.ReadStream(DeclarationDataResourcePrefix + ".Buses.DefaultClimatic.aenv"))); + public static HeatingDistributionCasesMap HeatingDistributionCases => + heatingDistributionCasesMap ?? (heatingDistributionCasesMap = HeatingDistributionCasesMapReader.ReadStream( + RessourceHelper.ReadStream(DeclarationDataResourcePrefix + ".Buses.HeatingDistributionCases.csv"))); + public static HeatingDistributionMap HeatingDistribution => + heatingDistributionMap ?? (heatingDistributionMap = HeatingDistributionMapReader.ReadStream( + RessourceHelper.ReadStream(DeclarationDataResourcePrefix + ".Buses.HeatingDistribution.csv"))); + public static ElectricalConsumerList DefaultElectricConsumerList => elUserConfig ?? (elUserConfig = ElectricConsumerReader.ReadStream( RessourceHelper.ReadStream(DeclarationDataResourcePrefix + ".Buses.ElectricConsumers.csv"))); diff --git a/VectoCore/VectoCore/Resources/Declaration/Buses/HeatingDistribution.csv b/VectoCore/VectoCore/Resources/Declaration/Buses/HeatingDistribution.csv new file mode 100644 index 0000000000000000000000000000000000000000..1159aa1a6d46cb16b2d0cbe00390e0d5353e19b1 --- /dev/null +++ b/VectoCore/VectoCore/Resources/Declaration/Buses/HeatingDistribution.csv @@ -0,0 +1,156 @@ +HeatingDistributionCase , Environmental ID , R-744 , non R-744 2-stage , non R-744 3-stage , non R-744 4-stage , non R-744 continuous , electric heater , fuel heater +# only R-744 +HD1 , 1 , 100 , - , - , - , - , - , - +HD1 , 2 , 100 , - , - , - , - , - , - +HD1 , 3 , 100 , - , - , - , - , - , - +HD1 , 4 , 100 , - , - , - , - , - , - +HD1 , 5 , 100 , - , - , - , - , - , - +HD1 , 6 , 100 , - , - , - , - , - , - +HD1 , 7 , 100 , - , - , - , - , - , - +HD1 , 8 , 100 , - , - , - , - , - , - +HD1 , 9 , 100 , - , - , - , - , - , - +HD1 , 10 , 100 , - , - , - , - , - , - +HD1 , 11 , 100 , - , - , - , - , - , - + +# R-744 + other electric heater +HD2 , 1 , 50 , , , , , 50 , +HD2 , 2 , 100 , - , - , - , - , 0 , - +HD2 , 3 , 100 , - , - , - , - , 0 , - +HD2 , 4 , 100 , - , - , - , - , 0 , - +HD2 , 5 , 100 , - , - , - , - , 0 , - +HD2 , 6 , 100 , - , - , - , - , 0 , - +HD2 , 7 , 100 , - , - , - , - , 0 , - +HD2 , 8 , 100 , - , - , - , - , 0 , - +HD2 , 9 , 100 , - , - , - , - , 0 , - +HD2 , 10 , 100 , - , - , - , - , 0 , - +HD2 , 11 , 100 , - , - , - , - , 0 , - + +# R-744 + other electric heater + fuel heater +HD3 , 1 , 40 , - , - , - , - , 20 , 40 +HD3 , 2 , 70 , - , - , - , - , 0 , 30 +HD3 , 3 , 80 , - , - , - , - , 0 , 20 +HD3 , 4 , 100 , - , - , - , - , 0 , 0 +HD3 , 5 , 100 , - , - , - , - , 0 , 0 +HD3 , 6 , 100 , - , - , - , - , 0 , 0 +HD3 , 7 , 100 , - , - , - , - , 0 , 0 +HD3 , 8 , 100 , - , - , - , - , 0 , 0 +HD3 , 9 , 100 , - , - , - , - , 0 , 0 +HD3 , 10 , 100 , - , - , - , - , 0 , 0 +HD3 , 11 , 100 , - , - , - , - , 0 , 0 + +# R-744 + fuel heater +HD4 , 1 , 40 , - , - , - , - , - , 60 +HD4 , 2 , 70 , - , - , - , - , - , 30 +HD4 , 3 , 80 , - , - , - , - , - , 20 +HD4 , 4 , 100 , - , - , - , - , - , 0 +HD4 , 5 , 100 , - , - , - , - , - , 0 +HD4 , 6 , 100 , - , - , - , - , - , 0 +HD4 , 7 , 100 , - , - , - , - , - , 0 +HD4 , 8 , 100 , - , - , - , - , - , 0 +HD4 , 9 , 100 , - , - , - , - , - , 0 +HD4 , 10 , 100 , - , - , - , - , - , 0 +HD4 , 11 , 100 , - , - , - , - , - , 0 + +# Non R744 only +HD5 , 1 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 2 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 3 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 4 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 5 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 6 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 7 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 8 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 9 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 10 , - , 100 , 100 , 100 , 100 , - , - +HD5 , 11 , - , 100 , 100 , 100 , 100 , - , - + +# Non R-744 + other electric heater +HD6 , 1 , - , 0 , 0 , 0 , 0 , 100 , - +HD6 , 2 , - , 100 , 100 , 100 , 100 , 0 , - +HD6 , 3 , - , 100 , 100 , 100 , 100 , 0 , - +HD6 , 4 , - , 100 , 100 , 100 , 100 , 0 , - +HD6 , 5 , - , 100 , 100 , 100 , 100 , 0 , - +HD6 , 6 , - , 100 , 100 , 100 , 100 , 0 , - +HD6 , 7 , - , 100 , 100 , 100 , 100 , 0 , - +HD6 , 8 , - , 100 , 100 , 100 , 100 , 0 , - +HD6 , 9 , - , 100 , 100 , 100 , 100 , 0 , - +HD6 , 10 , - , 100 , 100 , 100 , 100 , 0 , - +HD6 , 11 , - , 100 , 100 , 100 , 100 , 0 , - + +# Non R-744 + other electric heater + fuel heater +HD7 , 1 , - , 0 , 0 , 0 , 0 , 20 , 80 +HD7 , 2 , - , 70 , 70 , 70 , 70 , 0 , 30 +HD7 , 3 , - , 80 , 80 , 80 , 80 , 0 , 20 +HD7 , 4 , - , 100 , 100 , 100 , 100 , 0 , 0 +HD7 , 5 , - , 100 , 100 , 100 , 100 , 0 , 0 +HD7 , 6 , - , 100 , 100 , 100 , 100 , 0 , 0 +HD7 , 7 , - , 100 , 100 , 100 , 100 , 0 , 0 +HD7 , 8 , - , 100 , 100 , 100 , 100 , 0 , 0 +HD7 , 9 , - , 100 , 100 , 100 , 100 , 0 , 0 +HD7 , 10 , - , 100 , 100 , 100 , 100 , 0 , 0 +HD7 , 11 , - , 100 , 100 , 100 , 100 , 0 , 0 + +# Non R-744 + fuel heater +HD8 , 1 , - , 0 , 0 , 0 , 0 , - , 100 +HD8 , 2 , - , 70 , 70 , 70 , 70 , - , 30 +HD8 , 3 , - , 80 , 80 , 80 , 80 , - , 20 +HD8 , 4 , - , 100 , 100 , 100 , 100 , - , 0 +HD8 , 5 , - , 100 , 100 , 100 , 100 , - , 0 +HD8 , 6 , - , 100 , 100 , 100 , 100 , - , 0 +HD8 , 7 , - , 100 , 100 , 100 , 100 , - , 0 +HD8 , 8 , - , 100 , 100 , 100 , 100 , - , 0 +HD8 , 9 , - , 100 , 100 , 100 , 100 , - , 0 +HD8 , 10 , - , 100 , 100 , 100 , 100 , - , 0 +HD8 , 11 , - , 100 , 100 , 100 , 100 , - , 0 + +# Other electric heater only +HD9 , 1 , - , - , - , - , - , 100 , +HD9 , 2 , - , - , - , - , - , 100 , +HD9 , 3 , - , - , - , - , - , 100 , +HD9 , 4 , - , - , - , - , - , 100 , +HD9 , 5 , - , - , - , - , - , 100 , +HD9 , 6 , - , - , - , - , - , 100 , +HD9 , 7 , - , - , - , - , - , 100 , +HD9 , 8 , - , - , - , - , - , 100 , +HD9 , 9 , - , - , - , - , - , 100 , +HD9 , 10 , - , - , - , - , - , 100 , +HD9 , 11 , - , - , - , - , - , 100 , + +# Ohter electric heater + fuel heater +HD10 , 1 , - , - , - , - , - , 20 , 80 +HD10 , 2 , - , - , - , - , - , 0 , 100 +HD10 , 3 , - , - , - , - , - , 0 , 100 +HD10 , 4 , - , - , - , - , - , 0 , 100 +HD10 , 5 , - , - , - , - , - , 0 , 100 +HD10 , 6 , - , - , - , - , - , 0 , 100 +HD10 , 7 , - , - , - , - , - , 0 , 100 +HD10 , 8 , - , - , - , - , - , 0 , 100 +HD10 , 9 , - , - , - , - , - , 0 , 100 +HD10 , 10 , - , - , - , - , - , 0 , 100 +HD10 , 11 , - , - , - , - , - , 0 , 100 + +# fuel heater only +HD11 , 1 , - , - , - , - , - , - , 100 +HD11 , 2 , - , - , - , - , - , - , 100 +HD11 , 3 , - , - , - , - , - , - , 100 +HD11 , 4 , - , - , - , - , - , - , 100 +HD11 , 5 , - , - , - , - , - , - , 100 +HD11 , 6 , - , - , - , - , - , - , 100 +HD11 , 7 , - , - , - , - , - , - , 100 +HD11 , 8 , - , - , - , - , - , - , 100 +HD11 , 9 , - , - , - , - , - , - , 100 +HD11 , 10 , - , - , - , - , - , - , 100 +HD11 , 11 , - , - , - , - , - , - , 100 + +# no heating +HD12 , 1 , - , - , - , - , - , - , - +HD12 , 2 , - , - , - , - , - , - , - +HD12 , 3 , - , - , - , - , - , - , - +HD12 , 4 , - , - , - , - , - , - , - +HD12 , 5 , - , - , - , - , - , - , - +HD12 , 6 , - , - , - , - , - , - , - +HD12 , 7 , - , - , - , - , - , - , - +HD12 , 8 , - , - , - , - , - , - , - +HD12 , 9 , - , - , - , - , - , - , - +HD12 , 10 , - , - , - , - , - , - , - +HD12 , 11 , - , - , - , - , - , - , - diff --git a/VectoCore/VectoCore/Resources/Declaration/Buses/HeatingDistributionCases.csv b/VectoCore/VectoCore/Resources/Declaration/Buses/HeatingDistributionCases.csv new file mode 100644 index 0000000000000000000000000000000000000000..09fcf3a726b120b5ad9f89bebfb4b6efb38002c5 --- /dev/null +++ b/VectoCore/VectoCore/Resources/Declaration/Buses/HeatingDistributionCases.csv @@ -0,0 +1,36 @@ +HeatingDistributionCase , R-744 , non R-744 2-stage , non R-744 3-stage , non R-744 4-stage , non R-744 continuous , electric heater , fuel heater +HD1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 + +HD2 , 1 , 0 , 0 , 0 , 0 , 1 , 0 + +HD3 , 1 , 0 , 0 , 0 , 0 , 1 , 1 + +HD4 , 1 , 0 , 0 , 0 , 0 , 0 , 1 + +HD5 , 0 , 1 , 0 , 0 , 0 , 0 , 0 +HD5 , 0 , 0 , 1 , 0 , 0 , 0 , 0 +HD5 , 0 , 0 , 0 , 1 , 0 , 0 , 0 +HD5 , 0 , 0 , 0 , 0 , 1 , 0 , 0 + +HD6 , 0 , 1 , 0 , 0 , 0 , 1 , 0 +HD6 , 0 , 0 , 1 , 0 , 0 , 1 , 0 +HD6 , 0 , 0 , 0 , 1 , 0 , 1 , 0 +HD6 , 0 , 0 , 0 , 0 , 1 , 1 , 0 + +HD7 , 0 , 1 , 0 , 0 , 0 , 1 , 1 +HD7 , 0 , 0 , 1 , 0 , 0 , 1 , 1 +HD7 , 0 , 0 , 0 , 1 , 0 , 1 , 1 +HD7 , 0 , 0 , 0 , 0 , 1 , 1 , 1 + +HD8 , 0 , 1 , 0 , 0 , 0 , 0 , 1 +HD8 , 0 , 0 , 1 , 0 , 0 , 0 , 1 +HD8 , 0 , 0 , 0 , 1 , 0 , 0 , 1 +HD8 , 0 , 0 , 0 , 0 , 1 , 0 , 1 + +HD9 , 0 , 0 , 0 , 0 , 0 , 1 , 0 + +HD10 , 0 , 0 , 0 , 0 , 0 , 1 , 1 + +HD11 , 0 , 0 , 0 , 0 , 0 , 0 , 1 + +HD12 , 0 , 0 , 0 , 0 , 0 , 0 , 0 diff --git a/VectoCore/VectoCoreTest/Models/Declaration/BusDeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/BusDeclarationDataTest.cs index efce6d6a22350be1dfc6637581d663e391219306..b3ff35a7597fac68e5408c0eb6bbcc3d664544b7 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/BusDeclarationDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/BusDeclarationDataTest.cs @@ -1,6 +1,9 @@ -using NUnit.Framework; +using System.Linq; +using NUnit.Framework; +using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; using TUGraz.VectoCore.Models.Declaration; namespace TUGraz.VectoCore.Tests.Models.Declaration; @@ -84,4 +87,95 @@ public class BusDeclarationDataTest var len = DeclarationData.BusAuxiliaries.CorrectionLengthDrivetrainVolume(vc, lowEntry, numAxles, articulated); Assert.AreEqual(expectedLength, len.Value()); } + + + [ + TestCase(HeatPumpType.R_744, HeaterType.None, false, HeatingDistributionCase.HeatingDistribution1), + TestCase(HeatPumpType.R_744, HeaterType.WaterElectricHeater, false, HeatingDistributionCase.HeatingDistribution2), + TestCase(HeatPumpType.R_744, HeaterType.AirElectricHeater, true, HeatingDistributionCase.HeatingDistribution3), + TestCase(HeatPumpType.R_744, HeaterType.None, true, HeatingDistributionCase.HeatingDistribution4), + TestCase(HeatPumpType.non_R_744_2_stage, HeaterType.None, false, HeatingDistributionCase.HeatingDistribution5), + TestCase(HeatPumpType.non_R_744_3_stage, HeaterType.WaterElectricHeater, false, HeatingDistributionCase.HeatingDistribution6), + TestCase(HeatPumpType.non_R_744_4_stage, HeaterType.AirElectricHeater, true, HeatingDistributionCase.HeatingDistribution7), + TestCase(HeatPumpType.non_R_744_2_stage, HeaterType.None, true, HeatingDistributionCase.HeatingDistribution8), + TestCase(HeatPumpType.none, HeaterType.OtherElectricHeating, false, HeatingDistributionCase.HeatingDistribution9), + TestCase(HeatPumpType.none, HeaterType.WaterElectricHeater, true, HeatingDistributionCase.HeatingDistribution10), + TestCase(HeatPumpType.none, HeaterType.None, true, HeatingDistributionCase.HeatingDistribution11), + TestCase(HeatPumpType.none, HeaterType.None, false, HeatingDistributionCase.HeatingDistribution12), + ] + public void TestBusAuxHeatingDistributionCase(HeatPumpType heatPump, HeaterType heater, bool fuelHeater, + HeatingDistributionCase expectedCase) + { + var heatingCase = + DeclarationData.BusAuxiliaries.HeatingDistributionCases.GetHeatingDistributionCase(heatPump, heater, + fuelHeater); + Assert.AreEqual(expectedCase, heatingCase); + } + + + [ + TestCase(HeatingDistributionCase.HeatingDistribution1, HeatPumpType.R_744, HeaterType.None, false), + TestCase(HeatingDistributionCase.HeatingDistribution2, HeatPumpType.R_744, HeaterType.WaterElectricHeater, false), + TestCase(HeatingDistributionCase.HeatingDistribution3, HeatPumpType.R_744, HeaterType.WaterElectricHeater, true), + TestCase(HeatingDistributionCase.HeatingDistribution4, HeatPumpType.R_744, HeaterType.None, true), + TestCase(HeatingDistributionCase.HeatingDistribution5, HeatPumpType.non_R_744_2_stage, HeaterType.None, false), + TestCase(HeatingDistributionCase.HeatingDistribution6, HeatPumpType.non_R_744_3_stage, HeaterType.WaterElectricHeater, false), + TestCase(HeatingDistributionCase.HeatingDistribution7, HeatPumpType.non_R_744_4_stage, HeaterType.WaterElectricHeater, true), + TestCase(HeatingDistributionCase.HeatingDistribution8, HeatPumpType.non_R_744_2_stage, HeaterType.None, true), + TestCase(HeatingDistributionCase.HeatingDistribution9, HeatPumpType.none, HeaterType.WaterElectricHeater, false), + TestCase(HeatingDistributionCase.HeatingDistribution10, HeatPumpType.none, HeaterType.WaterElectricHeater, true), + TestCase(HeatingDistributionCase.HeatingDistribution11, HeatPumpType.none, HeaterType.None, true), +// TestCase(HeatingDistributionCase.HeatingDistribution12, HeatPumpType.none, HeaterType.None, false), + ] + public void TestBusAuxHeatingDistribution(HeatingDistributionCase hdCase, HeatPumpType hpType, HeaterType heater, bool fuelHeater) + { + for (var environmentalId = 1; environmentalId <= 11; environmentalId++) { + var entry = DeclarationData.BusAuxiliaries.HeatingDistribution.Lookup(hdCase, environmentalId); + Assert.IsNotNull(entry); + var hp = entry.GetHeatpumpContribution(hpType); + var elHeater = entry.GetElectricHeaterContribution(heater); + var fuel = entry.GetFuelHeaterContribution(); + if (hdCase == HeatingDistributionCase.HeatingDistribution12) { + // in case 12 no heaters are present! + Assert.AreEqual(0, hp + elHeater + fuel); + } else { + Assert.AreEqual(1, hp + elHeater + fuel, + $"contributions do not sum up to 1 for configuration {hdCase}, {environmentalId}"); + } + } + } + + [Test] + public void TestBusAusHeatingDistribution_ALL() + { + var heatpumps = EnumHelper.GetValues<HeatPumpType>().Where(x => !x.IsOneOf(HeatPumpType.not_applicable)) + .ToList(); + var electricHeater = EnumHelper.GetValues<HeaterType>().Where(x => x != HeaterType.FuelHeater).ToList(); + var fuelHeater = new[] { true, false }; + + foreach (var heatpump in heatpumps) { + foreach (var heater in electricHeater) { + foreach (var auxHeater in fuelHeater) { + var heatingCase = + DeclarationData.BusAuxiliaries.HeatingDistributionCases.GetHeatingDistributionCase(heatpump, + heater, auxHeater); + + for (var envId = 1; envId <= 11; envId++) { + var entry = DeclarationData.BusAuxiliaries.HeatingDistribution.Lookup(heatingCase, envId); + var hp = entry.GetHeatpumpContribution(heatpump); + var elHeater = entry.GetElectricHeaterContribution(heater); + var fuel = entry.GetFuelHeaterContribution(); + if (heatingCase == HeatingDistributionCase.HeatingDistribution12) { + // in case 12 no heaters are present! + Assert.AreEqual(0, hp + elHeater + fuel); + } else { + Assert.AreEqual(1, hp + elHeater + fuel, + $"contributions do not sum up to 1 for configuration. {heatpump}, {heater}, {auxHeater} {heatingCase}, {envId}"); + } + } + } + } + } + + } } \ No newline at end of file