From 6d33321f060baccf78944120e0a35d1c5bf658ca Mon Sep 17 00:00:00 2001 From: GillisHommen <98752265+GillisHommen@users.noreply.github.com> Date: Mon, 21 Jul 2025 17:37:28 +0200 Subject: [PATCH 1/3] J_rapidRunData now has addTimeStep() method, using J_AssetFlows as input (among others) Tested with L4L model, runs! Results look OK. --- Zero_engine.alpx | 4 + _alp/Agents/EnergyCoop/Code/Functions.java | 20 +- _alp/Agents/EnergyCoop/Variables.xml | 22 ++ _alp/Agents/EnergyModel/Code/Functions.java | 88 ++++++-- _alp/Agents/EnergyModel/Code/Functions.xml | 2 +- _alp/Agents/EnergyModel/Variables.xml | 22 ++ .../Agents/GridConnection/Code/Functions.java | 125 +++++++----- _alp/Agents/GridConnection/Variables.xml | 32 ++- _alp/Classes/Class.J_AssetFlows.java | 105 ++++++++++ _alp/Classes/Class.J_RapidRunData.java | 191 ++++++++++++++++++ 10 files changed, 530 insertions(+), 81 deletions(-) create mode 100644 _alp/Classes/Class.J_AssetFlows.java diff --git a/Zero_engine.alpx b/Zero_engine.alpx index b5e55d46..b0bcf775 100644 --- a/Zero_engine.alpx +++ b/Zero_engine.alpx @@ -1611,6 +1611,10 @@ 1749651263461 + + 1753106536266 + + com.anylogic.libraries.modules.markup_descriptors diff --git a/_alp/Agents/EnergyCoop/Code/Functions.java b/_alp/Agents/EnergyCoop/Code/Functions.java index 2162866f..20b05c75 100644 --- a/_alp/Agents/EnergyCoop/Code/Functions.java +++ b/_alp/Agents/EnergyCoop/Code/Functions.java @@ -1525,9 +1525,24 @@ HashSet f_getAllChildCustomerGridConnections_recursion(HashSet f_getAllChildCustomerGridConnections_recursion(HashSet + + 1753111072241 + + 60 + 950 + + false + true + true + + + + + + + 1669037234222 diff --git a/_alp/Agents/EnergyModel/Code/Functions.java b/_alp/Agents/EnergyModel/Code/Functions.java index b8e98adc..b1765813 100644 --- a/_alp/Agents/EnergyModel/Code/Functions.java +++ b/_alp/Agents/EnergyModel/Code/Functions.java @@ -218,33 +218,77 @@ if (b_parallelizeGridConnections) { c_gridConnections.parallelStream().forEach(gc -> gc.f_calculateEnergyBalance()); - for(GridConnection gc : c_gridConnections) { // Can't do this in parallel due to different threads writing to the same values! - - fm_currentBalanceFlows_kW.addFlows(gc.fm_currentBalanceFlows_kW); - fm_currentProductionFlows_kW.addFlows(gc.fm_currentProductionFlows_kW); - fm_currentConsumptionFlows_kW.addFlows(gc.fm_currentConsumptionFlows_kW); - - v_currentFinalEnergyConsumption_kW += gc.v_currentFinalEnergyConsumption_kW; - v_currentPrimaryEnergyProduction_kW += gc.v_currentPrimaryEnergyProduction_kW; - v_currentEnergyCurtailed_kW += gc.v_currentEnergyCurtailed_kW; - v_currentPrimaryEnergyProductionHeatpumps_kW += gc.v_currentPrimaryEnergyProductionHeatpumps_kW; - } } else { for(GridConnection gc : c_gridConnections) { gc.f_calculateEnergyBalance(); - - fm_currentBalanceFlows_kW.addFlows(gc.fm_currentBalanceFlows_kW); - fm_currentProductionFlows_kW.addFlows(gc.fm_currentProductionFlows_kW); - fm_currentConsumptionFlows_kW.addFlows(gc.fm_currentConsumptionFlows_kW); - - v_currentFinalEnergyConsumption_kW += gc.v_currentFinalEnergyConsumption_kW; - v_currentPrimaryEnergyProduction_kW += gc.v_currentPrimaryEnergyProduction_kW; - v_currentEnergyCurtailed_kW += gc.v_currentEnergyCurtailed_kW; - v_currentPrimaryEnergyProductionHeatpumps_kW += gc.v_currentPrimaryEnergyProductionHeatpumps_kW; } } +double fixedConsumptionElectric_kW = 0; +double heatPumpElectricityConsumption_kW = 0; +double evChargingPowerElectric_kW = 0; +double currentBatteriesConsumption_kW = 0; +double hydrogenElectricityConsumption_kW = 0; +double electricHobConsumption_kW = 0; +double districtHeatDelivery_kW = 0; +double pvProductionElectric_kW = 0; +double windProductionElectric_kW = 0; +double ptProductionHeat_kW = 0; +double CHPProductionElectric_kW = 0; +double currentBatteriesProduction_kW = 0; +double currentV2GProduction_kW = 0; +double currentStoredEnergyBatteries_MWh = 0; + +v_assetFlows.reset(); +for(GridConnection gc : c_gridConnections) { // Can't do this in parallel due to different threads writing to the same values! + + fm_currentBalanceFlows_kW.addFlows(gc.fm_currentBalanceFlows_kW); + fm_currentProductionFlows_kW.addFlows(gc.fm_currentProductionFlows_kW); + fm_currentConsumptionFlows_kW.addFlows(gc.fm_currentConsumptionFlows_kW); + + v_currentFinalEnergyConsumption_kW += gc.v_currentFinalEnergyConsumption_kW; + v_currentPrimaryEnergyProduction_kW += gc.v_currentPrimaryEnergyProduction_kW; + v_currentEnergyCurtailed_kW += gc.v_currentEnergyCurtailed_kW; + v_currentPrimaryEnergyProductionHeatpumps_kW += gc.v_currentPrimaryEnergyProductionHeatpumps_kW; + + v_assetFlows.addFlows(gc.v_assetFlows); + +} + /* + fixedConsumptionElectric_kW += gc.v_fixedConsumptionElectric_kW; + heatPumpElectricityConsumption_kW += gc.v_heatPumpElectricityConsumption_kW; + evChargingPowerElectric_kW += max(0,gc.v_evChargingPowerElectric_kW); + currentBatteriesConsumption_kW += max(0,gc.v_batteryPowerElectric_kW); + hydrogenElectricityConsumption_kW += gc.v_hydrogenElectricityConsumption_kW; + electricHobConsumption_kW += gc.v_electricHobConsumption_kW; + districtHeatDelivery_kW += gc.v_districtHeatDelivery_kW; + pvProductionElectric_kW += gc.v_pvProductionElectric_kW; + windProductionElectric_kW += gc.v_windProductionElectric_kW; + ptProductionHeat_kW += gc.v_ptProductionHeat_kW; + CHPProductionElectric_kW += gc.v_CHPProductionElectric_kW; + currentBatteriesProduction_kW += max(0,-gc.v_batteryPowerElectric_kW); + currentV2GProduction_kW += max(0,-gc.v_evChargingPowerElectric_kW); + currentStoredEnergyBatteries_MWh += gc.v_batteryStoredEnergy_kWh/1000; + */ + + +/*v_assetFlows.setFlows(fixedConsumptionElectric_kW, + heatPumpElectricityConsumption_kW, + evChargingPowerElectric_kW, + currentBatteriesConsumption_kW, + hydrogenElectricityConsumption_kW, + electricHobConsumption_kW, + districtHeatDelivery_kW, + pvProductionElectric_kW, + windProductionElectric_kW, + ptProductionHeat_kW, + CHPProductionElectric_kW, + currentBatteriesProduction_kW, + currentV2GProduction_kW, + currentStoredEnergyBatteries_MWh);*/ + +// TODO: Is this still needed?? for (GridConnection gc : c_subGridConnections) { gc.f_calculateEnergyBalance(); } @@ -1101,6 +1145,9 @@ EnergyCoop f_addConsumptionEnergyCarrier(OL_EnergyCarriers EC) double f_rapidRunDataLogging() {/*ALCODESTART::1741622740564*/ +v_rapidRunData.addTimeStep(fm_currentBalanceFlows_kW, fm_currentConsumptionFlows_kW, fm_currentProductionFlows_kW, v_currentPrimaryEnergyProduction_kW, v_currentFinalEnergyConsumption_kW, v_currentPrimaryEnergyProductionHeatpumps_kW, v_currentEnergyCurtailed_kW, v_assetFlows, this); + +/* // Further Subdivision of asset types within energy carriers double v_fixedConsumptionElectric_kW = sum(c_gridConnections, x->x.v_fixedConsumptionElectric_kW); double v_heatPumpElectricityConsumption_kW = sum(c_gridConnections, x->x.v_heatPumpElectricityConsumption_kW); @@ -1299,6 +1346,7 @@ EnergyCoop f_addConsumptionEnergyCarrier(OL_EnergyCarriers EC) else{ v_rapidRunData.ts_dailyAverageBatteriesSOC_fr.addStep(0); } +*/ /*ALCODEEND*/} diff --git a/_alp/Agents/EnergyModel/Code/Functions.xml b/_alp/Agents/EnergyModel/Code/Functions.xml index 59a7c38b..d3ae5e0e 100644 --- a/_alp/Agents/EnergyModel/Code/Functions.xml +++ b/_alp/Agents/EnergyModel/Code/Functions.xml @@ -573,7 +573,7 @@ 1741622740564 677 - 321 + 322 + + 1753110053329 + + 840 + 320 + + false + true + true + + + + + + + 1658496701675 diff --git a/_alp/Agents/GridConnection/Code/Functions.java b/_alp/Agents/GridConnection/Code/Functions.java index f0cd0043..d21db96c 100644 --- a/_alp/Agents/GridConnection/Code/Functions.java +++ b/_alp/Agents/GridConnection/Code/Functions.java @@ -1463,58 +1463,6 @@ else if (flowsMap.get(EC) > 0){ {/*ALCODESTART::1722518905501*/ v_maxConnectionLoad_fr = max(v_maxConnectionLoad_fr, abs(fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) / v_liveConnectionMetaData.contractedDeliveryCapacity_kW )); -double currentImport_kW = 0.0; -double currentExport_kW = 0.0; -for (OL_EnergyCarriers EC : v_activeEnergyCarriers) { - double currentBalance_kW = fm_currentBalanceFlows_kW.get(EC); - v_rapidRunData.am_totalBalanceAccumulators_kW.get(EC).addStep( currentBalance_kW ); - - if(v_activeConsumptionEnergyCarriers.contains(EC)){ - currentImport_kW += max( 0, currentBalance_kW ); - } - if(v_activeProductionEnergyCarriers.contains(EC)){ - currentExport_kW += max( 0, -currentBalance_kW ); - } -} - -// Daytime totals. Use overal-total minus daytime total to get nighttime totals. -if(energyModel.b_isDaytime) { - - for (OL_EnergyCarriers EC : v_activeEnergyCarriers) { - double currentBalance_kW = fm_currentBalanceFlows_kW.get(EC); - if(v_activeConsumptionEnergyCarriers.contains(EC)){ - v_rapidRunData.am_daytimeImports_kW.get(EC).addStep(max( 0, currentBalance_kW )); - } - if(v_activeProductionEnergyCarriers.contains(EC)){ - v_rapidRunData.am_daytimeExports_kW.get(EC).addStep(max( 0, -currentBalance_kW )); - } - } - - v_rapidRunData.acc_daytimeElectricityProduction_kW.addStep(fm_currentProductionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); - v_rapidRunData.acc_daytimeElectricityConsumption_kW.addStep(fm_currentConsumptionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); - v_rapidRunData.acc_daytimeEnergyProduction_kW.addStep(v_currentPrimaryEnergyProduction_kW); - v_rapidRunData.acc_daytimeFinalEnergyConsumption_kW.addStep(v_currentFinalEnergyConsumption_kW); - v_rapidRunData.acc_daytimePrimaryEnergyProductionHeatpumps_kW.addStep(v_currentPrimaryEnergyProductionHeatpumps_kW); -} - -// Weekend totals. Use overal-totals minus weekend totals to get weekday totals. -if (!energyModel.b_isWeekday) { // - for (OL_EnergyCarriers EC : v_activeEnergyCarriers) { - double currentBalance_kW = fm_currentBalanceFlows_kW.get(EC); - if(v_activeConsumptionEnergyCarriers.contains(EC)){ - v_rapidRunData.am_weekendImports_kW.get(EC).addStep(max( 0, currentBalance_kW )); - } - if(v_activeProductionEnergyCarriers.contains(EC)){ - v_rapidRunData.am_weekendExports_kW.get(EC).addStep(max( 0, -currentBalance_kW )); - } - } - v_rapidRunData.acc_weekendElectricityProduction_kW.addStep(fm_currentProductionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); - v_rapidRunData.acc_weekendElectricityConsumption_kW.addStep(fm_currentConsumptionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); - v_rapidRunData.acc_weekendEnergyProduction_kW.addStep(v_currentPrimaryEnergyProduction_kW); - v_rapidRunData.acc_weekendFinalEnergyConsumption_kW.addStep(v_currentFinalEnergyConsumption_kW); - v_rapidRunData.acc_weekendPrimaryEnergyProductionHeatpumps_kW.addStep(v_currentPrimaryEnergyProductionHeatpumps_kW); -} - // Further Subdivision of asset types within energy carriers v_fixedConsumptionElectric_kW = 0; for (J_EA j_ea : c_fixedConsumptionElectricAssets) { @@ -1571,6 +1519,77 @@ else if (flowsMap.get(EC) > 0){ v_ptProductionHeat_kW -= j_ea.getLastFlows().get(OL_EnergyCarriers.HEAT); } +v_assetFlows.setFlows(v_fixedConsumptionElectric_kW, + v_heatPumpElectricityConsumption_kW, + max(0,v_evChargingPowerElectric_kW), + max(0,v_batteryPowerElectric_kW), + v_hydrogenElectricityConsumption_kW, + v_electricHobConsumption_kW, + v_districtHeatDelivery_kW, + v_pvProductionElectric_kW, + v_windProductionElectric_kW, + v_ptProductionHeat_kW, + v_CHPProductionElectric_kW, + max(0,-v_batteryPowerElectric_kW), + max(0,-v_evChargingPowerElectric_kW), + v_batteryStoredEnergy_kWh/1000); + +v_rapidRunData.addTimeStep(fm_currentBalanceFlows_kW, fm_currentConsumptionFlows_kW, fm_currentProductionFlows_kW, v_currentPrimaryEnergyProduction_kW, v_currentFinalEnergyConsumption_kW, v_currentPrimaryEnergyProductionHeatpumps_kW, v_currentEnergyCurtailed_kW, v_assetFlows, energyModel); + +/* +double currentImport_kW = 0.0; +double currentExport_kW = 0.0; +for (OL_EnergyCarriers EC : v_activeEnergyCarriers) { + double currentBalance_kW = fm_currentBalanceFlows_kW.get(EC); + v_rapidRunData.am_totalBalanceAccumulators_kW.get(EC).addStep( currentBalance_kW ); + + if(v_activeConsumptionEnergyCarriers.contains(EC)){ + currentImport_kW += max( 0, currentBalance_kW ); + } + if(v_activeProductionEnergyCarriers.contains(EC)){ + currentExport_kW += max( 0, -currentBalance_kW ); + } +} + +// Daytime totals. Use overal-total minus daytime total to get nighttime totals. +if(energyModel.b_isDaytime) { + + for (OL_EnergyCarriers EC : v_activeEnergyCarriers) { + double currentBalance_kW = fm_currentBalanceFlows_kW.get(EC); + if(v_activeConsumptionEnergyCarriers.contains(EC)){ + v_rapidRunData.am_daytimeImports_kW.get(EC).addStep(max( 0, currentBalance_kW )); + } + if(v_activeProductionEnergyCarriers.contains(EC)){ + v_rapidRunData.am_daytimeExports_kW.get(EC).addStep(max( 0, -currentBalance_kW )); + } + } + + v_rapidRunData.acc_daytimeElectricityProduction_kW.addStep(fm_currentProductionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); + v_rapidRunData.acc_daytimeElectricityConsumption_kW.addStep(fm_currentConsumptionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); + v_rapidRunData.acc_daytimeEnergyProduction_kW.addStep(v_currentPrimaryEnergyProduction_kW); + v_rapidRunData.acc_daytimeFinalEnergyConsumption_kW.addStep(v_currentFinalEnergyConsumption_kW); + v_rapidRunData.acc_daytimePrimaryEnergyProductionHeatpumps_kW.addStep(v_currentPrimaryEnergyProductionHeatpumps_kW); +} + +// Weekend totals. Use overal-totals minus weekend totals to get weekday totals. +if (!energyModel.b_isWeekday) { // + for (OL_EnergyCarriers EC : v_activeEnergyCarriers) { + double currentBalance_kW = fm_currentBalanceFlows_kW.get(EC); + if(v_activeConsumptionEnergyCarriers.contains(EC)){ + v_rapidRunData.am_weekendImports_kW.get(EC).addStep(max( 0, currentBalance_kW )); + } + if(v_activeProductionEnergyCarriers.contains(EC)){ + v_rapidRunData.am_weekendExports_kW.get(EC).addStep(max( 0, -currentBalance_kW )); + } + } + v_rapidRunData.acc_weekendElectricityProduction_kW.addStep(fm_currentProductionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); + v_rapidRunData.acc_weekendElectricityConsumption_kW.addStep(fm_currentConsumptionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); + v_rapidRunData.acc_weekendEnergyProduction_kW.addStep(v_currentPrimaryEnergyProduction_kW); + v_rapidRunData.acc_weekendFinalEnergyConsumption_kW.addStep(v_currentFinalEnergyConsumption_kW); + v_rapidRunData.acc_weekendPrimaryEnergyProductionHeatpumps_kW.addStep(v_currentPrimaryEnergyProductionHeatpumps_kW); +} + + //District heating v_districtHeatDelivery_kW = max(0,fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.HEAT)); @@ -1698,7 +1717,7 @@ else if (flowsMap.get(EC) > 0){ else{ v_rapidRunData.ts_dailyAverageBatteriesSOC_fr.addStep(0); } - +*/ /*ALCODEEND*/} double f_setActive(boolean setActive) diff --git a/_alp/Agents/GridConnection/Variables.xml b/_alp/Agents/GridConnection/Variables.xml index b68667f6..ee31c5f8 100644 --- a/_alp/Agents/GridConnection/Variables.xml +++ b/_alp/Agents/GridConnection/Variables.xml @@ -996,7 +996,7 @@ 1741182119260 570 - 810 + 790 + + 1753110629668 + + 570 + 840 + + false + true + true + + + + + + + 1658499438204 diff --git a/_alp/Classes/Class.J_AssetFlows.java b/_alp/Classes/Class.J_AssetFlows.java new file mode 100644 index 00000000..90bb30ad --- /dev/null +++ b/_alp/Classes/Class.J_AssetFlows.java @@ -0,0 +1,105 @@ +/** + * J_AssetFlows + */ +public class J_AssetFlows implements Serializable { + + // Further Subdivision of asset types within energy carriers + public double fixedConsumptionElectric_kW; + public double heatPumpElectricityConsumption_kW; + public double evChargingPowerElectric_kW; + public double currentBatteriesConsumption_kW; + public double hydrogenElectricityConsumption_kW; + public double electricHobConsumption_kW; + public double districtHeatDelivery_kW; + public double pvProductionElectric_kW; + public double windProductionElectric_kW; + public double ptProductionHeat_kW; + public double CHPProductionElectric_kW; + public double currentBatteriesProduction_kW; + public double currentV2GProduction_kW; + public double currentStoredEnergyBatteries_MWh; + + /** + * Default constructor + */ + public J_AssetFlows() { + } + + public void setFlows( + double fixedConsumptionElectric_kW, + double heatPumpElectricityConsumption_kW, + double evChargingPowerElectric_kW, + double currentBatteriesConsumption_kW, + double hydrogenElectricityConsumption_kW, + double electricHobConsumption_kW, + double districtHeatDelivery_kW, + double pvProductionElectric_kW, + double windProductionElectric_kW, + double ptProductionHeat_kW, + double CHPProductionElectric_kW, + double currentBatteriesProduction_kW, + double currentV2GProduction_kW, + double currentStoredEnergyBatteries_MWh) { + this.fixedConsumptionElectric_kW = fixedConsumptionElectric_kW; + this.heatPumpElectricityConsumption_kW = heatPumpElectricityConsumption_kW; + this.evChargingPowerElectric_kW = evChargingPowerElectric_kW; + this.currentBatteriesConsumption_kW = currentBatteriesConsumption_kW; + this.hydrogenElectricityConsumption_kW = hydrogenElectricityConsumption_kW; + this.electricHobConsumption_kW = electricHobConsumption_kW; + this.districtHeatDelivery_kW = districtHeatDelivery_kW; + this.pvProductionElectric_kW = pvProductionElectric_kW; + this.windProductionElectric_kW = windProductionElectric_kW; + this.ptProductionHeat_kW = ptProductionHeat_kW; + this.CHPProductionElectric_kW = CHPProductionElectric_kW; + this.currentBatteriesProduction_kW = currentBatteriesProduction_kW; + this.currentV2GProduction_kW = currentV2GProduction_kW; + this.currentStoredEnergyBatteries_MWh = currentStoredEnergyBatteries_MWh; + } + + public void addFlows(J_AssetFlows assetFlows){ + this.fixedConsumptionElectric_kW += fixedConsumptionElectric_kW; + this.heatPumpElectricityConsumption_kW += heatPumpElectricityConsumption_kW; + this.evChargingPowerElectric_kW += evChargingPowerElectric_kW; + this.currentBatteriesConsumption_kW += currentBatteriesConsumption_kW; + this.hydrogenElectricityConsumption_kW += hydrogenElectricityConsumption_kW; + this.electricHobConsumption_kW += electricHobConsumption_kW; + this.districtHeatDelivery_kW += districtHeatDelivery_kW; + this.pvProductionElectric_kW += pvProductionElectric_kW; + this.windProductionElectric_kW += windProductionElectric_kW; + this.ptProductionHeat_kW += ptProductionHeat_kW; + this.CHPProductionElectric_kW += CHPProductionElectric_kW; + this.currentBatteriesProduction_kW += currentBatteriesProduction_kW; + this.currentV2GProduction_kW += currentV2GProduction_kW; + this.currentStoredEnergyBatteries_MWh += currentStoredEnergyBatteries_MWh; + } + + + public void reset() { + fixedConsumptionElectric_kW = 0; + heatPumpElectricityConsumption_kW = 0; + evChargingPowerElectric_kW = 0; + currentBatteriesConsumption_kW = 0; + hydrogenElectricityConsumption_kW = 0; + electricHobConsumption_kW = 0; + districtHeatDelivery_kW = 0; + pvProductionElectric_kW = 0; + windProductionElectric_kW = 0; + ptProductionHeat_kW = 0; + CHPProductionElectric_kW = 0; + currentBatteriesProduction_kW = 0; + currentV2GProduction_kW = 0; + currentStoredEnergyBatteries_MWh = 0; + } + + @Override + public String toString() { + return super.toString(); + } + + /** + * This number is here for model snapshot storing purpose
+ * It needs to be changed when this class gets changed + */ + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/_alp/Classes/Class.J_RapidRunData.java b/_alp/Classes/Class.J_RapidRunData.java index c9df3176..df656f74 100644 --- a/_alp/Classes/Class.J_RapidRunData.java +++ b/_alp/Classes/Class.J_RapidRunData.java @@ -480,6 +480,197 @@ public J_RapidRunData getClone() { } + public void addTimeStep(J_FlowsMap fm_currentBalanceFlows_kW, J_FlowsMap fm_currentConsumptionFlows_kW, J_FlowsMap fm_currentProductionFlows_kW, double v_currentPrimaryEnergyProduction_kW, double v_currentFinalEnergyConsumption_kW, double v_currentPrimaryEnergyProductionHeatpumps_kW, double v_currentEnergyCurtailed_kW, J_AssetFlows assetFlows, EnergyModel energyModel) { + for (OL_EnergyCarriers EC : activeEnergyCarriers) { + this.am_totalBalanceAccumulators_kW.get(EC).addStep( fm_currentBalanceFlows_kW.get(EC) ); + } + + /* + // Further Subdivision of asset types within energy carriers + double v_fixedConsumptionElectric_kW = sum(c_gridConnections, x->x.v_fixedConsumptionElectric_kW); + double v_heatPumpElectricityConsumption_kW = sum(c_gridConnections, x->x.v_heatPumpElectricityConsumption_kW); + double v_evChargingPowerElectric_kW = sum(c_gridConnections, x->max(0,x.v_evChargingPowerElectric_kW)); + double currentBatteriesConsumption_kW = sum(c_gridConnections, x->max(0,x.v_batteryPowerElectric_kW)); + double v_hydrogenElectricityConsumption_kW = sum(c_gridConnections, x->x.v_hydrogenElectricityConsumption_kW); + double v_electricHobConsumption_kW = sum(c_gridConnections, x->x.v_electricHobConsumption_kW); + double v_districtHeatDelivery_kW = sum(c_gridConnections, x->x.v_districtHeatDelivery_kW); + + double v_pvProductionElectric_kW = sum(c_gridConnections, x->x.v_pvProductionElectric_kW); + double v_windProductionElectric_kW = sum(c_gridConnections, x->x.v_windProductionElectric_kW); + double v_ptProductionHeat_kW = sum(c_gridConnections, x->x.v_ptProductionHeat_kW); + double currentBatteriesProduction_kW = sum(c_gridConnections, x->max(0,-x.v_batteryPowerElectric_kW)); + double currentV2GProduction_kW = sum(c_gridConnections, x-> max(0, -x.v_evChargingPowerElectric_kW)); + double v_CHPProductionElectric_kW = sum(c_gridConnections, x->x.v_CHPProductionElectric_kW); + + double currentStoredEnergyBatteries_MWh = sum(c_gridConnections, x->x.v_batteryStoredEnergy_kWh)/1000; + */ + + // Daytime totals. Use overal-total minus daytime total to get nighttime totals. + if(energyModel.b_isDaytime) { + + for (OL_EnergyCarriers EC : activeEnergyCarriers) { + double currentBalance_kW = fm_currentBalanceFlows_kW.get(EC); + if(activeConsumptionEnergyCarriers.contains(EC)){ + am_daytimeImports_kW.get(EC).addStep(max( 0, currentBalance_kW )); + } + if(activeProductionEnergyCarriers.contains(EC)){ + am_daytimeExports_kW.get(EC).addStep(max( 0, -currentBalance_kW )); + } + } + + acc_daytimeElectricityProduction_kW.addStep(fm_currentProductionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); + acc_daytimeElectricityConsumption_kW.addStep(fm_currentConsumptionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); + acc_daytimeEnergyProduction_kW.addStep(v_currentPrimaryEnergyProduction_kW); + acc_daytimeFinalEnergyConsumption_kW.addStep(v_currentFinalEnergyConsumption_kW); + acc_daytimePrimaryEnergyProductionHeatpumps_kW.addStep(v_currentPrimaryEnergyProductionHeatpumps_kW); + + } + + // Weekend totals. Use overal-totals minus weekend totals to get weekday totals. + if (!energyModel.b_isWeekday) { // + for (OL_EnergyCarriers EC : activeEnergyCarriers) { + double currentBalance_kW = fm_currentBalanceFlows_kW.get(EC); + if(activeConsumptionEnergyCarriers.contains(EC)){ + am_weekendImports_kW.get(EC).addStep(max( 0, currentBalance_kW )); + } + if(activeProductionEnergyCarriers.contains(EC)){ + am_weekendExports_kW.get(EC).addStep(max( 0, -currentBalance_kW )); + } + } + + acc_weekendElectricityProduction_kW.addStep(fm_currentProductionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); + acc_weekendElectricityConsumption_kW.addStep(fm_currentConsumptionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) ); + acc_weekendEnergyProduction_kW.addStep(v_currentPrimaryEnergyProduction_kW); + acc_weekendFinalEnergyConsumption_kW.addStep(v_currentFinalEnergyConsumption_kW); + acc_weekendPrimaryEnergyProductionHeatpumps_kW.addStep(v_currentPrimaryEnergyProductionHeatpumps_kW); + } + + //========== SUMMER WEEK ==========// + if (energyModel.b_isSummerWeek){ + for (OL_EnergyCarriers EC : activeEnergyCarriers) { + am_summerWeekBalanceAccumulators_kW.get(EC).addStep( fm_currentBalanceFlows_kW.get(EC) ); + } + for (OL_EnergyCarriers EC : activeConsumptionEnergyCarriers) { + am_summerWeekConsumptionAccumulators_kW.get(EC).addStep( fm_currentConsumptionFlows_kW.get(EC) ); + + } + for (OL_EnergyCarriers EC : activeProductionEnergyCarriers) { + am_summerWeekProductionAccumulators_kW.get(EC).addStep( fm_currentProductionFlows_kW.get(EC) ); + } + + acc_summerWeekEnergyProduction_kW.addStep(v_currentPrimaryEnergyProduction_kW); + acc_summerWeekFinalEnergyConsumption_kW.addStep(v_currentFinalEnergyConsumption_kW); + + acc_summerWeekEnergyCurtailed_kW.addStep(v_currentEnergyCurtailed_kW); + acc_summerWeekPrimaryEnergyProductionHeatpumps_kW.addStep(v_currentPrimaryEnergyProductionHeatpumps_kW); + + acc_summerWeekDeliveryCapacity_kW.addStep( connectionMetaData.physicalCapacity_kW ); + acc_summerWeekFeedinCapacity_kW.addStep( -connectionMetaData.physicalCapacity_kW ); + + acc_summerWeekBaseloadElectricityConsumption_kW.addStep( assetFlows.fixedConsumptionElectric_kW ); + acc_summerWeekHeatPumpElectricityConsumption_kW.addStep( assetFlows.heatPumpElectricityConsumption_kW ); + + acc_summerWeekElectricVehicleConsumption_kW.addStep( max(0,assetFlows.evChargingPowerElectric_kW) ); + acc_summerWeekBatteriesConsumption_kW.addStep( assetFlows.currentBatteriesConsumption_kW ); + acc_summerWeekElectricCookingConsumption_kW.addStep( assetFlows.electricHobConsumption_kW ); + acc_summerWeekElectrolyserElectricityConsumption_kW.addStep( max(0, assetFlows.hydrogenElectricityConsumption_kW) ); + acc_summerWeekDistrictHeatingConsumption_kW.addStep( assetFlows.districtHeatDelivery_kW ); + acc_summerWeekPVProduction_kW.addStep( assetFlows.pvProductionElectric_kW ); + acc_summerWeekWindProduction_kW.addStep( assetFlows.windProductionElectric_kW ); + acc_summerWeekPTProduction_kW.addStep( assetFlows.ptProductionHeat_kW ); + acc_summerWeekV2GProduction_kW.addStep( max(0, -assetFlows.evChargingPowerElectric_kW) ); + acc_summerWeekBatteriesProduction_kW.addStep( assetFlows.currentBatteriesProduction_kW ); + acc_summerWeekCHPElectricityProduction_kW.addStep( assetFlows.CHPProductionElectric_kW ); + ts_summerWeekBatteriesStoredEnergy_MWh.addStep(assetFlows.currentStoredEnergyBatteries_MWh); + + if(assetsMetaData.totalInstalledBatteryStorageCapacity_MWh > 0){ + ts_summerWeekBatteriesSOC_fr.addStep(assetFlows.currentStoredEnergyBatteries_MWh/assetsMetaData.totalInstalledBatteryStorageCapacity_MWh); + } + else{ + ts_summerWeekBatteriesSOC_fr.addStep(0); + } + } + + //========== WINTER WEEK ==========// + if (energyModel.b_isWinterWeek){ + for (OL_EnergyCarriers EC : activeEnergyCarriers) { + am_winterWeekBalanceAccumulators_kW.get(EC).addStep( fm_currentBalanceFlows_kW.get(EC) ); + } + for (OL_EnergyCarriers EC : activeConsumptionEnergyCarriers) { + am_winterWeekConsumptionAccumulators_kW.get(EC).addStep( fm_currentConsumptionFlows_kW.get(EC) ); + } + for (OL_EnergyCarriers EC : activeProductionEnergyCarriers) { + am_winterWeekProductionAccumulators_kW.get(EC).addStep( fm_currentProductionFlows_kW.get(EC) ); + } + + acc_winterWeekEnergyProduction_kW.addStep(v_currentPrimaryEnergyProduction_kW); + acc_winterWeekFinalEnergyConsumption_kW.addStep(v_currentFinalEnergyConsumption_kW); + + acc_winterWeekEnergyCurtailed_kW.addStep(v_currentEnergyCurtailed_kW); + acc_winterWeekPrimaryEnergyProductionHeatpumps_kW.addStep(v_currentPrimaryEnergyProductionHeatpumps_kW); + + acc_winterWeekDeliveryCapacity_kW.addStep( connectionMetaData.physicalCapacity_kW ); + acc_winterWeekFeedinCapacity_kW.addStep( -connectionMetaData.physicalCapacity_kW ); + + acc_winterWeekBaseloadElectricityConsumption_kW.addStep( assetFlows.fixedConsumptionElectric_kW ); + acc_winterWeekHeatPumpElectricityConsumption_kW.addStep( assetFlows.heatPumpElectricityConsumption_kW ); + + acc_winterWeekElectricVehicleConsumption_kW.addStep( max(0,assetFlows.evChargingPowerElectric_kW) ); + acc_winterWeekBatteriesConsumption_kW.addStep( assetFlows.currentBatteriesConsumption_kW ); + acc_winterWeekElectricCookingConsumption_kW.addStep( assetFlows.electricHobConsumption_kW ); + acc_winterWeekElectrolyserElectricityConsumption_kW.addStep( max(0, assetFlows.hydrogenElectricityConsumption_kW) ); + acc_winterWeekDistrictHeatingConsumption_kW.addStep( assetFlows.districtHeatDelivery_kW ); + acc_winterWeekPVProduction_kW.addStep( assetFlows.pvProductionElectric_kW ); + acc_winterWeekWindProduction_kW.addStep( assetFlows.windProductionElectric_kW ); + acc_winterWeekPTProduction_kW.addStep( assetFlows.ptProductionHeat_kW ); + acc_winterWeekV2GProduction_kW.addStep( max(0, -assetFlows.evChargingPowerElectric_kW) ); + acc_winterWeekBatteriesProduction_kW.addStep( assetFlows.currentBatteriesProduction_kW ); + acc_winterWeekCHPElectricityProduction_kW.addStep( assetFlows.CHPProductionElectric_kW ); + ts_winterWeekBatteriesStoredEnergy_MWh.addStep(assetFlows.currentStoredEnergyBatteries_MWh); + + if(assetsMetaData.totalInstalledBatteryStorageCapacity_MWh > 0){ + ts_winterWeekBatteriesSOC_fr.addStep(assetFlows.currentStoredEnergyBatteries_MWh/assetsMetaData.totalInstalledBatteryStorageCapacity_MWh); + } + else{ + ts_winterWeekBatteriesSOC_fr.addStep(0); + } + } + + //========== TOTALS / DAILY AVERAGES ==========// + for (OL_EnergyCarriers EC : activeConsumptionEnergyCarriers) { + am_dailyAverageConsumptionAccumulators_kW.get(EC).addStep( fm_currentConsumptionFlows_kW.get(EC) ); + } + for (OL_EnergyCarriers EC : activeProductionEnergyCarriers) { + am_dailyAverageProductionAccumulators_kW.get(EC).addStep( fm_currentProductionFlows_kW.get(EC) ); + } + acc_dailyAverageEnergyProduction_kW.addStep(v_currentPrimaryEnergyProduction_kW); + acc_dailyAverageFinalEnergyConsumption_kW.addStep(v_currentFinalEnergyConsumption_kW); + acc_totalEnergyCurtailed_kW.addStep(v_currentEnergyCurtailed_kW); + acc_totalPrimaryEnergyProductionHeatpumps_kW.addStep(v_currentPrimaryEnergyProductionHeatpumps_kW); + acc_dailyAverageBaseloadElectricityConsumption_kW.addStep( assetFlows.fixedConsumptionElectric_kW ); + acc_dailyAverageHeatPumpElectricityConsumption_kW.addStep( assetFlows.heatPumpElectricityConsumption_kW ); + acc_dailyAverageElectricVehicleConsumption_kW.addStep( max(0,assetFlows.evChargingPowerElectric_kW) ); + acc_dailyAverageBatteriesConsumption_kW.addStep( assetFlows.currentBatteriesConsumption_kW ); + acc_dailyAverageElectricCookingConsumption_kW.addStep( assetFlows.electricHobConsumption_kW ); + acc_dailyAverageElectrolyserElectricityConsumption_kW.addStep( max(0, assetFlows.hydrogenElectricityConsumption_kW) ); + acc_dailyAverageDistrictHeatingConsumption_kW.addStep( assetFlows.districtHeatDelivery_kW ); + acc_dailyAveragePVProduction_kW.addStep( assetFlows.pvProductionElectric_kW ); + acc_dailyAverageWindProduction_kW.addStep( assetFlows.windProductionElectric_kW ); + acc_dailyAveragePTProduction_kW.addStep( assetFlows.ptProductionHeat_kW ); + acc_dailyAverageV2GProduction_kW.addStep( max(0, -assetFlows.evChargingPowerElectric_kW) ); + acc_dailyAverageBatteriesProduction_kW.addStep( assetFlows.currentBatteriesProduction_kW ); + acc_dailyAverageCHPElectricityProduction_kW.addStep( assetFlows.CHPProductionElectric_kW ); + ts_dailyAverageBatteriesStoredEnergy_MWh.addStep(assetFlows.currentStoredEnergyBatteries_MWh); + + if(assetsMetaData.totalInstalledBatteryStorageCapacity_MWh > 0){ + ts_dailyAverageBatteriesSOC_fr.addStep(assetFlows.currentStoredEnergyBatteries_MWh/assetsMetaData.totalInstalledBatteryStorageCapacity_MWh); + } + else{ + ts_dailyAverageBatteriesSOC_fr.addStep(0); + } + + } + public J_LoadDurationCurves getLoadDurationCurves(EnergyModel energyModel) { return new J_LoadDurationCurves(this.am_totalBalanceAccumulators_kW.get(OL_EnergyCarriers.ELECTRICITY).getTimeSeries_kW(), energyModel); } From 355526b1f38d00924f80b9d8c8558ef3e941d182 Mon Sep 17 00:00:00 2001 From: GillisHommen <98752265+GillisHommen@users.noreply.github.com> Date: Tue, 22 Jul 2025 17:44:13 +0200 Subject: [PATCH 2/3] J_AssetFlows now also used for J_LiveData --- .../ConnectionOwner/Levels/Level.level.xml | 1 + _alp/Agents/EnergyCoop/AOC.EnergyCoop.xml | 44 ++- _alp/Agents/EnergyModel/AOC.EnergyModel.xml | 13 +- _alp/Agents/EnergyModel/EmbeddedObjects.xml | 321 +----------------- .../GridConnection/AOC.GridConnection.xml | 6 +- .../Agents/GridConnection/Code/Functions.java | 173 ++++++---- _alp/Agents/GridConnection/Code/Functions.xml | 4 +- .../AOC.ZeroAgent.xml} | 36 +- _alp/Classes/Class.I_EnergyData.java | 4 + _alp/Classes/Class.J_ActivityTracker.java | 1 - _alp/Classes/Class.J_AssetFlows.java | 30 +- _alp/Classes/Class.J_AssetsMetaData.java | 7 + _alp/Classes/Class.J_ConnectionMetaData.java | 4 + _alp/Classes/Class.J_EA.java | 3 + _alp/Classes/Class.J_EAEV.java | 3 + _alp/Classes/Class.J_EAVehicle.java | 11 + _alp/Classes/Class.J_LiveData.java | 82 +++++ _alp/Classes/Class.J_ProfileForecaster.java | 12 +- _alp/Classes/Class.J_ProfilePointer.java | 4 + 19 files changed, 329 insertions(+), 430 deletions(-) rename _alp/Agents/{GovernmentLayer/AOC.GovernmentLayer.xml => ZeroAgent/AOC.ZeroAgent.xml} (86%) diff --git a/_alp/Agents/ConnectionOwner/Levels/Level.level.xml b/_alp/Agents/ConnectionOwner/Levels/Level.level.xml index 9175da5a..18a5c013 100644 --- a/_alp/Agents/ConnectionOwner/Levels/Level.level.xml +++ b/_alp/Agents/ConnectionOwner/Levels/Level.level.xml @@ -133,6 +133,7 @@ false 1675071708039 + true 660 350
@@ -2281,7 +2281,7 @@ true ArrayList - Agent + Actor Object diff --git a/_alp/Agents/EnergyModel/AOC.EnergyModel.xml b/_alp/Agents/EnergyModel/AOC.EnergyModel.xml index 21ffa2d2..79ae2d90 100644 --- a/_alp/Agents/EnergyModel/AOC.EnergyModel.xml +++ b/_alp/Agents/EnergyModel/AOC.EnergyModel.xml @@ -18,6 +18,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.annotation.JsonAutoDetect; +import java.lang.reflect.Field; import java.io.FileOutputStream; import java.util.stream.Stream; diff --git a/_alp/Agents/EnergyModel/Code/AdditionalClassCode.java b/_alp/Agents/EnergyModel/Code/AdditionalClassCode.java index 265a0087..d9a439f9 100644 --- a/_alp/Agents/EnergyModel/Code/AdditionalClassCode.java +++ b/_alp/Agents/EnergyModel/Code/AdditionalClassCode.java @@ -1,4 +1,18 @@ public OL_ResultScope getScope(){return OL_ResultScope.ENERGYMODEL;} public J_RapidRunData getRapidRunData(){return v_rapidRunData;} public J_LiveData getLiveData(){return v_liveData;} -public J_RapidRunData getPreviousRapidRunData(){return v_previousRunData;} \ No newline at end of file +public J_RapidRunData getPreviousRapidRunData(){return v_previousRunData;} + +public static void forceSetOwner(Agent agent, AgentArrayList pop) throws Exception { + Agent owner = pop.getOwner(); + Field f = Agent.class.getDeclaredField("d"); + f.setAccessible(true); + f.set(agent, owner); + Field ff = Agent.class.getDeclaredField("j"); + ff.setAccessible(true); + ff.set(agent, pop); + /*Field c = Agent.class.getDeclaredField("c"); + traceln("Field c: %s", c); + c.setAccessible(true); + c.toString();*/ +} \ No newline at end of file diff --git a/_alp/Agents/EnergyModel/EmbeddedObjects.xml b/_alp/Agents/EnergyModel/EmbeddedObjects.xml index 8f2c54d2..c2e02fda 100644 --- a/_alp/Agents/EnergyModel/EmbeddedObjects.xml +++ b/_alp/Agents/EnergyModel/EmbeddedObjects.xml @@ -380,6 +380,15 @@ + + + + + + + + + true @@ -449,6 +458,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true @@ -518,6 +593,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + true @@ -692,6 +794,24 @@ + + + + + + + + + + + + + + + + + + true @@ -979,6 +1099,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true @@ -1132,6 +1291,12 @@ + + + + + + true @@ -1285,6 +1450,9 @@ + + + true @@ -1438,6 +1606,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true @@ -1897,6 +2107,9 @@ + + + true @@ -2380,6 +2593,27 @@ + + + + + + + + + + + + + + + + + + + + + true @@ -2534,6 +2768,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true diff --git a/_alp/Agents/EnergyModel/Variables.xml b/_alp/Agents/EnergyModel/Variables.xml index 93bf7d20..bc5d8b08 100644 --- a/_alp/Agents/EnergyModel/Variables.xml +++ b/_alp/Agents/EnergyModel/Variables.xml @@ -2435,7 +2435,7 @@ false true true - + ArrayList ConnectionOwner String @@ -2489,7 +2489,7 @@ false true true - + ArrayList GridConnection String @@ -2653,7 +2653,7 @@ false true true - + ArrayList Actor String @@ -2805,4 +2805,22 @@ String + + 1753288831771 + + 87 + -105 + + false + true + true + + ArrayList + GridNode + String + + diff --git a/_alp/Agents/ZeroAgent/AOC.ZeroAgent.xml b/_alp/Agents/GovernmentLayer/AOC.GovernmentLayer.xml similarity index 90% rename from _alp/Agents/ZeroAgent/AOC.ZeroAgent.xml rename to _alp/Agents/GovernmentLayer/AOC.GovernmentLayer.xml index 342bd3cf..14435dc5 100644 --- a/_alp/Agents/ZeroAgent/AOC.ZeroAgent.xml +++ b/_alp/Agents/GovernmentLayer/AOC.GovernmentLayer.xml @@ -138,26 +138,6 @@ END - - - 1660732002822 - - true - 50 - -100 - - false - true - true - - zero_engine - EnergyModel - - - 1660731364524 diff --git a/_alp/Agents/GridConnection/AOC.GridConnection.xml b/_alp/Agents/GridConnection/AOC.GridConnection.xml index dddf8f1c..eb11f0dc 100644 --- a/_alp/Agents/GridConnection/AOC.GridConnection.xml +++ b/_alp/Agents/GridConnection/AOC.GridConnection.xml @@ -18,6 +18,7 @@ import java.util.Scanner; import java.util.*; import java.util.stream.Collectors; import java.io.*; +import java.lang.reflect.Field; import zeroPackage.ZeroMath; //import zeroPackage.ZeroAccumulator; @@ -25,6 +26,30 @@ import javax.management.RuntimeErrorException; import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonSubTypes; +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.PROPERTY, + property = "type" // 👈 this will be the field name in your JSON + ) +@JsonSubTypes({ + @JsonSubTypes.Type(value = GCDistrictHeating.class, name = "GCDistrictHeating"), + @JsonSubTypes.Type(value = GCEnergyConversion.class, name = "GCEnergyConversion"), + @JsonSubTypes.Type(value = GCEnergyProduction.class, name = "GCEnergyProduction"), + @JsonSubTypes.Type(value = GCGridBattery.class, name = "GCGridBattery"), + @JsonSubTypes.Type(value = GCHouse.class, name = "GCHouse"), + @JsonSubTypes.Type(value = GCNeighborhood.class, name = "GCNeighborhood"), + @JsonSubTypes.Type(value = GCPublicCharger.class, name = "GCPublicCharger"), + @JsonSubTypes.Type(value = GCUtility.class, name = "GCUtility"), + //@JsonSubTypes.Type(value = J_EAEV.class, name = "J_EAEV"), + //@JsonSubTypes.Type(value = J_EADieselVehicle.class, name = "J_EADieselVehicle"), + + // Add other known subtypes here if needed +}) + +@JsonIgnoreProperties({"va_gridConnection","_origin_VA","_pl_powerFlows_autoUpdateEvent_xjal","_SOC_plot_autoUpdateEvent_xjal"}) @JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "@id")]]> I_EnergyData 1718111623480 + true 47 1010 + + 1753281672894 + + + 60 + 150 + + false + true + true + + + + + + + 1660736411315 @@ -378,9 +402,10 @@ 1675688426540 - - 60 - 140 + + true + 480 + 270