From be0d53a2dab3727ecf69051fcc877361c4a3d76f Mon Sep 17 00:00:00 2001 From: Ate Hempenius Date: Fri, 8 Aug 2025 18:01:15 +0200 Subject: [PATCH 1/3] bugfixes for when a coop is made using the filter functionality Added a functionality to the accumulator.add method. Where it is now also possible to add an accumulator with a smaller resolution to an accumulator with a larger resolution if it matches time intervals. The data resolution of the rapid run class of the coop after creation is now equal to the largest interval of the members. When a coop is present during rapid run sim, the resolution of the coop is converted into more detail again. --- _alp/Agents/EnergyCoop/Code/Functions.java | 157 ++++++-------------- _alp/Agents/EnergyCoop/Code/Functions.xml | 51 +++---- _alp/Agents/EnergyModel/Code/Functions.java | 4 + _alp/Classes/Class.J_RapidRunData.java | 21 ++- _alp/Classes/Class.ZeroAccumulator.java | 35 +++-- 5 files changed, 104 insertions(+), 164 deletions(-) diff --git a/_alp/Agents/EnergyCoop/Code/Functions.java b/_alp/Agents/EnergyCoop/Code/Functions.java index 70f005c4..6333c5ef 100644 --- a/_alp/Agents/EnergyCoop/Code/Functions.java +++ b/_alp/Agents/EnergyCoop/Code/Functions.java @@ -572,7 +572,7 @@ v_activeEnergyCarriers.addAll(GC.v_activeEnergyCarriers); v_activeProductionEnergyCarriers.addAll(GC.v_activeProductionEnergyCarriers); v_activeConsumptionEnergyCarriers.addAll(GC.v_activeConsumptionEnergyCarriers); - + v_liveData.assetsMetaData.activeAssetFlows.addAll(GC.v_liveData.assetsMetaData.activeAssetFlows); if(!GC.v_liveConnectionMetaData.contractedDeliveryCapacityKnown){ v_liveConnectionMetaData.contractedDeliveryCapacityKnown = false; @@ -596,7 +596,6 @@ v_liveData.dsm_liveAssetFlows_kW.createEmptyDataSets(v_liveData.assetsMetaData.activeAssetFlows, (int)(168 / energyModel.p_timeStep_h)); // Initializing Live Data Class -v_liveAssetsMetaData.updateActiveAssetData(new ArrayList<>(f_getAllChildMemberGridConnections())); v_liveData.activeConsumptionEnergyCarriers = v_activeConsumptionEnergyCarriers; v_liveData.activeProductionEnergyCarriers = v_activeProductionEnergyCarriers; v_liveData.activeEnergyCarriers = v_activeEnergyCarriers; @@ -1071,6 +1070,7 @@ // Make collective profiles, electricity per timestep, other energy carriers per day! for (GridConnection gc : c_memberGridConnections) { + // Totals v_rapidRunData.am_totalBalanceAccumulators_kW.add(gc.v_rapidRunData.am_totalBalanceAccumulators_kW); v_rapidRunData.am_dailyAverageConsumptionAccumulators_kW.add(gc.v_rapidRunData.am_dailyAverageConsumptionAccumulators_kW); @@ -1079,6 +1079,7 @@ v_rapidRunData.acc_dailyAverageFinalEnergyConsumption_kW.add(gc.v_rapidRunData.acc_dailyAverageFinalEnergyConsumption_kW); v_rapidRunData.acc_totalEnergyCurtailed_kW.add(gc.v_rapidRunData.acc_totalEnergyCurtailed_kW); v_rapidRunData.acc_totalPrimaryEnergyProductionHeatpumps_kW.add(gc.v_rapidRunData.acc_totalPrimaryEnergyProductionHeatpumps_kW); + v_rapidRunData.am_assetFlowsAccumulators_kW.add(gc.v_rapidRunData.am_assetFlowsAccumulators_kW); // Daytime v_rapidRunData.acc_daytimeElectricityConsumption_kW.add(gc.v_rapidRunData.acc_daytimeElectricityConsumption_kW); @@ -1104,6 +1105,7 @@ v_rapidRunData.acc_summerWeekFinalEnergyConsumption_kW.add(gc.v_rapidRunData.acc_summerWeekFinalEnergyConsumption_kW); v_rapidRunData.acc_summerWeekEnergyCurtailed_kW.add(gc.v_rapidRunData.acc_summerWeekEnergyCurtailed_kW); v_rapidRunData.acc_summerWeekPrimaryEnergyProductionHeatpumps_kW.add(gc.v_rapidRunData.acc_summerWeekPrimaryEnergyProductionHeatpumps_kW); + v_rapidRunData.am_assetFlowsSummerWeek_kW.add(gc.v_rapidRunData.am_assetFlowsSummerWeek_kW); // Winterweek v_rapidRunData.am_winterWeekBalanceAccumulators_kW.add(gc.v_rapidRunData.am_winterWeekBalanceAccumulators_kW); @@ -1113,22 +1115,17 @@ v_rapidRunData.acc_winterWeekFinalEnergyConsumption_kW.add(gc.v_rapidRunData.acc_winterWeekFinalEnergyConsumption_kW); v_rapidRunData.acc_winterWeekEnergyCurtailed_kW.add(gc.v_rapidRunData.acc_winterWeekEnergyCurtailed_kW); v_rapidRunData.acc_winterWeekPrimaryEnergyProductionHeatpumps_kW.add(gc.v_rapidRunData.acc_winterWeekPrimaryEnergyProductionHeatpumps_kW); + v_rapidRunData.am_assetFlowsWinterWeek_kW.add(gc.v_rapidRunData.am_assetFlowsWinterWeek_kW); } -f_collectAssetSpecificEnergyFlows_rapidRun(); - // This is only true because we have no customers and only members of the Coop for this implementation acc_totalOwnElectricityProduction_kW = v_rapidRunData.am_dailyAverageProductionAccumulators_kW.get(OL_EnergyCarriers.ELECTRICITY); //acc_summerWeekOwnElectricityProduction_kW = am_summerWeekProductionAccumulators_kW.get(OL_EnergyCarriers.ELECTRICITY); //acc_winterWeekOwnElectricityProduction_kW = am_winterWeekProductionAccumulators_kW.get(OL_EnergyCarriers.ELECTRICITY); - //Calculate cumulative asset capacities f_getTotalInstalledCapacityOfAssets_rapidRun(); -//Recalculate SOC ts for energycoop -//f_recalculateSOC_rapidrun(); - /*ALCODEEND*/} double f_initializeCustomCoop(ArrayList gcList) @@ -1145,14 +1142,13 @@ for(GridConnection GC : c_memberGridConnections){ if(GC.v_rapidRunData == null){ allGCHaveRapidRun = false; + break; } } if(allGCHaveRapidRun){ - //Create rapid run data class used to collect rapid run data of other gc - v_rapidRunData = new J_RapidRunData(this); - v_rapidRunData.initializeAccumulators(energyModel.p_runEndTime_h - energyModel.p_runStartTime_h, energyModel.p_timeStep_h, EnumSet.copyOf(v_activeEnergyCarriers), EnumSet.copyOf(v_activeConsumptionEnergyCarriers), EnumSet.copyOf(v_activeProductionEnergyCarriers)); - v_rapidRunData.connectionMetaData = v_liveConnectionMetaData.getClone(); - v_rapidRunData.assetsMetaData = v_liveAssetsMetaData.getClone(); + + //Create rapid run data class used to store combined values of the members + f_createAndInitializeRapidRunDataClass(); //Collect current totals f_collectGridConnectionRapidRunData(); @@ -1312,63 +1308,6 @@ HashSet f_getAllChildCustomerGridConnections_recursion(HashSet gcList = f_getAllChildMemberGridConnections(); @@ -1477,49 +1416,6 @@ HashSet f_getAllChildCustomerGridConnections_recursion(HashSet 0){ - dailyAverageBatteriesSOC_fr[i] = v_rapidRunData.ts_dailyAverageBatteriesStoredEnergy_MWh.getY(i)/totalInstalledBatteryStorageCapacity_MWh; - } - else{ - dailyAverageBatteriesSOC_fr[i] = 0; - } -} - -//Summerweek SOC -for(int i = 0; i < v_rapidRunData.ts_summerWeekBatteriesStoredEnergy_MWh.getLength() ; i++){ - if(totalInstalledBatteryStorageCapacity_MWh > 0){ - summerWeekBatteriesSOC_fr[i] = v_rapidRunData.ts_summerWeekBatteriesStoredEnergy_MWh.getY(i)/totalInstalledBatteryStorageCapacity_MWh; - } - else{ - summerWeekBatteriesSOC_fr[i] = 0; - } -} - -//Winterweek SOC -for(int i = 0; i < v_rapidRunData.ts_winterWeekBatteriesStoredEnergy_MWh.getLength() ; i++){ - if(totalInstalledBatteryStorageCapacity_MWh > 0){ - winterWeekBatteriesSOC_fr[i] = v_rapidRunData.ts_winterWeekBatteriesStoredEnergy_MWh.getY(i)/totalInstalledBatteryStorageCapacity_MWh; - } - else{ - winterWeekBatteriesSOC_fr[i] = 0; - } -} - -v_rapidRunData.ts_dailyAverageBatteriesSOC_fr.setTimeSeries(dailyAverageBatteriesSOC_fr); -v_rapidRunData.ts_summerWeekBatteriesSOC_fr.setTimeSeries(summerWeekBatteriesSOC_fr); -v_rapidRunData.ts_winterWeekBatteriesSOC_fr.setTimeSeries(winterWeekBatteriesSOC_fr); -/*ALCODEEND*/} - double f_getTotalInstalledCapacityOfAssets_live() {/*ALCODESTART::1744211359139*/ //Collect live asset totals @@ -1640,3 +1536,38 @@ EnergyCoop f_addAssetFlow(OL_AssetFlowCategories AC) } /*ALCODEEND*/} +double f_createAndInitializeRapidRunDataClass() +{/*ALCODESTART::1754666678297*/ +//Create rapid run data class used to collect rapid run data of other gc +v_rapidRunData = new J_RapidRunData(this); +v_rapidRunData.assetsMetaData = v_liveAssetsMetaData.getClone(); + +EnumSet activeEnergyCarriers_rapidRun = EnumSet.copyOf(v_activeEnergyCarriers); +EnumSet activeConsumptionEnergyCarriers_rapidRun = EnumSet.copyOf(v_activeConsumptionEnergyCarriers); +EnumSet activeProductionEnergyCarriers_rapidRun = EnumSet.copyOf(v_activeProductionEnergyCarriers); + +//Need to do this, for if the sliders have changed, otherwise potential errors/missing data +boolean storeTotalAssetFlows = true; +for(GridConnection GC : c_memberGridConnections){ + activeEnergyCarriers_rapidRun.addAll(GC.v_rapidRunData.activeEnergyCarriers); + activeConsumptionEnergyCarriers_rapidRun.addAll(GC.v_rapidRunData.activeConsumptionEnergyCarriers); + activeProductionEnergyCarriers_rapidRun.addAll(GC.v_rapidRunData.activeProductionEnergyCarriers); + + v_rapidRunData.assetsMetaData.activeAssetFlows.addAll(GC.v_rapidRunData.assetsMetaData.activeAssetFlows); + + if(GC.v_rapidRunData.getStoreTotalAssetFlows() == false){ + storeTotalAssetFlows = false; + } +} + +//Adjust StoreTotalAssetFlows accordingly to the member data +v_rapidRunData.setStoreTotalAssetFlows(storeTotalAssetFlows); +traceln("v_rapidRunData.setStoreTotalAssetFlows: " + v_rapidRunData.getStoreTotalAssetFlows()); +//For now assumed to stay the same even after slider change: can't see rapid run graphs anyway after slider change +v_rapidRunData.connectionMetaData = v_liveConnectionMetaData.getClone(); + +//Initialize the rapid run data +v_rapidRunData.initializeAccumulators(energyModel.p_runEndTime_h - energyModel.p_runStartTime_h, energyModel.p_timeStep_h, activeEnergyCarriers_rapidRun, activeConsumptionEnergyCarriers_rapidRun, activeProductionEnergyCarriers_rapidRun); + +/*ALCODEEND*/} + diff --git a/_alp/Agents/EnergyCoop/Code/Functions.xml b/_alp/Agents/EnergyCoop/Code/Functions.xml index 0749cce1..eb6d5d35 100644 --- a/_alp/Agents/EnergyCoop/Code/Functions.xml +++ b/_alp/Agents/EnergyCoop/Code/Functions.xml @@ -349,7 +349,7 @@ 1739970817879 990 - 210 + 230