# omvormer.py - de netomvormer van het station bij de ontwerpbelasting en bij het aanslaan van de pomp
import cmath
import math

U, F = 230.0, 50.0                    # V effectief (referentie), Hz
ETA = 0.93                            # rendement van de omvormer (rekenwaarde)
lasten = {"noodverwarming": (2000, 1.00), "drukpomp": (750, 0.81), "koelkast": (150, 0.70), "rest": (300, 0.95)}


def stroom(P, cos_phi):
    """Stroom als fasor (A), naijlend (inductief)."""
    return cmath.rect(P / (U * cos_phi), -math.acos(cos_phi))


def verslag(naam, I):
    S = U * I.conjugate()             # complex vermogen P + jQ
    print(f"{naam}: I = {abs(I):5.2f} A, P = {S.real:5.0f} W, Q = {S.imag:5.0f} var, "
          f"S = {abs(S):5.0f} VA, cos phi = {S.real / abs(S):.3f}")
    print("    aan de batterij: " + ", ".join(f"{S.real / ETA / u:5.1f} A bij {u} V" for u in (44, 48, 56)))
    return S


I_n = sum(stroom(P, c) for P, c in lasten.values())
S_n = verslag("ontwerpbelasting", I_n)
print(f"    p(t) schommelt met 100 Hz tussen {S_n.real - abs(S_n):.0f} en {S_n.real + abs(S_n):.0f} W")
C_bus = abs(S_n) / (2 * math.pi * F * 400 * 20)
print(f"    buffer op een tussenkring van 400 V met 20 V rimpel: {1000 * C_bus:.2f} mF")

I_pomp = stroom(*lasten["drukpomp"])  # aanloop: zes keer de stroom, cos phi = 0,5 (rekenwaarde)
verslag("pomp slaat aan", I_n - I_pomp + cmath.rect(6 * abs(I_pomp), -math.acos(0.5)))

C = S_n.imag / (U ** 2 * 2 * math.pi * F)   # alles compenseren naar cos phi = 1
print(f"compensatie van alles: C = {1e6 * C:.1f} uF")
verslag("gecompenseerd", I_n + 1j * U * 2 * math.pi * F * C)
