There is a code in which the calculation of the centrifugal nozzle of the liquid propellant is carried out, each formula represents a separate function. The code has the main class Injector, in which all the basic calculations are performed, as well as two other CentrifugalInjector and ScrewInjector, in these two classes calculations are recorded that the user needs to select before starting calculations, depending on which class the calculations are used will be adjusted.
But after running the code, we get the following:
Traceback (most recent call last):
File "G:\LARIS\tests\test_centrifugal_injector.py", line 50, in <module>
test()
File "G:\LARIS\tests\test_centrifugal_injector.py", line 34, in test
print(injector.equivalent_geometric_characteristic_injector)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "G:\LARIS\src\centrifugal_injector_calc.py", line 95, in equivalent_geometric_characteristic_injector
return geometric_characteristics / (1 + self.coefficient_friction / 2 * self.radius_tangential_inlet *
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: unsupported operand type(s) for /: 'property' and 'complex'`
Program code:
import math
from dataclasses import dataclass
from enum import Enum
class AngularValues(Enum):
RIGHT_ANGLE = 90
class ConstructiveTypes(Enum):
CENTRIFUGAL_INJECTOR = "CENTRIFUGAL"
SCREW_INJECTOR = "SCREW"
@dataclass(frozen=True, slots=True)
class Injector:
outer_diameter_injector: float
side_wall_thickness_injector: float
number_input_tangential_holes: float
diameter_input_tangential_holes: float
length_input_tangential_holes: float
relative_length_twisting_chamber: float
diameter_injector_nozzle: float
relative_length_injector_nozzle: float
angle_nozzle_axis: float
mass_flow_rate: float
viscosity: float
injector_type: str
@property
def diameter_twisting_chamber_injector(self) -> float:
"""Возвращает диаметр камеры закручивания центробежной форсунки"""
return self.outer_diameter_injector - 2 * self.side_wall_thickness_injector
@property
def relative_length_tangential_hole(self) -> float:
"""Возвращает отношение длины входного тангенциального к его диаметру"""
return self.length_input_tangential_holes / self.diameter_input_tangential_holes
@property
def length_twisting_chamber(self) -> float:
"""Возвращает длину камеры закручивания центробежной форсунки"""
return self.relative_length_twisting_chamber * self.diameter_twisting_chamber_injector
@property
def radius_twisting_chamber_injector(self) -> float:
"""Возвращает радиус камеры закручивания центробежной форсунки"""
return self.diameter_twisting_chamber_injector / 2
@property
def radius_input_tangential_holes(self) -> float:
"""Возвращает радиус входных тангенциальных отверстий"""
return self.diameter_input_tangential_holes / 2
@property
def radius_tangential_inlet(self) -> float:
"""Возвращает величину радиуса, на котором расположена ось входного тангенциального отверстия от оси форсунки"""
return self.radius_twisting_chamber_injector - self.radius_input_tangential_holes
@property
def length_injector_nozzle(self) -> float:
"""Возвращает длину сопла форсунки"""
return self.relative_length_injector_nozzle * self.diameter_injector_nozzle
@property
def radius_injector_nozzle(self) -> float:
"""Возвращает радиус сопла форсунки"""
return self.diameter_injector_nozzle / 2
@property
def reynolds_number(self) -> float:
"""Возвращает число Рейнольдса"""
return (4 * self.mass_flow_rate) / (math.pi * self.viscosity * self.diameter_input_tangential_holes
* math.sqrt(self.number_input_tangential_holes))
@property
def coefficient_friction(self) -> float:
"""Возвращает коэффициент трения"""
return 10 ** ((25.8 / (math.log(self.reynolds_number, 10))**2.58) - 2)
@property
def equivalent_geometric_characteristic_injector(self) -> float:
"""Возвращает эквивалентную геометрическую характеристику"""
if self.injector_type == ConstructiveTypes.SCREW_INJECTOR.value:
geometric_characteristics = ScrewInjector.geometric_characteristics
elif self.injector_type == ConstructiveTypes.CENTRIFUGAL_INJECTOR.value:
geometric_characteristics = CentrifugalInjector.geometric_characteristics
return geometric_characteristics / (1 + self.coefficient_friction / 2 * self.radius_tangential_inlet *
(self.radius_tangential_inlet + self.diameter_input_tangential_holes -
self.radius_injector_nozzle))
class ScrewInjector(Injector):
cross_sectional_area_one_passage_channel: float
@property
def geometric_characteristics(self) -> float:
"""Возвращает геометрическую характеристику шнековой форсунки"""
return (math.pi * self.radius_tangential_inlet * self.radius_injector_nozzle) / \
(self.number_input_tangential_holes * self.cross_sectional_area_one_passage_channel)
class CentrifugalInjector(Injector):
@property
def geometric_characteristics(self) -> float:
"""Возвращает геометрическую характеристику центробежной форсунки"""
if self.angle_nozzle_axis == AngularValues.RIGHT_ANGLE.value:
return (self.radius_tangential_inlet * self.radius_injector_nozzle) / \
(self.number_input_tangential_holes * self.radius_input_tangential_holes**2)
else:
return (self.radius_tangential_inlet * self.radius_injector_nozzle) / \
(self.number_input_tangential_holes * self.radius_input_tangential_holes**2) * self.angle_nozzle_axis
Verification file code:
from src.centrifugal_injector_calc import Injector, CentrifugalInjector, ScrewInjector
def test() -> None:
common = {
"outer_diameter_injector": 15,
"side_wall_thickness_injector": 1,
"number_input_tangential_holes": 10,
"diameter_input_tangential_holes": 10,
"length_input_tangential_holes": 10,
"relative_length_twisting_chamber": 10,
"diameter_injector_nozzle": 10,
"relative_length_injector_nozzle": 10,
"angle_nozzle_axis": 10,
"mass_flow_rate": 10,
"viscosity": 1,
"injector_type": "CENTRIFUGAL"
}
injector = Injector(
**common
)
print(injector.diameter_twisting_chamber_injector)
print(injector.relative_length_tangential_hole)
print(injector.length_twisting_chamber)
print(injector.radius_twisting_chamber_injector)
print(injector.radius_input_tangential_holes)
print(injector.radius_tangential_inlet)
print(injector.length_injector_nozzle)
print(injector.radius_injector_nozzle)
print(injector.reynolds_number)
print(injector.coefficient_friction)
print(injector.equivalent_geometric_characteristic_injector)
centrifugal = CentrifugalInjector(
**common
)
print(centrifugal.geometric_characteristics)
screw = ScrewInjector(
**common, cross_sectional_area_one_passage_channel=5.0
)
print(screw.geometric_characteristics)
if __name__ == "__main__":
test()