11from libecalc .domain .process .entities .shaft import VariableSpeedShaft
22from libecalc .domain .process .process_solver .asv_solvers import ASVSolver
3- from libecalc .domain .process .process_solver .boundary import Boundary
43from libecalc .domain .process .process_solver .float_constraint import FloatConstraint
5- from libecalc .domain .process .process_system .compressor_stage_process_unit import CompressorStageProcessUnit
6- from libecalc .domain .process .process_system .process_unit import ProcessUnitId , create_process_unit_id
7- from libecalc .domain .process .value_objects .fluid_stream import FluidService , FluidStream
8-
9-
10- class SpeedCompressorStage (CompressorStageProcessUnit ):
11- """
12- Test double that makes speed->pressure mapping deterministic:
13-
14- outlet_pressure = inlet_pressure + shaft_speed
15-
16- The capacity-related methods are implemented with wide limits to avoid
17- interfering with tests that focus on solver orchestration.
18- """
19-
20- def __init__ (self , shaft : VariableSpeedShaft , fluid_service : FluidService ):
21- self ._id = create_process_unit_id ()
22- self ._shaft = shaft
23- self ._fluid_service = fluid_service
24-
25- def get_id (self ) -> ProcessUnitId :
26- return self ._id
27-
28- def get_speed_boundary (self ) -> Boundary :
29- return Boundary (min = 200.0 , max = 600.0 )
30-
31- def get_maximum_standard_rate (self , inlet_stream : FluidStream ) -> float :
32- # "Infinite" capacity for test purposes
33- return 1e30
34-
35- def get_minimum_standard_rate (self , inlet_stream : FluidStream ) -> float :
36- # "No minimum" for test purposes
37- return 0.0
38-
39- def propagate_stream (self , inlet_stream : FluidStream ) -> FluidStream :
40- speed = self ._shaft .get_speed ()
41- return self ._fluid_service .create_stream_from_standard_rate (
42- fluid_model = inlet_stream .fluid_model ,
43- pressure_bara = inlet_stream .pressure_bara + speed ,
44- standard_rate_m3_per_day = inlet_stream .standard_rate_sm3_per_day ,
45- temperature_kelvin = inlet_stream .temperature_kelvin ,
46- )
474
485
496def test_asv_solver_applies_downstream_choke_when_speed_solution_is_at_min_speed (
507 stream_factory ,
518 process_system_factory ,
529 fluid_service ,
5310 choke_factory ,
11+ speed_compressor_stage_factory ,
5412):
5513 """
5614 If the target outlet pressure is lower than the outlet pressure at minimum speed, SpeedSolver returns
@@ -61,7 +19,7 @@ def test_asv_solver_applies_downstream_choke_when_speed_solution_is_at_min_speed
6119 downstream_choke = choke_factory ()
6220
6321 # One "compressor" stage that increases pressure with speed, followed by a downstream choke.
64- compressor = SpeedCompressorStage (shaft = shaft , fluid_service = fluid_service )
22+ compressor = speed_compressor_stage_factory (shaft = shaft )
6523
6624 solver = ASVSolver (
6725 shaft = shaft ,
@@ -75,10 +33,10 @@ def test_asv_solver_applies_downstream_choke_when_speed_solution_is_at_min_speed
7533
7634 # At min speed=200 => baseline outlet = 25 + 200 = 225.
7735 # Choose a target lower than 225 so SpeedSolver returns min speed with success=False.
78- target = FloatConstraint (50.0 , abs_tol = 1e-12 )
36+ target_pressure = FloatConstraint (50.0 , abs_tol = 1e-12 )
7937
8038 speed_solution , recirculation_solutions = solver .find_asv_solution (
81- pressure_constraint = target ,
39+ pressure_constraint = target_pressure ,
8240 inlet_stream = inlet_stream ,
8341 )
8442
@@ -96,4 +54,4 @@ def test_asv_solver_applies_downstream_choke_when_speed_solution_is_at_min_speed
9654 process_system = process_system_factory (process_units = [* solver .get_recirculation_loops (), downstream_choke ])
9755 outlet = process_system .propagate_stream (inlet_stream = inlet_stream )
9856
99- assert outlet .pressure_bara == target
57+ assert outlet .pressure_bara == target_pressure
0 commit comments