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

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

# Цель: проверить баланс энергии однородного теплоизолированного тела.
# Постоянные q_v и c_v дают dT/dt = q_v/c_v; пространственных потоков нет.
# Вход: c_v [Дж/(м³·К)], q_v [Вт/м³], время [с], температура [К].
# Выход: выбранный шаг dt_s и температура T_K в конце нагрева.

# 1. Исходные данные в СИ. В интерфейсе FEMM теплоёмкость вводят в МДж/(м³·К).
cv_si = 2.0e6
qv_w_m3 = 1.0e6
initial_k = 300.0
duration_s = 20.0
heating_rate_k_s = qv_w_m3 / cv_si
analytic_k = initial_k + heating_rate_k_s * duration_s

# 2. Сравниваем три шага явного интегрирования одного и того же баланса.
# Отношение q_v/c_v вычислено до цикла; последний шаг при необходимости
# сокращается, поэтому длительность не отбрасывается округлением int().
for dt in (2.0, 1.0, 0.5):
    T = initial_k
    remaining_s = duration_s
    while remaining_s > 0.0:
        step_s = min(dt, remaining_s)
        T += heating_rate_k_s * step_s
        remaining_s -= step_s

    # При постоянной скорости метод точен с погрешностью округления.
    # Этот опыт проверяет баланс, но не порядок сходимости общего метода.
    assert abs(T - analytic_k) < 1e-9
    print("dt_s", dt, "T_K", T)

# Это аналитическая проверка; hi_analyze здесь не вызывается.
# Для нативного шага нужны открытая тепловая модель и файл previous_anh.
# Порядок аргументов: единицы, тип, точность, глубина, угол, файл, шаг.
# hi_probdef("millimeters", "planar", 1e-8, 100, 30, previous_anh, dt)
