Skip to content

Commit 5198ddb

Browse files
authored
Refactor/introduce time series fluid density (#1010)
* refactor: introduce time series fluid density
1 parent 8c52f7f commit 5198ddb

5 files changed

Lines changed: 56 additions & 10 deletions

File tree

src/libecalc/domain/infrastructure/energy_components/legacy_consumer/consumer_function/pump_consumer_function.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
)
1212
from libecalc.domain.process.pump.pump import PumpModel
1313
from libecalc.domain.time_series_flow_rate import TimeSeriesFlowRate
14+
from libecalc.domain.time_series_fluid_density import TimeSeriesFluidDensity
1415
from libecalc.domain.time_series_pressure import TimeSeriesPressure
1516
from libecalc.expression import Expression
1617

@@ -21,10 +22,10 @@ class PumpConsumerFunction(ConsumerFunction):
2122
2223
Args:
2324
pump_function: The pump model
25+
fluid_density (TimeSeriesFluidDensity): Fluid density time series [kg/m3]
2426
rate (TimeSeriesFlowRate): Flow rate time series [Sm3/h].
2527
suction_pressure (TimeSeriesPressure): Suction pressure time series [bara].
2628
discharge_pressure (TimeSeriesPressure): Discharge pressure time series [bara].
27-
fluid_density_expression: Fluid density expression [kg/m3]
2829
power_loss_factor_expression: Optional power loss factor expression.
2930
Typically used for power line loss subsea et.c.
3031
"""
@@ -35,14 +36,14 @@ def __init__(
3536
rate: TimeSeriesFlowRate,
3637
suction_pressure: TimeSeriesPressure,
3738
discharge_pressure: TimeSeriesPressure,
38-
fluid_density_expression: Expression,
39+
fluid_density: TimeSeriesFluidDensity,
3940
power_loss_factor_expression: Expression = None,
4041
):
4142
self._pump_function = pump_function
4243
self._rate = rate
44+
self._fluid_density = fluid_density
4345
self._suction_pressure = suction_pressure
4446
self._discharge_pressure = discharge_pressure
45-
self._fluid_density_expression = fluid_density_expression
4647

4748
# Typically used for power line loss subsea et.c.
4849
self._power_loss_factor_expression = power_loss_factor_expression
@@ -64,14 +65,12 @@ def evaluate(
6465

6566
stream_day_rate = self._rate.get_stream_day_values()
6667

67-
fluid_density = expression_evaluator.evaluate(expression=self._fluid_density_expression)
68-
6968
# Do not input regularity to pump function. Handled outside
7069
energy_function_result = self._pump_function.evaluate_rate_ps_pd_density(
7170
rate=np.asarray(stream_day_rate, dtype=np.float64),
7271
suction_pressures=np.asarray(self._suction_pressure.get_values(), dtype=np.float64),
7372
discharge_pressures=np.asarray(self._discharge_pressure.get_values(), dtype=np.float64),
74-
fluid_density=np.asarray(fluid_density, dtype=np.float64),
73+
fluid_density=np.asarray(self._fluid_density.get_values(), dtype=np.float64),
7574
)
7675

7776
power_loss_factor = get_power_loss_factor_from_expression(
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from abc import ABC, abstractmethod
2+
from collections.abc import Sequence
3+
4+
5+
class TimeSeriesFluidDensity(ABC):
6+
"""
7+
Interface for evaluating fluid density time series.
8+
9+
"""
10+
11+
@abstractmethod
12+
def get_values(self) -> Sequence[float]:
13+
"""
14+
Returns the evaluated fluid density values as a NumPy array.
15+
"""
16+
pass
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from collections.abc import Sequence
2+
3+
from libecalc.domain.time_series_fluid_density import TimeSeriesFluidDensity
4+
from libecalc.presentation.yaml.domain.time_series_expression import TimeSeriesExpression
5+
6+
7+
class ExpressionTimeSeriesFluidDensity(TimeSeriesFluidDensity):
8+
"""
9+
Provides fluid density values by evaluating a time series expression.
10+
"""
11+
12+
def __init__(self, time_series_expression: TimeSeriesExpression):
13+
self._time_series_expression = time_series_expression
14+
15+
def get_values(self) -> Sequence[float]:
16+
"""
17+
Returns the fluid density values as a NumPy array.
18+
"""
19+
20+
fluid_density_values = self._time_series_expression.get_evaluated_expressions()
21+
22+
return fluid_density_values

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
from libecalc.dto.utils.validators import convert_expression, convert_expressions
4747
from libecalc.expression import Expression
4848
from libecalc.presentation.yaml.domain.expression_time_series_flow_rate import ExpressionTimeSeriesFlowRate
49+
from libecalc.presentation.yaml.domain.expression_time_series_fluid_density import ExpressionTimeSeriesFluidDensity
4950
from libecalc.presentation.yaml.domain.expression_time_series_pressure import ExpressionTimeSeriesPressure
5051
from libecalc.presentation.yaml.domain.reference_service import ReferenceService
5152
from libecalc.presentation.yaml.domain.time_series_expression import TimeSeriesExpression
@@ -275,6 +276,11 @@ def _map_pump(
275276
condition_expression=condition,
276277
)
277278

279+
fluid_density_expression = TimeSeriesExpression(
280+
expressions=model.fluid_density, expression_evaluator=period_evaluator
281+
)
282+
fluid_density = ExpressionTimeSeriesFluidDensity(time_series_expression=fluid_density_expression)
283+
278284
suction_pressure_expression = TimeSeriesExpression(
279285
expressions=model.suction_pressure, expression_evaluator=period_evaluator
280286
)
@@ -285,15 +291,14 @@ def _map_pump(
285291
)
286292
discharge_pressure = ExpressionTimeSeriesPressure(time_series_expression=discharge_pressure_expression)
287293

288-
fluid_density = convert_expression(model.fluid_density)
289294
pump_model = create_pump_model(pump_model_dto=energy_model)
290295
return PumpConsumerFunction(
291296
power_loss_factor_expression=power_loss_factor, # type: ignore[arg-type]
292297
pump_function=pump_model,
293298
rate=rate_standard_m3_day,
294299
suction_pressure=suction_pressure,
295300
discharge_pressure=discharge_pressure,
296-
fluid_density_expression=fluid_density, # type: ignore[arg-type]
301+
fluid_density=fluid_density,
297302
)
298303

299304
def _map_multiple_streams_compressor(

tests/libecalc/core/consumers/system/test_consumer_system.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from libecalc.domain.regularity import Regularity
2929
from libecalc.expression import Expression
3030
from libecalc.presentation.yaml.domain.expression_time_series_pressure import ExpressionTimeSeriesPressure
31+
from libecalc.presentation.yaml.domain.expression_time_series_fluid_density import ExpressionTimeSeriesFluidDensity
3132
from libecalc.presentation.yaml.domain.time_series_expression import TimeSeriesExpression
3233
from libecalc.presentation.yaml.domain.expression_time_series_flow_rate import ExpressionTimeSeriesFlowRate
3334

@@ -373,6 +374,9 @@ def test_pump_consumer_function_and_pump_system_consumer_function(self, expressi
373374
rate_expression = TimeSeriesExpression(expressions=6648.0, expression_evaluator=variables_map)
374375
rate = ExpressionTimeSeriesFlowRate(time_series_expression=rate_expression, regularity=regularity)
375376

377+
fluid_density_expression = TimeSeriesExpression(expressions=1021.0, expression_evaluator=variables_map)
378+
fluid_density = ExpressionTimeSeriesFluidDensity(time_series_expression=fluid_density_expression)
379+
376380
suction_pressure_expression = TimeSeriesExpression(expressions=1.0, expression_evaluator=variables_map)
377381
suction_pressure = ExpressionTimeSeriesPressure(time_series_expression=suction_pressure_expression)
378382

@@ -382,17 +386,17 @@ def test_pump_consumer_function_and_pump_system_consumer_function(self, expressi
382386
pump_consumer_function = PumpConsumerFunction(
383387
pump_function=pump,
384388
rate=rate,
389+
fluid_density=fluid_density,
385390
suction_pressure=suction_pressure,
386391
discharge_pressure=discharge_pressure,
387-
fluid_density_expression=Expression.setup_from_expression(1021),
388392
)
389393
power_loss_factor = 0.03
390394
pump_consumer_function_with_power_loss_factor = PumpConsumerFunction(
391395
pump_function=pump,
392396
rate=rate,
397+
fluid_density=fluid_density,
393398
suction_pressure=suction_pressure,
394399
discharge_pressure=discharge_pressure,
395-
fluid_density_expression=Expression.setup_from_expression(1021),
396400
power_loss_factor_expression=Expression.setup_from_expression(str(power_loss_factor)),
397401
)
398402

0 commit comments

Comments
 (0)