Skip to content

Commit 5df4878

Browse files
authored
fix(libecalc): improve validation of pressures set to zero (#1705)
- Expression values of 0 were treated as missing causing assertion failures - Add ProcessNonPositivePressureValidationException for clear feedback when suction, discharge, or intermediate pressure is zero or negative (but currently only validate when the rate is positive - this should change when we get other means than rate =0 for switching a consumer off) - Rename validate_increasing_pressure to validate_pressures
1 parent 8cd57f5 commit 5df4878

3 files changed

Lines changed: 28 additions & 11 deletions

File tree

src/libecalc/common/errors/ecalc_validation_error.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ class ProcessPressureRatioValidationException(EcalcValidationException):
2727
pass
2828

2929

30+
class ProcessNonPositivePressureValidationException(EcalcValidationException):
31+
pass
32+
33+
3034
class ProcessDischargePressureValidationException(EcalcValidationException):
3135
pass
3236

src/libecalc/presentation/yaml/mappers/consumer_function_mapper.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from libecalc.common.energy_usage_type import EnergyUsageType
1111
from libecalc.common.errors.ecalc_validation_error import (
1212
EcalcValidationException,
13+
ProcessNonPositivePressureValidationException,
1314
ProcessPressureRatioValidationException,
1415
)
1516
from libecalc.common.errors.exceptions import InvalidResourceException
@@ -220,7 +221,7 @@ def map_rate_fractions(
220221
]
221222

222223

223-
def validate_increasing_pressure(
224+
def validate_pressures(
224225
suction_pressure: ExpressionTimeSeriesPressure,
225226
discharge_pressure: ExpressionTimeSeriesPressure,
226227
intermediate_pressure: ExpressionTimeSeriesPressure | None = None,
@@ -240,8 +241,20 @@ def validate_increasing_pressure(
240241
if validation_mask[i]:
241242
sp = suction_pressure_values[i]
242243
dp = discharge_pressure_values[i]
244+
if sp <= 0:
245+
raise ProcessNonPositivePressureValidationException(
246+
message=f"Invalid pressure at timestep {i + 1}: suction pressure ({sp}) is non-positive, which is not physically possible."
247+
)
248+
if dp <= 0:
249+
raise ProcessNonPositivePressureValidationException(
250+
message=f"Invalid pressure at timestep {i + 1}: discharge pressure ({dp}) is non-positive, which is not physically possible."
251+
)
243252
if intermediate_pressure_values is not None:
244253
ip = intermediate_pressure_values[i]
254+
if ip <= 0:
255+
raise ProcessNonPositivePressureValidationException(
256+
message=f"Invalid pressure at timestep {i + 1}: intermediate pressure ({ip}) is non-positive, which is not physically possible."
257+
)
245258
if not (sp <= ip <= dp):
246259
raise ProcessPressureRatioValidationException(
247260
message=f"Invalid pressures at index {i + 1}: suction pressure ({sp}) must be less than intermediate pressure ({ip}), which must be less than discharge pressure ({dp})."
@@ -1123,7 +1136,7 @@ def _map_pump(
11231136
validation_mask=pressure_validation_mask,
11241137
)
11251138

1126-
validate_increasing_pressure(
1139+
validate_pressures(
11271140
suction_pressure=suction_pressure,
11281141
discharge_pressure=discharge_pressure,
11291142
)
@@ -1211,7 +1224,7 @@ def _map_multiple_streams_compressor(
12111224
else None
12121225
)
12131226

1214-
validate_increasing_pressure(
1227+
validate_pressures(
12151228
suction_pressure=suction_pressure,
12161229
discharge_pressure=discharge_pressure,
12171230
intermediate_pressure=interstage_control_pressure,
@@ -1280,7 +1293,7 @@ def _map_compressor(
12801293
),
12811294
validation_mask=validation_mask,
12821295
)
1283-
if model.suction_pressure
1296+
if model.suction_pressure is not None
12841297
else None
12851298
)
12861299

@@ -1291,7 +1304,7 @@ def _map_compressor(
12911304
),
12921305
validation_mask=validation_mask,
12931306
)
1294-
if model.discharge_pressure
1307+
if model.discharge_pressure is not None
12951308
else None
12961309
)
12971310
operational_data = CompressorOperationalTimeSeries.from_time_series(
@@ -1309,7 +1322,7 @@ def _map_compressor(
13091322
raise InvalidConsumptionType(actual=consumption_type, expected=consumes)
13101323

13111324
if suction_pressure is not None and discharge_pressure is not None:
1312-
validate_increasing_pressure(
1325+
validate_pressures(
13131326
suction_pressure=suction_pressure,
13141327
discharge_pressure=discharge_pressure,
13151328
)
@@ -1453,7 +1466,7 @@ def _map_compressor_system(
14531466
]
14541467

14551468
for suction_pressure, discharge_pressure in zip(suction_pressures, discharge_pressures):
1456-
validate_increasing_pressure(
1469+
validate_pressures(
14571470
suction_pressure=suction_pressure,
14581471
discharge_pressure=discharge_pressure,
14591472
)
@@ -1615,7 +1628,7 @@ def _map_pump_system(
16151628
] * number_of_pumps
16161629

16171630
for suction_pressure, discharge_pressure in zip(suction_pressures, discharge_pressures):
1618-
validate_increasing_pressure(
1631+
validate_pressures(
16191632
suction_pressure=suction_pressure,
16201633
discharge_pressure=discharge_pressure,
16211634
)

tests/libecalc/presentation/yaml/domain/test_time_series_pressure.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
InvalidPressureException,
1010
)
1111
from libecalc.presentation.yaml.domain.time_series_expression import TimeSeriesExpression
12-
from libecalc.presentation.yaml.mappers.consumer_function_mapper import validate_increasing_pressure
12+
from libecalc.presentation.yaml.mappers.consumer_function_mapper import validate_pressures
1313

1414
periods = [
1515
Period(start=datetime(2020, 1, 1), end=datetime(2021, 1, 1)),
@@ -44,7 +44,7 @@ def test_expressions_with_pressure_ratio_less_than_one(expression_evaluator_fact
4444
)
4545

4646
with pytest.raises(ProcessPressureRatioValidationException):
47-
validate_increasing_pressure(
47+
validate_pressures(
4848
suction_pressure=ExpressionTimeSeriesPressure(
4949
time_series_expression=TimeSeriesExpression(expression="SIM1;PS", expression_evaluator=evaluator)
5050
),
@@ -54,7 +54,7 @@ def test_expressions_with_pressure_ratio_less_than_one(expression_evaluator_fact
5454
)
5555

5656
with pytest.raises(ProcessPressureRatioValidationException):
57-
validate_increasing_pressure(
57+
validate_pressures(
5858
suction_pressure=ExpressionTimeSeriesPressure(
5959
time_series_expression=TimeSeriesExpression(expression="SIM1;PS", expression_evaluator=evaluator)
6060
),

0 commit comments

Comments
 (0)