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

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

# Цель: получить таблицу аналитического температурного профиля пластины.
# Постоянны теплопроводность k и объёмный источник q_v; на x = ±a задано T_b.
# Вход задан в СИ. Выход — CSV: x_m [м], T_K [К], включая обе границы и центр.
# Таблица служит эталоном для графика; расчёт FEMM здесь не выполняется.

# 1. Исходные данные и равномерная сетка: 20 интервалов дают 21 точку.
half_thickness_m = 0.01
thermal_conductivity_w_m_k = 10.0
source_w_m3 = 1e6
boundary_k = 300.0
interval_count = 20
spacing_m = 2.0 * half_thickness_m / interval_count
temperature_factor_k_m2 = source_w_m3 / (2.0 * thermal_conductivity_w_m_k)

# 2. Вычисляем T(x) = T_b + q_v(a² - x²)/(2k) за один проход по точкам.
# Сохраняем небольшую таблицу, чтобы проверить её до вывода в CSV.
rows = []
for point_index in range(interval_count + 1):
    x = -half_thickness_m + spacing_m * point_index
    T = boundary_k + temperature_factor_k_m2 * (half_thickness_m**2 - x * x)
    rows.append((x, T))

# 3. Сверяем максимум и два граничных условия с аналитическими значениями.
assert abs(rows[interval_count // 2][1] - 305.0) < 1e-10
assert abs(rows[0][1] - boundary_k) < 1e-10
assert abs(rows[-1][1] - boundary_k) < 1e-10

# Одинаковый разделитель заголовка и данных позволяет читать результат как CSV.
# Шесть знаков после точки достаточны для этой сетки; это точность вывода.
print("x_m,T_K")
for x, T in rows:
    print("{:.6f},{:.6f}".format(x, T))
