Skip to content

Commit 7cb3d87

Browse files
committed
chore: init mapping
1 parent b05a6d0 commit 7cb3d87

File tree

23 files changed

+761
-154
lines changed

23 files changed

+761
-154
lines changed

src/libecalc/domain/process/entities/process_units/recirculation_loop.py

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from collections.abc import Sequence
22

33
from libecalc.domain.component_validation_error import DomainValidationException
4+
from libecalc.domain.process.entities.process_units.compressor import Compressor
45
from libecalc.domain.process.entities.process_units.mixer import Mixer
56
from libecalc.domain.process.entities.process_units.splitter import Splitter
67
from libecalc.domain.process.process_system.process_system import ProcessSystem, ProcessSystemId
@@ -57,7 +58,7 @@ class RecirculationLoop(ProcessSystem):
5758
def __init__(
5859
self,
5960
process_system_id: ProcessSystemId,
60-
inner_process: ProcessSystem,
61+
inner_process: ProcessSystem | ProcessUnit,
6162
fluid_service: FluidService,
6263
recirculation_rate: float = 0,
6364
):
@@ -77,20 +78,36 @@ def __init__(
7778
)
7879

7980
def _validate_inner_process(self):
80-
assert isinstance(self._inner_process, ProcessSystem), "Recirculation loop should contain a ProcessSystem"
81-
for process_unit in self._inner_process.get_process_units():
82-
if isinstance(process_unit, Mixer | Splitter):
83-
raise DomainValidationException("Recirculation loop cannot contain splitters or mixers")
81+
if not isinstance(self._inner_process, ProcessSystem | ProcessUnit):
82+
raise DomainValidationException(
83+
"Recirculation loop should contain a ProcessSystem with a compressor or a single compressor"
84+
)
85+
if isinstance(self._inner_process, ProcessSystem):
86+
for process_unit in self._inner_process.get_process_units():
87+
if isinstance(process_unit, Splitter | Mixer):
88+
raise DomainValidationException("Recirculation loop cannot contain splitters or mixers")
89+
if isinstance(self._inner_process, ProcessUnit):
90+
if not isinstance(self._inner_process, Compressor):
91+
raise DomainValidationException(
92+
"Recirculation loop should contain a ProcessSystem with a compressor or a single compressor"
93+
)
8494

8595
def get_id(self) -> ProcessSystemId:
8696
return self._id
8797

8898
def get_process_units(self) -> Sequence[ProcessUnit | ProcessSystem]:
89-
return [
90-
self._mixer,
91-
*self._inner_process.get_process_units(),
92-
self._splitter,
93-
]
99+
if isinstance(self._inner_process, ProcessSystem):
100+
return [
101+
self._mixer,
102+
*self._inner_process.get_process_units(),
103+
self._splitter,
104+
]
105+
else:
106+
return [
107+
self._mixer,
108+
self._inner_process,
109+
self._splitter,
110+
]
94111

95112
def set_recirculation_rate(self, rate: float):
96113
self._mixer.set_mix_rate(rate)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from dataclasses import dataclass
2+
from typing import Literal
3+
4+
from libecalc.domain.process.process_system.process_system import ProcessSystem, ProcessSystemId
5+
from libecalc.domain.process.stream_distribution.common_stream_distribution import Overflow
6+
from libecalc.domain.process.value_objects.fluid_stream.time_series_stream import TimeSeriesStream
7+
from libecalc.presentation.yaml.domain.time_series_expression import TimeSeriesExpression
8+
9+
10+
@dataclass
11+
class CommonStreamSettings:
12+
rate_fractions: list[TimeSeriesExpression]
13+
overflow: list[Overflow]
14+
15+
16+
@dataclass
17+
class CommonStreamDistributionConfig:
18+
inlet_stream: TimeSeriesStream
19+
settings: list[CommonStreamSettings]
20+
21+
22+
@dataclass
23+
class IndividualStreamDistributionConfig:
24+
inlet_streams: list[TimeSeriesStream]
25+
26+
27+
@dataclass
28+
class Constraint:
29+
process_system_id: ProcessSystemId
30+
outlet_pressure: TimeSeriesExpression
31+
32+
33+
@dataclass
34+
class PressureControlConfig:
35+
process_system_id: ProcessSystemId
36+
type: Literal["UPSTREAM_CHOKE", "DOWNSTREAM_CHOKE", "COMMON_ASV", "INDIVIDUAL_ASV_RATE", "INDIVIDUAL_ASV_PRESSURE"]
37+
38+
39+
@dataclass
40+
class AntiSurgeConfig:
41+
process_system_id: ProcessSystemId
42+
type: Literal["INDIVIDUAL_ASV", "COMMON_ASV"]
43+
44+
45+
@dataclass
46+
class ProcessSimulation:
47+
process_systems: list[ProcessSystem]
48+
pressure_control_strategies: list[PressureControlConfig]
49+
anti_surge_strategies: list[AntiSurgeConfig]
50+
constraints: list[Constraint]
51+
stream_distribution: IndividualStreamDistributionConfig | CommonStreamDistributionConfig

src/libecalc/domain/process/process_solver/anti_surge/individual_asv.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ class IndividualASVAntiSurgeStrategy(AntiSurgeStrategy):
2929

3030
def __init__(
3131
self,
32-
recirculation_loop_ids: list[ProcessSystemId],
33-
compressors: list[Compressor],
32+
recirculation_loop_ids: Sequence[ProcessSystemId],
33+
compressors: Sequence[Compressor],
3434
simulator: ProcessRunner,
3535
):
3636
assert len(recirculation_loop_ids) == len(compressors)

src/libecalc/domain/process/process_solver/pressure_control/individual_asv.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class IndividualASVPressureControlStrategy(PressureControlStrategy):
3333
def __init__(
3434
self,
3535
simulator: ProcessRunner,
36-
recirculation_loop_ids: list[ProcessSystemId],
37-
compressors: list[Compressor],
36+
recirculation_loop_ids: Sequence[ProcessSystemId],
37+
compressors: Sequence[Compressor],
3838
root_finding_strategy: RootFindingStrategy,
3939
):
4040
self._simulator = simulator
@@ -131,8 +131,8 @@ class IndividualASVRateControlStrategy(PressureControlStrategy):
131131
def __init__(
132132
self,
133133
simulator: ProcessRunner,
134-
recirculation_loop_ids: list[ProcessSystemId],
135-
compressors: list[Compressor],
134+
recirculation_loop_ids: Sequence[ProcessSystemId],
135+
compressors: Sequence[Compressor],
136136
):
137137
self._simulator = simulator
138138
self._recirculation_loop_ids = recirculation_loop_ids
@@ -222,8 +222,8 @@ def get_outlet_stream(rate_fraction: float) -> FluidStream:
222222

223223
def _minimum_achievable_pressure(
224224
simulator: ProcessRunner,
225-
recirculation_loop_ids: list[ProcessSystemId],
226-
compressors: list[Compressor],
225+
recirculation_loop_ids: Sequence[ProcessSystemId],
226+
compressors: Sequence[Compressor],
227227
inlet_stream: FluidStream,
228228
) -> Sequence[Configuration[RecirculationConfiguration | ChokeConfiguration]]:
229229
"""Propagate with maximum recirculation on every stage to find the lowest achievable pressure."""

src/libecalc/domain/process/process_solver/process_system_runner.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from collections.abc import Iterable
1+
from collections.abc import Iterable, Sequence
22

33
from libecalc.domain.process.entities.process_units.choke import Choke
44
from libecalc.domain.process.entities.process_units.recirculation_loop import RecirculationLoop
@@ -15,7 +15,7 @@
1515

1616

1717
class ProcessSystemRunner(ProcessRunner):
18-
def __init__(self, shaft: Shaft, units: list[ProcessUnit | ProcessSystem]):
18+
def __init__(self, shaft: Shaft, units: Sequence[ProcessUnit | ProcessSystem]):
1919
self._shaft = shaft
2020
self._units = {unit.get_id(): unit for unit in units}
2121
self._configurations: dict[ProcessUnitId | ProcessSystemId | ShaftId, Configuration] = {}

src/libecalc/domain/process/stream_distribution/common_stream_distribution.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import abc
22
from collections import defaultdict
33
from collections.abc import Hashable, Iterable
4+
from collections.abc import Mapping
45
from dataclasses import dataclass
56
from typing import Generic, TypeVar
67

78
import networkx as nx
8-
from libecalc.domain.process.stream_distribution.stream_distribution import StreamDistribution
9+
910
from libecalc.domain.component_validation_error import DomainValidationException
11+
from libecalc.domain.process.stream_distribution.stream_distribution import StreamDistribution
1012
from libecalc.domain.process.value_objects.fluid_stream import FluidService, FluidStream
1113

1214

@@ -28,7 +30,7 @@ class CommonStreamDistribution(StreamDistribution, Generic[T]):
2830
def __init__(
2931
self,
3032
inlet_stream: FluidStream,
31-
items: dict[T, HasExcessRate],
33+
items: Mapping[T, HasExcessRate],
3234
rate_fractions: list[float],
3335
overflows: list[Overflow[T]],
3436
fluid_service: FluidService,
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from collections.abc import Sequence
2+
3+
from libecalc.domain.process.stream_distribution.stream_distribution import StreamDistribution
4+
from libecalc.domain.process.value_objects.fluid_stream import FluidStream
5+
6+
7+
class IndividualStreamDistribution(StreamDistribution):
8+
def __init__(self, streams: Sequence[FluidStream]):
9+
self._streams = streams
10+
11+
def get_number_of_streams(self) -> int:
12+
return len(self._streams)
13+
14+
def get_streams(self) -> list[FluidStream]:
15+
return list(self._streams)

src/libecalc/domain/process/stream_distribution/priorities_stream_distribution.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import abc
2+
from collections.abc import Sequence
23

34
from libecalc.domain.process.stream_distribution.stream_distribution import StreamDistribution
45
from libecalc.domain.process.value_objects.fluid_stream import FluidStream
@@ -9,7 +10,7 @@ class HasValidity(abc.ABC):
910
def is_valid(self, inlet_stream: FluidStream) -> bool: ...
1011

1112

12-
def find_first_valid(stream_distributions: list[StreamDistribution], items: list[HasValidity]) -> list[FluidStream]:
13+
def find_first_valid(stream_distributions: list[StreamDistribution], items: Sequence[HasValidity]) -> list[FluidStream]:
1314
assert len(stream_distributions) > 0
1415
for stream_distribution in stream_distributions:
1516
streams = stream_distribution.get_streams()
@@ -20,7 +21,7 @@ def find_first_valid(stream_distributions: list[StreamDistribution], items: list
2021

2122

2223
class PrioritiesStreamDistribution(StreamDistribution):
23-
def __init__(self, stream_distributions: list[StreamDistribution], items: list[HasValidity]):
24+
def __init__(self, stream_distributions: list[StreamDistribution], items: Sequence[HasValidity]):
2425
self._stream_distributions = stream_distributions
2526
self._items = items
2627

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from dataclasses import dataclass
2+
3+
from libecalc.domain.process.value_objects.fluid_stream import FluidModel
4+
from libecalc.domain.time_series_flow_rate import TimeSeriesFlowRate
5+
from libecalc.presentation.yaml.domain.time_series_expression import TimeSeriesExpression
6+
7+
8+
@dataclass(frozen=True)
9+
class TimeSeriesStream:
10+
fluid_model: FluidModel
11+
pressure_bara: TimeSeriesExpression
12+
temperature_kelvin: TimeSeriesExpression
13+
standard_rate_m3_per_day: TimeSeriesFlowRate

src/libecalc/presentation/yaml/domain/reference_service.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55
from libecalc.domain.component_validation_error import DomainValidationException
66
from libecalc.presentation.yaml.mappers.yaml_path import YamlPath
7+
from libecalc.presentation.yaml.yaml_types.components.yaml_process_system import (
8+
YamlCompressor,
9+
YamlCompressorStageProcessSystem,
10+
YamlSerialProcessSystem,
11+
)
712
from libecalc.presentation.yaml.yaml_types.facility_model.yaml_facility_model import (
813
YamlCompressorTabularModel,
914
YamlGeneratorSetModel,
@@ -24,6 +29,7 @@
2429
YamlVariableSpeedCompressorTrain,
2530
YamlVariableSpeedCompressorTrainMultipleStreamsAndPressures,
2631
)
32+
from libecalc.presentation.yaml.yaml_types.streams.yaml_inlet_stream import YamlInletStream
2733

2834

2935
class InvalidReferenceException(DomainValidationException):
@@ -72,3 +78,15 @@ def get_pump_model(self, reference: str) -> YamlPumpChartSingleSpeed | YamlPumpC
7278

7379
@abc.abstractmethod
7480
def get_tabulated_model(self, reference: str) -> YamlTabularModel: ...
81+
82+
@abc.abstractmethod
83+
def get_process_system(self, reference: str) -> YamlSerialProcessSystem: ...
84+
85+
@abc.abstractmethod
86+
def get_compressor_stage(self, reference: str) -> YamlCompressorStageProcessSystem: ...
87+
88+
@abc.abstractmethod
89+
def get_compressor(self, reference: str) -> YamlCompressor: ...
90+
91+
@abc.abstractmethod
92+
def get_stream(self, reference: str) -> YamlInletStream: ...

0 commit comments

Comments
 (0)