Skip to content

Commit 7c81c57

Browse files
committed
chore: avoid shared state
1 parent 2b5ba96 commit 7c81c57

7 files changed

Lines changed: 57 additions & 44 deletions

File tree

src/libecalc/domain/process/compressor/core/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from __future__ import annotations
22

33
from abc import abstractmethod
4+
from copy import deepcopy
45
from functools import partial
6+
from typing import Self
57

68
import numpy as np
79
from numpy.typing import NDArray
@@ -72,6 +74,9 @@ def check_for_undefined_stages(
7274
) -> None:
7375
pass
7476

77+
def clone(self) -> Self:
78+
return deepcopy(self)
79+
7580

7681
class CompressorWithTurbineModel(CompressorModel):
7782
def __init__(

src/libecalc/domain/process/compressor/core/train/single_speed_compressor_train_common_shaft.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@
88
)
99
from libecalc.domain.process.compressor.core.results import CompressorTrainResultSingleTimeStep
1010
from libecalc.domain.process.compressor.core.train.base import CompressorTrainModel
11+
from libecalc.domain.process.compressor.core.train.stage import CompressorTrainStage
1112
from libecalc.domain.process.compressor.core.train.train_evaluation_input import CompressorTrainEvaluationInput
1213
from libecalc.domain.process.compressor.core.train.utils.common import EPSILON
1314
from libecalc.domain.process.compressor.core.train.utils.numeric_methods import (
1415
find_root,
1516
maximize_x_given_boolean_condition_function,
1617
)
17-
from libecalc.domain.process.compressor.core.utils import map_compressor_train_stage_to_domain
18-
from libecalc.domain.process.compressor.dto import CompressorStage
1918
from libecalc.domain.process.value_objects.chart.compressor import SingleSpeedCompressorChart
2019
from libecalc.domain.process.value_objects.fluid_stream.fluid_factory import FluidFactoryInterface
2120

@@ -67,27 +66,27 @@ def __init__(
6766
fluid_factory: FluidFactoryInterface,
6867
energy_usage_adjustment_constant: float,
6968
energy_usage_adjustment_factor: float,
70-
stages: list[CompressorStage],
69+
stages: list[CompressorTrainStage],
7170
pressure_control: FixedSpeedPressureControl | None = None,
7271
calculate_max_rate: bool = False,
7372
maximum_power: float | None = None,
7473
maximum_discharge_pressure: float | None = None,
7574
):
7675
logger.debug(f"Creating SingleSpeedCompressorTrainCommonShaft with n_stages: {len(stages)}")
77-
stages_mapped = [map_compressor_train_stage_to_domain(stage_dto) for stage_dto in stages]
76+
# stages_mapped = [map_compressor_train_stage_to_domain(stage_dto) for stage_dto in stages]
7877
super().__init__(
7978
fluid_factory=fluid_factory,
8079
energy_usage_adjustment_constant=energy_usage_adjustment_constant,
8180
energy_usage_adjustment_factor=energy_usage_adjustment_factor,
82-
stages=stages_mapped,
81+
stages=stages,
8382
typ=EnergyModelType.SINGLE_SPEED_COMPRESSOR_TRAIN_COMMON_SHAFT,
8483
maximum_power=maximum_power,
8584
pressure_control=pressure_control,
8685
maximum_discharge_pressure=maximum_discharge_pressure,
8786
calculate_max_rate=calculate_max_rate,
8887
)
8988
self._validate_maximum_discharge_pressure()
90-
self._validate_stages(stages_mapped)
89+
self._validate_stages(stages)
9190

9291
def evaluate_given_constraints(
9392
self,

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from libecalc.domain.process.compressor.core.train.single_speed_compressor_train_common_shaft import (
1313
SingleSpeedCompressorTrainCommonShaft,
1414
)
15+
from libecalc.domain.process.compressor.core.utils import map_compressor_train_stage_to_domain
1516
from libecalc.domain.process.compressor.dto import (
1617
CompressorStage,
1718
CompressorTrainSimplifiedWithKnownStages,
@@ -475,10 +476,10 @@ def _single_speed_compressor_train_mapper(
475476
fluid_factory = _create_fluid_factory(fluid_model=fluid_model)
476477
if fluid_factory is None:
477478
raise ValueError("Fluid model is required for compressor train")
478-
479+
stages_mapped = [map_compressor_train_stage_to_domain(stage_dto) for stage_dto in stages]
479480
return SingleSpeedCompressorTrainCommonShaft(
480481
fluid_factory=fluid_factory,
481-
stages=stages,
482+
stages=stages_mapped,
482483
pressure_control=pressure_control,
483484
maximum_discharge_pressure=maximum_discharge_pressure,
484485
energy_usage_adjustment_constant=model_config.power_adjustment_constant,

src/libecalc/presentation/yaml/yaml_reference_service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ def get_generator_set_model(self, reference: str) -> GeneratorSetModel:
121121

122122
def get_compressor_model(self, reference: str) -> CompressorModel:
123123
model = self._get_model_reference(reference, "compressor model")
124-
# Check if already a domain compressor model
124+
# Check if already a domain compressor model, and clone it to ensure no state is shared
125125
if isinstance(model, CompressorModel):
126-
return model
126+
return model.clone()
127127
# Otherwise: check if it is a DTO -> convert to domain model
128128
if isinstance(model, get_args(CompressorModelTypes)):
129129
return create_compressor_model(model)

tests/libecalc/core/models/compressor_modelling/conftest.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,19 +194,21 @@ def single_speed_compressor_train_unisim_methane(
194194
)
195195

196196
fluid_factory = NeqSimFluidFactory(FluidModel(composition=FluidComposition(methane=1.0), eos_model=EoSModel.SRK))
197+
stages = [
198+
dto.CompressorStage(
199+
compressor_chart=chart,
200+
inlet_temperature_kelvin=293.15, # 20 C.
201+
pressure_drop_before_stage=0,
202+
remove_liquid_after_cooling=True,
203+
control_margin=0,
204+
)
205+
]
206+
stages_mapped = [map_compressor_train_stage_to_domain(stage_dto) for stage_dto in stages]
197207
return SingleSpeedCompressorTrainCommonShaft(
198208
fluid_factory=fluid_factory,
199209
energy_usage_adjustment_constant=0,
200210
energy_usage_adjustment_factor=1,
201-
stages=[
202-
dto.CompressorStage(
203-
compressor_chart=chart,
204-
inlet_temperature_kelvin=293.15, # 20 C.
205-
pressure_drop_before_stage=0,
206-
remove_liquid_after_cooling=True,
207-
control_margin=0,
208-
)
209-
],
211+
stages=stages_mapped,
210212
pressure_control=libecalc.common.fixed_speed_pressure_control.FixedSpeedPressureControl.DOWNSTREAM_CHOKE,
211213
calculate_max_rate=False,
212214
)

tests/libecalc/core/models/compressor_modelling/test_single_speed_compressor_train_common_shaft.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
)
88
from libecalc.domain.process.compressor.core.train.stage import CompressorTrainStage
99
from libecalc.domain.process.compressor.core.train.train_evaluation_input import CompressorTrainEvaluationInput
10+
from libecalc.domain.process.compressor.core.utils import map_compressor_train_stage_to_domain
1011
from libecalc.domain.process.core.results.compressor import CompressorTrainCommonShaftFailureStatus
1112
from libecalc.domain.process.value_objects.chart.chart_area_flag import ChartAreaFlag
1213
from libecalc.domain.process.value_objects.fluid_stream.fluid_model import FluidModel
@@ -52,12 +53,12 @@ def create_single_speed_compressor_train(
5253
if stages is None:
5354
stages = single_speed_stages
5455
fluid_factory = NeqSimFluidFactory(fluid_model)
55-
56+
stages_mapped = [map_compressor_train_stage_to_domain(stage_dto) for stage_dto in stages]
5657
return SingleSpeedCompressorTrainCommonShaft(
5758
fluid_factory=fluid_factory,
5859
energy_usage_adjustment_constant=energy_usage_adjustment_constant,
5960
energy_usage_adjustment_factor=energy_usage_adjustment_factor,
60-
stages=stages,
61+
stages=stages_mapped,
6162
pressure_control=pressure_control,
6263
calculate_max_rate=calculate_max_rate,
6364
maximum_power=maximum_power,

tests/libecalc/dto/test_energy_model.py

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from libecalc.domain.process.compressor.core.train.single_speed_compressor_train_common_shaft import (
1717
SingleSpeedCompressorTrainCommonShaft,
1818
)
19+
from libecalc.domain.process.compressor.core.utils import map_compressor_train_stage_to_domain
1920
from libecalc.domain.process.value_objects.chart.generic import GenericChartFromDesignPoint, GenericChartFromInput
2021
from libecalc.domain.process.value_objects.fluid_stream.fluid_model import EoSModel, FluidComposition, FluidModel
2122
from libecalc.infrastructure.neqsim_fluid_provider.neqsim_fluid_factory import NeqSimFluidFactory
@@ -240,22 +241,24 @@ def test_valid_train_known_stages(self):
240241
fluid_factory = NeqSimFluidFactory(
241242
fluid_model=FluidModel(eos_model=EoSModel.PR, composition=FluidComposition(methane=1))
242243
)
244+
stages = [
245+
dto.CompressorStage(
246+
compressor_chart=SingleSpeedChartDTO(
247+
speed_rpm=1,
248+
rate_actual_m3_hour=[1, 2],
249+
polytropic_head_joule_per_kg=[3, 4],
250+
efficiency_fraction=[0.5, 0.5],
251+
),
252+
inlet_temperature_kelvin=300,
253+
pressure_drop_before_stage=0,
254+
remove_liquid_after_cooling=True,
255+
control_margin=0.0,
256+
)
257+
]
258+
stages_mapped = [map_compressor_train_stage_to_domain(stage_dto) for stage_dto in stages]
243259
SingleSpeedCompressorTrainCommonShaft(
244260
fluid_factory=fluid_factory,
245-
stages=[
246-
dto.CompressorStage(
247-
compressor_chart=SingleSpeedChartDTO(
248-
speed_rpm=1,
249-
rate_actual_m3_hour=[1, 2],
250-
polytropic_head_joule_per_kg=[3, 4],
251-
efficiency_fraction=[0.5, 0.5],
252-
),
253-
inlet_temperature_kelvin=300,
254-
pressure_drop_before_stage=0,
255-
remove_liquid_after_cooling=True,
256-
control_margin=0.0,
257-
)
258-
],
261+
stages=stages_mapped,
259262
energy_usage_adjustment_factor=1,
260263
energy_usage_adjustment_constant=0,
261264
pressure_control=libecalc.common.fixed_speed_pressure_control.FixedSpeedPressureControl.DOWNSTREAM_CHOKE,
@@ -266,18 +269,20 @@ def test_invalid_chart(self):
266269
fluid_factory = NeqSimFluidFactory(
267270
fluid_model=FluidModel(eos_model=EoSModel.PR, composition=FluidComposition(methane=1))
268271
)
272+
stages = [
273+
dto.CompressorStage(
274+
compressor_chart=VariableSpeedChartDTO(curves=[]),
275+
inlet_temperature_kelvin=300,
276+
pressure_drop_before_stage=0,
277+
remove_liquid_after_cooling=True,
278+
control_margin=0.0,
279+
)
280+
]
281+
stages_mapped = [map_compressor_train_stage_to_domain(stage_dto) for stage_dto in stages]
269282
with pytest.raises(ProcessChartTypeValidationException):
270283
SingleSpeedCompressorTrainCommonShaft(
271284
fluid_factory=fluid_factory,
272-
stages=[
273-
dto.CompressorStage(
274-
compressor_chart=VariableSpeedChartDTO(curves=[]),
275-
inlet_temperature_kelvin=300,
276-
pressure_drop_before_stage=0,
277-
remove_liquid_after_cooling=True,
278-
control_margin=0.0,
279-
)
280-
],
285+
stages=stages_mapped,
281286
energy_usage_adjustment_factor=1,
282287
energy_usage_adjustment_constant=0,
283288
pressure_control=libecalc.common.fixed_speed_pressure_control.FixedSpeedPressureControl.DOWNSTREAM_CHOKE,

0 commit comments

Comments
 (0)