"""Калибровочная пара и поисковая катушка: поле, усреднение, сердечник, R и L.
Запуск внутри FEMM 5 из папки комплекта. Нужен common.py; внешних пакетов нет.
R=50 мм, расстояние=R, по 100 витков и 1 А DC; сечение каждой обмотки 1x1 мм.
Датчик: 100 витков среднего радиуса 4 мм, длина 20 мм, провод 0.1 мм.
Магнитная модель линейна; 1-кГц чувствительность выводится из DC поля,
поэтому вихревые потери и частотная проницаемость сердечника не моделируются.
"""

# Каталог сценария определяется явно: запуск не зависит от чужого 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-helmholtz")
rows = []
for core_mu in [1, 100]:
    newdocument(0)
    mi_probdef(0, "millimeters", "axi", 1e-9, 1, 30)
    material("Air")
    material("Winding", sigma=58, wire_type=3, strands=1, diameter=0.1)
    material("Core", mu=core_mu)
    mi_addcircprop("Cal", 1, 1)
    mi_addcircprop("Sense", 0, 1)
    for z in [-25, 25]:
        mi_drawrectangle(49.5, z - 0.5, 50.5, z + 0.5)
        label(50, z, "Air", 0.2, "Cal", 100, 1)
    mi_drawrectangle(3.95, -10, 4.05, 10)
    label(4, 0, "Winding", 0.1, "Sense", 100, 2)
    mi_drawrectangle(0, -10, 3, 10)
    label(1.5, 0, "Core", 0.5, group=3)
    label(20, 0, "Air", 2)
    mi_makeABC(7, 200, 0, 0, 0)
    solve(folder, "calibration-mu%d" % core_mu)
    b0 = mo_getpointvalues(0, 0)[2]
    linkage = mo_getcircuitproperties("Sense")[2]
    samples = []
    for z in [-10, -5, 0, 5, 10]:
        samples.append([z, mo_getpointvalues(0, z)[2]])
    bavg = linkage / (100 * math.pi * 0.004**2)
    exact = (4 / 5) ** 1.5 * MU0 * 100 / 0.05
    row = {
        "core_mu": core_mu,
        "B0_T": b0,
        "linkage_Wb": linkage,
        "Bavg_T": bavg,
        "axis_z_mm_B_T": samples,
        "thin_loop_B0_T": exact,
        "sensitivity_V_per_T_at_1kHz": 2 * math.pi * 1000 * linkage / exact,
    }
    close_magnetic()
    # Самоиндуктивность датчика при отключённой калибровочной паре.
    opendocument(os.path.join(folder, "calibration-mu%d.fem" % core_mu))
    mi_modifycircprop("Cal", 1, 0)
    mi_modifycircprop("Sense", 1, 1)
    solve(folder, "self-mu%d" % core_mu)
    current, voltage, flux = mo_getcircuitproperties("Sense")
    row["L_H"] = flux / current
    row["R_ohm"] = voltage / current
    rows.append(row)
    close_magnetic()
    save_json(folder, rows)
assert abs(rows[0]["B0_T"] / rows[0]["thin_loop_B0_T"] - 1) < 0.02
assert rows[1]["L_H"] > rows[0]["L_H"] > 0
print(rows)
