Source code for gearbox.standards.agma2101.pitting
"""Surface durability (pitting) of cylindrical gears according to AGMA 2001-D04."""
from __future__ import annotations
from dataclasses import dataclass
from math import sqrt
from gearbox.standards._hertz import elasticity_coefficient
from gearbox.standards.agma2101._factors import (
dynamic_factor,
load_distribution_factor,
size_factor,
)
from gearbox.standards.agma2101._geometry import geometry_factors, require_supported_gears
from gearbox.standards.agma2101._strength import (
hardness_ratio_factors,
pitting_stress_cycle_factor,
)
from gearbox.transmission import Transmission
[docs]
@dataclass(frozen=True)
class PittingResult:
"""Result of an AGMA 2001-D04 contact stress calculation. Stress in MPa."""
contact_stress: float
"""``sigma_H``: contact stress."""
elastic_coefficient: float
"""``C_p`` [sqrt(MPa)]."""
tangential_load: float
"""``W_t`` [N]."""
application_factor: float
"""``K_A`` (``K_o``)."""
dynamic_factor: float
"""``K_v``."""
size_factor: float
"""``K_s``."""
load_distribution_factor: float
"""``K_m`` (``K_H``)."""
surface_condition_factor: float
"""``C_f``."""
pitting_geometry_factor: float
"""``I``, pitting resistance geometry factor (AGMA 908-B89)."""
stress_cycle_factor_pinion: float | None = None
"""``Z_N`` of the pinion (only with ``Material.allowable_contact_stress_number``)."""
stress_cycle_factor_wheel: float | None = None
"""``Z_N`` of the wheel."""
hardness_ratio_factor_wheel: float | None = None
"""``C_H`` of the wheel (the pinion's is 1)."""
permissible_contact_stress_pinion: float | None = None
"""``s_ac Z_N C_H / (K_T K_R)`` of the pinion [MPa]."""
permissible_contact_stress_wheel: float | None = None
"""Same for the wheel [MPa]."""
safety_factor_pinion: float | None = None
"""``S_H`` of the pinion: permissible over actual contact stress."""
safety_factor_wheel: float | None = None
"""``S_H`` of the wheel."""
[docs]
def calculate_pitting(transmission: Transmission) -> PittingResult:
"""Compute the AGMA 2001-D04 contact stress.
Args:
transmission: The gear pair and its operating conditions.
Returns:
A :class:`PittingResult` with the stress and every factor.
Raises:
ValueError: For double helical gears.
"""
require_supported_gears(transmission, bending=False)
diameter = transmission.pinion.reference_diameter
width = transmission.net_face_width
elastic_coefficient = elasticity_coefficient(
transmission.pinion.material, transmission.wheel.material
)
tangential_load = transmission.nominal_tangential_force
application_factor = transmission.application_factor
size = size_factor(transmission)
load_distribution = load_distribution_factor(transmission)
surface_condition_factor = 1
dynamic = dynamic_factor(transmission)
geometry = geometry_factors(transmission).pitting
contact_stress = elastic_coefficient * sqrt(
tangential_load
* application_factor
* dynamic
* size
* (load_distribution / (diameter * width))
* surface_condition_factor
/ geometry
)
strength = _pitting_strength(transmission, contact_stress)
return PittingResult(
**strength,
contact_stress=contact_stress,
elastic_coefficient=elastic_coefficient,
tangential_load=tangential_load,
application_factor=application_factor,
dynamic_factor=dynamic,
size_factor=size,
load_distribution_factor=load_distribution,
surface_condition_factor=surface_condition_factor,
pitting_geometry_factor=geometry,
)
def _pitting_strength(transmission: Transmission, contact_stress: float) -> dict[str, float | None]:
"""Allowable stress and safety factors, AGMA 2001-D04 clauses 11 and 14 to 19."""
p, w = transmission.pinion, transmission.wheel
s_ac = (p.material.allowable_contact_stress_number, w.material.allowable_contact_stress_number)
if None in s_ac:
return {}
cycles = (
60 * transmission.design_life_hours * transmission.pinion_speed_rpm,
60 * transmission.design_life_hours * transmission.wheel_speed_rpm,
)
z_n = (pitting_stress_cycle_factor(p, cycles[0]), pitting_stress_cycle_factor(w, cycles[1]))
c_h = hardness_ratio_factors(transmission)
k = transmission.temperature_factor * transmission.reliability_factor
permissible = tuple(s * z * c / k for s, z, c in zip(s_ac, z_n, c_h, strict=True))
return {
"stress_cycle_factor_pinion": z_n[0],
"stress_cycle_factor_wheel": z_n[1],
"hardness_ratio_factor_wheel": c_h[1],
"permissible_contact_stress_pinion": permissible[0],
"permissible_contact_stress_wheel": permissible[1],
"safety_factor_pinion": permissible[0] / contact_stress,
"safety_factor_wheel": permissible[1] / contact_stress,
}