# mast.py - de lichtste stalen buis voor de mast van de windturbine
import math

L, E, rho, fy = 12.0, 210e9, 7850.0, 235e6          # mast (m), staal S235 (Pa, kg/m3, Pa)
F_kop, q_p, c_f = 1500.0, 1000.0, 0.7               # kracht op de mastkop (N), piekstuwdruk (Pa), vormfactor buis
m_top, gamma = 150.0, 1.5                            # gondel + rotor (kg), belastingsfactor (wind)
f_1P_min = 80 / 60                                   # 1P bij het laagste toerental in bedrijf (Hz)
buizen = [(D, t) for D in (193.7, 219.1, 244.5, 273.0) for t in (4.0, 5.0, 6.3, 8.0)]   # mm


def controle(D_mm, t_mm):
    D, t = D_mm / 1000, t_mm / 1000
    I = math.pi / 64 * (D**4 - (D - 2 * t)**4)
    A = math.pi / 4 * (D**2 - (D - 2 * t)**2)
    M = F_kop * L + q_p * c_f * D * L**2 / 2        # buigmoment aan de voet (N m)
    sigma = gamma * M / (I / (D / 2))               # rekenwaarde van de buigspanning (Pa)
    massa = rho * A * L
    f1 = math.sqrt(3 * E * I / L**3 / (m_top + 33 / 140 * massa)) / (2 * math.pi)
    eisen = {"sterkte": sigma <= fy, "plooien": D / t <= 50, "trilling": f1 <= f_1P_min / 1.1}
    return massa, sigma, f1, [naam for naam, ok in eisen.items() if not ok]


goed = []
for D, t in buizen:
    massa, sigma, f1, fout = controle(D, t)
    if not fout:
        goed.append((massa, D, t))
    oordeel = "in orde" if not fout else "faalt: " + ", ".join(fout)
    print(f"{D:5.1f} x {t:3.1f} mm: {massa:4.0f} kg, sigma {sigma / 1e6:4.0f} MPa, f1 {f1:4.2f} Hz  {oordeel}")
massa, D, t = min(goed)
print(f"lichtste buis die aan alle eisen voldoet: {D} x {t} mm ({massa:.0f} kg)")
