Skip to content

Commit 1183c3c

Browse files
committed
refactor: add get_configuration to Solution
refactor: extract Configurations and SimulationUnitId from ProcessRunner to break import cycle refactor: introduce OpertaingConfiguration as union of speed-, choke-, and recircconfigurations i#refactor: use ConfigurationValue type alias broadly
1 parent b1141f9 commit 1183c3c

18 files changed

Lines changed: 91 additions & 81 deletions

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from abc import ABC, abstractmethod
22
from collections.abc import Sequence
33

4-
from libecalc.domain.process.process_solver.process_runner import Configuration
4+
from libecalc.domain.process.process_solver.configuration import Configuration
55
from libecalc.domain.process.process_solver.solver import Solution
66
from libecalc.domain.process.process_solver.solvers.recirculation_solver import RecirculationConfiguration
77
from libecalc.domain.process.value_objects.fluid_stream import FluidStream

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
from libecalc.domain.process.entities.process_units.compressor import Compressor
44
from libecalc.domain.process.process_solver.anti_surge.anti_surge_strategy import AntiSurgeStrategy
5-
from libecalc.domain.process.process_solver.process_runner import Configuration, ProcessRunner
5+
from libecalc.domain.process.process_solver.configuration import Configuration
6+
from libecalc.domain.process.process_solver.process_runner import ProcessRunner
67
from libecalc.domain.process.process_solver.search_strategies import BinarySearchStrategy, RootFindingStrategy
78
from libecalc.domain.process.process_solver.solver import Solution
89
from libecalc.domain.process.process_solver.solvers.recirculation_solver import (

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
from libecalc.domain.process.entities.process_units.compressor import Compressor
55
from libecalc.domain.process.process_solver.anti_surge.anti_surge_strategy import AntiSurgeStrategy
6-
from libecalc.domain.process.process_solver.process_runner import Configuration, ProcessRunner
6+
from libecalc.domain.process.process_solver.configuration import Configuration
7+
from libecalc.domain.process.process_solver.process_runner import ProcessRunner
78
from libecalc.domain.process.process_solver.solver import Solution
89
from libecalc.domain.process.process_solver.solvers.recirculation_solver import RecirculationConfiguration
910
from libecalc.domain.process.process_system.process_error import RateTooHighError
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from dataclasses import dataclass
2+
from functools import total_ordering
3+
from typing import Generic, TypeVar
4+
5+
from libecalc.domain.process.entities.shaft.shaft import ShaftId
6+
from libecalc.domain.process.process_system.process_system import ProcessSystemId
7+
from libecalc.domain.process.process_system.process_unit import ProcessUnitId
8+
9+
T_co = TypeVar("T_co", covariant=True)
10+
11+
SimulationUnitId = ProcessUnitId | ProcessSystemId | ShaftId
12+
13+
14+
@dataclass(frozen=True)
15+
class Configuration(Generic[T_co]):
16+
simulation_unit_id: SimulationUnitId
17+
value: T_co
18+
19+
20+
@total_ordering
21+
@dataclass
22+
class SpeedConfiguration:
23+
speed: float
24+
25+
def __eq__(self, other: object) -> bool:
26+
if not isinstance(other, SpeedConfiguration):
27+
return NotImplemented
28+
return self.speed == other.speed
29+
30+
def __lt__(self, other: object) -> bool:
31+
if not isinstance(other, SpeedConfiguration):
32+
return NotImplemented
33+
return self.speed < other.speed
34+
35+
36+
@dataclass
37+
class ChokeConfiguration:
38+
delta_pressure: float
39+
40+
41+
@dataclass
42+
class RecirculationConfiguration:
43+
recirculation_rate: float
44+
45+
def __post_init__(self):
46+
self.recirculation_rate = float(self.recirculation_rate)
47+
48+
49+
OperatingConfiguration = SpeedConfiguration | ChokeConfiguration | RecirculationConfiguration

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
from typing import Final
33

44
from libecalc.domain.component_validation_error import DomainValidationException
5+
from libecalc.domain.process.process_solver.configuration import Configuration
56
from libecalc.domain.process.process_solver.float_constraint import FloatConstraint
67
from libecalc.domain.process.process_solver.outlet_pressure_solver import OutletPressureSolver
78
from libecalc.domain.process.process_solver.pressure_control.downstream_choke import (
89
DownstreamChokePressureControlStrategy,
910
)
1011
from libecalc.domain.process.process_solver.pressure_control.upstream_choke import UpstreamChokePressureControlStrategy
11-
from libecalc.domain.process.process_solver.process_runner import Configuration
1212
from libecalc.domain.process.process_solver.solver import Solution
1313
from libecalc.domain.process.process_solver.solvers.speed_solver import SpeedConfiguration
1414
from libecalc.domain.process.value_objects.fluid_stream import FluidStream
@@ -60,14 +60,6 @@ def _validate_pressure_control_placement(segments: list[OutletPressureSolver]) -
6060
f"(segment {i} of {len(segments)})."
6161
)
6262

63-
@staticmethod
64-
def _extract_speed_configuration(solution: Solution[Sequence[Configuration]]) -> SpeedConfiguration:
65-
"""Find speed configuration in a sequence of configurations."""
66-
for config in solution.configuration:
67-
if isinstance(config.value, SpeedConfiguration):
68-
return config.value
69-
raise DomainValidationException("No SpeedConfiguration found in solution.")
70-
7163
def find_solution(
7264
self,
7365
pressure_targets: list[FloatConstraint],
@@ -83,7 +75,9 @@ def find_solution(
8375
current_inlet = inlet_stream
8476
for segment, target in zip(self._segments, pressure_targets):
8577
solution_for_segment = segment.find_solution(pressure_constraint=target, inlet_stream=current_inlet)
86-
speed_configurations.append(self._extract_speed_configuration(solution_for_segment))
78+
speed_configuration = solution_for_segment.get_configuration(self._shaft_id)
79+
assert isinstance(speed_configuration, SpeedConfiguration)
80+
speed_configurations.append(speed_configuration)
8781
segment.runner.apply_configurations(solution_for_segment.configuration)
8882
current_inlet = segment.runner.run(inlet_stream=current_inlet)
8983

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
from libecalc.domain.process.entities.shaft.shaft import ShaftId
55
from libecalc.domain.process.process_solver.anti_surge.anti_surge_strategy import AntiSurgeStrategy
66
from libecalc.domain.process.process_solver.boundary import Boundary
7+
from libecalc.domain.process.process_solver.configuration import Configuration
78
from libecalc.domain.process.process_solver.float_constraint import FloatConstraint
89
from libecalc.domain.process.process_solver.pressure_control.pressure_control_strategy import PressureControlStrategy
9-
from libecalc.domain.process.process_solver.process_runner import Configuration, ProcessRunner
10+
from libecalc.domain.process.process_solver.process_runner import ProcessRunner
1011
from libecalc.domain.process.process_solver.search_strategies import BinarySearchStrategy, RootFindingStrategy
1112
from libecalc.domain.process.process_solver.solver import Solution
1213
from libecalc.domain.process.process_solver.solvers.recirculation_solver import (

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from collections.abc import Sequence
22

33
from libecalc.domain.process.entities.process_units.compressor import Compressor
4+
from libecalc.domain.process.process_solver.configuration import Configuration
45
from libecalc.domain.process.process_solver.float_constraint import FloatConstraint
56
from libecalc.domain.process.process_solver.pressure_control.pressure_control_strategy import PressureControlStrategy
6-
from libecalc.domain.process.process_solver.process_runner import Configuration, ProcessRunner
7+
from libecalc.domain.process.process_solver.process_runner import ProcessRunner
78
from libecalc.domain.process.process_solver.search_strategies import BinarySearchStrategy, RootFindingStrategy
89
from libecalc.domain.process.process_solver.solver import Solution
910
from libecalc.domain.process.process_solver.solvers.downstream_choke_solver import ChokeConfiguration

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from collections.abc import Sequence
22

3+
from libecalc.domain.process.process_solver.configuration import Configuration
34
from libecalc.domain.process.process_solver.float_constraint import FloatConstraint
45
from libecalc.domain.process.process_solver.pressure_control.pressure_control_strategy import PressureControlStrategy
5-
from libecalc.domain.process.process_solver.process_runner import Configuration, ProcessRunner
6+
from libecalc.domain.process.process_solver.process_runner import ProcessRunner
67
from libecalc.domain.process.process_solver.solver import Solution
78
from libecalc.domain.process.process_solver.solvers.downstream_choke_solver import (
89
ChokeConfiguration,

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

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

33
from libecalc.domain.process.compressor.core.train.utils.numeric_methods import find_root
44
from libecalc.domain.process.entities.process_units.compressor import Compressor
5+
from libecalc.domain.process.process_solver.configuration import Configuration
56
from libecalc.domain.process.process_solver.float_constraint import FloatConstraint
67
from libecalc.domain.process.process_solver.pressure_control.pressure_control_strategy import PressureControlStrategy
7-
from libecalc.domain.process.process_solver.process_runner import Configuration, ProcessRunner
8+
from libecalc.domain.process.process_solver.process_runner import ProcessRunner
89
from libecalc.domain.process.process_solver.search_strategies import BinarySearchStrategy, RootFindingStrategy
910
from libecalc.domain.process.process_solver.solver import Solution
1011
from libecalc.domain.process.process_solver.solvers.downstream_choke_solver import ChokeConfiguration

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from abc import ABC, abstractmethod
22
from collections.abc import Sequence
33

4+
from libecalc.domain.process.process_solver.configuration import Configuration
45
from libecalc.domain.process.process_solver.float_constraint import FloatConstraint
5-
from libecalc.domain.process.process_solver.process_runner import Configuration
66
from libecalc.domain.process.process_solver.solver import Solution
77
from libecalc.domain.process.process_solver.solvers.downstream_choke_solver import ChokeConfiguration
88
from libecalc.domain.process.process_solver.solvers.recirculation_solver import RecirculationConfiguration

0 commit comments

Comments
 (0)