Skip to content

Commit 4c11a17

Browse files
committed
Fixed issues, now have mode for normal and bypass operation
1 parent 1341a82 commit 4c11a17

8 files changed

Lines changed: 270 additions & 338 deletions

File tree

src/omotes_simulator_core/entities/assets/ates_cluster.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,9 @@ def _calculate_massflowrate(self) -> None:
147147
def _set_solver_asset_setpoint(self) -> None:
148148
"""Set the setpoint of solver asset."""
149149
if self.mass_flowrate >= 0:
150-
self.solver_asset.supply_temperature = self.cold_well_temperature # injection
151-
else:
152150
self.solver_asset.supply_temperature = self.hot_well_temperature # production
151+
else:
152+
self.solver_asset.supply_temperature = self.cold_well_temperature # injection
153153
self.solver_asset.mass_flow_rate_set_point = self.mass_flowrate # type: ignore
154154

155155
def set_setpoints(self, setpoints: dict) -> None:
@@ -169,19 +169,23 @@ def set_setpoints(self, setpoints: dict) -> None:
169169
setpoints_set = set(setpoints.keys())
170170
# Check if all setpoints are in the setpoints
171171
if necessary_setpoints.issubset(setpoints_set):
172-
self.thermal_power_allocation = -1 * setpoints[PROPERTY_HEAT_DEMAND]
172+
self.thermal_power_allocation = -setpoints[PROPERTY_HEAT_DEMAND]
173173
if self.first_time_step:
174-
self.temperature_in = setpoints[PROPERTY_TEMPERATURE_IN]
175-
self.temperature_out = setpoints[PROPERTY_TEMPERATURE_OUT]
174+
if self.thermal_power_allocation >= 0:
175+
self.temperature_in = setpoints[PROPERTY_TEMPERATURE_OUT]
176+
self.temperature_out = setpoints[PROPERTY_TEMPERATURE_IN]
177+
else:
178+
self.temperature_in = setpoints[PROPERTY_TEMPERATURE_IN]
179+
self.temperature_out = setpoints[PROPERTY_TEMPERATURE_OUT]
176180
self.first_time_step = False
177181
else:
178182
# After the first time step: use solver temperature
179183
if self.thermal_power_allocation >= 0:
184+
self.temperature_out = self.solver_asset.get_temperature(0)
180185
self.temperature_in = self.hot_well_temperature
181-
self.temperature_out = self.solver_asset.get_temperature(1)
182186
else:
183-
self.temperature_in = self.solver_asset.get_temperature(0)
184-
self.temperature_out = self.cold_well_temperature
187+
self.temperature_in = self.cold_well_temperature
188+
self.temperature_out = self.solver_asset.get_temperature(1)
185189

186190
self._calculate_massflowrate()
187191
if self.current_time != self.time:
@@ -331,6 +335,6 @@ def is_converged(self) -> bool:
331335
332336
:return: True if the asset has converged, False otherwise
333337
"""
334-
return abs(self.get_heat_supplied() + self.thermal_power_allocation) < (
335-
self.thermal_power_allocation * 0.001
338+
return abs(self.get_heat_supplied() - self.thermal_power_allocation) < (
339+
abs(self.thermal_power_allocation) * 0.001
336340
)

src/omotes_simulator_core/entities/assets/controller/controller_heat_transfer.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,22 @@ def set_asset(self, heat_demand: float, bypass: bool = False) -> dict[str, dict[
5757
SECONDARY + PROPERTY_HEAT_DEMAND: heat_demand * -1,
5858
SECONDARY + PROPERTY_TEMPERATURE_OUT: 273.15 + 80,
5959
SECONDARY + PROPERTY_TEMPERATURE_IN: 273.15 + 50,
60-
PROPERTY_SET_PRESSURE: False,
60+
SECONDARY + PROPERTY_SET_PRESSURE: False,
61+
PRIMARY + PROPERTY_SET_PRESSURE: False,
6162
PROPERTY_BYPASS: True,
6263
}
6364
}
6465
else:
6566
return {
6667
self.id: {
67-
PRIMARY + PROPERTY_HEAT_DEMAND: heat_demand,
68+
PRIMARY + PROPERTY_HEAT_DEMAND: heat_demand / self.factor,
6869
PRIMARY + PROPERTY_TEMPERATURE_OUT: 273.15 + 30,
69-
PRIMARY + PROPERTY_TEMPERATURE_IN: 273.15 + 40,
70-
SECONDARY + PROPERTY_HEAT_DEMAND: -heat_demand * self.factor,
70+
PRIMARY + PROPERTY_TEMPERATURE_IN: 273.15 + 50,
71+
SECONDARY + PROPERTY_HEAT_DEMAND: -heat_demand,
7172
SECONDARY + PROPERTY_TEMPERATURE_OUT: 273.15 + 80,
72-
SECONDARY + PROPERTY_TEMPERATURE_IN: 273.15 + 50,
73-
PROPERTY_SET_PRESSURE: False,
73+
SECONDARY + PROPERTY_TEMPERATURE_IN: 273.15 + 40,
74+
SECONDARY + PROPERTY_SET_PRESSURE: False,
75+
PRIMARY + PROPERTY_SET_PRESSURE: False,
7476
PROPERTY_BYPASS: False,
7577
}
7678
}

src/omotes_simulator_core/entities/assets/controller/controller_network.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
PROPERTY_SET_PRESSURE,
2424
PROPERTY_TEMPERATURE_IN,
2525
PROPERTY_TEMPERATURE_OUT,
26+
SECONDARY,
27+
PRIMARY,
2628
)
2729
from omotes_simulator_core.entities.assets.controller.controller_consumer import ControllerConsumer
2830
from omotes_simulator_core.entities.assets.controller.controller_heat_transfer import (
@@ -232,17 +234,17 @@ def get_total_supply_priority(self, priority: int) -> float:
232234
sum([producer.power for producer in self.producers if producer.priority == priority])
233235
)
234236

235-
def set_pressure(self) -> str:
236-
"""Returns the id of the asset for which the pressure can be set for this network.
237+
def set_pressure(self) -> tuple[str, str]:
238+
"""Returns the id of the asset for which the pressure can be set for this network and the key in the set points dict.
237239
238240
The controller needs to set per hydraulic separated part of the system the pressure.
239241
The network can thus pass back the id for which asset the pressure needs to be set.
240242
The controller can then do this.
241243
"""
242244
if self.producers:
243-
return self.producers[0].id
245+
return (self.producers[0].id, PROPERTY_SET_PRESSURE)
244246
if self.heat_transfer_assets_sec:
245-
return self.heat_transfer_assets_sec[0].id
247+
return (self.heat_transfer_assets_sec[0].id, SECONDARY + PROPERTY_SET_PRESSURE)
246248
if self.heat_transfer_assets_prim:
247-
return self.heat_transfer_assets_prim[0].id
249+
return (self.heat_transfer_assets_prim[0].id, PRIMARY + PROPERTY_SET_PRESSURE)
248250
raise ValueError("No asset found for which the pressure can be set.")

src/omotes_simulator_core/entities/assets/heat_pump.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def _set_setpoints_secondary(self, setpoints_secondary: Dict) -> None:
118118
SECONDARY + PROPERTY_TEMPERATURE_IN,
119119
SECONDARY + PROPERTY_TEMPERATURE_OUT,
120120
SECONDARY + PROPERTY_HEAT_DEMAND,
121-
PROPERTY_SET_PRESSURE,
121+
SECONDARY + PROPERTY_SET_PRESSURE,
122122
PROPERTY_BYPASS,
123123
}
124124
# Dict to set
@@ -138,14 +138,13 @@ def _set_setpoints_secondary(self, setpoints_secondary: Dict) -> None:
138138

139139
# self.temperature_in_secondary = setpoints_secondary[SECONDARY + PROPERTY_TEMPERATURE_IN]
140140
self.temperature_out_secondary = setpoints_secondary[SECONDARY + PROPERTY_TEMPERATURE_OUT]
141-
self.mass_flow_secondary = heat_demand_and_temperature_to_mass_flow(
141+
self.mass_flow_secondary = -heat_demand_and_temperature_to_mass_flow(
142142
thermal_demand=setpoints_secondary[SECONDARY + PROPERTY_HEAT_DEMAND],
143143
temperature_in=self.temperature_in_secondary,
144144
temperature_out=self.temperature_out_secondary,
145145
)
146146
self.control_mass_flow_secondary = not (
147-
setpoints_secondary[PROPERTY_SET_PRESSURE]
148-
& (setpoints_secondary[SECONDARY + PROPERTY_HEAT_DEMAND] < 0)
147+
setpoints_secondary[SECONDARY + PROPERTY_SET_PRESSURE]
149148
)
150149

151150
# Assign setpoints to the HeatTransferAsset solver asset
@@ -178,6 +177,7 @@ def _set_setpoints_primary(self, setpoints_primary: Dict) -> None:
178177
PRIMARY + PROPERTY_TEMPERATURE_IN,
179178
PRIMARY + PROPERTY_TEMPERATURE_OUT,
180179
PRIMARY + PROPERTY_HEAT_DEMAND,
180+
PRIMARY + PROPERTY_SET_PRESSURE,
181181
}
182182
# Dict to set
183183
setpoints_set = set(setpoints_primary.keys())
@@ -201,10 +201,7 @@ def _set_setpoints_primary(self, setpoints_primary: Dict) -> None:
201201
temperature_in=self.temperature_in_primary,
202202
temperature_out=self.temperature_out_primary,
203203
)
204-
self.control_mass_flow_primary = not (
205-
setpoints_primary[PROPERTY_SET_PRESSURE]
206-
& (setpoints_primary[PRIMARY + PROPERTY_HEAT_DEMAND] < 0)
207-
)
204+
self.control_mass_flow_primary = not (setpoints_primary[PRIMARY + PROPERTY_SET_PRESSURE])
208205

209206
# Assign setpoints to the HeatTransferAsset solver asset
210207
self.solver_asset.temperature_in_primary = self.temperature_in_primary # type: ignore

src/omotes_simulator_core/entities/assets/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ def heat_demand_and_temperature_to_mass_flow(
3535
:param float temperature_in: The temperature that the asset receives from the
3636
"from_junction". The temperature should be supplied in Kelvin.
3737
"""
38-
heat_capacity = fluid_props.get_heat_capacity((temperature_in + temperature_out) / 2)
39-
return thermal_demand / ((temperature_out - temperature_in) * float(heat_capacity))
38+
internal_energy1 = fluid_props.get_ie(temperature_in)
39+
internal_energy2 = fluid_props.get_ie(temperature_out)
40+
return thermal_demand / (internal_energy2 - internal_energy1)
4041

4142

4243
def mass_flow_and_temperature_to_heat_demand(

src/omotes_simulator_core/entities/network_controller.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,12 @@ def update_networks_factor(self) -> None:
6060
for asset in current_network.heat_transfer_assets_prim:
6161
if self.networks[int(step)].exists(asset.id):
6262
network.factor_to_first_network.append(asset.factor)
63-
current_network = self.networks[int(step)]
6463
break
6564
for asset in current_network.heat_transfer_assets_sec:
6665
if self.networks[int(step)].exists(asset.id):
6766
network.factor_to_first_network.append(1 / asset.factor)
68-
current_network = self.networks[int(step)]
6967
break
68+
current_network = self.networks[int(step)]
7069

7170
def update_setpoints(self, time: datetime.datetime) -> dict:
7271
"""Method to get the controller inputs for the network.
@@ -181,8 +180,8 @@ def update_setpoints(self, time: datetime.datetime) -> dict:
181180

182181
# Set the pressure.
183182
for network in self.networks:
184-
pressure_set_asset = network.set_pressure()
185-
asset_setpoints[pressure_set_asset][PROPERTY_SET_PRESSURE] = True
183+
pressure_set_asset, key = network.set_pressure()
184+
asset_setpoints[pressure_set_asset][key] = True
186185

187186
return asset_setpoints
188187

src/omotes_simulator_core/infrastructure/app.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ def run(file_path: str | None = None) -> pd.DataFrame:
4141
config = SimulationConfiguration(
4242
simulation_id=uuid.uuid1(),
4343
name="test run",
44-
timestep=3600,
45-
start=datetime.strptime("2019-01-01T00:00:00", "%Y-%m-%dT%H:%M:%S"),
46-
stop=datetime.strptime("2019-01-01T01:00:00", "%Y-%m-%dT%H:%M:%S"),
44+
timestep=24 * 3600,
45+
start=datetime.strptime("2019-01-18T00:00:00", "%Y-%m-%dT%H:%M:%S"),
46+
stop=datetime.strptime("2019-02-01T00:00:00", "%Y-%m-%dT%H:%M:%S"),
4747
)
4848

4949
esdl_file_path = sys.argv[1] if file_path is None else file_path
@@ -63,9 +63,10 @@ def run(file_path: str | None = None) -> pd.DataFrame:
6363
level=logging.INFO, format="%(asctime)s [%(levelname)s]:%(name)s - %(message)s"
6464
)
6565
t1 = datetime.now()
66-
result = run(r".\testdata\test1.esdl")
66+
result = run(r".\testdata\heat_pump_bypass.esdl")
6767
t2 = datetime.now()
6868

6969
logger.info(f"Results dataframe shape=({result.shape})")
70+
result.to_csv(r".\testdata\heat_pump_bypass_results.csv", index=False)
7071
logger.info(f"Execution time: {t2 - t1}")
7172
logger.debug(result.head())

0 commit comments

Comments
 (0)