1414from libecalc .domain .process .compressor .core .train .utils .numeric_methods import find_root
1515from libecalc .domain .process .compressor .dto import InterstagePressureControl
1616from libecalc .domain .process .value_objects .chart .compressor import (
17- SingleSpeedCompressorChart ,
18- VariableSpeedCompressorChart ,
17+ CompressorChart ,
1918)
2019from libecalc .domain .process .value_objects .fluid_stream import FluidStream , ProcessConditions
2120
@@ -28,7 +27,7 @@ class CompressorTrainStage:
2827
2928 def __init__ (
3029 self ,
31- compressor_chart : SingleSpeedCompressorChart | VariableSpeedCompressorChart ,
30+ compressor_chart : CompressorChart ,
3231 inlet_temperature_kelvin : float ,
3332 remove_liquid_after_cooling : bool ,
3433 pressure_drop_ahead_of_stage : float | None = None ,
@@ -47,7 +46,7 @@ def has_control_pressure(self):
4746 def evaluate (
4847 self ,
4948 inlet_stream_stage : FluidStream ,
50- speed : float | None = None ,
49+ speed : float ,
5150 asv_rate_fraction : float | None = 0.0 ,
5251 asv_additional_mass_rate : float | None = 0.0 ,
5352 increase_rate_left_of_minimum_flow_assuming_asv : bool | None = True ,
@@ -67,22 +66,13 @@ def evaluate(
6766
6867 Returns: Results of the evaluation
6968 """
70- if isinstance (self .compressor_chart , VariableSpeedCompressorChart ):
71- if speed is None :
72- msg = (
73- f"Speed value ({ speed } ) is not allowed for a variable speed compressor chart."
74- f"You should not end up here, please contact support."
75- )
76- logger .exception (msg )
77- raise IllegalStateException (msg )
78-
79- if speed < self .compressor_chart .minimum_speed or speed > self .compressor_chart .maximum_speed :
80- msg = (
81- f"Speed value ({ speed } ) outside allowed range ({ self .compressor_chart .minimum_speed } -"
82- f" { self .compressor_chart .maximum_speed } ). You should not end up here, please contact support."
83- )
84- logger .exception (msg )
85- raise IllegalStateException (msg )
69+ if speed < self .compressor_chart .minimum_speed or speed > self .compressor_chart .maximum_speed :
70+ msg = (
71+ f"Speed value ({ speed } ) outside allowed range ({ self .compressor_chart .minimum_speed } -"
72+ f" { self .compressor_chart .maximum_speed } ). You should not end up here, please contact support."
73+ )
74+ logger .exception (msg )
75+ raise IllegalStateException (msg )
8676
8777 if asv_rate_fraction is not None and asv_additional_mass_rate is not None :
8878 if asv_rate_fraction > 0 and asv_additional_mass_rate > 0 :
@@ -107,11 +97,7 @@ def evaluate(
10797 )
10898
10999 actual_rate_m3_per_hour_to_use = actual_rate_m3_per_hour = inlet_stream_compressor .volumetric_rate
110- compressor_maximum_actual_rate_m3_per_hour = float (
111- self .compressor_chart .maximum_rate_as_function_of_speed (speed ) # type: ignore[arg-type]
112- if isinstance (self .compressor_chart , VariableSpeedCompressorChart )
113- else self .compressor_chart .maximum_rate
114- )
100+ compressor_maximum_actual_rate_m3_per_hour = self .compressor_chart .maximum_rate_as_function_of_speed (speed )
115101 available_capacity_for_actual_rate_m3_per_hour = max (
116102 0 , compressor_maximum_actual_rate_m3_per_hour - actual_rate_m3_per_hour
117103 ) # if the actual_rate_m3_per_hour is above capacity, the available capacity should be zero, not negative
@@ -124,24 +110,15 @@ def evaluate(
124110 if asv_additional_mass_rate :
125111 additional_rate_m3_per_hour = asv_additional_mass_rate / inlet_stream_compressor .density
126112
127- if isinstance (self .compressor_chart , VariableSpeedCompressorChart ):
128- compressor_chart_head_and_efficiency_result = (
129- self .compressor_chart .calculate_polytropic_head_and_efficiency_single_point (
130- speed = speed , # type: ignore[arg-type]
131- actual_rate_m3_per_hour = actual_rate_m3_per_hour ,
132- recirculated_rate_m3_per_hour = additional_rate_m3_per_hour ,
133- increase_rate_left_of_minimum_flow_assuming_asv = increase_rate_left_of_minimum_flow_assuming_asv , # type: ignore[arg-type]
134- increase_speed_below_assuming_choke = increase_speed_below_assuming_choke , # type: ignore[arg-type]
135- )
136- )
137- else :
138- compressor_chart_head_and_efficiency_result = (
139- self .compressor_chart .calculate_polytropic_head_and_efficiency_single_point (
140- actual_rate_m3_per_hour = actual_rate_m3_per_hour ,
141- recirculated_rate_m3_per_hour = additional_rate_m3_per_hour ,
142- increase_rate_left_of_minimum_flow_assuming_asv = increase_rate_left_of_minimum_flow_assuming_asv , # type: ignore[arg-type]
143- )
113+ compressor_chart_head_and_efficiency_result = (
114+ self .compressor_chart .calculate_polytropic_head_and_efficiency_single_point (
115+ speed = speed ,
116+ actual_rate_m3_per_hour = actual_rate_m3_per_hour ,
117+ recirculated_rate_m3_per_hour = additional_rate_m3_per_hour ,
118+ increase_rate_left_of_minimum_flow_assuming_asv = increase_rate_left_of_minimum_flow_assuming_asv , # type: ignore[arg-type]
119+ increase_speed_below_assuming_choke = increase_speed_below_assuming_choke , # type: ignore[arg-type]
144120 )
121+ )
145122
146123 actual_rate_m3_per_hour_to_use += additional_rate_m3_per_hour
147124
@@ -160,9 +137,7 @@ def evaluate(
160137 _ ,
161138 mass_rate_asv_corrected_kg_per_hour ,
162139 ) = calculate_asv_corrected_rate (
163- minimum_actual_rate_m3_per_hour = float (self .compressor_chart .minimum_rate_as_function_of_speed (speed )) # type: ignore[arg-type]
164- if isinstance (self .compressor_chart , VariableSpeedCompressorChart )
165- else float (self .compressor_chart .minimum_rate ),
140+ minimum_actual_rate_m3_per_hour = float (self .compressor_chart .minimum_rate_as_function_of_speed (speed )),
166141 actual_rate_m3_per_hour = actual_rate_m3_per_hour_to_use ,
167142 density_kg_per_m3 = inlet_stream_compressor .density ,
168143 )
@@ -230,8 +205,8 @@ def evaluate_given_speed_and_target_discharge_pressure(
230205 CompressorTrainStageResultSingleTimeStep: The result of the evaluation for the compressor stage,
231206 including the outlet stream and operational details.
232207 """
233- # If no speed is defined for VariableSpeedCompressorChart , use the minimum speed
234- if isinstance (self .compressor_chart , VariableSpeedCompressorChart ) and speed is None :
208+ # If no speed is defined for CompressorChart , use the minimum speed
209+ if isinstance (self .compressor_chart , CompressorChart ) and speed is None :
235210 speed = self .compressor_chart .minimum_speed
236211
237212 result_no_recirculation = self .evaluate (
@@ -242,11 +217,7 @@ def evaluate_given_speed_and_target_discharge_pressure(
242217
243218 # result_no_recirculation.inlet_stream.density_kg_per_m3 will have correct pressure and temperature
244219 # to find max mass rate, inlet_stream_stage will not
245- maximum_rate = (
246- self .compressor_chart .maximum_rate
247- if isinstance (self .compressor_chart , SingleSpeedCompressorChart )
248- else self .compressor_chart .maximum_rate_as_function_of_speed (speed ) # type: ignore[arg-type]
249- )
220+ maximum_rate = self .compressor_chart .maximum_rate_as_function_of_speed (speed )
250221
251222 max_recirculation = max (
252223 maximum_rate * float (result_no_recirculation .inlet_stream .density )
@@ -292,7 +263,7 @@ class UndefinedCompressorStage(CompressorTrainStage):
292263 def __init__ (
293264 self ,
294265 polytropic_efficiency : float ,
295- compressor_chart : VariableSpeedCompressorChart = None , # Not in use. Not relevant when undefined.
266+ compressor_chart : CompressorChart = None , # Not in use. Not relevant when undefined.
296267 inlet_temperature_kelvin : float = 0.0 ,
297268 remove_liquid_after_cooling : bool = False ,
298269 pressure_drop_ahead_of_stage : float | None = None ,
0 commit comments