diff --git a/_alp/Agents/GridConnection/Levels/Level.level.xml b/_alp/Agents/GridConnection/Levels/Level.level.xml
index 158561d1..8feadc15 100644
--- a/_alp/Agents/GridConnection/Levels/Level.level.xml
+++ b/_alp/Agents/GridConnection/Levels/Level.level.xml
@@ -960,4 +960,29 @@ energyModel.energyDataViewer.viewArea.navigateTo();
View Data
+
+ false
+ 1746437702494
+
+ 510
+ -60
+
+ true
+ true
+ false
+ SHAPE_DRAW_2D3D
+
+ false
+
+ true
+ v_rapidRunData.getFlexPotential();
+
+
+
+ notBenuttingsgraad
+
+
diff --git a/_alp/Classes/Class.J_RapidRunData.java b/_alp/Classes/Class.J_RapidRunData.java
index 81c7edd4..7c64a526 100644
--- a/_alp/Classes/Class.J_RapidRunData.java
+++ b/_alp/Classes/Class.J_RapidRunData.java
@@ -1,10 +1,12 @@
import java.util.EnumSet;
+import zeroPackage.ZeroMath;
/**
* J_RapidRunData
*/
public class J_RapidRunData {
public Agent parentAgent;
+ private double timeStep_h;
public EnumSet activeEnergyCarriers;
public EnumSet activeConsumptionEnergyCarriers;
public EnumSet activeProductionEnergyCarriers;
@@ -129,6 +131,7 @@ public J_RapidRunData(Agent parentAgent) {
}
public void initializeAccumulators(double simDuration_h, double timeStep_h, EnumSet v_activeEnergyCarriers, EnumSet v_activeConsumptionEnergyCarriers, EnumSet v_activeProductionEnergyCarriers) {
+ this.timeStep_h = timeStep_h;
this.activeEnergyCarriers = EnumSet.copyOf(v_activeEnergyCarriers);
this.activeConsumptionEnergyCarriers = EnumSet.copyOf(v_activeConsumptionEnergyCarriers);
this.activeProductionEnergyCarriers = EnumSet.copyOf(v_activeProductionEnergyCarriers);
@@ -507,6 +510,51 @@ public double getPeakFeedin_kW() {
return peakFeedin_kW;
}
+ public Pair getFlexPotential() {
+ // Check if capacity is known
+ Double possibleGrowthFactor_fr;
+ Double requiredBatteryCapacity_kWh;
+ if (connectionMetaData.contractedDeliveryCapacityKnown) {
+ // Find day with max capacity utilisation
+ ZeroAccumulator acc_dailyAvgElectricityConsumption_kW = am_dailyAverageConsumptionAccumulators_kW.get(OL_EnergyCarriers.ELECTRICITY);
+ ZeroAccumulator acc_dailyAvgElectricityProduction_kW = am_dailyAverageProductionAccumulators_kW.get(OL_EnergyCarriers.ELECTRICITY);
+ ZeroAccumulator acc_dailyAvgNettElectricityDelivery_kW = acc_dailyAvgElectricityConsumption_kW.subtract(acc_dailyAvgElectricityProduction_kW);
+ double[] dailyAvgs_kW = acc_dailyAvgNettElectricityDelivery_kW.getTimeSeries_kW();
+
+ int maxDay = 0;
+ for (int i = 0; i < dailyAvgs_kW.length; i++) {
+ maxDay = dailyAvgs_kW[i] > dailyAvgs_kW[maxDay] ? i : maxDay;
+ }
+ traceln("Max day: %s, average power %s kW", maxDay, dailyAvgs_kW[maxDay]);
+ // Maximum growth is when dailyAvg delivery would be equal to contracted delivery capacity.
+ possibleGrowthFactor_fr = connectionMetaData.contractedDeliveryCapacity_kW / dailyAvgs_kW[maxDay];
+ if ( possibleGrowthFactor_fr < 1.0) {
+ traceln("Already overutilising contracted delivery capacity over one day!! Probably an infeasible results...Growth factor: %s", possibleGrowthFactor_fr);
+ requiredBatteryCapacity_kWh = 0.0;
+ } else {
+ traceln("possibleGrowth: %s ", possibleGrowthFactor_fr);
+ double[] dayProfile_kW = Arrays.copyOfRange(am_totalBalanceAccumulators_kW.get(OL_EnergyCarriers.ELECTRICITY).getTimeSeries_kW(),roundToInt(24.0/timeStep_h * maxDay), roundToInt(24.0/timeStep_h * (maxDay+1)));
+ double[] dayProfileScaled_kW = ZeroMath.arrayMultiply(dayProfile_kW, possibleGrowthFactor_fr);
+ double[] SoC_kWh = new double[roundToInt(24/timeStep_h)+1];
+ double minSoC_kWh = 0.0;
+ double maxSoC_kWh = 0.0;
+ for(int i = 0; i < roundToInt(24/timeStep_h); i++) {
+ SoC_kWh[i+1] = SoC_kWh[i] + (dayProfileScaled_kW[i] - possibleGrowthFactor_fr * dailyAvgs_kW[maxDay] ) * timeStep_h;
+ minSoC_kWh = min(minSoC_kWh, SoC_kWh[i+1]);
+ maxSoC_kWh = max(maxSoC_kWh, SoC_kWh[i+1]);
+ }
+ requiredBatteryCapacity_kWh = maxSoC_kWh - minSoC_kWh;
+ traceln("Battery size to allow growth: %s kWh", requiredBatteryCapacity_kWh);
+ }
+ } else {
+ traceln("Gridconnection contracted delivery capacity unknown!");
+ possibleGrowthFactor_fr = null;
+ requiredBatteryCapacity_kWh = 0.0;
+ }
+
+ return new Pair(possibleGrowthFactor_fr, requiredBatteryCapacity_kWh);
+ }
+
public double getTotalElectricityConsumed_MWh() {
return am_dailyAverageConsumptionAccumulators_kW.get(OL_EnergyCarriers.ELECTRICITY).getIntegral_MWh();
}