diff --git a/_alp/Classes/Class.J_BatteryManagementPeakShavingForecast.java b/_alp/Classes/Class.J_BatteryManagementPeakShavingForecast.java index 654c8eb7..98aa5e61 100644 --- a/_alp/Classes/Class.J_BatteryManagementPeakShavingForecast.java +++ b/_alp/Classes/Class.J_BatteryManagementPeakShavingForecast.java @@ -65,32 +65,94 @@ private double[] getNettoBalanceForecast_kW() { int startTimeDayIndex = roundToInt(hour_of_simulation_year/p_timestep_h); int endTimeDayIndex = roundToInt((hour_of_simulation_year + 24)/p_timestep_h); - List profileAssets = new ArrayList(); - List consumptionAssets = new ArrayList(); - List productionAssets = new ArrayList(); + List elecConsumptionProfiles = new ArrayList(); //survey inkoop profile data + List elecHeatPumpProfiles = new ArrayList(); //survey WP profile data + List elecEVProfiles = new ArrayList(); //Custom EV profile data + List surveyHeatDemandProfiles = new ArrayList(); //survey gas to heat builing profiles + List genericHeatDemandProfiles = new ArrayList(); //Generic gas to heat builing profiles + List genericBuildingProfiles = new ArrayList(); //Generic inkoop builing profiles + List productionAssetProfiles = new ArrayList(); // Production profiles - for (GridConnection GC : c_targetGridConnections){ - profileAssets.addAll(findAll(GC.c_profileAssets, profile -> profile.assetFlowCategory == OL_AssetFlowCategories.fixedConsumptionElectric_kW)); - consumptionAssets.addAll(findAll(GC.c_consumptionAssets, cons -> cons.energyAssetType == OL_EnergyAssetType.ELECTRICITY_DEMAND)); - productionAssets.addAll(findAll(GC.c_productionAssets, prod -> prod.energyAssetType == OL_EnergyAssetType.PHOTOVOLTAIC || prod.energyAssetType == OL_EnergyAssetType.WINDMILL)); + for (GridConnection GC : c_targetGridConnections){ + elecConsumptionProfiles.addAll(findAll(GC.c_profileAssets, profile -> profile.assetFlowCategory == OL_AssetFlowCategories.fixedConsumptionElectric_kW)); + elecHeatPumpProfiles.addAll(findAll(GC.c_profileAssets, profile -> profile.assetFlowCategory == OL_AssetFlowCategories.heatPumpElectricityConsumption_kW)); + elecEVProfiles.addAll(findAll(GC.c_profileAssets, profile -> profile.assetFlowCategory == OL_AssetFlowCategories.evChargingPower_kW)); + if(GC.f_getCurrentHeatingType() == OL_GridConnectionHeatingType.ELECTRIC_HEATPUMP && !(GC.p_heatingManagement instanceof J_HeatingManagementGhost)) { + surveyHeatDemandProfiles.addAll(findAll(GC.c_profileAssets, profile -> profile.energyCarrier == OL_EnergyCarriers.HEAT)); + genericHeatDemandProfiles.addAll(findAll(GC.c_consumptionAssets, cons -> cons.energyAssetType == OL_EnergyAssetType.HEAT_DEMAND)); + } + genericBuildingProfiles.addAll(findAll(GC.c_consumptionAssets, cons -> cons.energyAssetType == OL_EnergyAssetType.ELECTRICITY_DEMAND)); + productionAssetProfiles.addAll(findAll(GC.c_productionAssets, prod -> prod.energyAssetType == OL_EnergyAssetType.PHOTOVOLTAIC || prod.energyAssetType == OL_EnergyAssetType.WINDMILL)); } - - for(J_EAProfile profileAsset : profileAssets) { - double[] tempNettoBalance_kW = ZeroMath.arrayMultiply(Arrays.copyOfRange(profileAsset.a_energyProfile_kWh, startTimeDayIndex, endTimeDayIndex), 1/p_timestep_h); - for (int i = 0; i < tempNettoBalance_kW.length; i++) { - nettoBalanceTotal_kW[i] += tempNettoBalance_kW[i]; + + for(J_EAProfile elecConsumptionProfile : elecConsumptionProfiles) { + if(elecConsumptionProfile != null){ + double[] tempNettoBalance_kW = ZeroMath.arrayMultiply(Arrays.copyOfRange(elecConsumptionProfile.a_energyProfile_kWh, startTimeDayIndex, endTimeDayIndex), 1/p_timestep_h);//, elecConsumptionProfile.getProfileScaling_fr()); + for (int i = 0; i < tempNettoBalance_kW.length; i++) { + nettoBalanceTotal_kW[i] += tempNettoBalance_kW[i]; + } + } + } + for(J_EAProfile elecHeatPumpProfile : elecHeatPumpProfiles) { + if(elecHeatPumpProfile != null){ + double[] tempNettoBalance_kW = ZeroMath.arrayMultiply(Arrays.copyOfRange(elecHeatPumpProfile.a_energyProfile_kWh, startTimeDayIndex, endTimeDayIndex), 1/p_timestep_h);//, elecHeatPumpProfile.getProfileScaling_fr()); + for (int i = 0; i < tempNettoBalance_kW.length; i++) { + nettoBalanceTotal_kW[i] += tempNettoBalance_kW[i]; + } + } + } + for(J_EAProfile elecEVProfile : elecEVProfiles) { + if(elecEVProfile != null){ + double[] tempNettoBalance_kW = ZeroMath.arrayMultiply(Arrays.copyOfRange(elecEVProfile.a_energyProfile_kWh, startTimeDayIndex, endTimeDayIndex), 1/p_timestep_h);//, elecEVProfile.getProfileScaling_fr()); + for (int i = 0; i < tempNettoBalance_kW.length; i++) { + nettoBalanceTotal_kW[i] += tempNettoBalance_kW[i]; + } } } - for(J_EAConsumption consumptionAsset : consumptionAssets) { - for(double time = energyModel_time_h; time < energyModel_time_h + 24; time += p_timestep_h){ - nettoBalanceTotal_kW[roundToInt((time-energyModel_time_h)/p_timestep_h)] += consumptionAsset.getProfilePointer().getValue(time)*consumptionAsset.yearlyDemand_kWh*consumptionAsset.getConsumptionScaling_fr(); + for(J_EAProfile surveyHeatDemandProfile : surveyHeatDemandProfiles) { + if(surveyHeatDemandProfile != null){ + double[] heatPower_kW = ZeroMath.arrayMultiply(Arrays.copyOfRange(surveyHeatDemandProfile.a_energyProfile_kWh, startTimeDayIndex, endTimeDayIndex), 1/p_timestep_h);//, surveyHeatDemandProfile.getProfileScaling_fr()); + //traceln(heatPower_kW); + double eta_r = parentGC.energyModel.avgc_data.p_avgEfficiencyHeatpump; + double outputTemperature_degC = parentGC.energyModel.avgc_data.p_avgOutputTemperatureHeatpump_degC; + for(double time = energyModel_time_h; time < energyModel_time_h + 24; time += p_timestep_h){ + double baseTemperature_degC = parentGC.energyModel.pp_ambientTemperature_degC.getValue(time); + double COP_r = eta_r * ( 273.15 + outputTemperature_degC ) / ( outputTemperature_degC - baseTemperature_degC ); + nettoBalanceTotal_kW[roundToInt((time-energyModel_time_h)/p_timestep_h)] += heatPower_kW[roundToInt((time-energyModel_time_h)/p_timestep_h)] / COP_r; + } } } - for(J_EAProduction productionAsset : productionAssets) { - for(double time = energyModel_time_h; time < energyModel_time_h + 24; time += p_timestep_h){ - nettoBalanceTotal_kW[roundToInt((time-energyModel_time_h)/p_timestep_h)] -= productionAsset.getProfilePointer().getValue(time)*productionAsset.getCapacityElectric_kW(); + for(J_EAConsumption genericHeatDemandProfile : genericHeatDemandProfiles) { + if(genericHeatDemandProfile != null){ + + double eta_r = parentGC.energyModel.avgc_data.p_avgEfficiencyHeatpump; + double outputTemperature_degC = parentGC.energyModel.avgc_data.p_avgOutputTemperatureHeatpump_degC; + + for(double time = energyModel_time_h; time < energyModel_time_h + 24; time += p_timestep_h){ + double baseTemperature_degC = parentGC.energyModel.pp_ambientTemperature_degC.getValue(time); + double COP_r = eta_r * ( 273.15 + outputTemperature_degC ) / ( outputTemperature_degC - baseTemperature_degC ); + + //traceln(genericHeatDemandProfile.getProfilePointer().getValue(time)*genericHeatDemandProfile.yearlyDemand_kWh); + nettoBalanceTotal_kW[roundToInt((time-energyModel_time_h)/p_timestep_h)] += genericHeatDemandProfile.getProfilePointer().getValue(time)*genericHeatDemandProfile.yearlyDemand_kWh*genericHeatDemandProfile.getConsumptionScaling_fr() / COP_r; + } } } + for(J_EAConsumption genericBuildingProfile : genericBuildingProfiles) { + if(genericBuildingProfile != null){ //table function + for(double time = energyModel_time_h; time < energyModel_time_h + 24; time += p_timestep_h){ + nettoBalanceTotal_kW[roundToInt((time-energyModel_time_h)/p_timestep_h)] += genericBuildingProfile.getProfilePointer().getValue(time)*genericBuildingProfile.yearlyDemand_kWh*genericBuildingProfile.getConsumptionScaling_fr(); + } + } + } + for(J_EAProduction productionAssetProfile : productionAssetProfiles) { + if (productionAssetProfile != null) { //table function + for(double time = energyModel_time_h; time < energyModel_time_h + 24; time += p_timestep_h){ + nettoBalanceTotal_kW[roundToInt((time-energyModel_time_h)/p_timestep_h)] -= productionAssetProfile.getProfilePointer().getValue(time)*productionAssetProfile.getCapacityElectric_kW(); + } + } + } + + return nettoBalanceTotal_kW; }