Skip to content

Commit 421c24a

Browse files
committed
refactor: unify simplified compressor train models and improve code quality
- Consolidate CompressorTrainSimplifiedKnownStages and CompressorTrainSimplifiedUnknownStages into single unified model - Replace separate energy model types with unified COMPRESSOR_TRAIN_SIMPLIFIED type - Add KnownStagesConfig and UnknownStagesConfig for flexible stage configuration - Update factory functions to create unified models with proper configuration - Improve SimplifiedTrainBuilder API by removing redundant parameters - Fix unused variables and parameter shadowing issues - Update consumer functions to use unified model approach - Maintain backward compatibility through configuration-based stage preparation
1 parent 605f4c8 commit 421c24a

12 files changed

Lines changed: 850 additions & 617 deletions

File tree

src/libecalc/common/energy_model_type.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ class EnergyModelType(str, Enum):
66
TABULATED = "TABULATED"
77
COMPRESSOR_SAMPLED = "COMPRESSOR_SAMPLED"
88
PUMP_MODEL = "PUMP_MODEL"
9-
COMPRESSOR_TRAIN_SIMPLIFIED_WITH_KNOWN_STAGES = "COMPRESSOR_TRAIN_SIMPLIFIED_WITH_KNOWN_NUMBER_OF_COMPRESSORS"
10-
COMPRESSOR_TRAIN_SIMPLIFIED_WITH_UNKNOWN_STAGES = "COMPRESSOR_TRAIN_SIMPLIFIED_WITH_UNKNOWN_NUMBER_OF_COMPRESSORS"
9+
COMPRESSOR_TRAIN_SIMPLIFIED = "COMPRESSOR_TRAIN_SIMPLIFIED"
1110
VARIABLE_SPEED_COMPRESSOR_TRAIN_COMMON_SHAFT = "VARIABLE_SPEED_COMPRESSOR_TRAIN_COMMON_SHAFT"
1211
SINGLE_SPEED_COMPRESSOR_TRAIN_COMMON_SHAFT = "SINGLE_SPEED_COMPRESSOR_TRAIN_COMMON_SHAFT"
1312
VARIABLE_SPEED_COMPRESSOR_TRAIN_MULTIPLE_STREAMS_AND_PRESSURES = (

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

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
ConsumerFunctionResult,
66
)
77
from libecalc.domain.process.compressor.core.base import CompressorModel, CompressorWithTurbineModel
8-
from libecalc.domain.process.compressor.core.train.simplified_train import (
9-
CompressorTrainSimplifiedKnownStages,
10-
CompressorTrainSimplifiedUnknownStages,
11-
)
8+
from libecalc.domain.process.compressor.core.train.simplified_train import CompressorTrainSimplified
129
from libecalc.domain.process.compressor.core.train.simplified_train_builder import SimplifiedTrainBuilder
1310
from libecalc.domain.process.compressor.core.train.variable_speed_compressor_train_common_shaft_multiple_streams_and_pressures import (
1411
VariableSpeedCompressorTrainCommonShaftMultipleStreamsAndPressures,
@@ -69,28 +66,21 @@ def __init__(
6966
else None
7067
)
7168

72-
# Use existing _compressor_model property to avoid code duplication
73-
prepared_stages = None
74-
if isinstance(self._compressor_model, CompressorTrainSimplifiedKnownStages):
75-
prepared_stages = SimplifiedTrainBuilder.prepare_stages_for_known_stages_model(
76-
original_dto_stages=self._compressor_model._original_dto_stages,
77-
fluid_factory=self._compressor_model.fluid_factory,
78-
rate=stream_day_rate,
79-
suction_pressure=suction_pressure,
80-
discharge_pressure=discharge_pressure,
81-
)
82-
elif isinstance(self._compressor_model, CompressorTrainSimplifiedUnknownStages):
83-
prepared_stages = SimplifiedTrainBuilder.prepare_stages_for_unknown_stages_model(
84-
stage_template=self._compressor_model.stage,
85-
maximum_pressure_ratio_per_stage=self._compressor_model.maximum_pressure_ratio_per_stage,
86-
fluid_factory=self._compressor_model.fluid_factory,
87-
rate=stream_day_rate,
88-
suction_pressure=suction_pressure,
89-
discharge_pressure=discharge_pressure,
90-
)
91-
92-
if prepared_stages is not None:
93-
self._compressor_model.stages = prepared_stages
69+
# Prepare stages for simplified compressor train using configuration approach
70+
if isinstance(self._compressor_model, CompressorTrainSimplified):
71+
if (
72+
self._compressor_model._stage_config is not None
73+
and suction_pressure is not None
74+
and discharge_pressure is not None
75+
):
76+
builder = SimplifiedTrainBuilder(fluid_factory=self._compressor_model.fluid_factory)
77+
prepared_stages, _ = builder.prepare_stages_from_config(
78+
config=self._compressor_model._stage_config,
79+
rate=stream_day_rate,
80+
suction_pressure=suction_pressure,
81+
discharge_pressure=discharge_pressure,
82+
)
83+
self._compressor_model.set_prepared_stages(prepared_stages)
9484

9585
compressor_function.set_evaluation_input(
9686
rate=stream_day_rate,

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

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,7 @@
2727
get_operational_settings_number_used_from_model_results,
2828
)
2929
from libecalc.domain.process.compressor.core.base import CompressorModel, CompressorWithTurbineModel
30-
from libecalc.domain.process.compressor.core.train.simplified_train import (
31-
CompressorTrainSimplifiedKnownStages,
32-
CompressorTrainSimplifiedUnknownStages,
33-
)
30+
from libecalc.domain.process.compressor.core.train.simplified_train import CompressorTrainSimplified
3431
from libecalc.domain.process.compressor.core.train.simplified_train_builder import SimplifiedTrainBuilder
3532
from libecalc.domain.process.pump.pump import PumpModel
3633
from libecalc.domain.time_series_power_loss_factor import TimeSeriesPowerLossFactor
@@ -351,27 +348,17 @@ def evaluate_consumers( # type: ignore[override]
351348
actual_model = self._get_actual_compressor_model(consumer_model)
352349
else:
353350
actual_model = consumer_model
354-
prepared_stages = None
355-
if isinstance(actual_model, CompressorTrainSimplifiedKnownStages):
356-
prepared_stages = SimplifiedTrainBuilder.prepare_stages_for_known_stages_model(
357-
original_dto_stages=actual_model._original_dto_stages,
358-
fluid_factory=actual_model.fluid_factory,
359-
rate=np.asarray(consumer_rates[i]),
360-
suction_pressure=np.asarray(operational_setting.suction_pressures[i]),
361-
discharge_pressure=np.asarray(operational_setting.discharge_pressures[i]),
362-
)
363-
elif isinstance(actual_model, CompressorTrainSimplifiedUnknownStages):
364-
prepared_stages = SimplifiedTrainBuilder.prepare_stages_for_unknown_stages_model(
365-
stage_template=actual_model.stage,
366-
maximum_pressure_ratio_per_stage=actual_model.maximum_pressure_ratio_per_stage,
367-
fluid_factory=actual_model.fluid_factory,
368-
rate=np.asarray(consumer_rates[i]),
369-
suction_pressure=np.asarray(operational_setting.suction_pressures[i]),
370-
discharge_pressure=np.asarray(operational_setting.discharge_pressures[i]),
371-
)
372-
373-
if prepared_stages is not None:
374-
actual_model.stages = prepared_stages
351+
# Prepare stages for simplified compressor train using configuration approach
352+
if isinstance(actual_model, CompressorTrainSimplified):
353+
if actual_model._stage_config is not None:
354+
builder = SimplifiedTrainBuilder(fluid_factory=actual_model.fluid_factory)
355+
prepared_stages, _ = builder.prepare_stages_from_config(
356+
config=actual_model._stage_config,
357+
rate=np.asarray(consumer_rates[i]),
358+
suction_pressure=np.asarray(operational_setting.suction_pressures[i]),
359+
discharge_pressure=np.asarray(operational_setting.discharge_pressures[i]),
360+
)
361+
actual_model.set_prepared_stages(prepared_stages)
375362

376363
consumer_model.set_evaluation_input(
377364
rate=np.asarray(consumer_rates[i]),

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

Lines changed: 56 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
from libecalc.domain.process.compressor.core.sampled import CompressorModelSampled
22
from libecalc.domain.process.compressor.core.train.simplified_train import (
3-
CompressorTrainSimplifiedKnownStages,
4-
CompressorTrainSimplifiedUnknownStages,
3+
CompressorTrainSimplified,
4+
KnownStagesConfig,
5+
UnknownStagesConfig,
56
)
7+
from libecalc.domain.process.compressor.core.train.simplified_train_builder import SimplifiedTrainBuilder
68
from libecalc.domain.process.compressor.core.train.single_speed_compressor_train_common_shaft import (
79
SingleSpeedCompressorTrainCommonShaft,
810
)
@@ -51,25 +53,6 @@ def _create_variable_speed_compressor_train_multiple_streams_and_pressures_strea
5153
)
5254

5355

54-
def _create_compressor_train_simplified_with_known_stages(
55-
compressor_model_dto: CompressorTrainSimplifiedWithKnownStages,
56-
) -> CompressorTrainSimplifiedKnownStages:
57-
# Energy usage adjustment not supported for this model (yet)
58-
# Issue error if factors are not default (and not changing the energy usage result)
59-
60-
fluid_factory = _create_fluid_factory(compressor_model_dto.fluid_model)
61-
if fluid_factory is None:
62-
raise ValueError("Fluid model is required for compressor train")
63-
return CompressorTrainSimplifiedKnownStages(
64-
fluid_factory=fluid_factory,
65-
energy_usage_adjustment_constant=compressor_model_dto.energy_usage_adjustment_constant,
66-
energy_usage_adjustment_factor=compressor_model_dto.energy_usage_adjustment_factor,
67-
stages=compressor_model_dto.stages,
68-
calculate_max_rate=compressor_model_dto.calculate_max_rate,
69-
maximum_power=compressor_model_dto.maximum_power,
70-
)
71-
72-
7356
def _create_single_speed_compressor_train(
7457
compressor_model_dto: SingleSpeedCompressorTrain,
7558
) -> SingleSpeedCompressorTrainCommonShaft:
@@ -148,31 +131,69 @@ def _create_variable_speed_compressor_train_multiple_streams_and_pressures(
148131
)
149132

150133

151-
def _create_compressor_train_simplified_with_unknown_stages(
152-
compressor_model_dto: CompressorTrainSimplifiedWithUnknownStages,
153-
) -> CompressorTrainSimplifiedUnknownStages:
134+
def _create_compressor_sampled(compressor_model_dto: CompressorSampled) -> CompressorModelSampled:
135+
return CompressorModelSampled(
136+
energy_usage_adjustment_constant=compressor_model_dto.energy_usage_adjustment_constant,
137+
energy_usage_adjustment_factor=compressor_model_dto.energy_usage_adjustment_factor,
138+
energy_usage_type=compressor_model_dto.energy_usage_type,
139+
energy_usage_values=compressor_model_dto.energy_usage_values,
140+
rate_values=compressor_model_dto.rate_values,
141+
suction_pressure_values=compressor_model_dto.suction_pressure_values,
142+
discharge_pressure_values=compressor_model_dto.discharge_pressure_values,
143+
power_interpolation_values=compressor_model_dto.power_interpolation_values,
144+
)
145+
146+
147+
def create_compressor_train_simplified_from_known_stages(
148+
compressor_model_dto: CompressorTrainSimplifiedWithKnownStages,
149+
) -> CompressorTrainSimplified:
150+
"""Create unified simplified compressor train model from known stages DTO."""
154151
fluid_factory = _create_fluid_factory(compressor_model_dto.fluid_model)
155152
if fluid_factory is None:
156153
raise ValueError("Fluid model is required for compressor train")
157-
return CompressorTrainSimplifiedUnknownStages(
154+
155+
# Create configuration for known stages
156+
config = KnownStagesConfig(stages=compressor_model_dto.stages)
157+
158+
# Use centralized chart type detection
159+
supports_max_rate = SimplifiedTrainBuilder.supports_max_rate_calculation(compressor_model_dto.stages)
160+
161+
return CompressorTrainSimplified(
158162
fluid_factory=fluid_factory,
159163
energy_usage_adjustment_constant=compressor_model_dto.energy_usage_adjustment_constant,
160164
energy_usage_adjustment_factor=compressor_model_dto.energy_usage_adjustment_factor,
161-
stage=compressor_model_dto.stage,
162-
maximum_pressure_ratio_per_stage=compressor_model_dto.maximum_pressure_ratio_per_stage,
165+
stages=[], # Stages will be prepared later using the configuration
163166
calculate_max_rate=compressor_model_dto.calculate_max_rate,
164167
maximum_power=compressor_model_dto.maximum_power,
168+
supports_max_rate=supports_max_rate,
169+
stage_config=config,
165170
)
166171

167172

168-
def _create_compressor_sampled(compressor_model_dto: CompressorSampled) -> CompressorModelSampled:
169-
return CompressorModelSampled(
173+
def create_compressor_train_simplified_from_unknown_stages(
174+
compressor_model_dto: CompressorTrainSimplifiedWithUnknownStages,
175+
) -> CompressorTrainSimplified:
176+
"""Create unified simplified compressor train model from unknown stages DTO."""
177+
fluid_factory = _create_fluid_factory(compressor_model_dto.fluid_model)
178+
if fluid_factory is None:
179+
raise ValueError("Fluid model is required for compressor train")
180+
181+
# Create configuration for unknown stages
182+
config = UnknownStagesConfig(
183+
stage_template=compressor_model_dto.stage,
184+
maximum_pressure_ratio_per_stage=compressor_model_dto.maximum_pressure_ratio_per_stage,
185+
)
186+
187+
# Use centralized chart type detection
188+
supports_max_rate = SimplifiedTrainBuilder.supports_max_rate_calculation([compressor_model_dto.stage])
189+
190+
return CompressorTrainSimplified(
191+
fluid_factory=fluid_factory,
170192
energy_usage_adjustment_constant=compressor_model_dto.energy_usage_adjustment_constant,
171193
energy_usage_adjustment_factor=compressor_model_dto.energy_usage_adjustment_factor,
172-
energy_usage_type=compressor_model_dto.energy_usage_type,
173-
energy_usage_values=compressor_model_dto.energy_usage_values,
174-
rate_values=compressor_model_dto.rate_values,
175-
suction_pressure_values=compressor_model_dto.suction_pressure_values,
176-
discharge_pressure_values=compressor_model_dto.discharge_pressure_values,
177-
power_interpolation_values=compressor_model_dto.power_interpolation_values,
194+
stages=[], # Stages will be prepared later using the configuration
195+
calculate_max_rate=compressor_model_dto.calculate_max_rate,
196+
maximum_power=compressor_model_dto.maximum_power,
197+
supports_max_rate=supports_max_rate,
198+
stage_config=config,
178199
)

0 commit comments

Comments
 (0)