"""Определения магнитных величин в однородном поле воздуха.

Среда: встроенный MicroPython FEMM 5.
Вход: B в Т, ширина и глубина в м, число витков и угол датчика в градусах.
Выход: JSON с H в А/м, площадью в м², потоком и потокосцеплением в Вб.
Модель: поле нормально к плоской поверхности, все витки сцеплены одинаково;
это аналитический эталон, а не решение FEMM и не результат измерения.
"""

import json
import math

# Учебное приближение магнитной постоянной в СИ, Гн/м.
MU0 = 4 * math.pi * 1e-7
B_T = 0.01
width_m = 0.020
depth_m = 0.010
turns = 100
hall_angle_deg = 5.0

# Для постоянной нормальной индукции интеграл по поверхности равен B*S.
# Потокосцепление N*Phi допустимо при одинаковом потоке во всех витках.
area_m2 = width_m * depth_m
flux_Wb = B_T * area_m2
linkage_Wb = turns * flux_Wb

# Hall наблюдает проекцию на свою ось; H = B/mu0 относится только к воздуху.
record = {
    "origin": "author_analytical_reference_not_FEMM_or_measurement",
    "B_T": B_T,
    "H_air_A_per_m": B_T / MU0,
    "area_m2": area_m2,
    "flux_Wb": flux_Wb,
    "linkage_Wb": linkage_Wb,
    "Hall_5deg_T": B_T * math.cos(math.radians(hall_angle_deg)),
}

# Численный результат сверяем с заранее вычисленным эталоном 2 мкВб.
assert abs(flux_Wb - 2e-6) < 1e-15, "Нарушены площадь или единицы потока"
print(json.dumps(record))
