Source code for gearbox.standards.agma2101.bending
"""Tooth bending strength of cylindrical gears according to AGMA 2001-D04."""
from __future__ import annotations
from dataclasses import dataclass
from math import cos, radians
from gearbox.standards.agma2101._factors import (
dynamic_factor,
load_distribution_factor,
rim_thickness_factor,
size_factor,
)
from gearbox.standards.agma2101._geometry import geometry_factors, require_supported_gears
from gearbox.standards.agma2101._strength import bending_stress_cycle_factor
from gearbox.transmission import Transmission
[docs]
@dataclass(frozen=True)
class BendingResult:
"""Result of an AGMA 2001-D04 bending stress calculation. Stresses in MPa."""
bending_stress_pinion: float
"""``sigma_F1``: tooth bending stress of the pinion."""
bending_stress_wheel: float
"""``sigma_F2``: tooth bending stress of the wheel."""
tangential_load: float
"""``W_t`` [N]."""
application_factor: float
"""``K_A`` (``K_o``)."""
dynamic_factor: float
"""``K_v``."""
bending_geometry_factor_pinion: float
"""``J`` of the pinion (AGMA 908-B89)."""
bending_geometry_factor_wheel: float
"""``J`` of the wheel (AGMA 908-B89)."""
size_factor: float
"""``K_s``."""
load_distribution_factor: float
"""``K_m`` (``K_H``)."""
rim_thickness_factor_pinion: float
"""``K_B`` of the pinion."""
rim_thickness_factor_wheel: float
"""``K_B`` of the wheel."""
stress_cycle_factor_pinion: float | None = None
"""``Y_N`` of the pinion (only with ``Material.allowable_bending_stress_number``)."""
stress_cycle_factor_wheel: float | None = None
"""``Y_N`` of the wheel."""
permissible_bending_stress_pinion: float | None = None
"""``s_at Y_N / (K_T K_R)`` of the pinion [MPa]."""
permissible_bending_stress_wheel: float | None = None
"""Same for the wheel [MPa]."""
safety_factor_pinion: float | None = None
"""``S_F`` of the pinion: permissible over actual bending stress."""
safety_factor_wheel: float | None = None
"""``S_F`` of the wheel."""
[docs]
def calculate_bending(transmission: Transmission) -> BendingResult:
"""Compute the AGMA 2001-D04 tooth bending stress of both gears.
Args:
transmission: The gear pair and its operating conditions.
Returns:
A :class:`BendingResult` with the stresses and every factor.
Raises:
ValueError: For double helical gears and internal gears (AGMA 908-B89 has no ``J``).
"""
require_supported_gears(transmission, bending=True)
pinion = transmission.pinion
tangential_load = transmission.nominal_tangential_force
application_factor = transmission.application_factor
width = transmission.net_face_width
transverse_module = pinion.module / cos(radians(pinion.helix_angle))
dynamic = dynamic_factor(transmission)
size = size_factor(transmission)
geometry = geometry_factors(transmission).bending
load_distribution = load_distribution_factor(transmission)
rim_pinion = rim_thickness_factor(pinion)
rim_wheel = rim_thickness_factor(transmission.wheel)
common = (
tangential_load * application_factor * dynamic * size * (1.0 / (width * transverse_module))
)
stress_pinion = common * (load_distribution * rim_pinion / geometry[0])
stress_wheel = common * (load_distribution * rim_wheel / geometry[1])
return BendingResult(
**_bending_strength(transmission, stress_pinion, stress_wheel),
bending_stress_pinion=stress_pinion,
bending_stress_wheel=stress_wheel,
tangential_load=tangential_load,
application_factor=application_factor,
dynamic_factor=dynamic,
bending_geometry_factor_pinion=geometry[0],
bending_geometry_factor_wheel=geometry[1],
size_factor=size,
load_distribution_factor=load_distribution,
rim_thickness_factor_pinion=rim_pinion,
rim_thickness_factor_wheel=rim_wheel,
)
def _bending_strength(
transmission: Transmission, stress_pinion: float, stress_wheel: float
) -> dict[str, float | None]:
"""Allowable stress and safety factors, AGMA 2001-D04 clauses 11, 17 to 19."""
p, w = transmission.pinion, transmission.wheel
s_at = (p.material.allowable_bending_stress_number, w.material.allowable_bending_stress_number)
if None in s_at:
return {}
cycles = (
60 * transmission.design_life_hours * transmission.pinion_speed_rpm,
60 * transmission.design_life_hours * transmission.wheel_speed_rpm,
)
y_n = (bending_stress_cycle_factor(p, cycles[0]), bending_stress_cycle_factor(w, cycles[1]))
k = transmission.temperature_factor * transmission.reliability_factor
permissible = (s_at[0] * y_n[0] / k, s_at[1] * y_n[1] / k)
return {
"stress_cycle_factor_pinion": y_n[0],
"stress_cycle_factor_wheel": y_n[1],
"permissible_bending_stress_pinion": permissible[0],
"permissible_bending_stress_wheel": permissible[1],
"safety_factor_pinion": permissible[0] / stress_pinion,
"safety_factor_wheel": permissible[1] / stress_wheel,
}