Skip to content

Commit 14f1ce0

Browse files
authored
refactor: use new fluidstream object in compressor models and results (#1006)
* refactor: use new FluidStream object in compressor calculations and results * refactor: replace TrainFluidStream with FluidFactoryInterface dependency injection This commit implements a comprehensive refactoring to replace the old TrainFluidStream with a new FluidFactoryInterface pattern that moves toward Domain-Driven Design principles. Refs. equinor/ecalc-internal#610 equinor/ecalc-internal#641
1 parent 52c71f0 commit 14f1ce0

59 files changed

Lines changed: 1689 additions & 1828 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/ecalc_neqsim_wrapper/mappings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
from pydantic import Field
44

5+
from libecalc.common.ecalc_base_model import EcalcBaseModel
56
from libecalc.common.errors.exceptions import EcalcError
6-
from libecalc.common.fluid import EcalcBaseModel
77
from libecalc.common.logger import logger
8-
from libecalc.domain.process.value_objects.fluid_stream.fluid_composition import FluidComposition
8+
from libecalc.domain.process.value_objects.fluid_stream.fluid_model import FluidComposition
99

1010

1111
class NeqsimComposition(EcalcBaseModel):

src/ecalc_neqsim_wrapper/thermo.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020
)
2121
from libecalc.common.decorators.capturer import Capturer
2222
from libecalc.common.logger import logger
23-
from libecalc.domain.process.value_objects.fluid_stream.eos_model import EoSModel
24-
from libecalc.domain.process.value_objects.fluid_stream.fluid_composition import FluidComposition
23+
from libecalc.domain.process.value_objects.fluid_stream.fluid_model import EoSModel, FluidComposition
2524

2625
STANDARD_TEMPERATURE_KELVIN = 288.15
2726
STANDARD_PRESSURE_BARA = 1.01325
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from pydantic import BaseModel, ConfigDict
2+
3+
from libecalc.common.string.string_utils import to_camel_case
4+
5+
6+
class EcalcBaseModel(BaseModel):
7+
model_config = ConfigDict(
8+
extra="forbid",
9+
alias_generator=to_camel_case,
10+
populate_by_name=True,
11+
)

src/libecalc/common/fluid.py

Lines changed: 0 additions & 60 deletions
This file was deleted.

src/libecalc/common/fluid_stream_type.py

Lines changed: 0 additions & 6 deletions
This file was deleted.

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

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
from typing import Any
22

33
from libecalc.common.energy_model_type import EnergyModelType
4-
from libecalc.common.fluid import MultipleStreamsAndPressureStream
5-
from libecalc.common.fluid_stream_type import FluidStreamType
64
from libecalc.common.logger import logger
75
from libecalc.domain.infrastructure.energy_components.turbine import Turbine
86
from libecalc.domain.process.compressor.core.base import CompressorModel, CompressorWithTurbineModel
97
from libecalc.domain.process.compressor.core.sampled import CompressorModelSampled
10-
from libecalc.domain.process.compressor.core.train.fluid import FluidStream
118
from libecalc.domain.process.compressor.core.train.simplified_train import (
129
CompressorTrainSimplifiedKnownStages,
1310
CompressorTrainSimplifiedUnknownStages,
@@ -32,6 +29,20 @@
3229
VariableSpeedCompressorTrainMultipleStreamsAndPressures,
3330
)
3431
from libecalc.domain.process.compressor.dto.model_types import CompressorModelTypes as CompressorModelDTO
32+
from libecalc.domain.process.value_objects.fluid_stream.fluid_factory import FluidFactoryInterface
33+
from libecalc.domain.process.value_objects.fluid_stream.fluid_model import FluidModel
34+
from libecalc.domain.process.value_objects.fluid_stream.multiple_streams_stream import (
35+
FluidStreamType,
36+
MultipleStreamsAndPressureStream,
37+
)
38+
from libecalc.infrastructure.neqsim_fluid_provider.neqsim_fluid_factory import NeqSimFluidFactory
39+
40+
41+
def _create_fluid_factory(fluid_model: FluidModel | None) -> FluidFactoryInterface | None:
42+
"""Create a fluid factory from a fluid model."""
43+
if fluid_model is None:
44+
return None
45+
return NeqSimFluidFactory(fluid_model)
3546

3647

3748
def _create_variable_speed_compressor_train_multiple_streams_and_pressures_stream(
@@ -41,7 +52,7 @@ def _create_variable_speed_compressor_train_multiple_streams_and_pressures_strea
4152
is_inlet_stream = stream_data.typ == FluidStreamType.INGOING
4253
return FluidStreamObjectForMultipleStreams(
4354
name=stream_data.name,
44-
fluid=FluidStream(fluid_model=stream_data.fluid_model) if stream_data.fluid_model else None,
55+
fluid_model=stream_data.fluid_model,
4556
is_inlet_stream=is_inlet_stream,
4657
connected_to_stage_no=stream_references[stream_data.name],
4758
)
@@ -52,8 +63,12 @@ def _create_compressor_train_simplified_with_known_stages(
5263
) -> CompressorTrainSimplifiedKnownStages:
5364
# Energy usage adjustment not supported for this model (yet)
5465
# Issue error if factors are not default (and not changing the energy usage result)
66+
fluid_factory = _create_fluid_factory(compressor_model_dto.fluid_model)
67+
if fluid_factory is None:
68+
raise ValueError("Fluid model is required for compressor train")
5569
return CompressorTrainSimplifiedKnownStages(
5670
data_transfer_object=compressor_model_dto,
71+
fluid_factory=fluid_factory,
5772
)
5873

5974

@@ -81,24 +96,48 @@ def _create_compressor_with_turbine(
8196
def _create_single_speed_compressor_train(
8297
compressor_model_dto: SingleSpeedCompressorTrain,
8398
) -> SingleSpeedCompressorTrainCommonShaft:
99+
fluid_factory = _create_fluid_factory(compressor_model_dto.fluid_model)
100+
if fluid_factory is None:
101+
raise ValueError("Fluid model is required for compressor train")
84102
return SingleSpeedCompressorTrainCommonShaft(
85103
data_transfer_object=compressor_model_dto,
104+
fluid_factory=fluid_factory,
86105
)
87106

88107

89108
def _create_variable_speed_compressor_train(
90109
compressor_model_dto: VariableSpeedCompressorTrain,
91110
) -> VariableSpeedCompressorTrainCommonShaft:
111+
fluid_factory = _create_fluid_factory(compressor_model_dto.fluid_model)
112+
if fluid_factory is None:
113+
raise ValueError("Fluid model is required for compressor train")
92114
return VariableSpeedCompressorTrainCommonShaft(
93115
data_transfer_object=compressor_model_dto,
116+
fluid_factory=fluid_factory,
94117
)
95118

96119

97120
def _create_variable_speed_compressor_train_multiple_streams_and_pressures(
98121
compressor_model_dto: VariableSpeedCompressorTrainMultipleStreamsAndPressures,
99122
) -> VariableSpeedCompressorTrainCommonShaftMultipleStreamsAndPressures:
123+
# Find the first inlet stream's fluid model for the train inlet
124+
fluid_model_train_inlet = None
125+
for stream in compressor_model_dto.streams:
126+
if stream.typ == FluidStreamType.INGOING and stream.fluid_model is not None:
127+
fluid_model_train_inlet = stream.fluid_model
128+
break
129+
130+
# Fall back to dto fluid_model if no inlet stream has a fluid model
131+
if fluid_model_train_inlet is None:
132+
fluid_model_train_inlet = compressor_model_dto.fluid_model
133+
134+
fluid_factory_train_inlet = _create_fluid_factory(fluid_model_train_inlet)
135+
if fluid_factory_train_inlet is None:
136+
raise ValueError("Fluid model is required for compressor train")
137+
100138
return VariableSpeedCompressorTrainCommonShaftMultipleStreamsAndPressures(
101139
data_transfer_object=compressor_model_dto,
140+
fluid_factory=fluid_factory_train_inlet,
102141
streams=[
103142
_create_variable_speed_compressor_train_multiple_streams_and_pressures_stream(
104143
stream_specification_dto, compressor_model_dto.stream_references
@@ -111,7 +150,13 @@ def _create_variable_speed_compressor_train_multiple_streams_and_pressures(
111150
def _create_compressor_train_simplified_with_unknown_stages(
112151
compressor_model_dto: CompressorTrainSimplifiedWithUnknownStages,
113152
) -> CompressorTrainSimplifiedUnknownStages:
114-
return CompressorTrainSimplifiedUnknownStages(data_transfer_object=compressor_model_dto)
153+
fluid_factory = _create_fluid_factory(compressor_model_dto.fluid_model)
154+
if fluid_factory is None:
155+
raise ValueError("Fluid model is required for compressor train")
156+
return CompressorTrainSimplifiedUnknownStages(
157+
data_transfer_object=compressor_model_dto,
158+
fluid_factory=fluid_factory,
159+
)
115160

116161

117162
def _create_compressor_sampled(compressor_model_dto: CompressorSampled) -> CompressorModelSampled:

0 commit comments

Comments
 (0)