From 7c1bd18a0389fccd41491c9570067ae4b10f7c86 Mon Sep 17 00:00:00 2001 From: Ate Hempenius Date: Fri, 10 Apr 2026 18:58:19 +0200 Subject: [PATCH 1/3] J_eastorage is no more abstract. removal of old classes, j_eaconversion more generic setup --- Zero_engine.alpx | 39 ++--- _alp/Classes/Class.J_EAConversion.java | 24 ++- .../Class.J_EAConversionElectrolyser.java | 7 - .../Class.J_EAConversionElektrolyser.java | 46 ------ .../Classes/Class.J_EAConversionFuelCell.java | 39 ----- _alp/Classes/Class.J_EAHydrogenVehicle.java | 137 ----------------- _alp/Classes/Class.J_EAProfile.java | 8 +- _alp/Classes/Class.J_EAStorage.java | 141 ++++++++++++++---- _alp/Classes/Class.J_EAStorageElectric.java | 62 ++++---- _alp/Classes/Class.J_EAStorageGas.java | 9 +- _alp/Classes/Class.J_EAVehicle.java | 70 --------- 11 files changed, 174 insertions(+), 408 deletions(-) delete mode 100644 _alp/Classes/Class.J_EAConversionElektrolyser.java delete mode 100644 _alp/Classes/Class.J_EAConversionFuelCell.java delete mode 100644 _alp/Classes/Class.J_EAHydrogenVehicle.java delete mode 100644 _alp/Classes/Class.J_EAVehicle.java diff --git a/Zero_engine.alpx b/Zero_engine.alpx index 84c5d066..0d0ef54c 100644 --- a/Zero_engine.alpx +++ b/Zero_engine.alpx @@ -1,7 +1,7 @@ 1658477103134 @@ -365,6 +365,10 @@ 1773156171459 + 1659525715752 @@ -1084,6 +1088,10 @@ 1770132010080 + 1762354709855 @@ -1407,6 +1415,11 @@ LARGE_CONNECTION (grootverbruik, > 3x80) 1772100318398 + + 1775728951678 + + 1772100318398 + EULER @@ -1587,18 +1600,6 @@ LARGE_CONNECTION (grootverbruik, > 3x80) true 1752737189062 - - 1668600448637 - - true - 1752677832758 - - - 1671107396262 - - true - 1752677832758 - 1671522756085 @@ -1641,12 +1642,6 @@ LARGE_CONNECTION (grootverbruik, > 3x80) 1752681639768 - - 1692862773194 - - true - 1752677832758 - 1692876125447 @@ -1657,12 +1652,6 @@ LARGE_CONNECTION (grootverbruik, > 3x80) 1752677832758 - - 1707992650964 - - true - 1752677832758 - 1711009967838 diff --git a/_alp/Classes/Class.J_EAConversion.java b/_alp/Classes/Class.J_EAConversion.java index 018b15cb..2fd7c332 100644 --- a/_alp/Classes/Class.J_EAConversion.java +++ b/_alp/Classes/Class.J_EAConversion.java @@ -7,6 +7,9 @@ public class J_EAConversion extends zero_engine.J_EAFlex implements Serializable protected double eta_r; protected double inputCapacity_kW; protected double outputCapacity_kW; + + private OL_AssetFlowCategories inputAssetFlowCategory; + private OL_AssetFlowCategories outputAssetFlowCategory; /** * Default constructor */ @@ -16,8 +19,18 @@ public J_EAConversion() { /** * Constructor initializing the fields, and setting assetFlowCatagory (Assetflowcatagory is filled with OUTPUT product of the conversion!) */ - public J_EAConversion(I_AssetOwner owner, OL_EnergyAssetType energyAssetType, double outputCapacity_kW, double efficiency_r, OL_EnergyCarriers energyCarrierProduced, OL_EnergyCarriers energyCarrierConsumed, OL_AssetFlowCategories assetFlowCatagory, J_TimeParameters timeParameters) { - this.assetFlowCategory = assetFlowCatagory; + public J_EAConversion(I_AssetOwner owner, OL_EnergyAssetType energyAssetType, double outputCapacity_kW, double efficiency_r, OL_EnergyCarriers energyCarrierProduced, OL_EnergyCarriers energyCarrierConsumed, OL_AssetFlowCategories inputAssetFlowCategory, OL_AssetFlowCategories outputAssetFlowCategory, J_TimeParameters timeParameters) { + if(inputAssetFlowCategory != null && outputAssetFlowCategory != null) { + throw new RuntimeException("Trying to assign 2 assetflow catagories to a J_EAConversion, this is not allowed (YET)!!. Only an Input OR an output Assetflow is supported."); + } + if(inputAssetFlowCategory != null) { + this.inputAssetFlowCategory = inputAssetFlowCategory; + this.assetFlowCategory = outputAssetFlowCategory; + } + else if(outputAssetFlowCategory != null) { + this.outputAssetFlowCategory = outputAssetFlowCategory; + this.assetFlowCategory = outputAssetFlowCategory; + } construct(owner, energyAssetType, outputCapacity_kW, efficiency_r, energyCarrierProduced, energyCarrierConsumed, timeParameters); } @@ -66,7 +79,12 @@ public void operate(double powerFraction_fr, J_TimeVariables timeVariables) { this.flowsMap.put(this.energyCarrierConsumed, powerFraction_fr * this.inputCapacity_kW); this.flowsMap.addFlow(this.energyCarrierProduced, -powerFraction_fr * this.outputCapacity_kW); // We don't put here, in case the energy carrier is the same if (this.assetFlowCategory != null) { - this.assetFlowsMap.put(this.assetFlowCategory, powerFraction_fr * this.outputCapacity_kW); + if(this.inputAssetFlowCategory != null) { + this.assetFlowsMap.put(this.assetFlowCategory, powerFraction_fr * this.inputCapacity_kW); + } + else if(this.outputAssetFlowCategory != null) { + this.assetFlowsMap.put(this.assetFlowCategory, powerFraction_fr * this.outputCapacity_kW); + } } } diff --git a/_alp/Classes/Class.J_EAConversionElectrolyser.java b/_alp/Classes/Class.J_EAConversionElectrolyser.java index a4f9b733..cb81df7c 100644 --- a/_alp/Classes/Class.J_EAConversionElectrolyser.java +++ b/_alp/Classes/Class.J_EAConversionElectrolyser.java @@ -131,11 +131,4 @@ public String toString() { + "with efficiency: " + this.eta_r + ", " + "Current output: " + -this.getLastFlows().get(this.energyCarrierProduced) + " kW"; } - - /** - * 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_EAConversionElektrolyser.java b/_alp/Classes/Class.J_EAConversionElektrolyser.java deleted file mode 100644 index 8dd48117..00000000 --- a/_alp/Classes/Class.J_EAConversionElektrolyser.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * J_EAConversionElektrolyser - */ -public class J_EAConversionElektrolyser extends zero_engine.J_EAConversion implements Serializable { - - /** - /** - * Default constructor - */ - public J_EAConversionElektrolyser() { - } - - /** - * Constructor initializing the fields - */ - - public J_EAConversionElektrolyser(Agent parentAgent, double inputElectricCapacity_kW, double efficiency_r, double timestep_h) { - this.parentAgent = parentAgent; - this.inputCapacity_kW = inputElectricCapacity_kW; - this.eta_r = efficiency_r; - this.outputCapacity_kW = this.inputCapacity_kW * this.eta_r; - this.timestep_h = timestep_h; - - this.energyAssetType = OL_EnergyAssetType.ELECTROLYSER; - - this.energyCarrierProduced = OL_EnergyCarriers.HYDROGEN; - this.energyCarrierConsumed = OL_EnergyCarriers.ELECTRICITY; - - this.activeProductionEnergyCarriers.add(this.energyCarrierProduced); - this.activeConsumptionEnergyCarriers.add(this.energyCarrierConsumed); - registerEnergyAsset(); - } - - @Override - public void setEta_r( double efficiency_r) { - this.eta_r = efficiency_r; - this.outputCapacity_kW = this.inputCapacity_kW * this.eta_r; - } - - /** - * 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_EAConversionFuelCell.java b/_alp/Classes/Class.J_EAConversionFuelCell.java deleted file mode 100644 index eda97867..00000000 --- a/_alp/Classes/Class.J_EAConversionFuelCell.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * J_EAConversionFuelCell - */ -public class J_EAConversionFuelCell extends zero_engine.J_EAConversion implements Serializable { - - /** - /** - * Default constructor - */ - public J_EAConversionFuelCell() { - } - - /** - * Constructor initializing the fields - */ - - public J_EAConversionFuelCell(Agent parentAgent, double outputElectricCapacity_kW, double efficiency_r, double timestep_h) { - this.parentAgent = parentAgent; - this.outputCapacity_kW = outputElectricCapacity_kW; - this.eta_r = efficiency_r; - this.inputCapacity_kW = this.outputCapacity_kW / this.eta_r; - this.timestep_h = timestep_h; - - this.energyAssetType = OL_EnergyAssetType.FUEL_CELL; - - this.energyCarrierProduced = OL_EnergyCarriers.ELECTRICITY; - this.energyCarrierConsumed = OL_EnergyCarriers.HYDROGEN; - this.activeProductionEnergyCarriers.add(this.energyCarrierProduced); - this.activeConsumptionEnergyCarriers.add(this.energyCarrierConsumed); - registerEnergyAsset(); - } - - /** - * 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_EAHydrogenVehicle.java b/_alp/Classes/Class.J_EAHydrogenVehicle.java deleted file mode 100644 index 2418cb5f..00000000 --- a/_alp/Classes/Class.J_EAHydrogenVehicle.java +++ /dev/null @@ -1,137 +0,0 @@ -/** - * J_EAConversionHydrogenVehicle - */ -public class J_EAHydrogenVehicle extends J_EAVehicle implements Serializable { - - private OL_EnergyCarriers energyCarrierConsumed = OL_EnergyCarriers.HYDROGEN; - - /** - * Default constructor - */ - public J_EAHydrogenVehicle() { - } - - /** - * Constructor initializing the fields - */ - public J_EAHydrogenVehicle(Agent ownerAssetAgent, double energyConsumption_kWhpkm, J_TimeParameters timeParameters, double vehicleScaling, OL_EnergyAssetType energyAssetType, J_ActivityTrackerTrips tripTracker) { - this(ownerAssetAgent, energyConsumption_kWhpkm, timeParameters, vehicleScaling, energyAssetType, tripTracker, true); - } - public J_EAHydrogenVehicle(Agent ownerAssetAgent, double energyConsumption_kWhpkm, J_TimeParameters timeParameters, double vehicleScaling, OL_EnergyAssetType energyAssetType, J_ActivityTrackerTrips tripTracker, boolean available) { - this.parentAgent = ownerAssetAgent; - this.energyConsumption_kWhpkm = energyConsumption_kWhpkm; - this.timeParameters = timeParameters; - this.vehicleScaling = vehicleScaling; - this.energyAssetType = energyAssetType; - this.tripTracker = tripTracker; - this.available = available; - if (tripTracker != null) { - tripTracker.Vehicle=this; - } - this.activeConsumptionEnergyCarriers.add(this.energyCarrierConsumed); - registerEnergyAsset(); - } - - //@Override - public void f_updateAllFlows() { - - flowsMap.put(OL_EnergyCarriers.HYDROGEN, this.energyUse_kW); - - if (parentAgent instanceof GridConnection) { - ((GridConnection)parentAgent).f_addFlows(flowsMap, this.energyUse_kW, assetFlowsMap, this); - } - this.lastFlowsMap = flowsMap; - this.lastEnergyUse_kW = this.energyUse_kW; - //Pair flowspair = new Pair(this.flowsMap, this.energyUse_kW); - clear(); - //return this.flowsMap; - } - - /*public double[] operate(double ratioOfChargeCapacity_r) { - return returnEnergyFlows(); - }*/ - - @Override - public boolean startTrip(J_TimeVariables timeVariables) { - if (available) { - available = false; - //traceln("Hydrogen vehicle starting trip!"); - return true; - } else { - traceln("Trip not started because vehicle not available!"); - return false; // Trip not started because vehicle not available! - } - } - - @Override - public boolean endTrip(double tripDist_km) { - - if(available) { - traceln("Trip not ended because vehicle never left!"); - return false; - } else { - available = true; - //traceln("Hydrogen vehicle finished trip!"); - return true; - - } - //traceln("Current milage: " + mileage + ", energy consumption per km: " + energyConsumption_kWhpkm); - } - - public boolean progressTrip(double marginalTripDist_km) { - if( available) { - traceln("Trip not updated because vehicle never left!"); - return false; - } - else { - mileage_km += marginalTripDist_km; - double energyUsedThisTimestep_kWh = marginalTripDist_km * vehicleScaling * energyConsumption_kWhpkm; - energyUsed_kWh += energyUsedThisTimestep_kWh; - //hydrogenConsumption_kW = energyUsedThisTimestep_kWh / timestep_h; - energyUse_kW += energyUsedThisTimestep_kWh / timestep_h; - return true; - } - } - - public double getEnergyUsed_kWh() { - return energyUsed_kWh; - } - - public boolean getAvailability() { - return available; - } - - @Override - public void storeStatesAndReset() { - // Each energy asset that has some states should overwrite this function! - energyUsedStored_kWh = energyUsed_kWh; - energyUsed_kWh = 0.0; - availableStored = available; - available = true; - mileage_km = 0; - clear(); - } - - @Override - public void restoreStates() { - // Each energy asset that has some states should overwrite this function! - energyUsed_kWh = energyUsedStored_kWh; - available = availableStored; - } - - - @Override - public String toString() { - return - "parentAgent = " + parentAgent +" " + - "energyConsumption_kWhpkm =" + energyConsumption_kWhpkm +" " + - "vehicleScaling = " + vehicleScaling; - } - - /** - * 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_EAProfile.java b/_alp/Classes/Class.J_EAProfile.java index 57666771..c0aaa0a8 100644 --- a/_alp/Classes/Class.J_EAProfile.java +++ b/_alp/Classes/Class.J_EAProfile.java @@ -2,7 +2,7 @@ /** * J_EAProfile */ -public class J_EAProfile extends zero_engine.J_EAFixed implements Serializable { +public class J_EAProfile extends zero_engine.J_EAFixed{ protected J_ProfilePointer profilePointer; protected double profileUnitScaler_r = 4.0; // This factor translates tablefunction data in kWh/qh, normalized power or consumption-fraction into power [kW]. To go from kWh/qh to kW, that is a factor 4. protected OL_EnergyCarriers energyCarrier; // = OL_EnergyCarriers.ELECTRICITY; @@ -145,10 +145,4 @@ public String toString() { "owner = " + this.getOwner() +", Energy consumed = " + this.energyUsed_kWh + "assetFlowCategory = " + this.assetFlowCategory + " "; } - - /** - * 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; } diff --git a/_alp/Classes/Class.J_EAStorage.java b/_alp/Classes/Class.J_EAStorage.java index 6e9c2ab7..cfe0dc72 100644 --- a/_alp/Classes/Class.J_EAStorage.java +++ b/_alp/Classes/Class.J_EAStorage.java @@ -1,38 +1,130 @@ /** * J_EAStorage */ -public abstract class J_EAStorage extends J_EAFlex implements Serializable { +public class J_EAStorage extends J_EAFlex { protected OL_EnergyCarriers storageMedium; protected double storageCapacity_kWh; + protected double chargeCapacity_kW; + protected double etaCharge_r; + protected double etaDischarge_r; protected double stateOfCharge_fr; - protected double initialstateOfCharge_fr; + protected double initialStateOfCharge_fr; protected double stateOfChargeStored_r; - //protected double lossFactor_r; - //protected double ambientTemperature_degC; - //protected String ambientTempType; protected double discharged_kWh = 0; protected double charged_kWh = 0; /** - * Default constructor + * Default constructor for serialization */ public J_EAStorage() { } + + /** + * Default constructor + */ + public J_EAStorage(I_AssetOwner owner, OL_EnergyAssetType energyAssetType, OL_EnergyCarriers storageMedium, double chargeCapacity_kW, double storageCapacity_kWh, double roundTripEfficiency_fr, double initialStateOfCharge_fr, J_TimeParameters timeParameters ) { + this.setOwner(owner); + this.energyAssetType = energyAssetType; + this.storageMedium = storageMedium; + this.chargeCapacity_kW = chargeCapacity_kW; + this.storageCapacity_kWh = storageCapacity_kWh; + this.setRoundTripEfficiency_r(roundTripEfficiency_fr); + this.initialStateOfCharge_fr = initialStateOfCharge_fr; + this.stateOfCharge_fr = initialStateOfCharge_fr; + this.timeParameters = timeParameters; + + this.activeProductionEnergyCarriers.add(storageMedium); + this.activeConsumptionEnergyCarriers.add(storageMedium); + registerEnergyAsset(timeParameters); + } - //public abstract double calculateLoss(); - + @Override + public void operate(double powerFraction_fr, J_TimeVariables timeVariables) { + double inputPower_kW = powerFraction_fr * chargeCapacity_kW; // Positive power going into Storage, Negative if going out. + + double deltaEnergy_kWh; //Change in contents of storage + + // charging/discharging losses + if (inputPower_kW > 0) { // charging (the storage 'consumes' energy) + deltaEnergy_kWh = etaCharge_r * inputPower_kW * timeParameters.getTimeStep_h(); // Actual change of energy content of battery after losses. deltaEnergy_kWh is smaller than inputPower_kW * timestep_h! + } else { // discharging (the storage 'produces' energy) + deltaEnergy_kWh = inputPower_kW / etaDischarge_r * timeParameters.getTimeStep_h(); // Actual change of energy content of battery after losses. deltaEnergy_kWh is larger than inputPower_kW * timestep_h! + } + + // Limit SoC to feasible range (0-1) + deltaEnergy_kWh = - min( -deltaEnergy_kWh, (stateOfCharge_fr * storageCapacity_kWh) ); // Prevent negative charge + deltaEnergy_kWh = min(deltaEnergy_kWh, (1 - stateOfCharge_fr) * storageCapacity_kWh ); // Prevent overcharge + + //Set the final remaining flows + double storageInput_kW = 0; + double storageOutput_kW = 0; + if (deltaEnergy_kWh > 0) { // charging, deltaEnergy_kWh and inputPower_kW positive + inputPower_kW = deltaEnergy_kWh / timeParameters.getTimeStep_h() / etaCharge_r; + storageInput_kW = inputPower_kW; + storageOutput_kW = 0; + energyUse_kW = (1-etaCharge_r)*inputPower_kW; + } else { // discharging, deltaEnergy_kWh and inputPower_kW negative + inputPower_kW = deltaEnergy_kWh / timeParameters.getTimeStep_h() * etaDischarge_r; + storageInput_kW = 0; + storageOutput_kW = -inputPower_kW; + energyUse_kW = -deltaEnergy_kWh / timeParameters.getTimeStep_h() * (1-etaDischarge_r); + } + energyUsed_kWh += energyUse_kW * timeParameters.getTimeStep_h(); + + discharged_kWh += storageOutput_kW * timeParameters.getTimeStep_h(); // Not the change-in-SoC, but the energy flowing out of the battery after losses. + charged_kWh += storageInput_kW * timeParameters.getTimeStep_h(); // Not the change-in-SoC, but the energy flowing into the battery before losses. + + updateStateOfCharge( deltaEnergy_kWh ); + flowsMap.put(storageMedium, storageInput_kW-storageOutput_kW); + } + protected void updateStateOfCharge( double deltaEnergy_kWh ) { stateOfCharge_fr += deltaEnergy_kWh / storageCapacity_kWh; } + public void setRoundTripEfficiency_r(double roundTripEfficiency_r) { + if (roundTripEfficiency_r < 0 || roundTripEfficiency_r > 1) { + traceln("Infeasible eta_r! Should be larger than 0 and no larger than 1! Setting eta_r=1. Input value is: %s", roundTripEfficiency_r); + this.etaCharge_r = 1; + this.etaDischarge_r = 1; + } else { + this.etaCharge_r = Math.sqrt(roundTripEfficiency_r); + this.etaDischarge_r = Math.sqrt(roundTripEfficiency_r); + } + } + + public double getCurrentStateOfCharge_fr() { + return this.stateOfCharge_fr; + } + + public double getStorageCapacity_kWh() { + return this.storageCapacity_kWh; + } + + public double getChargeCapacity_kW() { + return this.chargeCapacity_kW; + } + + public double getCurrentStateOfCharge_kWh() { + return this.stateOfCharge_fr * this.storageCapacity_kWh; + } + + public double getChargingEfficiency_r() { + return this.etaCharge_r; + } + + public double getDischargingEfficiency_r() { + return this.etaDischarge_r; + } + @Override public void storeStatesAndReset() { // Each energy asset that has some states should overwrite this function! energyUsedStored_kWh = energyUsed_kWh; energyUsed_kWh = 0.0; stateOfChargeStored_r = stateOfCharge_fr; - stateOfCharge_fr = initialstateOfCharge_fr; + stateOfCharge_fr = initialStateOfCharge_fr; charged_kWh = 0; discharged_kWh = 0; clear(); @@ -44,30 +136,15 @@ public void restoreStates() { energyUsed_kWh = energyUsedStored_kWh; stateOfCharge_fr = stateOfChargeStored_r; } - - public double getCurrentStateOfCharge_fr() { - return this.stateOfCharge_fr; - } - - public double getStorageCapacity_kWh() { - return this.storageCapacity_kWh; - } - - public double getCurrentStateOfCharge_kWh() { - return this.stateOfCharge_fr * this.storageCapacity_kWh; - } - - /*@Override - public double getCurrentTemperature() { - return 0; - } - + @Override - public void updateAmbientTemperature(double currentAmbientTemperature_degC) { - }*/ - - @Override public String toString() { - return super.toString(); + return + "type = " + this.getClass().toString() + "\n" + + "stateOfCharge_fr = " + this.stateOfCharge_fr + "\n" + + "storageCapacity_kWh = " + this.storageCapacity_kWh + "\n" + + "chargeCapacity_kW = " + this.chargeCapacity_kW + "\n" + + "discharged_kWh " + this.discharged_kWh + "\n"+ + "charged_kWh " + this.charged_kWh + "\n"; } } \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAStorageElectric.java b/_alp/Classes/Class.J_EAStorageElectric.java index b0ee820d..b3a2bb6a 100644 --- a/_alp/Classes/Class.J_EAStorageElectric.java +++ b/_alp/Classes/Class.J_EAStorageElectric.java @@ -5,9 +5,9 @@ public class J_EAStorageElectric extends J_EAStorage implements Serializable { protected OL_EnergyCarriers storageMedium = OL_EnergyCarriers.ELECTRICITY; - protected double etaCharge_r; // charging efficiency - protected double etaDischarge_r; - protected double capacityElectric_kW; + //protected double etaCharge_r; // charging efficiency + //protected double etaDischarge_r; + //protected double capacityElectric_kW; /** * Default constructor @@ -18,13 +18,13 @@ public J_EAStorageElectric() { /** * Constructor initializing the fields */ - public J_EAStorageElectric(I_AssetOwner owner, double capacityElectric_kW, double storageCapacity_kWh, double stateOfCharge_fr, J_TimeParameters timeParameters ) { + public J_EAStorageElectric(I_AssetOwner owner, double chargeCapacity_kW, double storageCapacity_kWh, double stateOfCharge_fr, J_TimeParameters timeParameters ) { this.setOwner(owner); this.timeParameters = timeParameters; - this.capacityElectric_kW = capacityElectric_kW; + this.chargeCapacity_kW = chargeCapacity_kW; this.storageCapacity_kWh = storageCapacity_kWh; - this.initialstateOfCharge_fr = stateOfCharge_fr; - this.stateOfCharge_fr = this.initialstateOfCharge_fr; + this.initialStateOfCharge_fr = stateOfCharge_fr; + this.stateOfCharge_fr = this.initialStateOfCharge_fr; this.energyAssetType = OL_EnergyAssetType.STORAGE_ELECTRIC; double eta_r=0.9; // Default cycle efficiency of 90%. Add this as an argument to constructor? this.etaCharge_r = Math.sqrt(eta_r); @@ -37,7 +37,7 @@ public J_EAStorageElectric(I_AssetOwner owner, double capacityElectric_kW, doubl @Override public void operate(double ratioOfChargeCapacity_r, J_TimeVariables timeVariables) { - double inputPower_kW = ratioOfChargeCapacity_r * capacityElectric_kW; // Electric power going into battery, before losses. + double inputPower_kW = ratioOfChargeCapacity_r * chargeCapacity_kW; // Electric power going into battery, before losses. double deltaEnergy_kWh; // The change in energy stored in the battery this timestep ('internal' energy) // charging/discharging losses @@ -70,10 +70,9 @@ public void operate(double ratioOfChargeCapacity_r, J_TimeVariables timeVariable charged_kWh += electricityConsumption_kW * timeParameters.getTimeStep_h(); // Not the change-in-SoC, but the energy flowing into the battery before losses. updateStateOfCharge( deltaEnergy_kWh ); - //traceln("Battery SoC: %s", stateOfCharge_fr); + flowsMap.put(OL_EnergyCarriers.ELECTRICITY, electricityConsumption_kW-electricityProduction_kW); - //assetFlowsMap.put(this.assetFlowCategory, electricityConsumption_kW-electricityProduction_kW); - + // Split charging and discharing power 'at the source'! assetFlowsMap.put(OL_AssetFlowCategories.batteriesChargingPower_kW, electricityConsumption_kW); assetFlowsMap.put(OL_AssetFlowCategories.batteriesDischargingPower_kW, electricityProduction_kW); @@ -89,27 +88,11 @@ public void setBatteryEfficiency_r(double eta_r) { this.etaDischarge_r = Math.sqrt(eta_r); } } - - @Override - public String toString() { - return - "type = " + this.getClass().toString() + " " + - "stateOfCharge_fr = " + this.stateOfCharge_fr+" "+ - "storageCapacity_kWh = " + this.storageCapacity_kWh +" "+ - "capacityElectric_kW = " + this.capacityElectric_kW +" "+ - "discharged_kWh " + this.discharged_kWh+" "+ - "charged_kWh " + this.charged_kWh+" "; - } - - @Override - protected void updateStateOfCharge( double deltaEnergy_kWh ) { - stateOfCharge_fr += deltaEnergy_kWh / storageCapacity_kWh; - } - + public double getCapacityAvailable_kW() { double availableCapacity_kW; - if ( stateOfCharge_fr * storageCapacity_kWh > capacityElectric_kW * timeParameters.getTimeStep_h()) { - availableCapacity_kW = capacityElectric_kW; + if ( stateOfCharge_fr * storageCapacity_kWh > chargeCapacity_kW * timeParameters.getTimeStep_h()) { + availableCapacity_kW = chargeCapacity_kW; } else { availableCapacity_kW = stateOfCharge_fr * storageCapacity_kWh / timeParameters.getTimeStep_h(); // Allow to drain completely @@ -118,15 +101,15 @@ public double getCapacityAvailable_kW() { } public double getMaxChargePower_kW() { // Always a positive number! - return min(capacityElectric_kW, (1-stateOfCharge_fr) * storageCapacity_kWh / timeParameters.getTimeStep_h() / etaCharge_r); + return min(chargeCapacity_kW, (1-stateOfCharge_fr) * storageCapacity_kWh / timeParameters.getTimeStep_h() / etaCharge_r); } public double getMaxDischargePower_kW() { // Always a positive number! - return min(capacityElectric_kW, stateOfCharge_fr * storageCapacity_kWh / timeParameters.getTimeStep_h() * etaDischarge_r); + return min(chargeCapacity_kW, stateOfCharge_fr * storageCapacity_kWh / timeParameters.getTimeStep_h() * etaDischarge_r); } public double getCapacityElectric_kW() { - return this.capacityElectric_kW; + return this.chargeCapacity_kW; } public double getTotalChargeAmount_kWh() { @@ -153,6 +136,17 @@ public void setStorageCapacity_kWh(double storageCapacity_kWh, GridConnection gc } public void setCapacityElectric_kW(double capacityElectric_kW) { - this.capacityElectric_kW = capacityElectric_kW; + this.chargeCapacity_kW = capacityElectric_kW; + } + + @Override + public String toString() { + return + "type = " + this.getClass().toString() + "\n" + + "stateOfCharge_fr = " + this.stateOfCharge_fr + "\n" + + "storageCapacity_kWh = " + this.storageCapacity_kWh + "\n" + + "chargeCapacity_kW = " + this.chargeCapacity_kW + "\n" + + "discharged_kWh " + this.discharged_kWh + "\n"+ + "charged_kWh " + this.charged_kWh + "\n"; } } \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAStorageGas.java b/_alp/Classes/Class.J_EAStorageGas.java index e7f3f5e2..95ac323c 100644 --- a/_alp/Classes/Class.J_EAStorageGas.java +++ b/_alp/Classes/Class.J_EAStorageGas.java @@ -1,7 +1,7 @@ /** * J_EAStorageGas */ -public class J_EAStorageGas extends zero_engine.J_EAStorage implements Serializable { +public class J_EAStorageGas extends zero_engine.J_EAStorage { private OL_EnergyCarriers energyCarrier = OL_EnergyCarriers.METHANE; private double lossFactor_r = 0; @@ -83,12 +83,5 @@ public double getTotalChargeAmount_kWh() { public double getTotalDischargeAmount_kWh() { return discharged_kWh; } - - - /** - * 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; } diff --git a/_alp/Classes/Class.J_EAVehicle.java b/_alp/Classes/Class.J_EAVehicle.java deleted file mode 100644 index 73a8a68e..00000000 --- a/_alp/Classes/Class.J_EAVehicle.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * J_EAVehicle - */ -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; - - -public abstract class J_EAVehicle extends J_EAFlex implements Serializable { - public boolean available = true; - protected boolean availableStored = true; - protected double energyConsumption_kWhpkm; - //private MobilityTracker mobilityTracker = null; - protected double vehicleScaling; - public double mileage_km = 0; - public J_ActivityTrackerTrips tripTracker; - /** - * Default constructor - */ - public J_EAVehicle() { - } - - public boolean startTrip(J_TimeVariables timeVariables) { - return false; - } - - public boolean endTrip(double tripDist_km) { - return false; - } - - public void operate(double ratioOfCapacity, J_TimeVariables timeVariables) { - traceln("***Warning*** abstract J_EAVehicle operate! This is a dummy function, doing nothing!"); - //return null; - } - - public void setVehicleScaling(double vehicleScaling) { - this.vehicleScaling = vehicleScaling; - } - - public void setTripTracker(J_ActivityTrackerTrips tracker) { - tripTracker = tracker; - } - - public J_ActivityTrackerTrips getTripTracker() { - return tripTracker; - } - - public boolean getAvailability() { - return available; - } - - public double getVehicleScaling_fr() { - return vehicleScaling; - } - - public double getEnergyConsumption_kWhpkm() { - return energyConsumption_kWhpkm * vehicleScaling; - } - - @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 From 899d0175364b01f0e746a5613c98d0be71ce8e2b Mon Sep 17 00:00:00 2001 From: Ate Hempenius Date: Tue, 14 Apr 2026 15:27:38 +0200 Subject: [PATCH 2/3] I_ElectrolyserManagement and I_BackupGeneratorManagement + electrolyser management classes initial commit --- Zero_engine.alpx | 47 ++- _alp/Agents/EnergyModel/EmbeddedObjects.xml | 27 -- .../AOC.GCDistrictHeating.xml | 3 - .../AOC.GCEnergyConversion.xml | 15 +- .../Code/AdditionalClassCode.java | 14 - .../GCEnergyConversion/Code/Functions.java | 36 --- .../GCEnergyConversion/Code/Functions.xml | 90 ++---- .../GCEnergyConversion/Levels/Level.level.xml | 107 ------- _alp/Agents/GCEnergyConversion/Variables.xml | 142 +++++---- .../AOC.GCEnergyProduction.xml | 3 - .../GCGridBattery/AOC.GCGridBattery.xml | 3 - _alp/Agents/GCHouse/AOC.GCHouse.xml | 3 - _alp/Agents/GCIndustry/AOC.GCIndustry.xml | 3 - .../GCNeighborhood/AOC.GCNeighborhood.xml | 3 - .../GCPublicCharger/AOC.GCPublicCharger.xml | 3 - _alp/Agents/GCUtility/AOC.GCUtility.xml | 3 - _alp/Agents/GridConnection/Variables.xml | 28 -- .../Class.I_BackupGeneratorManagement.java | 21 ++ .../Class.I_ElectrolyserManagement.java | 21 ++ _alp/Classes/Class.I_EnergyManagement.java | 14 + ...upGeneratorManagementContractCapacity.java | 56 ++++ .../Class.J_EAConversionElectrolyser.java | 111 +++++--- ....J_ElectrolyserManagementPowerSurplus.java | 269 ++++++++++++++++++ .../Class.J_ElectrolyserManagementPrice.java | 147 ++++++++++ .../Class.J_EnergyManagementDefault.java | 8 +- .../Class.J_EnergyManagementElectrolyser.java | 125 ++++++++ _alp/Classes/Class.J_TimeVariables.java | 4 +- 27 files changed, 888 insertions(+), 418 deletions(-) delete mode 100644 _alp/Agents/GCEnergyConversion/Code/AdditionalClassCode.java delete mode 100644 _alp/Agents/GCEnergyConversion/Levels/Level.level.xml create mode 100644 _alp/Classes/Class.I_BackupGeneratorManagement.java create mode 100644 _alp/Classes/Class.I_ElectrolyserManagement.java create mode 100644 _alp/Classes/Class.J_BackupGeneratorManagementContractCapacity.java create mode 100644 _alp/Classes/Class.J_ElectrolyserManagementPowerSurplus.java create mode 100644 _alp/Classes/Class.J_ElectrolyserManagementPrice.java create mode 100644 _alp/Classes/Class.J_EnergyManagementElectrolyser.java diff --git a/Zero_engine.alpx b/Zero_engine.alpx index 0d0ef54c..1bd7fd42 100644 --- a/Zero_engine.alpx +++ b/Zero_engine.alpx @@ -750,20 +750,12 @@ - -
1675025163072 @@ -1417,7 +1409,12 @@ LARGE_CONNECTION (grootverbruik, > 3x80) 1775728951678 - + + 1772100318398 + + + 1776078970513 + 1772100318398 @@ -2182,6 +2179,36 @@ LARGE_CONNECTION (grootverbruik, > 3x80) 1772100326457 + + 1776078551110 + + 1775728951678 + + + 1776078590999 + + 1775728951678 + + + 1776078958990 + + 1775728951678 + + + 1776079040123 + + 1776078970513 + + + 1776079237990 + + 1776078970513 + + + 1776164691536 + + 1772100335412 + com.anylogic.libraries.modules.markup_descriptors diff --git a/_alp/Agents/EnergyModel/EmbeddedObjects.xml b/_alp/Agents/EnergyModel/EmbeddedObjects.xml index 4f800f66..1fb8d315 100644 --- a/_alp/Agents/EnergyModel/EmbeddedObjects.xml +++ b/_alp/Agents/EnergyModel/EmbeddedObjects.xml @@ -163,9 +163,6 @@ - - - @@ -918,9 +915,6 @@ - - - @@ -1077,9 +1071,6 @@ - - - @@ -1221,9 +1212,6 @@ - - - @@ -1362,9 +1350,6 @@ - - - @@ -1551,9 +1536,6 @@ - - - @@ -1683,9 +1665,6 @@ - - - @@ -2154,9 +2133,6 @@ - - - @@ -2296,9 +2272,6 @@ - - - diff --git a/_alp/Agents/GCDistrictHeating/AOC.GCDistrictHeating.xml b/_alp/Agents/GCDistrictHeating/AOC.GCDistrictHeating.xml index 60ffdf39..8466a083 100644 --- a/_alp/Agents/GCDistrictHeating/AOC.GCDistrictHeating.xml +++ b/_alp/Agents/GCDistrictHeating/AOC.GCDistrictHeating.xml @@ -24,9 +24,6 @@ - - - diff --git a/_alp/Agents/GCEnergyConversion/AOC.GCEnergyConversion.xml b/_alp/Agents/GCEnergyConversion/AOC.GCEnergyConversion.xml index 3a2896ac..8440d359 100644 --- a/_alp/Agents/GCEnergyConversion/AOC.GCEnergyConversion.xml +++ b/_alp/Agents/GCEnergyConversion/AOC.GCEnergyConversion.xml @@ -2,7 +2,6 @@ 1663773857868 - 1752677823817 @@ -28,9 +27,6 @@ - - - @@ -186,8 +182,9 @@ 1717063231444 - 1610 - 390 + true + 2000 + 470 diff --git a/_alp/Agents/GCEnergyConversion/Code/AdditionalClassCode.java b/_alp/Agents/GCEnergyConversion/Code/AdditionalClassCode.java deleted file mode 100644 index bdd0364a..00000000 --- a/_alp/Agents/GCEnergyConversion/Code/AdditionalClassCode.java +++ /dev/null @@ -1,14 +0,0 @@ -@Override -public void f_operateFlexAssets(J_TimeVariables timeVariables){ - f_operateFlexAssets_override(timeVariables); -} - -@Override -public void f_resetSpecificGCStates(){ - f_resetSpecificGCStates_override(); -} - -@Override -public void f_resetSpecificGCStatesAfterRapidRun(){ - f_resetSpecificGCStatesAfterRapidRun_override(); -} \ No newline at end of file diff --git a/_alp/Agents/GCEnergyConversion/Code/Functions.java b/_alp/Agents/GCEnergyConversion/Code/Functions.java index e0234d0d..91c6bd4e 100644 --- a/_alp/Agents/GCEnergyConversion/Code/Functions.java +++ b/_alp/Agents/GCEnergyConversion/Code/Functions.java @@ -114,15 +114,6 @@ } /*ALCODEEND*/} -double f_operateFlexAssets_override(J_TimeVariables timeVariables) -{/*ALCODESTART::1708089644411*/ -for( J_EA v : c_conversionAssets ){ - if (v instanceof J_EAConversionElectrolyser) { - f_manageElectrolyser((J_EAConversionElectrolyser)v, timeVariables); - } -} -/*ALCODEEND*/} - double f_electrolyserRegime(double elektrolyserSetpointElectric_kW,double excessElectricPower_kW,J_EAConversionElectrolyser ElectrolyserAsset,J_TimeParameters timeParameters,J_TimeVariables timeVariables) {/*ALCODESTART::1708447959640*/ double solar_forecast_kW; @@ -399,33 +390,6 @@ else if(energyModel.v_timeStepsElapsed < (8760-forecast_time_h)/timeParameters.g /*ALCODEEND*/} -double f_resetSpecificGCStates_override() -{/*ALCODESTART::1717066943639*/ -//Reset variables -v_totalDownTimeElectrolyser_hr = 0; -v_totalEnergyLossIdle_kWh = 0; -v_producedOxygen_kg = 0; -v_hydrogenInStorage_kWh = 0; - - -/*ALCODEEND*/} - -double f_resetSpecificGCStatesAfterRapidRun_override() -{/*ALCODESTART::1717068271650*/ -//Rest forecast collections -c_forecast_RES_kW.clear(); -c_forecast_gridNodePowerFlow_kW.clear(); - - -//Reset dataset -data_liveWeekElectrolyserPower_kW.reset(); -data_liveWeekGridNoderPowerFlow_kW.reset(); - -//Reset variables -v_hydrogenProductionDeficit_kWh = 0; -v_hydrogenInStorage_kWh = 0; -/*ALCODEEND*/} - double f_electrolyserRegimeControl_AlwaysIdle(double currentGridNodePowerFlow_kW,J_EAConversionElectrolyser ElectrolyserAsset) {/*ALCODESTART::1717139694847*/ switch (ElectrolyserAsset.getState()){ diff --git a/_alp/Agents/GCEnergyConversion/Code/Functions.xml b/_alp/Agents/GCEnergyConversion/Code/Functions.xml index 981d815c..03bcb1ed 100644 --- a/_alp/Agents/GCEnergyConversion/Code/Functions.xml +++ b/_alp/Agents/GCEnergyConversion/Code/Functions.xml @@ -6,8 +6,8 @@ 1707149702398 true - 1610 - -40 + 2000 + 40