# DO NOT EDIT - AUTOMATICALLY GENERATED BY tests/make_test_stubs.py!
from __future__ import annotations
from typing import List
from numpy import float64
from typing import (
    List,
    Optional,
    Tuple,
    Union,
)


def A_cylinder(D: float, L: float) -> float: ...


def A_hollow_cylinder(Di: float, Do: float, L: float) -> float: ...


def A_multiple_hole_cylinder(Do: float, L: float, holes: List[Tuple[float, int]]) -> float: ...


def A_partial_circle(D: float, h: float) -> float: ...


def SA_conical_head(D: float, a: float) -> float: ...


def SA_ellipsoidal_head(D: float, a: float) -> float: ...


def SA_from_h(
    h: float,
    D: float,
    L: float,
    horizontal: bool = ...,
    sideA: Optional[str] = ...,
    sideB: Optional[str] = ...,
    sideA_a: float = ...,
    sideB_a: float = ...,
    sideA_f: Optional[float] = ...,
    sideA_k: Optional[float] = ...,
    sideB_f: Optional[float] = ...,
    sideB_k: Optional[float] = ...
) -> float: ...


def SA_guppy_head(D: float, a: float) -> float: ...


def SA_partial_cylindrical_body(L: float, D: float, h: float) -> float: ...


def SA_partial_horiz_conical_head(D: float, a: float, h: float) -> float: ...


def SA_partial_horiz_ellipsoidal_head(D: float, a: float, h: float) -> float: ...


def SA_partial_horiz_guppy_head(D: float, a: float, h: float) -> float: ...


def SA_partial_horiz_spherical_head(D: float, a: float, h: float) -> float: ...


def SA_partial_horiz_torispherical_head(D: float, f: float, k: float, h: float) -> float: ...


def SA_partial_sphere(D: float, h: float) -> float: ...


def SA_partial_vertical_conical_head(D: float, a: float, h: float) -> float: ...


def SA_partial_vertical_ellipsoidal_head(D: float, a: float, h: float) -> float: ...


def SA_partial_vertical_spherical_head(D: float, a: float, h: float) -> float: ...


def SA_partial_vertical_torispherical_head(D: float, f: float, k: float, h: float) -> float: ...


def SA_tank(
    D: float,
    L: float,
    sideA: Optional[str] = ...,
    sideB: Optional[str] = ...,
    sideA_a: float = ...,
    sideB_a: float = ...,
    sideA_f: Optional[float] = ...,
    sideA_k: Optional[float] = ...,
    sideB_f: Optional[float] = ...,
    sideB_k: Optional[float] = ...
) -> Tuple[float, float, float, float]: ...


def SA_torispheroidal(D: float, f: float, k: float) -> float: ...


def V_cylinder(D: float, L: float) -> float: ...


def V_from_h(
    h: float,
    D: float,
    L: float,
    horizontal: bool = ...,
    sideA: Optional[str] = ...,
    sideB: Optional[str] = ...,
    sideA_a: float = ...,
    sideB_a: float = ...,
    sideA_f: Optional[float] = ...,
    sideA_k: Optional[float] = ...,
    sideB_f: Optional[float] = ...,
    sideB_k: Optional[float] = ...
) -> float: ...


def V_hollow_cylinder(Di: float, Do: float, L: float) -> float: ...


def V_horiz_conical(
    D: float,
    L: float,
    a: float,
    h: float,
    headonly: bool = ...
) -> float: ...


def V_horiz_ellipsoidal(
    D: float,
    L: float,
    a: float,
    h: float,
    headonly: bool = ...
) -> float: ...


def V_horiz_guppy(
    D: float,
    L: float,
    a: float,
    h: float,
    headonly: bool = ...
) -> float: ...


def V_horiz_spherical(
    D: float,
    L: float,
    a: float,
    h: float,
    headonly: bool = ...
) -> float: ...


def V_horiz_torispherical(
    D: float,
    L: float,
    f: float,
    k: float,
    h: float,
    headonly: bool = ...
) -> float: ...


def V_horiz_torispherical_toint_1(x: float, w: float, c10: float, c11: float) -> float: ...


def V_horiz_torispherical_toint_2(x: float, w: float, c10: float, c11: float, g: float, g2: float) -> float: ...


def V_horiz_torispherical_toint_3(x: float, r2: float, g2: float, z_inv: float) -> float: ...


def V_multiple_hole_cylinder(Do: float, L: float, holes: List[Tuple[float, int]]) -> float: ...


def V_partial_sphere(D: float, h: float) -> float: ...


def V_tank(
    D: float,
    L: float,
    horizontal: bool = ...,
    sideA: Optional[str] = ...,
    sideB: Optional[str] = ...,
    sideA_a: float = ...,
    sideB_a: float = ...,
    sideA_f: Optional[float] = ...,
    sideA_k: Optional[float] = ...,
    sideB_f: Optional[float] = ...,
    sideB_k: Optional[float] = ...
) -> Tuple[float, float, float, float]: ...


def V_vertical_conical(D: float, a: float, h: float) -> float: ...


def V_vertical_conical_concave(D: float, a: float, h: float) -> float: ...


def V_vertical_ellipsoidal(D: float, a: float, h: float) -> float: ...


def V_vertical_ellipsoidal_concave(D: float, a: float, h: float) -> float: ...


def V_vertical_spherical(D: float, a: float, h: float) -> float: ...


def V_vertical_spherical_concave(D: float, a: float, h: float) -> float: ...


def V_vertical_torispherical(D: float, f: float, k: float, h: float) -> float: ...


def V_vertical_torispherical_concave(D: float, f: float, k: float, h: float) -> float: ...


def _SA_partial_horiz_ellipsoidal_head_to_int(y: float, c1: float, R2: float, R4: float) -> float: ...


def _SA_partial_horiz_guppy_head_to_int(x: float, a: float, R: float) -> float64: ...


def _SA_partial_horiz_spherical_head_to_int(x: float, R2: float, a4: float, c1: float, c2: float) -> float: ...


def _SA_partial_horiz_torispherical_head_int_1(x: float, b: float, c: float) -> float: ...


def _SA_partial_horiz_torispherical_head_int_2(y: float, t2: float, s: float, c1: float) -> float: ...


def _SA_partial_horiz_torispherical_head_int_3(y: float, x: float, s: float, t2: float) -> float: ...


def _V_horiz_spherical_toint(x: float, r2: float, R2: float, den_inv: float) -> float: ...


def a_torispherical(D: float, f: float, k: float) -> float: ...


def aspect_ratio(Dmin: float, Dmax: float) -> float: ...


def circle_segment_area_inner(h: float, R: float, A_expect: float) -> Tuple[float, float]: ...


def circle_segment_h_from_A(A: float, D: float) -> float: ...


def circularity(A: float, P: float) -> float: ...


def pitch_angle_solver(
    angle: Optional[float] = ...,
    pitch: Optional[float] = ...,
    pitch_parallel: Optional[float] = ...,
    pitch_normal: Optional[float] = ...
) -> Union[Tuple[float, float, float, float], Tuple[int, float, float, float]]: ...


def plate_enlargement_factor(amplitude: float, wavelength: float) -> float: ...


def sphericity(A: float, V: float) -> float: ...


def tank_from_two_specs_err(
    guess: List[float],
    spec0: float,
    spec1: float,
    spec0_name: str,
    spec1_name: str,
    h: float,
    horizontal: bool,
    sideA: None,
    sideB: None,
    sideA_a: None,
    sideB_a: None,
    sideA_f: None,
    sideA_k: None,
    sideB_f: None,
    sideB_k: None,
    sideA_a_ratio: None,
    sideB_a_ratio: None
) -> List[float]: ...


class AirCooledExchanger:
    def __init__(
        self,
        tube_rows: int,
        tube_passes: int,
        tubes_per_row: int,
        tube_length: float,
        tube_diameter: float,
        fin_thickness: float,
        angle: Optional[int] = ...,
        pitch: Optional[float] = ...,
        pitch_parallel: None = ...,
        pitch_normal: None = ...,
        pitch_ratio: None = ...,
        fin_diameter: None = ...,
        fin_height: Optional[float] = ...,
        fin_density: Optional[float] = ...,
        fin_interval: None = ...,
        parallel_bays: int = ...,
        bundles_per_bay: int = ...,
        fans_per_bay: int = ...,
        corbels: bool = ...,
        tube_thickness: Optional[float] = ...,
        fan_diameter: None = ...
    ) -> None: ...


class HelicalCoil:
    def __init__(
        self,
        Dt: float,
        Do: Optional[int] = ...,
        pitch: Optional[float] = ...,
        H: Optional[int] = ...,
        N: Optional[float] = ...,
        H_total: Optional[int] = ...,
        Do_total: Optional[float] = ...,
        Di: Optional[float] = ...
    ) -> None: ...


class PlateExchanger:
    def __init__(
        self,
        amplitude: float,
        wavelength: float,
        chevron_angle: int = ...,
        chevron_angles: Optional[Tuple[int, int]] = ...,
        width: Optional[float] = ...,
        length: Optional[float] = ...,
        thickness: None = ...,
        d_port: Optional[float] = ...,
        plates: Optional[int] = ...
    ) -> None: ...
    @property
    def plate_exchanger_identifier(self) -> str: ...


class RectangularFinExchanger:
    def __init__(
        self,
        fin_height: float,
        fin_thickness: float,
        fin_spacing: float,
        length: Optional[float] = ...,
        width: Optional[float] = ...,
        layers: Optional[int] = ...,
        plate_thickness: Optional[float] = ...,
        flow: str = ...
    ) -> None: ...
    def set_overall_geometry(self) -> None: ...


class RectangularOffsetStripFinExchanger:
    def __init__(
        self,
        fin_length: float,
        fin_height: float,
        fin_thickness: float,
        fin_spacing: float,
        length: None = ...,
        width: None = ...,
        layers: None = ...,
        plate_thickness: None = ...,
        flow: str = ...
    ) -> None: ...


class TANK:
    def A_cross_sectional(self, h: float, method: str = ...) -> float: ...
    def SA_from_h(self, h: float, method: str = ...) -> float: ...
    def V_from_h(self, h: float, method: str = ...) -> float: ...
    def _V_solver_error(
        self,
        Vtarget: int,
        D: float,
        L: float,
        horizontal: bool,
        sideA: Optional[str],
        sideB: Optional[str],
        sideA_a: Optional[float],
        sideB_a: Optional[float],
        sideA_f: Optional[float],
        sideA_k: Optional[float],
        sideB_f: Optional[float],
        sideB_k: Optional[float],
        sideA_a_ratio: Optional[float],
        sideB_a_ratio: Optional[float]
    ) -> float: ...
    def __init__(
        self,
        D: Optional[float] = ...,
        L: Optional[float] = ...,
        horizontal: bool = ...,
        sideA: Optional[str] = ...,
        sideB: Optional[str] = ...,
        sideA_a: Optional[float] = ...,
        sideB_a: Optional[float] = ...,
        sideA_f: Optional[float] = ...,
        sideA_k: Optional[float] = ...,
        sideB_f: Optional[float] = ...,
        sideB_k: Optional[float] = ...,
        sideA_a_ratio: Optional[float] = ...,
        sideB_a_ratio: Optional[float] = ...,
        L_over_D: Optional[float] = ...,
        V: Optional[int] = ...
    ) -> None: ...
    def _solve_tank_for_V(self) -> None: ...
    def add_thickness(
        self,
        thickness: float,
        sideA_thickness: None = ...,
        sideB_thickness: None = ...
    ) -> TANK: ...
    @staticmethod
    def from_two_specs(
        spec0: float,
        spec1: float,
        spec0_name: str = ...,
        spec1_name: str = ...,
        h: Optional[float] = ...,
        horizontal: bool = ...,
        sideA: None = ...,
        sideB: None = ...,
        sideA_a: None = ...,
        sideB_a: None = ...,
        sideA_f: None = ...,
        sideA_k: None = ...,
        sideB_f: None = ...,
        sideB_k: None = ...,
        sideA_a_ratio: None = ...,
        sideB_a_ratio: None = ...
    ) -> TANK: ...
    def h_from_V(self, V: float, method: str = ...) -> float: ...
    def set_misc(self) -> None: ...
    def set_table(self, n: int = ..., dx: None = ...) -> None: ...

__all__: List[str]