TypeError: unsupported operand type(s) for /: 'property' and 'complex'

49 views Asked by At

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()
0

There are 0 answers