"""Контрольный вычислительный фрагмент.

Среда: встроенный MicroPython FEMM 5.
Аналитический учебный пример; полевой решатель не вызывается.
Параметры, единицы величин и порядок вывода пояснены по стадиям.
"""

# Цель: воспроизводимый аналитический расчёт тока однородного проводника.
# Формула I = σSU/L применима при постоянной проводимости, равномерном сечении
# и изолированных боковых сторонах; контакты и нагрев здесь не учитываются.
# Вход: L [м], S [м²], σ [См/м], U [В]; результат функции — ток I [А].
import math


def reference_current(length_m, area_m2, sigma_sm, voltage_v):
    """Вернуть ток в амперах; знак тока совпадает со знаком напряжения."""
    # Отклоняем NaN и бесконечность до арифметики: сравнение NaN <= 0 ложно.
    values = (length_m, area_m2, sigma_sm, voltage_v)
    if not all(math.isfinite(value) for value in values):
        raise ValueError("Исходные величины должны быть конечными числами")
    if length_m <= 0.0 or area_m2 <= 0.0 or sigma_sm <= 0.0:
        raise ValueError("Длина, площадь и проводимость должны быть положительными")

    # Закон Ома: сначала находим проводимость G = σS/L, затем ток I = GU.
    # Нулевое и отрицательное напряжения допустимы и сохраняют свой смысл.
    conductance_s = sigma_sm * (area_m2 / length_m)
    current_a = conductance_s * voltage_v
    if not math.isfinite(current_a):
        raise ValueError("Переполнение при вычислении тока: проверьте масштаб данных")
    return current_a


# 1. Контрольный случай: L = 0,1 м, S = 10⁻⁵ м², σ = 58·10⁶ См/м, U = 0,1 В.
I = reference_current(0.1, 1e-5, 58e6, 0.1)
assert abs(I - 580.0) < 1e-9

# 2. Проверяем отказ на ошибочных данных; исключение не подменяется током 0 А.
try:
    reference_current(0.0, 1e-5, 58e6, 0.1)
    raise AssertionError("Недопустимая нулевая длина была принята")
except ValueError:
    pass  # Ожидаемый отказ означает, что защита входных данных сработала.

print("analytic replay PASS", I)
# Успешная аналитическая проверка не подтверждает нативный запуск FEMM.
