Skip to content

Commit f477c3d

Browse files
authored
Merge pull request #136 from Zenmo/UpdateCurtailmentModes
Update curtailment modes and f_batteryManagementSelfConsumption (replacing f_batteryManagementSimple)
2 parents e02484f + b007357 commit f477c3d

File tree

6 files changed

+37
-88
lines changed

6 files changed

+37
-88
lines changed

Zero_engine.alpx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,7 @@
971971
</Option>
972972
<Option>
973973
<Id>1725879557284</Id>
974-
<Name><![CDATA[SIMPLE]]></Name>
974+
<Name><![CDATA[SELF_CONSUMPTION]]></Name>
975975
</Option>
976976
<Option>
977977
<Id>1734001947459</Id>
@@ -1103,7 +1103,11 @@
11031103
</Option>
11041104
<Option>
11051105
<Id>1722411204922</Id>
1106-
<Name><![CDATA[PRICE]]></Name>
1106+
<Name><![CDATA[MARKETPRICE]]></Name>
1107+
</Option>
1108+
<Option>
1109+
<Id>1742810522883</Id>
1110+
<Name><![CDATA[NODALPRICING]]></Name>
11071111
</Option>
11081112
</OptionList>
11091113
<OptionList>

_alp/Agents/EnergyModel/Code/Functions.java

Lines changed: 4 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -401,8 +401,8 @@ null, roundToDecimal( a.v_electricityImported_kWh-a.v_electricityExported_kWh, 2
401401
{/*ALCODESTART::1664952601107*/
402402
b_isDaytime = t_h % 24 > 6 && t_h % 24 < 18;
403403
b_isWeekday = (t_h+(v_dayOfWeek1jan-1)*24) % (24*7) < (24*5);
404-
b_isSummerWeek = t_h >= p_startHourSummerWeek && t_h < p_startHourSummerWeek + 24*7;
405-
b_isWinterWeek = t_h >= p_startHourWinterWeek && t_h < p_startHourWinterWeek + 24*7;
404+
b_isSummerWeek = (t_h % 8760) >= p_startHourSummerWeek && (t_h % 8760) < p_startHourSummerWeek + 24*7;
405+
b_isWinterWeek = (t_h % 8760) >= p_startHourWinterWeek && (t_h % 8760) < p_startHourWinterWeek + 24*7;
406406
b_isLastTimeStepOfDay = t_h % 24 == (24-p_timeStep_h);
407407
t_hourOfDay = t_h % 24; // Assumes modelrun starts at midnight.
408408

@@ -1255,8 +1255,6 @@ null, roundToDecimal( a.v_electricityImported_kWh-a.v_electricityExported_kWh, 2
12551255
traceln("Energy export: "+ v_totalEnergyExport_MWh + " MWh");
12561256

12571257
// *** Total energy balance ***
1258-
//double electricityProduced_MWh = 0;
1259-
//double totalDistanceTrucks_km = 0;
12601258
double deltaThermalEnergySinceStart_MWh = 0;
12611259
double totalAmbientHeating_MWh = 0;
12621260
double totalEnergyCurtailed_MWh = 0;
@@ -1266,18 +1264,8 @@ null, roundToDecimal( a.v_electricityImported_kWh-a.v_electricityExported_kWh, 2
12661264
double totalHeatProduced_MWh = 0;
12671265
for (J_EA e : c_energyAssets) {
12681266
if (((GridConnection) e.getParentAgent()).v_isActive ) {
1269-
12701267
double EnergyUsed_kWh = e.getEnergyUsed_kWh();
1271-
//double electricityProduced_kWh = 0;
1272-
1273-
//energyConsumed_MWh += max(0,EnergyUsed_kWh)/1000;
1274-
//energyProduced_MWh +=max(0,-EnergyUsed_kWh)/1000;
12751268
if (EnergyUsed_kWh > 0) {
1276-
1277-
/*if (e instanceof J_EAConversionCurtailer || e instanceof J_EAConversionCurtailerHeat) {
1278-
totalEnergyProduced_MWh -= EnergyUsed_kWh/1000;
1279-
totalEnergyCurtailed_MWh += EnergyUsed_kWh/1000;
1280-
} else */
12811269
if( e instanceof J_EAConversionGasCHP ) {
12821270
totalEnergyUsed_MWh += EnergyUsed_kWh/1000;
12831271
//electricityProduced_kWh = ((J_EAConversionGasCHP)e).getElectricityProduced_kWh();
@@ -1291,9 +1279,6 @@ null, roundToDecimal( a.v_electricityImported_kWh-a.v_electricityExported_kWh, 2
12911279
deltaThermalEnergySinceStart_MWh += ((J_EABuilding)e).getRemainingHeatBufferHeat_kWh() / 1000;
12921280
}
12931281
} else {
1294-
/*if( e.energyAssetType == OL_EnergyAssetType.PHOTOVOLTAIC || e.energyAssetType == OL_EnergyAssetType.WINDMILL){
1295-
electricityProduced_MWh -= EnergyUsed_kWh/1000;
1296-
}*/
12971282
totalEnergyProduced_MWh -= EnergyUsed_kWh/1000;
12981283
if ( e instanceof J_EABuilding ) {
12991284
traceln("Building has produced more energy than it has used?? Is lossfactor too low?");
@@ -1314,16 +1299,10 @@ null, roundToDecimal( a.v_electricityImported_kWh-a.v_electricityExported_kWh, 2
13141299
}
13151300
double v_totalDeltaStoredEnergy_MWh = v_batteryStoredEnergyDeltaSinceStart_MWh + deltaThermalEnergySinceStart_MWh; // Positive number means more energy stored at the end of the simulation.
13161301

1317-
1318-
1319-
//traceln("Trucks have traveled " + totalDistanceTrucks_km + " km");
1320-
13211302
//Total selfconsumption, selfsufficiency
1322-
13231303
v_totalEnergySelfConsumed_MWh = v_totalEnergyConsumed_MWh - (v_totalEnergyImport_MWh + max(0,-v_totalDeltaStoredEnergy_MWh)); // Putting positive delta-stored energy here assumes this energy was imported as opposed to self-produced. Putting negative delta-stored energy here assumes this energy was self-consumed, as opposed to exported.
13241304
//v_totalSelfConsumedEnergy_MWh = totalEnergyUsed_MWh - (v_totalImportedEnergy_MWh + max(0,-v_totalDeltaStoredEnergy_MWh)); // Putting positive delta-stored energy here assumes this energy was imported as opposed to self-produced. Putting negative delta-stored energy here assumes this energy was self-consumed, as opposed to exported.
13251305

1326-
13271306
// Export and production-based selfconsumption
13281307
if ( v_totalEnergyProduced_MWh > 0 ){
13291308
v_modelSelfConsumption_fr = v_totalEnergySelfConsumed_MWh / v_totalEnergyProduced_MWh;
@@ -1351,8 +1330,8 @@ null, roundToDecimal( a.v_electricityImported_kWh-a.v_electricityExported_kWh, 2
13511330
// Remaining difference due to different temps of houses start vs end?
13521331
traceln("");
13531332
for (OL_EnergyCarriers EC : v_activeEnergyCarriers) {
1354-
traceln("Import " + EC.toString() + ": " + v_rapidRunData.am_totalBalanceAccumulators_kW.get(EC).getIntegralPos_kWh()/1000 + " MWh");
1355-
traceln("Export " + EC.toString() + ": " + v_rapidRunData.am_totalBalanceAccumulators_kW.get(EC).getIntegralNeg_kWh()/1000 + " MWh");
1333+
traceln("Import " + EC.toString() + ": " + v_rapidRunData.getTotalImport_MWh(EC) + " MWh");
1334+
traceln("Export " + EC.toString() + ": " + v_rapidRunData.getTotalExport_MWh(EC) + " MWh");
13561335
}
13571336

13581337
traceln("");
@@ -1377,36 +1356,6 @@ null, roundToDecimal( a.v_electricityImported_kWh-a.v_electricityExported_kWh, 2
13771356

13781357
}
13791358

1380-
/*
1381-
traceln( "import electricity: " + v_totalElectricityImport_MWh + " MWh");
1382-
traceln( "export electricity: " + v_totalElectricityExport_MWh + " MWh");
1383-
traceln( "nett import methane: " + (v_totalMethaneImport_MWh-v_totalMethaneExport_MWh) + " MWh");
1384-
traceln( "import diesel: " + v_totalDieselImport_MWh + " MWh");
1385-
traceln( "nett import hydrogen: " + (v_totalHydrogenImport_MWh-v_totalHydrogenExport_MWh) + " MWh");
1386-
*/
1387-
1388-
/*// intStream.parallel experiment works to extract daytime consumption! Now benchmark performance...
1389-
double daytimeEnergyUsed_MWh = IntStream.range(0, a_annualDaytimeIdxs.length).parallel().mapToDouble(idx -> a_annualEnergyConsumption_kW[idx]*a_annualDaytimeIdxs[idx]).sum()*p_timeStep_h/1000;
1390-
traceln("v_daytimeEnergyUsed_MWh: %s, daytimeEnergyUsed_MWh: %s", v_daytimeEnergyUsed_MWh, daytimeEnergyUsed_MWh);
1391-
*/
1392-
/*for (int i = 0; i<365; i++) { // Check if accumulator with signal resolution different from timestep still gives consistent results
1393-
if (abs(data_annualElectricityDemand_MWh.getY(i) - acc_annualDailyElectricityDemand_MWh.getTimeSeries()[i]) > 0.0001) {
1394-
traceln("Dataset and accumulator don't agree about daily electricity demand on day no. %s, dataset value: %s, accumulator value: %s", i, data_annualElectricityDemand_MWh.getY(i), acc_annualDailyElectricityDemand_MWh.getTimeSeries()[i]);
1395-
}
1396-
}*/
1397-
1398-
/*if ( abs(acc_annualElectricityBalanceDownsampled_kW.getIntegral()-acc_annualElectricityBalance_kW.getIntegral()) > 0.1 ) { // Check if reduced resolution accumulator gives same integral result!
1399-
traceln("Accumulators with different signal resolution DON'T agree on integral: full-res integral: %s, low-res integral: %s", acc_annualElectricityBalanceDownsampled_kW.getIntegral(), acc_annualElectricityBalance_kW.getIntegral());
1400-
} else {
1401-
traceln("Accumulators with different signal resolution AGREE on integral: full-res integral: %s, low-res integral: %s", acc_annualElectricityBalanceDownsampled_kW.getIntegral(), acc_annualElectricityBalance_kW.getIntegral());
1402-
}*/
1403-
1404-
//double nettElectricityArray_kWh = Arrays.stream( a_annualElectricityBalance_kW ).sum() * p_timeStep_h / 1000;
1405-
//double nettElectricityAccumulator_kWh = acc_annualElectricityBalance_kW.getSum() * p_timeStep_h / 1000;
1406-
//double importElectricityAccumulator_kWh = acc_annualElectricityBalance_kW.getSumPos() * p_timeStep_h / 1000;
1407-
//traceln("Test ZeroAccumulator: importElectricityAccumulator_kWh: %s kWh, nettElectricityAccumulator_kWh: %s kWh", importElectricityAccumulator_kWh, nettElectricityAccumulator_kWh);
1408-
1409-
14101359
/*ALCODEEND*/}
14111360

14121361
double f_resetAnnualValues()

_alp/Agents/GCUtility/Code/Functions.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
case BALANCE:
1515
f_batteryManagementBalance(p_batteryAsset.getCurrentStateOfCharge());
1616
break;
17-
case SIMPLE:
18-
f_batteryManagementSimple();
17+
case SELF_CONSUMPTION:
18+
f_batteryManagementSelfConsumption();
1919
break;
2020
case PRICE:
2121
f_batteryManagementPrice(p_batteryAsset.getCurrentStateOfCharge());

_alp/Agents/GridConnection/Code/Functions.java

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1928,7 +1928,19 @@ else if (j_ea.energyAssetType == OL_EnergyAssetType.CHP) {
19281928
}
19291929
}
19301930
break;
1931-
case PRICE:
1931+
case MARKETPRICE:
1932+
if(energyModel.pp_dayAheadElectricityPricing_eurpMWh.getCurrentValue() < 0.0) {
1933+
if (fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) < 0.0) { // Feedin, bring to zero!
1934+
for (J_EAProduction j_ea : c_productionAssets) {
1935+
j_ea.curtailElectricityProduction( - fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY));
1936+
if (!(fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) < 0.0)) {
1937+
break;
1938+
}
1939+
}
1940+
}
1941+
}
1942+
break;
1943+
case NODALPRICING:
19321944
// Prevent feedin when nodal price is negative
19331945
double priceTreshold_eur = -0.0;
19341946
if(l_parentNodeElectric.getConnectedAgent().v_currentTotalNodalPrice_eurpkWh < priceTreshold_eur) {
@@ -2526,28 +2538,12 @@ else if (flowsMap.get(EC) > 0){
25262538

25272539
/*ALCODEEND*/}
25282540

2529-
double f_batteryManagementSimple()
2541+
double f_batteryManagementSelfConsumption()
25302542
{/*ALCODESTART::1725629047745*/
2531-
//traceln("Battery storage capacity: " + ((J_EAStorageElectric)p_batteryAsset.j_ea).getStorageCapacity_kWh());
25322543
if (p_batteryAsset.getStorageCapacity_kWh() != 0){
2533-
2534-
double safetyMargin_fr = 0.95; // fraction of connection capacity that we use
2535-
double power_fr = 0;
2536-
double capacityElectric_kW = p_batteryAsset.getCapacityElectric_kW();
2537-
2538-
if (fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) > v_liveConnectionMetaData.contractedFeedinCapacity_kW * safetyMargin_fr) {
2539-
// discharge
2540-
double dischargeNeeded_kW = fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) - v_liveConnectionMetaData.contractedFeedinCapacity_kW * safetyMargin_fr;
2541-
power_fr = - dischargeNeeded_kW / capacityElectric_kW;
2542-
}
2543-
else if (fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) < v_liveConnectionMetaData.contractedDeliveryCapacity_kW * safetyMargin_fr) {
2544-
// charge
2545-
double chargeAvailable_kW = v_liveConnectionMetaData.contractedDeliveryCapacity_kW * safetyMargin_fr - fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY);
2546-
power_fr = chargeAvailable_kW / capacityElectric_kW;
2547-
}
2548-
2549-
2550-
p_batteryAsset.v_powerFraction_fr = max(-1,min(1, power_fr));
2544+
double chargeSetpoint_kW = - fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY);
2545+
// limit charging power to battery max power.
2546+
p_batteryAsset.v_powerFraction_fr = max(-1,min(1, chargeSetpoint_kW / p_batteryAsset.getCapacityElectric_kW()));
25512547
}
25522548
/*ALCODEEND*/}
25532549

_alp/Agents/GridConnection/Code/Functions.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -729,9 +729,9 @@
729729
<ReturnModificator>VOID</ReturnModificator>
730730
<ReturnType>double</ReturnType>
731731
<Id>1725629047745</Id>
732-
<Name><![CDATA[f_batteryManagementSimple]]></Name>
733-
<X>1230</X>
734-
<Y>820</Y>
732+
<Name><![CDATA[f_batteryManagementSelfConsumption]]></Name>
733+
<X>920</X>
734+
<Y>260</Y>
735735
<Label>
736736
<X>10</X>
737737
<Y>0</Y>

_alp/Agents/GridNode/Code/Functions.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,22 +117,22 @@
117117
data_totalLoad_kW.add(energyModel.t_h, v_currentLoad_kW);
118118
}
119119
// SummerWeek
120-
if (energyModel.t_h > energyModel.p_startHourSummerWeek && energyModel.t_h <= energyModel.p_startHourSummerWeek+24*7) {
120+
if (energyModel.b_isSummerWeek) {
121121
v_summerWeekImport_MWh += currentImport_MWh;
122122
v_summerWeekExport_MWh += currentExport_MWh;
123123
v_summerWeekExcessImport_MWh += currentExcessImport_MWh;
124124
v_summerWeekExcessExport_MWh += currentExcessExport_MWh;
125125

126-
data_summerWeekLoad_kW.add(energyModel.t_h, v_currentLoad_kW);
126+
data_summerWeekLoad_kW.add(energyModel.t_h-energyModel.p_runStartTime_h, v_currentLoad_kW);
127127
}
128128
// Winterweek
129-
if (energyModel.t_h > energyModel.p_startHourWinterWeek && energyModel.t_h <= energyModel.p_startHourWinterWeek+24*7) {
129+
if (energyModel.b_isWinterWeek) {
130130
v_winterWeekImport_MWh += currentImport_MWh;
131131
v_winterWeekExport_MWh += currentExport_MWh;
132132
v_winterWeekExcessImport_MWh += currentExcessImport_MWh;
133133
v_winterWeekExcessExport_MWh += currentExcessExport_MWh;
134134

135-
data_winterWeekLoad_kW.add(energyModel.t_h, v_currentLoad_kW);
135+
data_winterWeekLoad_kW.add(energyModel.t_h-energyModel.p_runStartTime_h, v_currentLoad_kW);
136136
}
137137
// Daytime
138138
if (energyModel.t_h % 24 > 6 && energyModel.t_h % 24 < 18) {
@@ -371,7 +371,7 @@
371371

372372
double f_calculateKPIs()
373373
{/*ALCODESTART::1713181018774*/
374-
//f_duurkrommes();
374+
f_getDuurkromme();
375375

376376
// Calcs nighttime
377377
v_nighttimeImport_MWh = v_totalImport_MWh - v_daytimeExcessImport_MWh;

0 commit comments

Comments
 (0)