"""Четыре витка: явная медь, MagnetWire и идеальный Litz при равной площади меди.
FEMM5/MicroPython; глубина 100 мм, I_peak=1 А в каждом витке.
Явные провода d=1 мм; MagnetWire: четыре таких витка в окне 2.5x2.5 мм;
Litz: четыре витка по 4 транспонированные жилы d=0.5 мм.
Разница Litz/явный одножильный — физическая замена провода, не ошибка FEMM.
"""

# Каталог сценария определяется явно: запуск не зависит от чужого CWD.
import os
import sys

os.chdir(os.path.dirname(os.path.abspath(sys.argv[0])))
exec(open("common.py").read())
folder = result_folder("results-winding-models")
rows = []
for frequency in [100, 10000]:
    for model in ["Explicit", "MagnetWire", "Litz"]:
        newdocument(0)
        mi_probdef(frequency, "millimeters", "planar", 1e-9, 100, 30)
        material("Air")
        mi_addcircprop("Winding", 1, 1)
        if model == "Explicit":
            material("Cu", sigma=58)
            for x in [-0.75, 0.75]:
                for y in [-0.75, 0.75]:
                    circle(x, y, 0.5)
                    label(x, y, "Cu", 0.04, "Winding", 1, 1)
        else:
            code = 3 if model == "MagnetWire" else 5
            strands = 1 if model == "MagnetWire" else 4
            diameter = 1 if model == "MagnetWire" else 0.5
            material("Cu", sigma=58, wire_type=code, strands=strands, diameter=diameter)
            mi_drawrectangle(-1.25, -1.25, 1.25, 1.25)
            label(0, 0, "Cu", 0.15, "Winding", 4, 1)
        label(3, 0, "Air", 1)
        mi_makeABC(7, 20, 0, 0, 0)
        solve(folder, "%s-%dHz" % (model, frequency))
        current, voltage, linkage = mo_getcircuitproperties("Winding")
        mo_groupselectblock(1)
        p4 = mo_blockintegral(4).real
        p6 = mo_blockintegral(6).real
        pin = (voltage * current.conjugate()).real / 2
        rows.append(
            {
                "model": model,
                "frequency_Hz": frequency,
                "P_ohmic_W": p4,
                "P_total_W": p6,
                "P_terminal_W": pin,
                "Z_ohm": pair(voltage / current),
                "Rdc_ohm": 4 * 0.1 / (58e6 * math.pi * 0.0005**2),
            }
        )
        close_magnetic()
        save_json(folder, rows)
assert all(row["P_total_W"] > 0 for row in rows)
print(rows)
