From 40e0824b07b39d3d7e5f0250d0fd32cc6bca1c58 Mon Sep 17 00:00:00 2001 From: Ate Hempenius Date: Thu, 28 May 2026 17:03:42 +0200 Subject: [PATCH 1/2] triptracker-refactor-+-cleanup --- Zero_engine.alpx | 30 ++- _alp/Agents/EnergyModel/Code/Functions.java | 19 +- _alp/Agents/GCHouse/Code/Functions.java | 2 +- .../Agents/GridConnection/Code/Functions.java | 34 +-- _alp/Classes/Class.J_ActivityTracker.java | 16 +- .../Class.J_ActivityTrackerCooking.java | 158 +++++------ .../Classes/Class.J_ActivityTrackerTrips.java | 253 ++++++++++-------- .../Class.J_CustomTripTrackerGenerator.java | 9 + _alp/Classes/Class.J_EAAirco.java | 16 +- _alp/Classes/Class.J_EABuilding.java | 94 +++---- _alp/Classes/Class.J_EAConsumption.java | 11 +- _alp/Classes/Class.J_EAConversion.java | 5 +- .../Class.J_EAConversionAirConditioner.java | 9 +- .../Class.J_EAConversionBiogasMethane.java | 58 ---- .../Class.J_EAConversionElectricHeater.java | 12 +- .../Class.J_EAConversionElectrolyser.java | 2 +- .../Class.J_EAConversionGasBurner.java | 4 +- _alp/Classes/Class.J_EAConversionGasCHP.java | 5 +- .../Class.J_EAConversionHeatDeliverySet.java | 9 +- .../Classes/Class.J_EAConversionHeatPump.java | 49 ++-- _alp/Classes/Class.J_EAConversionHob.java | 62 +++++ .../Class.J_EAConversionHydrogenBurner.java | 14 +- _alp/Classes/Class.J_EAEV.java | 13 +- _alp/Classes/Class.J_EAElectricHob.java | 56 ---- _alp/Classes/Class.J_EAFixed.java | 6 - _alp/Classes/Class.J_EAFlex.java | 5 - _alp/Classes/Class.J_EAFuelVehicle.java | 10 +- .../Class.J_EAPetroleumFuelTractor.java | 2 +- _alp/Classes/Class.J_EAProduction.java | 17 +- _alp/Classes/Class.J_EAStorageElectric.java | 8 +- 30 files changed, 442 insertions(+), 546 deletions(-) create mode 100644 _alp/Classes/Class.J_CustomTripTrackerGenerator.java delete mode 100644 _alp/Classes/Class.J_EAConversionBiogasMethane.java create mode 100644 _alp/Classes/Class.J_EAConversionHob.java delete mode 100644 _alp/Classes/Class.J_EAElectricHob.java diff --git a/Zero_engine.alpx b/Zero_engine.alpx index e4bb2252..b500f507 100644 --- a/Zero_engine.alpx +++ b/Zero_engine.alpx @@ -275,7 +275,7 @@ + + 1779959996975 + + + + + @@ -1517,12 +1533,6 @@ LARGE_CONNECTION (grootverbruik, > 3x80) 1752677832758 - - 1659117174457 - - true - 1752677832758 - 1659117174458 @@ -1609,7 +1619,7 @@ LARGE_CONNECTION (grootverbruik, > 3x80) 1673445448881 - + 1752677832758 @@ -2219,6 +2229,10 @@ LARGE_CONNECTION (grootverbruik, > 3x80) 1776078970513 + + 1779961820984 + + com.anylogic.libraries.modules.markup_descriptors diff --git a/_alp/Agents/EnergyModel/Code/Functions.java b/_alp/Agents/EnergyModel/Code/Functions.java index 14126e5f..2776b497 100644 --- a/_alp/Agents/EnergyModel/Code/Functions.java +++ b/_alp/Agents/EnergyModel/Code/Functions.java @@ -835,7 +835,7 @@ EnergyCoop f_addProductionEnergyCarrier(OL_EnergyCarriers EC) ((J_EAStorageHeat)e).updateAmbientTemperature( pp_ambientTemperature_degC.getCurrentValue() ); break; case BUILDING: - new RuntimeException("AmbientTempType 'BUILDING' is not supported yet for J_EAStorageHeat!"); + throw new RuntimeException("AmbientTempType 'BUILDING' is not supported yet for J_EAStorageHeat!"); /* GridConnection parentGC = (GridConnection)e.getParentAgent(); if(parentGC.p_BuildingThermalAsset == null){ @@ -845,17 +845,15 @@ EnergyCoop f_addProductionEnergyCarrier(OL_EnergyCarriers EC) ((J_EAStorageHeat)e).updateAmbientTemperature(parentGC.p_BuildingThermalAsset.getCurrentTemperature()); } */ - break; case HEAT_GRID: // Do Nothing, keep fixed temp for now - //new RuntimeException("AmbientTempType 'HEAT_GRID' is not supported yet for J_EAStorageHeat!"); + //throw new RuntimeException("AmbientTempType 'HEAT_GRID' is not supported yet for J_EAStorageHeat!"); break; case HEAT_STORAGE: - new RuntimeException("AmbientTempType 'HEAT_STORAGE' is not supported yet for J_EAStorageHeat!"); - break; + throw new RuntimeException("AmbientTempType 'HEAT_STORAGE' is not supported yet for J_EAStorageHeat!"); } } - if (e instanceof J_EAConversionHeatPump) { + if (e instanceof J_EAConversionHeatPump hp) { switch(((J_EAConversionHeatPump) e).getAmbientTempType()){ case FIXED: //Do nothing, use preset ambient temp @@ -864,7 +862,7 @@ EnergyCoop f_addProductionEnergyCarrier(OL_EnergyCarriers EC) ((J_EAConversionHeatPump)e).updateAmbientTemperature( pp_ambientTemperature_degC.getCurrentValue() ); break; case BUILDING: - new RuntimeException("AmbientTempType 'BUILDING' is not supported yet for J_EAConversionHeatPump!"); + throw new RuntimeException("AmbientTempType 'BUILDING' is not supported yet for J_EAConversionHeatPump!"); /* GridConnection parentGC = (GridConnection)e.getParentAgent(); if(parentGC.p_BuildingThermalAsset == null){ @@ -874,13 +872,12 @@ EnergyCoop f_addProductionEnergyCarrier(OL_EnergyCarriers EC) ((J_EAConversionHeatPump)e).updateAmbientTemperature(parentGC.p_BuildingThermalAsset.getCurrentTemperature()); } */ - break; case HEAT_GRID: - new RuntimeException("AmbientTempType 'HEAT_GRID' is not supported yet for J_EAConversionHeatPump!"); + // Do Nothing, keep fixed temp for now + //throw new RuntimeException("AmbientTempType 'HEAT_GRID' is not supported yet for J_EAConversionHeatPump!"); break; case HEAT_STORAGE: - new RuntimeException("AmbientTempType 'HEAT_STORAGE' is not supported yet for J_EAConversionHeatPump!"); - break; + throw new RuntimeException("AmbientTempType 'HEAT_STORAGE' is not supported yet for J_EAConversionHeatPump!"); } } if( e instanceof J_EABuilding ) { diff --git a/_alp/Agents/GCHouse/Code/Functions.java b/_alp/Agents/GCHouse/Code/Functions.java index 374a9803..75072626 100644 --- a/_alp/Agents/GCHouse/Code/Functions.java +++ b/_alp/Agents/GCHouse/Code/Functions.java @@ -11,7 +11,7 @@ if (p_cookingTracker != null) { // check for presence of cooking asset p_cookingTracker.manageActivities(timeVariables); // also calls f_updateAllFlows in HOB asset - double residualHeatGasPit_kW = -p_cookingTracker.HOB.getLastFlows().get(OL_EnergyCarriers.HEAT); + double residualHeatGasPit_kW = -p_cookingTracker.getHob().getLastFlows().get(OL_EnergyCarriers.HEAT); throw new RuntimeException("Cooking trackers and HOBs are not properly integrated with current heating management!"); /*if (p_BuildingThermalAsset != null) { p_BuildingThermalAsset.v_powerFraction_fr += residualHeatGasPit_kW / p_BuildingThermalAsset.getCapacityHeat_kW(); // Does this work out correctly with new heatingManagement structure?? diff --git a/_alp/Agents/GridConnection/Code/Functions.java b/_alp/Agents/GridConnection/Code/Functions.java index 0b97ac84..846d604a 100644 --- a/_alp/Agents/GridConnection/Code/Functions.java +++ b/_alp/Agents/GridConnection/Code/Functions.java @@ -483,7 +483,7 @@ else if (flowPacket.flowsMap.get(EC) > 0){ c_vehicleAssets.forEach(vehicle -> vehicle.setAvailability(true)); if (p_chargePoint != null) { c_tripTrackers.forEach(tt -> { - if (tt.vehicle instanceof J_EAEV ev && p_chargePoint.isRegistered(ev)) { + if (tt.getVehicle() instanceof J_EAEV ev && p_chargePoint.isRegistered(ev)) { p_chargePoint.deregisterChargingRequest(ev); } tt.setStartIndex(timeVariables, f_getChargePoint()); @@ -903,20 +903,20 @@ else if (j_ea instanceof J_EAConversion conversionAsset) { //Check if heating asset if (conversionAsset instanceof I_HeatingAsset) { c_heatingAssets.add(conversionAsset); - if (j_ea instanceof J_EAConversionHeatPump) { - energyModel.c_ambientDependentAssets.add(j_ea); + if (conversionAsset instanceof J_EAConversionHeatPump) { + energyModel.c_ambientDependentAssets.add(conversionAsset); } } - else if ( conversionAsset.energyAssetType == OL_EnergyAssetType.GAS_PIT || j_ea.energyAssetType == OL_EnergyAssetType.ELECTRIC_HOB){ + else if ( conversionAsset instanceof J_EAConversionHob hob){ if (p_cookingTracker == null) { int rowIndex = uniform_discr(2, 300); - p_cookingTracker = new J_ActivityTrackerCooking(energyModel.p_cookingPatternCsv, rowIndex, (energyModel.p_timeVariables.getAnyLogicTime_h())*60, (J_EAConversion)j_ea ); + p_cookingTracker = new J_ActivityTrackerCooking(energyModel.p_cookingPatternCsv, rowIndex, hob, timeParameters, energyModel.p_timeVariables); } else { - p_cookingTracker.HOB = (J_EAConversion)j_ea; + p_cookingTracker.setHob(hob); } } - else if (j_ea instanceof J_EAConversionAirConditioner aircoAsset) { + else if (conversionAsset instanceof J_EAConversionAirConditioner aircoAsset) { p_airco = aircoAsset; energyModel.c_ambientDependentAssets.add(aircoAsset); } @@ -925,19 +925,19 @@ else if (j_ea instanceof J_EAConversionAirConditioner aircoAsset) { else if (j_ea instanceof J_EAStorage storageAsset) { c_storageAssets.add(storageAsset); energyModel.c_storageAssets.add(storageAsset); - if (j_ea instanceof J_EAStorageHeat) { - energyModel.c_ambientDependentAssets.add(j_ea); - if (j_ea instanceof J_EABuilding buildingAsset) { + if (storageAsset instanceof J_EAStorageHeat heatStorage) { + energyModel.c_ambientDependentAssets.add(heatStorage); + if (heatStorage instanceof J_EABuilding buildingAsset) { p_BuildingThermalAsset = buildingAsset; } else { - p_heatBuffer = (J_EAStorageHeat)j_ea; + p_heatBuffer = heatStorage; } } - else if (j_ea instanceof J_EAStorageGas gasStorage) { + else if (storageAsset instanceof J_EAStorageGas gasStorage) { p_gasBuffer = gasStorage; } - else if (j_ea instanceof J_EAStorageElectric battery) { + else if (storageAsset instanceof J_EAStorageElectric battery) { p_batteryAsset = battery; double capacity_MWh = battery.getStorageCapacity_kWh()/1000; v_liveAssetsMetaData.totalInstalledBatteryStorageCapacity_MWh += capacity_MWh; @@ -954,17 +954,17 @@ J_ActivityTrackerTrips f_getNewTripTracker(OL_EnergyAssetType assetType,I_Vehicl J_ActivityTrackerTrips tripTracker; if (assetType == OL_EnergyAssetType.ELECTRIC_TRUCK || assetType == OL_EnergyAssetType.PETROLEUM_FUEL_TRUCK || assetType == OL_EnergyAssetType.HYDROGEN_TRUCK) { int rowIndex = uniform_discr(1, 7); //Truck trip CSV has 7 valid rows. - tripTracker = new J_ActivityTrackerTrips(timeParameters, energyModel.p_truckTripsCsv, rowIndex, energyModel.p_timeVariables, vehicle, p_chargePoint); + tripTracker = new J_ActivityTrackerTrips(energyModel.p_truckTripsCsv, rowIndex, vehicle, p_chargePoint, timeParameters, energyModel.p_timeVariables); } else if (assetType == OL_EnergyAssetType.PETROLEUM_FUEL_VAN || assetType == OL_EnergyAssetType.ELECTRIC_VAN || assetType == OL_EnergyAssetType.HYDROGEN_VAN) {// No mobility pattern for business vans available yet!! Falling back to truck mobility pattern int rowIndex = uniform_discr(1, 7); //Truck trip CSV (used for vans) has 7 valid rows. - tripTracker = new J_ActivityTrackerTrips(timeParameters, energyModel.p_truckTripsCsv, rowIndex, energyModel.p_timeVariables, vehicle, p_chargePoint); + tripTracker = new J_ActivityTrackerTrips(energyModel.p_truckTripsCsv, rowIndex, vehicle, p_chargePoint, timeParameters, energyModel.p_timeVariables); tripTracker.setAnnualDistance_km(30_000); //Wat gebeurt hier??? } else if(assetType == OL_EnergyAssetType.PETROLEUM_FUEL_VEHICLE || assetType == OL_EnergyAssetType.ELECTRIC_VEHICLE || assetType == OL_EnergyAssetType.HYDROGEN_VEHICLE) { int rowIndex = uniform_discr(0, 200); //Car trip CSV has 200+ valid rows. while (rowIndex == 28 || rowIndex == 42 || rowIndex == 150) { // 28, 42, 150, 445, 457, 483, 540, 563 all impossible triptrackers for vehicles with 116 kWh and 0.16 kWhpkm rowIndex = uniform_discr(0, 200); } - tripTracker = new J_ActivityTrackerTrips(timeParameters, energyModel.p_householdTripsCsv, rowIndex, energyModel.p_timeVariables, vehicle, p_chargePoint); + tripTracker = new J_ActivityTrackerTrips(energyModel.p_householdTripsCsv, rowIndex, vehicle, p_chargePoint, timeParameters, energyModel.p_timeVariables); } else{ throw new RuntimeException("Trying to get a new trip tracker for an unsupported vehicle type"); @@ -1153,7 +1153,7 @@ else if (j_ea instanceof J_EAConversionGasCHP) { } } - else if ( j_ea.energyAssetType == OL_EnergyAssetType.GAS_PIT || j_ea.energyAssetType == OL_EnergyAssetType.ELECTRIC_HOB){ + else if ( j_ea.energyAssetType == OL_EnergyAssetType.GAS_HOB || j_ea.energyAssetType == OL_EnergyAssetType.ELECTRIC_HOB){ p_cookingTracker = null; } else if (j_ea instanceof J_EAConversionElectrolyser) { diff --git a/_alp/Classes/Class.J_ActivityTracker.java b/_alp/Classes/Class.J_ActivityTracker.java index 6e24db7b..be029145 100644 --- a/_alp/Classes/Class.J_ActivityTracker.java +++ b/_alp/Classes/Class.J_ActivityTracker.java @@ -17,13 +17,10 @@ ) @JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "@id") public abstract class J_ActivityTracker implements I_StoreStatesAndReset { - protected EnergyModel energyModel; // Tripdata - protected ArrayList starttimes_min = new ArrayList<>(); - protected ArrayList endtimes_min = new ArrayList<>(); - //private ArrayList eventMagnitude = new ArrayList<>(); - public int nbActivities = 0; + protected ArrayList startTimes_h = new ArrayList<>(); + protected ArrayList endTimes_h = new ArrayList<>(); public int eventIndex = 0; protected int eventIndexStored =0; @@ -33,9 +30,6 @@ public abstract class J_ActivityTracker implements I_StoreStatesAndReset { public J_ActivityTracker() { } - public J_ActivityTracker(EnergyModel main, int rowIndex, double time_min) { - } - public void storeStatesAndReset() { eventIndexStored = eventIndex; eventIndex = 0; @@ -44,10 +38,4 @@ public void storeStatesAndReset() { public void restoreStates() { eventIndex = eventIndexStored; } - - - @Override - public String toString() { - return super.toString(); - } } \ No newline at end of file diff --git a/_alp/Classes/Class.J_ActivityTrackerCooking.java b/_alp/Classes/Class.J_ActivityTrackerCooking.java index d91c6869..02301c4b 100644 --- a/_alp/Classes/Class.J_ActivityTrackerCooking.java +++ b/_alp/Classes/Class.J_ActivityTrackerCooking.java @@ -1,21 +1,17 @@ /** * J_ActivityTrackerCooking */ - -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; -@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "@id") public class J_ActivityTrackerCooking extends zero_engine.J_ActivityTracker { private ArrayList powerFractions_fr = new ArrayList<>(); - public J_EAConversion HOB; - public double powerFraction_fr=0; - private int rowIndex; + private J_EAConversionHob hob; + private double powerFraction_fr=0; private boolean cooking = false; - private double timeStep_min; - private ArrayList initalStarttimes_min; - private ArrayList initalEndtimes_min; - private ArrayList storedStarttimes_min; - private ArrayList storedEndtimes_min; + private J_TimeParameters timeParameters; + private Integer CSVRowIndex = null; + private ArrayList initalStartTimes_h; + private ArrayList initalEndTimes_h; + private ArrayList storedStartTimes_h; + private ArrayList storedEndTimes_h; /** * Default constructor @@ -23,111 +19,83 @@ public class J_ActivityTrackerCooking extends zero_engine.J_ActivityTracker { public J_ActivityTrackerCooking() { } - public J_ActivityTrackerCooking(TextFile inputCookingActivities, int rowIndex, double time_min, J_EAConversion HOB) { - - this.rowIndex = rowIndex; - this.HOB=HOB; - //int rowIndex = uniform_discr(2, 300); - - this.timeStep_min = 60 * this.HOB.timeParameters.getTimeStep_h(); + public J_ActivityTrackerCooking(TextFile cookingActivitiesCSV, int CSVRowIndex, J_EAConversionHob hob, J_TimeParameters timeParameters, J_TimeVariables timeVariables) { + this.CSVRowIndex = CSVRowIndex; + this.hob=hob; + double time_h = timeVariables.getAnyLogicTime_h(); + this.timeParameters = timeParameters; - inputCookingActivities.close(); - inputCookingActivities.canReadMore(); - inputCookingActivities.readLine(); // Skips first line + cookingActivitiesCSV.close(); + cookingActivitiesCSV.canReadMore(); + cookingActivitiesCSV.readLine(); // Skips first line - while (roundToInt(inputCookingActivities.readDouble())!=rowIndex && inputCookingActivities.canReadMore()) { // Skip until rowIndex found - inputCookingActivities.readLine(); - //String line = tripsCsv.readLine(); // Does this also skip to the next line? - //traceln("Skipping line: " + line); + while (roundToInt(cookingActivitiesCSV.readDouble())!=CSVRowIndex && cookingActivitiesCSV.canReadMore()) { // Skip until rowIndex found + cookingActivitiesCSV.readLine(); } - int currentLineNb = inputCookingActivities.getLineNumber(); - traceln("rowIndex %s found on line: %s", rowIndex, currentLineNb); - int nbActivities = inputCookingActivities.readInt(); - traceln("Number of trips: %s", nbActivities); + int currentLineNb = cookingActivitiesCSV.getLineNumber(); + int nbActivities = cookingActivitiesCSV.readInt(); - for (int i = 0; i < nbActivities; i++){ - starttimes_min.add(inputCookingActivities.readDouble()); - endtimes_min.add(inputCookingActivities.readDouble()); - - double ratio = inputCookingActivities.readDouble() / HOB.getOutputCapacity_kW(); - powerFractions_fr.add(ratio); + startTimes_h.add(cookingActivitiesCSV.readDouble()/60.0); // Convert data (min) to hours + endTimes_h.add(cookingActivitiesCSV.readDouble()/60.0); // Convert data (min) to hours + powerFractions_fr.add(cookingActivitiesCSV.readDouble() / hob.getOutputCapacity_kW()); } - while ( starttimes_min.get(eventIndex) - time_min < 0) { - starttimes_min.set( eventIndex, starttimes_min.get(eventIndex) + 1440 ); // Source data is always just one day, repeating every day. - endtimes_min.set( eventIndex, endtimes_min.get(eventIndex) + 1440 ); // Source data is always just one day, repeating every day. + while ( startTimes_h.get(eventIndex) - time_h < 0) { + startTimes_h.set( eventIndex, startTimes_h.get(eventIndex) + 24 ); // Source data is always just one day, repeating every day. + endTimes_h.set( eventIndex, endTimes_h.get(eventIndex) + 24 ); // Source data is always just one day, repeating every day. eventIndex++; - if ( eventIndex > starttimes_min.size() - 1 ) { + if ( eventIndex > startTimes_h.size() - 1 ) { eventIndex = 0; } } - initalStarttimes_min = new ArrayList<>(starttimes_min); - initalEndtimes_min = new ArrayList<>(endtimes_min); - //traceln("Current model time in minutes: " + energyModel.t_h*60 + ", nb sessions: " + nbOfCookingSessions); - //traceln("Starttimes: %s", starttimes_min); - //traceln("Endtimes: %s", endtimes_min); + initalStartTimes_h = new ArrayList<>(startTimes_h); + initalEndTimes_h = new ArrayList<>(endTimes_h); } public void manageActivities(J_TimeVariables timeVariables) { - double time_min = timeVariables.getAnyLogicTime_h() * 60; - //traceln("Cooking tracker current time: " + time_min); - //traceln("Event index: " + eventIndex); - //traceln("startTimes: " + starttimes_min); - //traceln("endTimes: " + endtimes_min); - //traceln("powerFractions_fr: " + powerFractions_fr); - - if (cooking) { - if (time_min >= endtimes_min.get(eventIndex) ) { // end cooking session. Also check if a new one starts in this timestep! + double time_h = timeVariables.getAnyLogicTime_h(); - //main.v_activeCookingSessions.decrementAndGet(); - //traceln("End of cooking session, currently active cooking sessions %s", main.v_activeCookingSessions); + if (cooking) { + if (time_h >= endTimes_h.get(eventIndex) ) { // end cooking session. Also check if a new one starts in this timestep! // factor to compensate for the fact that you might not be cooking for the entire timestep. - double fr = (time_min - this.endtimes_min.get(this.eventIndex)) / this.timeStep_min; + double fr = (time_h - this.endTimes_h.get(this.eventIndex)) / this.timeParameters.getTimeStep_h(); this.powerFraction_fr = fr * this.powerFractions_fr.get(this.eventIndex); - starttimes_min.set( eventIndex, starttimes_min.get(eventIndex) + 1440 ); - endtimes_min.set( eventIndex, endtimes_min.get(eventIndex) + 1440 ); + startTimes_h.set( eventIndex, startTimes_h.get(eventIndex) + 24 ); + endTimes_h.set( eventIndex, endTimes_h.get(eventIndex) + 24 ); eventIndex++; - if ( eventIndex >= starttimes_min.size() ) { + if ( eventIndex >= startTimes_h.size() ) { eventIndex = 0; } cooking=false; - if (time_min >= starttimes_min.get(eventIndex)) { + if (time_h >= startTimes_h.get(eventIndex)) { // factor to compensate for the fact that you might not be cooking for the entire timestep. - fr = (time_min - this.starttimes_min.get(this.eventIndex)) / this.timeStep_min; + fr = (time_h - this.startTimes_h.get(this.eventIndex)) / this.timeParameters.getTimeStep_h(); this.powerFraction_fr = fr * this.powerFractions_fr.get(this.eventIndex); - //main.v_activeCookingSessions.incrementAndGet(); cooking=true; traceln("Starting next cooking session in same timestep as previous session ended!! Rowindex %s, eventIndex %s\", rowIndex, eventIndex"); } } else { - this.powerFraction_fr = this.starttimes_min.get(this.eventIndex); + this.powerFraction_fr = this.startTimes_h.get(this.eventIndex); } - } else if (time_min >= starttimes_min.get(eventIndex) ) { // start cooking session. Also check if it ends within this timestep! - /*if (endtimes_min.get(eventIndex) - starttimes_min.get(eventIndex) > 100) { - traceln("Cooking event longer than 100 minutes!! Rowindex %s, eventIndex %s.", rowIndex, eventIndex); - }*/ + } else if (time_h >= startTimes_h.get(eventIndex) ) { // start cooking session. Also check if it ends within this timestep! // factor to compensate for the fact that you might not be cooking for the entire timestep. - double fr = (time_min - this.starttimes_min.get(this.eventIndex)) / this.timeStep_min; + double fr = (time_h - this.startTimes_h.get(this.eventIndex)) / this.timeParameters.getTimeStep_h(); this.powerFraction_fr = fr * this.powerFractions_fr.get(this.eventIndex); - //main.v_activeCookingSessions.incrementAndGet(); cooking=true; - if (time_min >= endtimes_min.get(eventIndex) ) { // end cooking session in the same timestep? Still need to fix energy use for this case!! - - //main.v_activeCookingSessions.decrementAndGet(); - //traceln("End of cooking session, currently active cooking sessions %s", main.v_activeCookingSessions); - fr = (this.endtimes_min.get(this.eventIndex) - this.starttimes_min.get(this.eventIndex)) / this.timeStep_min; + if (time_h >= endTimes_h.get(eventIndex) ) { // end cooking session in the same timestep? Still need to fix energy use for this case!! + fr = (this.endTimes_h.get(this.eventIndex) - this.startTimes_h.get(this.eventIndex)) / this.timeParameters.getTimeStep_h(); this.powerFraction_fr = fr * this.powerFractions_fr.get(this.eventIndex); - starttimes_min.set( eventIndex, starttimes_min.get(eventIndex) + 1440 ); - endtimes_min.set( eventIndex, endtimes_min.get(eventIndex) + 1440 ); + startTimes_h.set( eventIndex, startTimes_h.get(eventIndex) + 24 ); + endTimes_h.set( eventIndex, endTimes_h.get(eventIndex) + 24 ); eventIndex++; - if ( eventIndex >= starttimes_min.size() ) { + if ( eventIndex >= startTimes_h.size() ) { eventIndex = 0; } cooking=false; @@ -136,29 +104,43 @@ public void manageActivities(J_TimeVariables timeVariables) { else { this.powerFraction_fr = 0; } - //if (powerFraction_fr > 0 ) { traceln("Cooking event in progress!"); } - HOB.f_updateAllFlows(powerFraction_fr, timeVariables); + hob.f_updateAllFlows(powerFraction_fr, timeVariables); } + + //Setters + public void setHob(J_EAConversionHob hob) { + this.hob = hob; + } + + + //Getters + public J_EAConversionHob getHob() { + return this.hob; + } + + @Override public void storeStatesAndReset() { eventIndexStored = eventIndex; - storedStarttimes_min = new ArrayList<>(starttimes_min); - storedEndtimes_min = new ArrayList<>(endtimes_min); - starttimes_min = new ArrayList<>(initalStarttimes_min); - endtimes_min = new ArrayList<>(initalEndtimes_min); + storedStartTimes_h = new ArrayList<>(startTimes_h); + storedEndTimes_h = new ArrayList<>(endTimes_h); + startTimes_h = new ArrayList<>(initalStartTimes_h); + endTimes_h = new ArrayList<>(initalEndTimes_h); eventIndex = 0; } @Override public void restoreStates() { eventIndex = eventIndexStored; - starttimes_min = new ArrayList<>(storedStarttimes_min); - endtimes_min = new ArrayList<>(storedEndtimes_min); + startTimes_h = new ArrayList<>(storedStartTimes_h); + endTimes_h = new ArrayList<>(storedEndTimes_h); } - @Override + @Override public String toString() { - return super.toString(); + String outputString = "J_ActivityTrackerCooking: \n"; + outputString += "Based on CSV data with row index: " + CSVRowIndex + "\n"; + return outputString; } } diff --git a/_alp/Classes/Class.J_ActivityTrackerTrips.java b/_alp/Classes/Class.J_ActivityTrackerTrips.java index 38eaa892..f3d1b14a 100644 --- a/_alp/Classes/Class.J_ActivityTrackerTrips.java +++ b/_alp/Classes/Class.J_ActivityTrackerTrips.java @@ -12,88 +12,85 @@ public class J_ActivityTrackerTrips extends J_ActivityTracker { private J_TimeParameters timeParameters; - public ArrayList distances_km = new ArrayList<>(); - private int rowIndex; - public I_Vehicle vehicle; - public double idleTimeToNextTrip_min; - public double idleTimeToNextTripStored_min; - public double tripDistance_km; - public double nextEventStartTime_min; - public double distanceScaling_fr = 1.0; - public double currentTripTimesteps_n; + private ArrayList distances_km = new ArrayList<>(); + private Integer CSVRowIndex = null; + private I_Vehicle vehicle; + private double idleTimeToNextTrip_h; + private double idleTimeToNextTripStored_h; + private double tripDistance_km; + private double distanceScaling_fr = 1.0; + private double currentTripTimesteps_n; private double nextEventStartTime_h; /** - * Default constructor + * Empty constructor for serialization */ public J_ActivityTrackerTrips() { } - public J_ActivityTrackerTrips(J_TimeParameters timeParameters, TextFile tripsCsv, int rowIndex, J_TimeVariables timeVariables, I_Vehicle vehicle, I_ChargePointRegistration chargePointRegistration) { + /** + * Default constructor using CSV trip input file + */ + public J_ActivityTrackerTrips(TextFile tripsCSV, int CSVRowIndex, I_Vehicle vehicle, I_ChargePointRegistration chargePointRegistration, J_TimeParameters timeParameters, J_TimeVariables timeVariables) { this.timeParameters = timeParameters; - this.rowIndex = rowIndex; + this.CSVRowIndex = CSVRowIndex; this.vehicle = vehicle; - tripsCsv.close(); - tripsCsv.canReadMore(); - tripsCsv.readLine(); // Skips first line + tripsCSV.close(); + tripsCSV.canReadMore(); + tripsCSV.readLine(); // Skips first line - while (roundToInt(tripsCsv.readDouble())!=rowIndex && tripsCsv.canReadMore()) { // Skip until rowIndex found - tripsCsv.readLine(); - //String line = tripsCsv.readLine(); // Does this also skip to the next line? - //traceln("Skipping line: " + line); + while (roundToInt(tripsCSV.readDouble())!= CSVRowIndex && tripsCSV.canReadMore()) { // Skip until rowIndex found + tripsCSV.readLine(); } - int currentLineNb = tripsCsv.getLineNumber(); - //traceln("rowIndex %s found on line: %s", rowIndex, currentLineNb); - int nbActivities = tripsCsv.readInt(); - + int currentLineNb = tripsCSV.getLineNumber(); + int nbActivities = tripsCSV.readInt(); + for (int i = 0; i < nbActivities; i++){ - starttimes_min.add(tripsCsv.readDouble()); - endtimes_min.add(tripsCsv.readDouble()); - distances_km.add(tripsCsv.readDouble()); + startTimes_h.add(tripsCSV.readDouble()/60.0); // Data is in min -> convert to hours + endTimes_h.add(tripsCSV.readDouble()/60.0); // Data is in min -> convert to hours + distances_km.add(tripsCSV.readDouble()); } // 'forward' to next activity setStartIndex(timeVariables, chargePointRegistration); } - private double getTimeSinceWeekStart(double time_min) { - double timeSinceWeekStart_min = (time_min + (timeParameters.getDayOfWeek1jan()-1) * 24 * 60) % (7*24*60); - return timeSinceWeekStart_min; + /** + * Constructor using defined trips as input + */ + public J_ActivityTrackerTrips(List startTimes_h, List endTimes_h, List distances_km, I_Vehicle vehicle, I_ChargePointRegistration chargePointRegistration, J_TimeParameters timeParameters, J_TimeVariables timeVariables) { + this.timeParameters = timeParameters; + this.vehicle = vehicle; + + //Check + if(startTimes_h.size() != endTimes_h.size() && startTimes_h.size() != distances_km.size()) { + throw new RuntimeException("Trying to create a custom J_ActivityTrackerTrips, with unequal amount of startTimes (" + startTimes_h.size() + "), endTimes (" + endTimes_h.size()+ "), and/or distances_km (" + distances_km.size() + ")."); + } + + this.startTimes_h.addAll(startTimes_h); + this.endTimes_h.addAll(endTimes_h); + this.distances_km.addAll(distances_km); + + // 'forward' to next activity + setStartIndex(timeVariables, chargePointRegistration); + } + + private double getTimeSinceWeekStart_h(double time_h) { + double timeSinceWeekStart_h = (time_h + (timeParameters.getDayOfWeek1jan()-1) * 24) % (7*24); + return timeSinceWeekStart_h; } private void setNextTrip() { eventIndex++; - if ( eventIndex > starttimes_min.size() - 1 ) { + if ( eventIndex > startTimes_h.size() - 1 ) { eventIndex = 0; } } - - public void setVehicle(I_Vehicle vehicle) { - this.vehicle = vehicle; - } - public void setDistanceScaling_fr(double distanceScaling_fr) { - this.distanceScaling_fr = distanceScaling_fr; - } + - public double getAnnualDistance_km() { - double currentAnnualDistance_km = 52 * distances_km.stream().mapToDouble(a -> a).sum(); // assumed trip-data is one week long!! Hence the 52, for 52 weeks in a year. - return currentAnnualDistance_km; - } - - public void setAnnualDistance_km(double desiredAnnualDistance_km) { // Scale trips to come to a certain total annual distance traveled. This can lead to unfeasibly long trips for EVs!! - double currentAnnualDistance_km = getAnnualDistance_km(); - double scalingFactor_f = desiredAnnualDistance_km / currentAnnualDistance_km; - - ListIterator iterator = distances_km.listIterator(); - for (int i = 0; i a).sum()); - //traceln("Desired annual distance was: %s km", desiredAnnualDistance_km); - } + /* * Main method that is called every timestep. @@ -103,32 +100,32 @@ public void setAnnualDistance_km(double desiredAnnualDistance_km) { // Scale tri * If so, it also checks if a new trip is starting in that same timestep. */ public void manageActivities(J_TimeVariables timeVariables, I_ChargePointRegistration chargePointRegistration) { - double time_min = timeVariables.getT_h() * 60; - double timeSinceWeekStart_min = getTimeSinceWeekStart(time_min); // Trip start/end-times are all defined as minutes since monday 00:00h, trips are looped indefinitely + double time_h = timeVariables.getT_h(); + double timeSinceWeekStart_h = getTimeSinceWeekStart_h(time_h); // Trip start/end-times are all defined as minutes since monday 00:00h, trips are looped indefinitely if (vehicle.getAvailability()) { // at start of timestep! check for multiple 'events' in timestep! - if ( timeSinceWeekStart_min >= starttimes_min.get(eventIndex) && (timeSinceWeekStart_min-timeParameters.getTimeStep_h() * 60) < starttimes_min.get(eventIndex)) { // is a trip starting this timestep? - currentTripTimesteps_n = max(1,roundToInt(((endtimes_min.get(eventIndex) - starttimes_min.get(eventIndex)) / (timeParameters.getTimeStep_h() * 60)))); + if ( timeSinceWeekStart_h >= startTimes_h.get(eventIndex) && (timeSinceWeekStart_h-timeParameters.getTimeStep_h()) < startTimes_h.get(eventIndex)) { // is a trip starting this timestep? + currentTripTimesteps_n = max(1,roundToInt(((endTimes_h.get(eventIndex) - startTimes_h.get(eventIndex)) / (timeParameters.getTimeStep_h())))); vehicle.startTrip(timeVariables); if(vehicle instanceof J_EAEV EV) { chargePointRegistration.deregisterChargingRequest(EV); } - if (timeSinceWeekStart_min >= endtimes_min.get(eventIndex) && (timeSinceWeekStart_min-timeParameters.getTimeStep_h() * 60) < endtimes_min.get(eventIndex)) { // is the trip also ending this timestep? + if (timeSinceWeekStart_h >= endTimes_h.get(eventIndex) && (timeSinceWeekStart_h-timeParameters.getTimeStep_h()) < endTimes_h.get(eventIndex)) { // is the trip also ending this timestep? vehicle.endTrip(tripDistance_km); setNextTrip(); - prepareNextActivity(time_min, chargePointRegistration); + prepareNextActivity(time_h, chargePointRegistration); } } } else { if (vehicle instanceof J_EAFuelVehicle fuelVehicle) { fuelVehicle.progressTrip(tripDistance_km / currentTripTimesteps_n); } - if (timeSinceWeekStart_min >= endtimes_min.get(eventIndex) && (timeSinceWeekStart_min-timeParameters.getTimeStep_h() * 60) < endtimes_min.get(eventIndex)) { // is a trip ending this timestep? + if (timeSinceWeekStart_h >= endTimes_h.get(eventIndex) && (timeSinceWeekStart_h-timeParameters.getTimeStep_h()) < endTimes_h.get(eventIndex)) { // is a trip ending this timestep? vehicle.endTrip(tripDistance_km); setNextTrip(); - prepareNextActivity(time_min, chargePointRegistration); - if (timeSinceWeekStart_min >= starttimes_min.get(eventIndex) && (timeSinceWeekStart_min-timeParameters.getTimeStep_h() * 60) < starttimes_min.get(eventIndex) ) { // is the next trip also starting this timestep? - currentTripTimesteps_n = max(1,roundToInt(((endtimes_min.get(eventIndex) - starttimes_min.get(eventIndex)) / (timeParameters.getTimeStep_h() * 60)))); + prepareNextActivity(time_h, chargePointRegistration); + if (timeSinceWeekStart_h >= startTimes_h.get(eventIndex) && (timeSinceWeekStart_h-timeParameters.getTimeStep_h()) < startTimes_h.get(eventIndex) ) { // is the next trip also starting this timestep? + currentTripTimesteps_n = max(1,roundToInt(((endTimes_h.get(eventIndex) - startTimes_h.get(eventIndex)) / timeParameters.getTimeStep_h()))); vehicle.startTrip(timeVariables); if(vehicle instanceof J_EAEV EV) { chargePointRegistration.deregisterChargingRequest(EV); @@ -143,13 +140,13 @@ public void manageActivities(J_TimeVariables timeVariables, I_ChargePointRegistr * It also immediately calls prepareNextActivity */ public void setStartIndex(J_TimeVariables timeVariables, I_ChargePointRegistration chargePointRegistration) { - double time_min = timeVariables.getT_h() * 60.0; - double timeSinceWeekStart_min = getTimeSinceWeekStart(time_min); + double time_h = timeVariables.getT_h(); + double timeSinceWeekStart_h = getTimeSinceWeekStart_h(time_h); boolean looped = false; - while ( starttimes_min.get(eventIndex) < (timeSinceWeekStart_min ) ) { // If this occurs 'during' a trip, that trip is ignored, it is not executed. + while ( startTimes_h.get(eventIndex) < (timeSinceWeekStart_h ) ) { // If this occurs 'during' a trip, that trip is ignored, it is not executed. setNextTrip(); // Skip to the next trip. - if (eventIndex == starttimes_min.size()-1 ) { + if (eventIndex == startTimes_h.size()-1 ) { if (looped) { setNextTrip(); // Increments eventIndex, reverts to first trip of week when 'overflowing' break; @@ -157,9 +154,8 @@ public void setStartIndex(J_TimeVariables timeVariables, I_ChargePointRegistrati looped = true; } } - } - prepareNextActivity(time_min, chargePointRegistration); + prepareNextActivity(time_h, chargePointRegistration); } /* @@ -168,37 +164,37 @@ public void setStartIndex(J_TimeVariables timeVariables, I_ChargePointRegistrati * If the vehicle is an EV it also calculates the charging need, including possible future trips. * The function passes this information to the EV and registers the charging request at the chargepoint. */ - public void prepareNextActivity(double time_min, I_ChargePointRegistration chargePointRegistration) { + public void prepareNextActivity(double time_h, I_ChargePointRegistration chargePointRegistration) { // Trip start/end-times are all defined as minutes since monday 00:00h - double timeSinceWeekStart_min = getTimeSinceWeekStart(time_min); - nextEventStartTime_min = starttimes_min.get(eventIndex); + double timeSinceWeekStart_h = getTimeSinceWeekStart_h(time_h); + nextEventStartTime_h = startTimes_h.get(eventIndex); - if (eventIndex == 0 && timeSinceWeekStart_min > nextEventStartTime_min) { // Next week's trip! - nextEventStartTime_h = (nextEventStartTime_min + time_min - timeSinceWeekStart_min)/60 + 168; + if (eventIndex == 0 && timeSinceWeekStart_h > nextEventStartTime_h) { // Next week's trip! + nextEventStartTime_h = (nextEventStartTime_h + time_h - timeSinceWeekStart_h) + 168; } else { - nextEventStartTime_h = (nextEventStartTime_min + time_min - timeSinceWeekStart_min)/60; + nextEventStartTime_h = (nextEventStartTime_h + time_h - timeSinceWeekStart_h); } - idleTimeToNextTrip_min = (nextEventStartTime_min - timeSinceWeekStart_min) % (24*7*60); // Modulo 24*7*60 needed because otherwise negative values can occur when trip starts 'next week'. + idleTimeToNextTrip_h = (nextEventStartTime_h - timeSinceWeekStart_h) % (24*7); // Modulo 24*7 needed because otherwise negative values can occur when trip starts 'next week'. tripDistance_km = distanceScaling_fr * distances_km.get( eventIndex ); // Update upcoming trip distance if (vehicle instanceof J_EAEV ev) { double energyNeedForNextTrip_kWh = ev.getEnergyConsumption_kWhpkm() * tripDistance_km; - if (idleTimeToNextTrip_min > 0 && (energyNeedForNextTrip_kWh-ev.getCurrentSOC_kWh())> idleTimeToNextTrip_min/60 * ev.getVehicleChargingCapacity_kW()) { - traceln("TripTracker reports: charging need for next trip is not feasible! Time till next trip: %s hours, chargeNeed_kWh: %s", roundToDecimal(idleTimeToNextTrip_min/60,2), roundToDecimal(energyNeedForNextTrip_kWh-ev.getCurrentSOC_kWh(),2)); + if (idleTimeToNextTrip_h > 0 && (energyNeedForNextTrip_kWh-ev.getCurrentSOC_kWh())> idleTimeToNextTrip_h * ev.getVehicleChargingCapacity_kW()) { + traceln("TripTracker reports: charging need for next trip is not feasible! Time till next trip: %s hours, chargeNeed_kWh: %s", roundToDecimal(idleTimeToNextTrip_h,2), roundToDecimal(energyNeedForNextTrip_kWh-ev.getCurrentSOC_kWh(),2)); } // Check if more charging is needed for next trip! double nextTripDist_km = 0; - double nextTripStartTime_min = 0; + double nextTripStartTime_h = 0; - if ( eventIndex == starttimes_min.size() - 1 ) { + if ( eventIndex == startTimes_h.size() - 1 ) { nextTripDist_km = distances_km.get( 0 ); - nextTripStartTime_min = endtimes_min.get( 0 ); + nextTripStartTime_h = endTimes_h.get( 0 ); } else { nextTripDist_km = distanceScaling_fr*distances_km.get( eventIndex+1 ); - nextTripStartTime_min = starttimes_min.get( eventIndex+1 ); + nextTripStartTime_h = startTimes_h.get( eventIndex+1 ); } - double additionalChargingNeededForNextTrip_kWh = max(0,nextTripDist_km * ev.getEnergyConsumption_kWhpkm() - (nextTripStartTime_min - endtimes_min.get(eventIndex))/60*ev.getVehicleChargingCapacity_kW()); + double additionalChargingNeededForNextTrip_kWh = max(0,nextTripDist_km * ev.getEnergyConsumption_kWhpkm() - (nextTripStartTime_h - endTimes_h.get(eventIndex))*ev.getVehicleChargingCapacity_kW()); energyNeedForNextTrip_kWh += additionalChargingNeededForNextTrip_kWh; energyNeedForNextTrip_kWh = min(energyNeedForNextTrip_kWh+10,ev.getStorageCapacity_kWh()); @@ -209,35 +205,62 @@ public void prepareNextActivity(double time_min, I_ChargePointRegistration charg } } - public double getNextEventStartTime_h() { - return nextEventStartTime_h; - } - - @Override - public String toString() { - return - "Number of trips = " + this.nbActivities + " " + - "Row index = " + this.rowIndex + " " + - "Distance Scaling = " + this.distanceScaling_fr + " "; - } - - public double getDistanceScaling_fr( ) { - return this.distanceScaling_fr; - } + + //Setters + public void setVehicle(I_Vehicle vehicle) { + this.vehicle = vehicle; + } + public void setDistanceScaling_fr(double distanceScaling_fr) { + this.distanceScaling_fr = distanceScaling_fr; + } + public void setAnnualDistance_km(double desiredAnnualDistance_km) { // Scale trips to come to a certain total annual distance traveled. This can lead to unfeasibly long trips for EVs!! + double currentAnnualDistance_km = getAnnualDistance_km(); + double scalingFactor_f = desiredAnnualDistance_km / currentAnnualDistance_km; + + ListIterator iterator = distances_km.listIterator(); + for (int i = 0; i a).sum(); // assumed trip-data is one week long!! Hence the 52, for 52 weeks in a year. + return currentAnnualDistance_km; + } + - @Override - public void storeStatesAndReset() { - eventIndexStored = eventIndex; - idleTimeToNextTripStored_min = idleTimeToNextTrip_min; - idleTimeToNextTrip_min = 0; - // Don't forget to call setStartIndex ! - } - - @Override - public void restoreStates() { - eventIndex = eventIndexStored; - nextEventStartTime_min = starttimes_min.get(eventIndex); - idleTimeToNextTrip_min = idleTimeToNextTripStored_min; - tripDistance_km = distanceScaling_fr * distances_km.get( eventIndex ); // Update upcoming trip distance - } -} + @Override + public void storeStatesAndReset() { + eventIndexStored = eventIndex; + idleTimeToNextTripStored_h = idleTimeToNextTrip_h; + idleTimeToNextTrip_h = 0; + // Don't forget to call setStartIndex ! + } + + @Override + public void restoreStates() { + eventIndex = eventIndexStored; + nextEventStartTime_h = startTimes_h.get(eventIndex); + idleTimeToNextTrip_h = idleTimeToNextTripStored_h; + tripDistance_km = distanceScaling_fr * distances_km.get( eventIndex ); // Update upcoming trip distance + } + + @Override + public String toString() { + String outputString = "J_ActivityTrackerTrips: \n"; + outputString += "Based on " + (CSVRowIndex != null ? "CSV data with row index: " + CSVRowIndex : "Custom input") + "\n"; + outputString += "Distance Scaling = " + this.distanceScaling_fr + " "; + return outputString; + } +} \ No newline at end of file diff --git a/_alp/Classes/Class.J_CustomTripTrackerGenerator.java b/_alp/Classes/Class.J_CustomTripTrackerGenerator.java new file mode 100644 index 00000000..e95358bb --- /dev/null +++ b/_alp/Classes/Class.J_CustomTripTrackerGenerator.java @@ -0,0 +1,9 @@ +/** + * J_CustomTripTrackerGenerator + */ +public class J_CustomTripTrackerGenerator { + public static J_ActivityTrackerTrips createCustomTripTracker(Map tripStartTime_hourOfDay, Map tripEndTime_hourOfDay, Map tripTravelDistance_km) { + J_ActivityTrackerTrips customTripTracker = new J_ActivityTrackerTrips(); + return customTripTracker; + } +} \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAAirco.java b/_alp/Classes/Class.J_EAAirco.java index eb4c7b7f..c6c7763e 100644 --- a/_alp/Classes/Class.J_EAAirco.java +++ b/_alp/Classes/Class.J_EAAirco.java @@ -5,17 +5,23 @@ public class J_EAAirco extends zero_engine.J_EAFlex { double capacityElectric_kW; int remainingONtimesteps = 0; + /** + * Empty constructor for serialization + */ + public J_EAAirco() { + } + /** - * Default constructor + * Constructor initializing the fields */ - public J_EAAirco(I_AssetOwner owner, double capacityElectric_kW, J_TimeParameters timeParameters) { + public J_EAAirco(I_AssetOwner owner, double capacityElectric_kW, J_TimeParameters timeParameters) { this.setOwner(owner); - this.timeParameters = timeParameters; - this.capacityElectric_kW = capacityElectric_kW; + this.timeParameters = timeParameters; + this.capacityElectric_kW = capacityElectric_kW; this.activeConsumptionEnergyCarriers.add(OL_EnergyCarriers.ELECTRICITY); //this.assetFlowCategory = OL_AssetFlowCategories.AIRCO; // bestaat nog niet! this.registerEnergyAsset(timeParameters); - } + } @Override diff --git a/_alp/Classes/Class.J_EABuilding.java b/_alp/Classes/Class.J_EABuilding.java index e0d7b99f..c68bfc62 100644 --- a/_alp/Classes/Class.J_EABuilding.java +++ b/_alp/Classes/Class.J_EABuilding.java @@ -1,14 +1,13 @@ /** * J_EABuilding */ -//import com.fasterxml.jackson.annotation.JsonTypeName; -//@JsonTypeName("J_EABuilding") -public class J_EABuilding extends zero_engine.J_EAStorageHeat implements Serializable { +public class J_EABuilding extends zero_engine.J_EAStorageHeat{ private double solarAbsorptionFactor_m2; private double solarRadiation_Wpm2 = 0; private double additionalVentilationLosses_fr = 0; private double coldExtracted_kWh = 0; + //Slider scaling factor private double lossScalingFactor_fr = 1; @@ -23,7 +22,7 @@ public class J_EABuilding extends zero_engine.J_EAStorageHeat implements Seriali private int exteriorReleaseScheduleIndex; /** - * Default constructor + * Empty constructor for serialization */ public J_EABuilding() { } @@ -111,16 +110,6 @@ public void operate(double powerFraction_fr, J_TimeVariables timeVariables) { } } - @Override - public String toString() { - return - this.getClass().toString() + " " + - "energyUsed_kWh (heat losses) = " + this.energyUsed_kWh + "kWh, " + - "temp = " + this.temperature_degC + ", " + - "lossFactor_WpK = " + this.lossFactor_WpK + ", "+ - "heatCapacity_JpK = " + this.heatCapacity_JpK; - } - @Override protected void updateStateOfCharge( double deltaEnergy_kWh ) { double tempDelta_degC = deltaEnergy_kWh / (this.heatCapacity_JpK / 3.6E6 ); @@ -153,35 +142,6 @@ public double getLossScalingFactor_fr() { return this.lossScalingFactor_fr; } - @Override - public void storeStatesAndReset() { - // Each energy asset that has some states should overwrite this function! - this.energyUsedStored_kWh = this.energyUsed_kWh; - this.ambientEnergyAbsorbedStored_kWh = this.ambientEnergyAbsorbed_kWh; - this.energyUsed_kWh = 0.0; - this.ambientEnergyAbsorbed_kWh = 0.0; - this.temperatureStored_degC = this.temperature_degC; - this.temperature_degC = this.initialTemperature_degC; - if (this.interiorReleaseSchedule_kWh != null) { - this.interiorReleaseScheduleStored_kWh = this.interiorReleaseSchedule_kWh; - Arrays.fill(this.interiorReleaseSchedule_kWh, 0.0); - } - if (this.exteriorReleaseSchedule_kWh != null) { - this.exteriorReleaseScheduleStored_kWh = this.exteriorReleaseSchedule_kWh; - Arrays.fill(this.exteriorReleaseSchedule_kWh, 0.0); - } - clear(); - } - - @Override - public void restoreStates() { - // Each energy asset that has some states should overwrite this function! - this.energyUsed_kWh = this.energyUsedStored_kWh; - this.ambientEnergyAbsorbed_kWh = this.ambientEnergyAbsorbedStored_kWh; - this.temperature_degC = this.temperatureStored_degC; - this.interiorReleaseSchedule_kWh = this.interiorReleaseScheduleStored_kWh; - this.exteriorReleaseSchedule_kWh = this.exteriorReleaseScheduleStored_kWh; - } @Override public void updateAmbientTemperature(double currentAmbientTemperature_degC) { // TODO: Hoe zorgen we dat we deze niet vergeten aan te roepen?? @@ -272,10 +232,44 @@ public boolean hasHeatBuffer() { return false; } } - /** - * 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; -} - + + @Override + public void storeStatesAndReset() { + // Each energy asset that has some states should overwrite this function! + this.energyUsedStored_kWh = this.energyUsed_kWh; + this.ambientEnergyAbsorbedStored_kWh = this.ambientEnergyAbsorbed_kWh; + this.energyUsed_kWh = 0.0; + this.ambientEnergyAbsorbed_kWh = 0.0; + this.temperatureStored_degC = this.temperature_degC; + this.temperature_degC = this.initialTemperature_degC; + if (this.interiorReleaseSchedule_kWh != null) { + this.interiorReleaseScheduleStored_kWh = this.interiorReleaseSchedule_kWh; + Arrays.fill(this.interiorReleaseSchedule_kWh, 0.0); + } + if (this.exteriorReleaseSchedule_kWh != null) { + this.exteriorReleaseScheduleStored_kWh = this.exteriorReleaseSchedule_kWh; + Arrays.fill(this.exteriorReleaseSchedule_kWh, 0.0); + } + clear(); + } + + @Override + public void restoreStates() { + // Each energy asset that has some states should overwrite this function! + this.energyUsed_kWh = this.energyUsedStored_kWh; + this.ambientEnergyAbsorbed_kWh = this.ambientEnergyAbsorbedStored_kWh; + this.temperature_degC = this.temperatureStored_degC; + this.interiorReleaseSchedule_kWh = this.interiorReleaseScheduleStored_kWh; + this.exteriorReleaseSchedule_kWh = this.exteriorReleaseScheduleStored_kWh; + } + + @Override + public String toString() { + return + "J_EABuilding: \n" + + "energyUsed_kWh (heat losses) = " + this.energyUsed_kWh + "kWh \n" + + "temp = " + this.temperature_degC + " \n" + + "lossFactor_WpK = " + this.lossFactor_WpK + " \n"+ + "heatCapacity_JpK = " + this.heatCapacity_JpK; + } +} \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAConsumption.java b/_alp/Classes/Class.J_EAConsumption.java index dccebc19..10485fab 100644 --- a/_alp/Classes/Class.J_EAConsumption.java +++ b/_alp/Classes/Class.J_EAConsumption.java @@ -1,12 +1,12 @@ /** * J_EAConsumption */ -public class J_EAConsumption extends zero_engine.J_EAProfile implements Serializable { +public class J_EAConsumption extends zero_engine.J_EAProfile{ private double yearlyDemand_kWh; - //public double loadLoad_kWh = 0; + /** - * Default constructor + * Empty constructor for serialization */ public J_EAConsumption() { } @@ -120,9 +120,4 @@ public String toString() { "energyCarrier = " + this.energyCarrier + " " + "yearlyDemand_kWh = " + this.yearlyDemand_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_EAConversion.java b/_alp/Classes/Class.J_EAConversion.java index a2b2c961..2052d28d 100644 --- a/_alp/Classes/Class.J_EAConversion.java +++ b/_alp/Classes/Class.J_EAConversion.java @@ -1,7 +1,7 @@ /** * J_EAConversion */ -public class J_EAConversion extends zero_engine.J_EAFlex implements Serializable { +public class J_EAConversion extends zero_engine.J_EAFlex{ protected OL_EnergyCarriers energyCarrierProduced; protected OL_EnergyCarriers energyCarrierConsumed; protected double eta_r; @@ -10,8 +10,9 @@ public class J_EAConversion extends zero_engine.J_EAFlex implements Serializable private OL_AssetFlowCategories inputAssetFlowCategory; private OL_AssetFlowCategories outputAssetFlowCategory; + /** - * Default constructor + * Empty constructor for serialization */ public J_EAConversion() { } diff --git a/_alp/Classes/Class.J_EAConversionAirConditioner.java b/_alp/Classes/Class.J_EAConversionAirConditioner.java index 60930aec..a7a6077f 100644 --- a/_alp/Classes/Class.J_EAConversionAirConditioner.java +++ b/_alp/Classes/Class.J_EAConversionAirConditioner.java @@ -7,10 +7,9 @@ public class J_EAConversionAirConditioner extends J_EAConversion { protected OL_AmbientTempType ambientTempType; public double totalElectricityConsumed_kWh =0; public J_EABuilding building; - //public double p_baseTemperatureReference; /** - * Default constructor + * Empty constructor for serialization */ public J_EAConversionAirConditioner() { } @@ -26,7 +25,6 @@ public J_EAConversionAirConditioner(I_AssetOwner owner, double inputElectricCapa this.setOwner(owner); this.timeParameters = timeParameters; this.inputCapacity_kW = inputElectricCapacity_kW; - //this.eta_r = eta_r; this.building = building; this.ambientTempType = OL_AmbientTempType.AMBIENT_AIR; this.updateAmbientTemperature( building.getAmbientTemperature_degC() ); // also updates COP @@ -42,12 +40,11 @@ public J_EAConversionAirConditioner(I_AssetOwner owner, double inputElectricCapa public void updateAmbientTemperature(double ambientTemperature_degC) { double buildingTemp_degC = building.getCurrentTemperature(); - this.COP_r = calculateCOP(ambientTemperature_degC, buildingTemp_degC); //this.eta_r * ( 273.15 + this.outputTemperature_degC ) / ( this.outputTemperature_degC - this.baseTemperature_degC ); + this.COP_r = calculateCOP(ambientTemperature_degC, buildingTemp_degC); this.outputCapacity_kW = this.inputCapacity_kW * this.COP_r; // this represents the current maximum cooling power (heat extracted from building!) } public double getCOP() { - //traceln("Heatpump output temperature: " + this.outputTemperature_degC); return this.COP_r; } @@ -72,6 +69,7 @@ public OL_AmbientTempType getAmbientTempType() { } private double calculateCOP(double ambientTemperature_degC, double buildingTemperature_degC) { // This is the cooling COP, defined as the extracted heat power divided by the input electric power. + //double COP_r = this.eta_r * ( 273.15 + this.outputTemperature_degC ) / ( this.outputTemperature_degC - this.baseTemperature_degC ); double deltaT = max(0,ambientTemperature_degC - buildingTemperature_degC); // Limit deltaT to 0-or-higher, meaning outside temp is equal or higher than inside temp. In reality, it can happen that an AC runs with a lower outside temp, but we 'cap' the COP this way. double COP_r = 5 - 0.10 * deltaT + 0.00126 * deltaT*deltaT; // 'expert judgement'-curve, not based on manufacturer or measurement data but on 'typical' efficiencies found online. return COP_r; // Ratio of cooling power (extracted heat) to input electric power. @@ -86,5 +84,4 @@ public String toString() { + "Energy used: " + this.energyUsed_kWh + ", " + "Current output: " + -this.getLastFlows().get(this.energyCarrierProduced) + " kW"; } - } \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAConversionBiogasMethane.java b/_alp/Classes/Class.J_EAConversionBiogasMethane.java deleted file mode 100644 index aefd82db..00000000 --- a/_alp/Classes/Class.J_EAConversionBiogasMethane.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * J_EAConversionBiogasMethane - */ -public class J_EAConversionBiogasMethane extends zero_engine.J_EAConversion implements Serializable { - - //private OL_EnergyCarriers energyCarrierProduced = OL_EnergyCarriers.METHANE; - //private OL_EnergyCarriers energyCarrierConsumed = OL_EnergyCarriers.METHANE; - public double capacityMethane_kW; - //protected double outputTemperature_degC; - /** - * Default constructor - */ - public J_EAConversionBiogasMethane() { - } - - /** - * Constructor initializing the fields - */ - public J_EAConversionBiogasMethane(Agent parentAgent, double capacityMethane_kW, double efficiency, double timestep_h) { - this.parentAgent= parentAgent; - this.capacityMethane_kW = capacityMethane_kW; - this.eta_r = efficiency; - this.timestep_h = timestep_h; - registerEnergyAsset(); - } - - @Override - public Pair operate(double ratioOfCapacity) { - //traceln("I convert now! GasBurner @ " + (ratioOfCapacity * 100) + " %"); - this.methaneProduction_kW = capacityMethane_kW * ratioOfCapacity; - this.methaneConsumption_kW = methaneProduction_kW / eta_r; - energyUse_kW = methaneConsumption_kW - methaneProduction_kW; - this.energyUsed_kWh += timestep_h * energyUse_kW; // This represents losses! - //double[] arr = {this.electricityProduction_kW, this.methaneProduction_kW, this.hydrogenProduction_kW, this.heatProduction_kW, this.electricityConsumption_kW, this.methaneConsumption_kW, this.hydrogenConsumption_kW, this.heatConsumption_kW }; - //return arr; - return returnEnergyFlows(); - } - - public double getEnergyUsed_kWh() { - return energyUsed_kWh; - } - - @Override - public String toString() { - return - "parentAgent = " + parentAgent +", Energy consumed = " + this.energyUsed_kWh + - "capacityMethane_kW = " + this.capacityMethane_kW +" "+ - "eta_r = " + this.eta_r+" " + - "energyUsed_kWh (losses) = " + this.energyUsed_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; - -} \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAConversionElectricHeater.java b/_alp/Classes/Class.J_EAConversionElectricHeater.java index a9688614..6878091a 100644 --- a/_alp/Classes/Class.J_EAConversionElectricHeater.java +++ b/_alp/Classes/Class.J_EAConversionElectricHeater.java @@ -1,13 +1,19 @@ /** * J_EAConversionElectricHeater */ -public class J_EAConversionElectricHeater extends J_EAConversion implements Serializable, I_HeatingAsset { +public class J_EAConversionElectricHeater extends J_EAConversion implements I_HeatingAsset { protected double outputTemperature_degC; + /** - * Default constructor + * Empty constructor for serialization + */ + public J_EAConversionElectricHeater() { + } + + /** + * Default constructor initializing the fields */ - public J_EAConversionElectricHeater(I_AssetOwner owner, double outputHeatCapacity_kW, double efficiency_r, J_TimeParameters timeParameters, double outputTemperature_degC) { this.setOwner(owner); this.timeParameters = timeParameters; diff --git a/_alp/Classes/Class.J_EAConversionElectrolyser.java b/_alp/Classes/Class.J_EAConversionElectrolyser.java index e5e5c937..a4e04af6 100644 --- a/_alp/Classes/Class.J_EAConversionElectrolyser.java +++ b/_alp/Classes/Class.J_EAConversionElectrolyser.java @@ -19,7 +19,7 @@ public class J_EAConversionElectrolyser extends zero_engine.J_EAConversion imple /** - * Default constructor for serialization + * Empty constructor for serialization */ public J_EAConversionElectrolyser() { } diff --git a/_alp/Classes/Class.J_EAConversionGasBurner.java b/_alp/Classes/Class.J_EAConversionGasBurner.java index 03df9132..5a9c18f0 100644 --- a/_alp/Classes/Class.J_EAConversionGasBurner.java +++ b/_alp/Classes/Class.J_EAConversionGasBurner.java @@ -5,8 +5,8 @@ public class J_EAConversionGasBurner extends zero_engine.J_EAConversion implemen protected double outputTemperature_degC; - /** - * Default constructor + /** + * Empty constructor for serialization */ public J_EAConversionGasBurner() { } diff --git a/_alp/Classes/Class.J_EAConversionGasCHP.java b/_alp/Classes/Class.J_EAConversionGasCHP.java index 191cae85..38fe09e3 100644 --- a/_alp/Classes/Class.J_EAConversionGasCHP.java +++ b/_alp/Classes/Class.J_EAConversionGasCHP.java @@ -8,10 +8,9 @@ public class J_EAConversionGasCHP extends zero_engine.J_EAConversion implements protected double outputElectricCapacity_kW; protected List energyCarriersProduced = new ArrayList<>(); - /** - * Default constructor + /** + * Empty constructor for serialization */ - public J_EAConversionGasCHP() { } diff --git a/_alp/Classes/Class.J_EAConversionHeatDeliverySet.java b/_alp/Classes/Class.J_EAConversionHeatDeliverySet.java index 03f39198..49927ecc 100644 --- a/_alp/Classes/Class.J_EAConversionHeatDeliverySet.java +++ b/_alp/Classes/Class.J_EAConversionHeatDeliverySet.java @@ -1,11 +1,11 @@ /** * J_EAConversionHeatDeliverySet */ -public class J_EAConversionHeatDeliverySet extends zero_engine.J_EAConversion implements Serializable, I_HeatingAsset { +public class J_EAConversionHeatDeliverySet extends zero_engine.J_EAConversion implements I_HeatingAsset { protected double outputTemperature_degC; /** - * Default constructor + * Empty constructor for serialization */ public J_EAConversionHeatDeliverySet() { } @@ -13,7 +13,6 @@ public J_EAConversionHeatDeliverySet() { /** * Constructor initializing the fields */ - public J_EAConversionHeatDeliverySet(I_AssetOwner owner, double outputHeatCapacity_kW, double efficiency_r, J_TimeParameters timeParameters, double outputTemperature_degC) { this.setOwner(owner); this.timeParameters = timeParameters; @@ -49,6 +48,4 @@ public void operate(double powerFraction_fr, J_TimeVariables timeVariables) { this.assetFlowsMap.put(this.assetFlowCategory, powerFraction_fr * this.inputCapacity_kW); } } - -} - +} \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAConversionHeatPump.java b/_alp/Classes/Class.J_EAConversionHeatPump.java index 472102cb..3e04f7aa 100644 --- a/_alp/Classes/Class.J_EAConversionHeatPump.java +++ b/_alp/Classes/Class.J_EAConversionHeatPump.java @@ -1,7 +1,7 @@ /** * J_EAConversionHeatPump */ -public class J_EAConversionHeatPump extends zero_engine.J_EAConversion implements Serializable, I_HeatingAsset { +public class J_EAConversionHeatPump extends zero_engine.J_EAConversion implements I_HeatingAsset { private double COP_r; private double belowZeroHeatpumpEtaReductionFactor; protected double outputTemperature_degC; @@ -13,13 +13,11 @@ public class J_EAConversionHeatPump extends zero_engine.J_EAConversion implement public double p_baseTemperatureReference; /** - * Default constructor + * Empty constructor for serialization */ public J_EAConversionHeatPump() { } - //Agent parentAgent, double outputCapacity_kW, double efficiency_r, double timestep_h, double outputTemperature_degC) { - /** * Constructor initializing the fields */ @@ -33,8 +31,6 @@ public J_EAConversionHeatPump(I_AssetOwner owner, double inputElectricCapacity_k this.ambientTempType = ambientTempType; this.updateAmbientTemperature( this.baseTemperature_degC ); - //this.COP_r = eta_r * ( 273.15 + outputTemperature_degC ) / ( outputTemperature_degC - baseTemperature_degC ); - // traceln("Carnot-based Heatpump COP with parameter eta_r is no longer used! Replaced by empirical COP-curve."); this.COP_r = calculateCOP(this.outputTemperature_degC, this.baseTemperature_degC); this.sourceAssetHeatPower_kW = sourceAssetHeatPower_kW; @@ -55,32 +51,26 @@ public void updateParameters(double baseTemperature_degC, double outputTemperatu if ( this.baseTemperature_degC > this.outputTemperature_degC) { traceln("**** EXCEPTION **** Heatpump baseTemperature ( " + this.baseTemperature_degC + ") > outputTemperature ( " + this.outputTemperature_degC + ") "); } - //this.COP_r = this.eta_r * ( 273.15 + this.outputTemperature_degC ) / ( this.outputTemperature_degC - this.baseTemperature_degC ); - this.COP_r = calculateCOP(this.outputTemperature_degC, this.baseTemperature_degC); //8.74 - 0.190 * deltaT + 0.00126 * deltaT * deltaT; + + this.COP_r = calculateCOP(this.outputTemperature_degC, this.baseTemperature_degC); // water heatpump should take sourceAsset power transfer limitations into account (e.g. residual heat). Ugly but effectively limiting heat power output. if( this.sourceAssetHeatPower_kW > 0) { this.outputCapacity_kW = min( this.outputCapacity_kW, this.sourceAssetHeatPower_kW / (1 - (1 / COP_r ))); - //traceln("Water water heatpump heat capacity limited from source! =" + this.capacityHeat_kW); } else { this.outputCapacity_kW = this.inputCapacity_kW * this.COP_r; - //traceln("heatpump updating temp: " + baseTemperature_degC); if( baseTemperature_degC < 0 ) { this.COP_r = this.COP_r / this.belowZeroHeatpumpEtaReductionFactor; } } - //traceln("J_EAConversionHeatpump capacityHeat_kW = "+ this.capacityHeat_kW + ", sourceAssetHeatPower_kW " + this.sourceAssetHeatPower_kW ); - } public void updateAmbientTemperature(double baseTemperature_degC) { // water heatpump should take sourceAsset power transfer limitations into account (e.g. residual heat). Ugly but effectively limiting heat power output. - - //traceln("J_EAHeatpump capacityHeat_kW = " + this.capacityHeat_kW + ", baseTemperature = "+ baseTemperature_degC + ", outputtemperature = "+ outputTemperature_degC); updateParameters(baseTemperature_degC, this.outputTemperature_degC); - this.COP_r = calculateCOP(this.outputTemperature_degC, this.baseTemperature_degC); //this.eta_r * ( 273.15 + this.outputTemperature_degC ) / ( this.outputTemperature_degC - this.baseTemperature_degC ); + this.COP_r = calculateCOP(this.outputTemperature_degC, this.baseTemperature_degC); this.outputCapacity_kW = this.inputCapacity_kW * this.COP_r; } @@ -90,7 +80,6 @@ public void setCOP(double COP_r) { } public double getCOP() { - //traceln("Heatpump output temperature: " + this.outputTemperature_degC); return this.COP_r; } @@ -110,7 +99,7 @@ public void operate(double powerFraction_fr, J_TimeVariables timeVariables) { heatConsumption_kW = heatProduction_kW - electricityConsumption_kW; //update effective energy production of source asset! this.p_linkedSourceEnergyAsset.v_powerFraction_fr += ( heatConsumption_kW / ((J_EAProduction)this.p_linkedSourceEnergyAsset).getCapacityHeat_kW() ); -// this.ownerAsset.p_linkedSourceEnergyAsset.j_ea.heatProduction_kW += this.heatConsumption_kW; + this.ownerAsset.p_linkedSourceEnergyAsset.j_ea.heatProduction_kW += this.heatConsumption_kW; } */ if (this.ambientTempType == OL_AmbientTempType.HEAT_GRID ) { @@ -129,7 +118,6 @@ public void operate(double powerFraction_fr, J_TimeVariables timeVariables) { public void setSourceAssetHeatPower(double sourceAssetHeatPower_kW) { this.sourceAssetHeatPower_kW = sourceAssetHeatPower_kW; - //traceln("sourceAssetHeatPower_kW is set to: "+sourceAssetHeatPower_kW); } public void setBaseTemperature_degC( double baseTemperature_degC) { @@ -142,6 +130,7 @@ public OL_AmbientTempType getAmbientTempType() { } public double calculateCOP(double outputTemperature_degC, double baseTemperature_degC) { + //double COP_r = this.eta_r * ( 273.15 + this.outputTemperature_degC ) / ( this.outputTemperature_degC - this.baseTemperature_degC ); double deltaT = max(1,this.outputTemperature_degC - this.baseTemperature_degC); // Limit deltaT to at least 1 degree. double COP_r = 8.74 - 0.190 * deltaT + 0.00126 * deltaT*deltaT; return COP_r; @@ -151,21 +140,17 @@ public double calculateCOP(double outputTemperature_degC, double baseTemperature public double getOutputTemperature_degC() { return this.outputTemperature_degC; } - /* + @Override public String toString() { return - "type = " + this.getClass().toString() + " " + - "parentAgent = " + parentAgent +" " + - "capacityElectricity_kW = " + capacityElectric_kW +" "+ - "capacityHeat_kW = " + capacityHeat_kW +" "+ - "baseTemperature_degC = " + baseTemperature_degC + " "+ - "ambientTempType = " + ambientTempType + " "+ - "sourceAssetHeatPower_kW = " + sourceAssetHeatPower_kW + " " + - "outputTemperature_degC = " + outputTemperature_degC +" "+ - "energyUsed_kWh = " + energyUsed_kWh + " "+ - "heatProduced_kWh = " + heatProduced_kWh + " "+ - "heatConsumed_kWh = " + heatConsumed_kWh + " "; - } - */ + "J_EAConversionHeatPump: \n" + + "capacityElectricity_kW = " + inputCapacity_kW + "\n"+ + "capacityHeat_kW = " + outputCapacity_kW +"\n"+ + "baseTemperature_degC = " + baseTemperature_degC + "\n"+ + "ambientTempType = " + ambientTempType + "\n"+ + "sourceAssetHeatPower_kW = " + sourceAssetHeatPower_kW + "\n"+ + "outputTemperature_degC = " + outputTemperature_degC +" \n"+ + "energyUsed_kWh = " + energyUsed_kWh; + } } diff --git a/_alp/Classes/Class.J_EAConversionHob.java b/_alp/Classes/Class.J_EAConversionHob.java new file mode 100644 index 00000000..abf346db --- /dev/null +++ b/_alp/Classes/Class.J_EAConversionHob.java @@ -0,0 +1,62 @@ +/** + * J_EAConversionHob + */ +public class J_EAConversionHob extends J_EAConversion{ + + //protected double outputTemperature_degC; + + /** + * Empty constructor for serialization + */ + public J_EAConversionHob() { + } + + /** + * Default constructor + */ + public J_EAConversionHob(I_AssetOwner owner, OL_EnergyCarriers energyCarrierConsumed, double inputCapacity_kW, double efficiency, J_TimeParameters timeParameters, double outputTemperature_degC) { + this.setOwner(owner); + this.timeParameters = timeParameters; + this.inputCapacity_kW = inputCapacity_kW; + this.eta_r = efficiency; // The efficiency is the amount of heat that is retained within the building + this.outputCapacity_kW = inputCapacity_kW * efficiency; + //this.outputTemperature_degC = outputTemperature_degC; + this.energyCarrierProduced = OL_EnergyCarriers.HEAT; + this.energyCarrierConsumed = energyCarrierConsumed; + + if(energyCarrierConsumed == OL_EnergyCarriers.ELECTRICITY) { + this.assetFlowCategory = OL_AssetFlowCategories.electricHobConsumption_kW; + this.energyAssetType = OL_EnergyAssetType.ELECTRIC_HOB; + } + else if (energyCarrierConsumed == OL_EnergyCarriers.METHANE){ + this.energyAssetType = OL_EnergyAssetType.GAS_HOB; + } + else { + throw new RuntimeException("EnergyCarrierConsumed (" + energyCarrierConsumed + ") found for J_EAConversionHob that is not supported!"); + } + + this.activeProductionEnergyCarriers.add(this.energyCarrierProduced); + this.activeConsumptionEnergyCarriers.add(this.energyCarrierConsumed); + registerEnergyAsset(timeParameters); + } + + @Override + public void operate( double powerFraction_fr, J_TimeVariables timeVariables ) { + double heatProduction_kW = this.inputCapacity_kW * powerFraction_fr * eta_r; + double energyInput_kW = this.inputCapacity_kW * powerFraction_fr; + this.energyUse_kW = (energyInput_kW - heatProduction_kW); + this.energyUsed_kWh += this.timeParameters.getTimeStep_h() * (energyInput_kW - heatProduction_kW); // This represents losses! + flowsMap.put(this.energyCarrierConsumed, energyInput_kW); + flowsMap.put(OL_EnergyCarriers.HEAT, -heatProduction_kW); + assetFlowsMap.put(this.assetFlowCategory, energyInput_kW); + } + + @Override + public String toString() { + return + "J_EAConversionHob: \n" + + "capacityElectric_kW = " + this.inputCapacity_kW +", \n"+ + "eta_r = " + this.eta_r+ ", \n" + + "energyUsed_kWh (losses) = " + this.energyUsed_kWh; + } +} \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAConversionHydrogenBurner.java b/_alp/Classes/Class.J_EAConversionHydrogenBurner.java index ce6c8b28..33cbb9a3 100644 --- a/_alp/Classes/Class.J_EAConversionHydrogenBurner.java +++ b/_alp/Classes/Class.J_EAConversionHydrogenBurner.java @@ -1,11 +1,12 @@ /** * J_EAConversionGasBurner */ -public class J_EAConversionHydrogenBurner extends zero_engine.J_EAConversion implements Serializable, I_HeatingAsset { +public class J_EAConversionHydrogenBurner extends zero_engine.J_EAConversion implements I_HeatingAsset { protected double outputTemperature_degC; - /** - * Default constructor + + /** + * Empty constructor for serialization */ public J_EAConversionHydrogenBurner() { } @@ -30,11 +31,4 @@ public J_EAConversionHydrogenBurner(I_AssetOwner owner, double outputHeatCapacit this.activeConsumptionEnergyCarriers.add(this.energyCarrierConsumed); registerEnergyAsset(timeParameters); } - - /** - * 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_EAEV.java b/_alp/Classes/Class.J_EAEV.java index 323ea974..f3d0acea 100644 --- a/_alp/Classes/Class.J_EAEV.java +++ b/_alp/Classes/Class.J_EAEV.java @@ -1,9 +1,6 @@ /** * J_EAEV */ -import com.fasterxml.jackson.annotation.JsonTypeName; - -//@JsonTypeName("J_EAEV") public class J_EAEV extends J_EAFlex implements I_Vehicle, I_ChargingRequest { private boolean available = true; @@ -30,8 +27,9 @@ public class J_EAEV extends J_EAFlex implements I_Vehicle, I_ChargingRequest { private double energyChargedOutsideModelAreaStored_kWh; private double charged_kWh = 0; private double discharged_kWh = 0; - /** - * Default constructor + + /** + * Empty constructor for serialization */ public J_EAEV() { } @@ -56,7 +54,7 @@ public J_EAEV(I_AssetOwner owner, double capacityElectricity_kW, double storageC this.tripTracker = tripTracker; this.available = available; if (tripTracker != null) { - tripTracker.vehicle=this; + tripTracker.setVehicle(this); } // Validation checks if (capacityElectric_kW <= 0 || storageCapacity_kWh <= 0 || energyConsumption_kWhpkm <= 0) { @@ -301,5 +299,4 @@ public String toString() { "storageCapacity_kWh = " + storageCapacity_kWh + " " + "charged_kWh = " + roundToDecimal( charged_kWh, 2 ); } -} - +} \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAElectricHob.java b/_alp/Classes/Class.J_EAElectricHob.java deleted file mode 100644 index b24256ad..00000000 --- a/_alp/Classes/Class.J_EAElectricHob.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * J_EAElectricHob - */ -public class J_EAElectricHob extends J_EAConversion implements Serializable { - - //protected double outputTemperature_degC; - - /** - * Default constructor - */ - // The efficiency is the amount of heat that is retained within the building - public J_EAElectricHob(I_AssetOwner owner, double inputCapacity_kW, double efficiency, J_TimeParameters timeParameters, double outputTemperature_degC) { - this.setOwner(owner); - this.timeParameters = timeParameters; - this.inputCapacity_kW = inputCapacity_kW; - this.eta_r = efficiency; - this.outputCapacity_kW = inputCapacity_kW * efficiency; - //this.outputTemperature_degC = outputTemperature_degC; - this.energyCarrierProduced = OL_EnergyCarriers.HEAT; - this.energyCarrierConsumed = OL_EnergyCarriers.ELECTRICITY; - this.energyAssetType = OL_EnergyAssetType.ELECTRIC_HOB; - this.assetFlowCategory = OL_AssetFlowCategories.electricHobConsumption_kW; - this.activeProductionEnergyCarriers.add(this.energyCarrierProduced); - this.activeConsumptionEnergyCarriers.add(this.energyCarrierConsumed); - registerEnergyAsset(timeParameters); - } - - @Override - public void operate( double powerFraction_fr, J_TimeVariables timeVariables ) { - double heatProduction_kW = this.inputCapacity_kW * powerFraction_fr * eta_r; - double electricityConsumption_kW = this.inputCapacity_kW * powerFraction_fr; - this.energyUse_kW = (electricityConsumption_kW - heatProduction_kW); - this.energyUsed_kWh += this.timeParameters.getTimeStep_h() * (electricityConsumption_kW - heatProduction_kW); // This represents losses! - //this.heatProduced_kWh += heatProduction_kW * timestep_h; - flowsMap.put(OL_EnergyCarriers.ELECTRICITY, electricityConsumption_kW); - flowsMap.put(OL_EnergyCarriers.HEAT, -heatProduction_kW); - assetFlowsMap.put(this.assetFlowCategory, electricityConsumption_kW); - } - - @Override - public String toString() { - return - "AssetType = " + energyAssetType + ", " + - "Energy consumed = " + this.energyUsed_kWh + ", " + - " capacityElectric_kW = " + this.inputCapacity_kW +" "+ - "eta_r = " + this.eta_r+ ", " + - "energyUsed_kWh (losses) = " + this.energyUsed_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; - -} \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAFixed.java b/_alp/Classes/Class.J_EAFixed.java index 34420938..41be9a0b 100644 --- a/_alp/Classes/Class.J_EAFixed.java +++ b/_alp/Classes/Class.J_EAFixed.java @@ -21,10 +21,4 @@ public J_FlowPacket f_updateAllFlows(J_TimeVariables timeVariables) { } public abstract void operate(J_TimeVariables timeVariables); - - - @Override - public String toString() { - return super.toString(); - } } \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAFlex.java b/_alp/Classes/Class.J_EAFlex.java index 5c8eef18..c4a9be9f 100644 --- a/_alp/Classes/Class.J_EAFlex.java +++ b/_alp/Classes/Class.J_EAFlex.java @@ -22,9 +22,4 @@ public J_FlowPacket f_updateAllFlows(double powerFraction_fr, J_TimeVariables ti } public abstract void operate(double powerFraction_fr, J_TimeVariables timeVariables); - - @Override - public String toString() { - return super.toString(); - } } \ No newline at end of file diff --git a/_alp/Classes/Class.J_EAFuelVehicle.java b/_alp/Classes/Class.J_EAFuelVehicle.java index 55344bdd..6927d043 100644 --- a/_alp/Classes/Class.J_EAFuelVehicle.java +++ b/_alp/Classes/Class.J_EAFuelVehicle.java @@ -1,7 +1,7 @@ /** * J_EAConversionPetroleumFuelVehicle */ -public class J_EAFuelVehicle extends J_EAFixed implements I_Vehicle, Serializable { +public class J_EAFuelVehicle extends J_EAFixed implements I_Vehicle{ private OL_EnergyCarriers energyCarrierConsumed; private boolean available = true; @@ -34,7 +34,7 @@ public J_EAFuelVehicle(I_AssetOwner owner, double energyConsumption_kWhpkm, J_Ti this.tripTracker = tripTracker; this.available = available; if (tripTracker != null) { - tripTracker.vehicle=this; + tripTracker.setVehicle(this); } this.energyCarrierConsumed = energyCarrier; @@ -152,11 +152,5 @@ public String toString() { "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; } diff --git a/_alp/Classes/Class.J_EAPetroleumFuelTractor.java b/_alp/Classes/Class.J_EAPetroleumFuelTractor.java index 2c967eed..2993c51b 100644 --- a/_alp/Classes/Class.J_EAPetroleumFuelTractor.java +++ b/_alp/Classes/Class.J_EAPetroleumFuelTractor.java @@ -1,6 +1,6 @@ import java.util.*; -public class J_EAPetroleumFuelTractor extends J_EAProfile implements Serializable { +public class J_EAPetroleumFuelTractor extends J_EAProfile{ final static double PETROLEUM_FUEL_ENERGY_DENSITY_KWH_PER_L = 9.7; final double[] petroleumFuelConsumptionPerWeek_L; diff --git a/_alp/Classes/Class.J_EAProduction.java b/_alp/Classes/Class.J_EAProduction.java index e5ce819f..2df84c3e 100644 --- a/_alp/Classes/Class.J_EAProduction.java +++ b/_alp/Classes/Class.J_EAProduction.java @@ -1,12 +1,8 @@ /** * J_EAProduction */ -public class J_EAProduction extends zero_engine.J_EAProfile implements Serializable { - //protected J_ProfilePointer profilePointer; - //protected OL_EnergyCarriers energyCarrier = OL_EnergyCarriers.ELECTRICITY; +public class J_EAProduction extends zero_engine.J_EAProfile{ protected double totalEnergyCurtailed_kWh=0; - //protected double outputTemperature_degC; - //protected double capacity_kW; /** * Default constructor @@ -188,15 +184,4 @@ public String toString() { "assetFlowCategory = " + this.assetFlowCategory + " " + "energyProduced_kWh = " + (-this.energyUsed_kWh) + " "; } - - - /*public double getCurrentTemperature() { - return outputTemperature_degC; - }*/ - - /** - * 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_EAStorageElectric.java b/_alp/Classes/Class.J_EAStorageElectric.java index b3a2bb6a..76417d91 100644 --- a/_alp/Classes/Class.J_EAStorageElectric.java +++ b/_alp/Classes/Class.J_EAStorageElectric.java @@ -4,13 +4,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; - + /** - * Default constructor + * Empty constructor for serialization */ public J_EAStorageElectric() { } From e8330f46fedcd72a21005e5283ce69ac603fdbfb Mon Sep 17 00:00:00 2001 From: Ate Hempenius Date: Mon, 1 Jun 2026 19:23:19 +0200 Subject: [PATCH 2/2] adjustments to vehicle type and I_Vehicle interface. --- Zero_engine.alpx | 4 -- _alp/Agents/GCPublicCharger/Variables.xml | 1 + .../Agents/GridConnection/Code/Functions.java | 2 +- _alp/Classes/Class.I_Vehicle.java | 8 ++- .../Classes/Class.J_ActivityTrackerTrips.java | 10 +-- .../Class.J_CustomTripTrackerGenerator.java | 9 --- _alp/Classes/Class.J_EAEV.java | 43 ++++++++----- _alp/Classes/Class.J_EAFuelVehicle.java | 62 +++++++++++++++---- 8 files changed, 92 insertions(+), 47 deletions(-) delete mode 100644 _alp/Classes/Class.J_CustomTripTrackerGenerator.java diff --git a/Zero_engine.alpx b/Zero_engine.alpx index b500f507..90810d25 100644 --- a/Zero_engine.alpx +++ b/Zero_engine.alpx @@ -2229,10 +2229,6 @@ LARGE_CONNECTION (grootverbruik, > 3x80) 1776078970513 - - 1779961820984 - - com.anylogic.libraries.modules.markup_descriptors diff --git a/_alp/Agents/GCPublicCharger/Variables.xml b/_alp/Agents/GCPublicCharger/Variables.xml index 6be4b972..3f867328 100644 --- a/_alp/Agents/GCPublicCharger/Variables.xml +++ b/_alp/Agents/GCPublicCharger/Variables.xml @@ -29,6 +29,7 @@ 1750335661857 + true 1630 150