Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions _alp/Agents/GridConnection/Levels/Level.level.xml
Original file line number Diff line number Diff line change
Expand Up @@ -960,4 +960,29 @@ energyModel.energyDataViewer.viewArea.navigateTo();</ActionCode>
<LabelText>View Data</LabelText>
</ExtendedProperties>
</Control>
<Control Type="Button">
<EmbeddedIcon>false</EmbeddedIcon>
<Id>1746437702494</Id>
<Name><![CDATA[button]]></Name>
<X>510</X>
<Y>-60</Y>
<Label>
<X>0</X>
<Y>-10</Y>
</Label>
<PublicFlag>true</PublicFlag>
<PresentationFlag>true</PresentationFlag>
<ShowLabel>false</ShowLabel>
<DrawMode>SHAPE_DRAW_2D3D</DrawMode>
<BasicProperties Width="100" Height="30">
<EmbeddedIcon>false</EmbeddedIcon>
<TextColor/>
<Enabled>true</Enabled>
<ActionCode>v_rapidRunData.getFlexPotential();</ActionCode>
</BasicProperties>
<ExtendedProperties>
<Font Name="Dialog" Size="11" Style="0"/>
<LabelText>notBenuttingsgraad</LabelText>
</ExtendedProperties>
</Control>
</Presentation>
48 changes: 48 additions & 0 deletions _alp/Classes/Class.J_RapidRunData.java
Original file line number Diff line number Diff line change
@@ -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<OL_EnergyCarriers> activeEnergyCarriers;
public EnumSet<OL_EnergyCarriers> activeConsumptionEnergyCarriers;
public EnumSet<OL_EnergyCarriers> activeProductionEnergyCarriers;
Expand Down Expand Up @@ -129,6 +131,7 @@ public J_RapidRunData(Agent parentAgent) {
}

public void initializeAccumulators(double simDuration_h, double timeStep_h, EnumSet<OL_EnergyCarriers> v_activeEnergyCarriers, EnumSet<OL_EnergyCarriers> v_activeConsumptionEnergyCarriers, EnumSet<OL_EnergyCarriers> 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);
Expand Down Expand Up @@ -507,6 +510,51 @@ public double getPeakFeedin_kW() {
return peakFeedin_kW;
}

public Pair<Double, Double> 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();
}
Expand Down