FEMM 5

Теплопроводность · Плоскопараллельная

Тепловое сопротивление кабеля

Многослойный кабель позволяет проверить тепловую модель значительно строже, чем сравнением одной максимальной температуры. Для каждого пассивного слоя есть независимое аналитическое сопротивление, а через все слои проходит одна и та же мощность жилы. Учебная задача учит различать удельное тепловое сопротивление материала, теплопроводность и сопротивление целого цилиндрического слоя. Эти три величины имеют разные определения и не должны смешиваться в таблицах.

Кабель представлен шестью концентрическими областями с радиусами 28.75, 29.5, 52.5, 53, 57 и 61 мм. Такая последовательность позволяет отдельно исследовать медную жилу, два тонких экрана, основную изоляцию, металлическую оболочку и защитный покров. Площадь жилы равна 2596.72 мм² и согласована с объёмным источником тепла. Никакая номинальная площадь не подставляется вместо площади геометрической модели.

Самостоятельная учебная модель FEMM 5: от физических соотношений к полевому решению и проверке результата.

Допущения и устройство учебной модели

Все размеры, свойства материалов и условия возбуждения заданы ниже. Численные результаты относятся к опубликованной версии модели FEMM 5.

Физическая и математическая постановка

Слои и тепловой поток

В жиле равномерно выделяется 30 Вт на метр. В остальных слоях источники отсутствуют, поэтому радиальный тепловой поток через каждый слой одинаков. Температурный перепад делится на мощность на единицу длины, что даёт сопротивление с единицей К м/Вт. Для изоляции и полупроводящих экранов удельное сопротивление равно 5 К м/Вт, следовательно, теплопроводность равна 0.2 Вт/(м К). Для защитного покрова используется обратная величина 1/3.5.

Для металлической оболочки принята теплопроводность 35 Вт/(м К). Она значительно лучше проводит тепло, чем изоляция, поэтому её доля полного сопротивления мала. При изменении этого параметра сначала оцените ожидаемый эффект по аналитической формуле, затем проверьте его решателем. Так можно отличить слабую физическую чувствительность от программной ошибки.

T_i=\frac{\ln(r_i/r_{i-1})}{2\pi k_i},\qquad \Delta\theta_i=P^{\prime}T_i

Температура, сетка и эталон

На наружной поверхности задана конвекция: воздух 20 °C, коэффициент 5 Вт/(м² К). Абсолютная температура зависит от этого условия; сопротивления внутренних слоёв при постоянных свойствах определяются геометрией и теплопроводностью. Дополнительная аналитическая формула учитывает конвективный перепад и небольшой перепад внутри равномерно нагреваемой медной жилы.

Программа решает три сетки, уменьшает размер элементов и угловой шаг окружностей, измеряет температуры на всех границах и отдельно сравнивает каждый слой с логарифмической формулой. На грубой сетке допускается до 3 процентов для тонкого экрана, на окончательной — не более 0.5 процента. Проверяются температура центра, суммарная выделенная мощность и сопротивление от поверхности жилы до внутренней поверхности оболочки. Точки измерения стоят в вершинах дуг, чтобы не оказаться вне многоугольной сетки.

Исходные данные

Шесть концентрических областей; радиусы 28.75, 29.5, 52.5, 53, 57, 61 мм; глубина 1 м.

Величины, единицы и происхождение параметров
ПараметрЗначениеЕдиницаПроисхождение
Радиусы слоёв28.75; 29.5; 52.5; 53; 57; 61ммЗаданный параметр учебной модели
Потери жилы30Вт/мЗаданный параметр учебной модели
Площадь жилы2597мм²Заданный параметр учебной модели
k меди380Вт/(м К)Заданный параметр учебной модели
k оболочки35Вт/(м К)Заданный параметр учебной модели
Воздух20°CЗаданный параметр учебной модели
Коэффициент конвекции5Вт/(м² К)Заданный параметр учебной модели

Порядок воспроизведения

  1. Создайте отдельную рабочую папку и поместите в неё reproduce.py. Откройте программу во встроенном редакторе Python FEMM 5. Команды ci_, co_, hi_* и ho_* уже доступны в этой среде; внешний пакет pyFEMM здесь не требуется. Запустите файл целиком. Программа сама создаст новую папку calculated-XX, поэтому повторный опыт не уничтожит предыдущую серию.
  2. Проследите три последовательных построения. Перед каждым решением программа записывает самостоятельную модель, закрывает документ и повторно открывает этот файл. Такое действие проверяет сохранение геометрии, свойств и русских имён. Для каждой сетки остаются входная модель, расчётное решение и запись численных показателей. Откройте окончательную модель вручную, чтобы сопоставить контуры, материалы и граничные условия с таблицей параметров.
  3. Откройте result.json из новой папки. records содержит результаты каждой сетки, checks — проверяемую величину, допустимое значение и логический итог. Переходите к обсуждению физики после выполнения всех проверок. Само уменьшение невязки линейного решателя ещё не доказывает достаточность сетки: отдельно сравниваются интегральные характеристики двух последних дискретизаций.
  4. Изменяйте один физический параметр за опыт и сохраняйте отдельную серию. Сравнивайте результаты при одинаковой длине, глубине и температурном соглашении. В отчёте приведите постановку, таблицу трёх сеток, результат независимой проверки и объяснение оставшегося расхождения.

Скачайте нужные файлы по отдельным ссылкам ниже в одну рабочую папку, затем откройте reproduce.py во встроенном Python FEMM 5 и выполните его. Сохраните имена файлов и структуру подпапок. Условия конкретного запуска и путь новых результатов указаны в комментариях программы.

Программа встроенного Python FEMM 5
Python · reproduce.py
"""Тепловое сопротивление слоёв высоковольтного кабеля.
Среда: встроенный MicroPython FEMM 5; команды FEMM доступны как глобальные функции.
Модель создаётся заново, сохраняется, закрывается и повторно открывается до расчёта.
Размеры геометрии заданы в миллиметрах; интегральные результаты имеют единицы СИ.
Каждый запуск создаёт новый calculated-XX рядом с программой и не меняет прежние
модели, результаты и квитанции. Все входные параметры заданы непосредственно в программе.
Область применимости и принятые допущения описаны в README.md.
"""

import os
import sys
import math
import json

script = globals().get("__file__", "") or (sys.argv[0] if sys.argv else "")
base = os.path.dirname(os.path.abspath(script)) if script else os.getcwd()
index = 1
while "calculated-%02d" % index in os.listdir(base):
    index += 1
directory = base + "/calculated-%02d" % index
os.mkdir(directory)
records = []
checks = []


def real(value):
    if isinstance(value, (list, tuple)):
        return real(value[0])
    return complex(value).real


def check(name, value, limit):
    checks.append(
        {
            "name": name,
            "value": value,
            "limit": limit,
            "passed": math.isfinite(value) and value <= limit,
        }
    )


BURIED = False
CENTERS = (0,)
AMBIENT_K = 293.15
H = 5
SOURCES = (30 / (math.pi * 0.02875**2), 0, 0, 0, 0, 0)

RADII_MM = (28.75, 29.5, 52.5, 53, 57, 61)
NAMES = (
    "Медь жилы",
    "Экран жилы",
    "Маслобумажная изоляция",
    "Экран изоляции",
    "Свинцовая оболочка",
    "Защитный покров",
)
CONDUCTIVITIES = (380, 0.2, 0.2, 0.2, 35, 1 / 3.5)
# Теплопроводность оболочки принята равной 35 Вт/(м К).


def circle(x, radius, angle, boundary=""):
    hi_addnode(x - radius, 0)
    hi_addnode(x + radius, 0)
    hi_addarc(x - radius, 0, x + radius, 0, 180, angle)
    hi_addarc(x + radius, 0, x - radius, 0, 180, angle)
    hi_selectarcsegment(x, radius)
    hi_selectarcsegment(x, -radius)
    hi_setarcsegmentprop(angle, boundary or "<None>", 0, 0, "<None>")
    hi_clearselected()


for level, mesh in enumerate((3, 1.5, 0.75)):
    newdocument(2)
    hi_probdef("millimeters", "planar", 1e-10, 1000, 30)
    for number, name in enumerate(NAMES):
        k = CONDUCTIVITIES[number]
        hi_addmaterial(name, k, k, SOURCES[number], 0)
    hi_addboundprop("Конвекция в воздух", 2, 0, 0, AMBIENT_K, H, 0)
    angle = 4 / (2**level)
    for cable, x in enumerate(CENTERS):
        previous = 0
        for number, radius in enumerate(RADII_MM):
            boundary = "Конвекция в воздух" if not BURIED and number == 5 else ""
            circle(x, radius, angle, boundary)
            label_x = x + (previous + radius) / 2
            hi_addblocklabel(label_x, 0)
            hi_selectlabel(label_x, 0)
            hi_setblockprop(NAMES[number], 0, mesh, cable * 10 + number + 1)
            hi_clearselected()
            previous = radius

    model = directory + "/model-%02d.feh" % (level + 1)
    hi_saveas(model)
    hi_close()
    opendocument(model)
    hi_analyze(1)
    hi_loadsolution()
    ho_smooth("off")
    temperatures = [real(ho_getpointvalues(x, 0)[0]) for x in CENTERS]
    # Интеграл q_v dV использует фактическую площадь многоугольной сетки.
    generated = 0
    for cable, x in enumerate(CENTERS):
        for number, source in enumerate(SOURCES):
            if source:
                ho_groupselectblock(cable * 10 + number + 1)
                generated += source * real(ho_blockintegral(2))
                ho_clearblock()
    row = {
        "mesh_mm": mesh,
        "model": "model-%02d.feh" % (level + 1),
        "nodes": ho_numnodes(),
        "elements": ho_numelements(),
        "T_center_K": temperatures,
        "generated_W": generated,
    }
    interface = [real(ho_getpointvalues(r, 0)[0]) for r in RADII_MM]
    drops = [(temperatures[0] - interface[0]) / 30]
    drops += [(interface[i - 1] - interface[i]) / 30 for i in range(1, 6)]
    row["R_layers_K_m_W"] = drops
    row["T_interfaces_K"] = interface
    row["R_core_sheath_K_m_W"] = sum(drops[1:4])
    reference = []
    for i in range(1, 6):
        reference.append(
            math.log(RADII_MM[i] / RADII_MM[i - 1]) / (2 * math.pi * CONDUCTIVITIES[i])
        )
    row["R_layers_analytic_K_m_W"] = reference
    row["max_layer_relative_error"] = max(
        abs(drops[i + 1] / reference[i] - 1) for i in range(5)
    )
    check(
        "Радиальные сопротивления, сетка %d" % (level + 1),
        row["max_layer_relative_error"],
        0.03,
    )
    records.append(row)
    ho_close()
    hi_close()
check(
    "Сходимость температуры жилы, К",
    abs(records[-1]["T_center_K"][0] - records[-2]["T_center_K"][0]),
    0.25,
)
reference = 293.15 + 30 / (2 * math.pi * 0.061 * H)
reference += 30 / (4 * math.pi * 380)
reference += 30 * sum(records[-1]["R_layers_analytic_K_m_W"])
check(
    "Аналитическая температура центра, К",
    abs(records[-1]["T_center_K"][0] - reference),
    0.1,
)
check(
    "Сопротивления слоёв на окончательной сетке",
    records[-1]["max_layer_relative_error"],
    0.005,
)
check(
    "Мощность источника на окончательной сетке, Вт",
    abs(records[-1]["generated_W"] - 30),
    0.01,
)
check(
    "Сопротивление жила-оболочка против 0.488 К м/Вт",
    abs(records[-1]["R_core_sheath_K_m_W"] / 0.488 - 1),
    0.01,
)

result = {
    "runtime": "FEMM 5.0; embedded MicroPython",
    "records": records,
    "checks": checks,
    "passed": all(item["passed"] for item in checks),
}
with open(directory + "/result.json", "w") as output:
    json.dump(result, output)
print(json.dumps(result))
assert result["passed"]

Картина рассчитанного поля

Температура, К: model-03.anh
Визуализация сохранённого решения FEMM 5 model-03.anh. Абсолютная температура по сохранённым узловым значениям. Показана расчётная область. Контуры деталей взяты из той же модели. Области вне сохранённых треугольников не заполняются. Это научный график сохранённых данных. Нажмите на карту, чтобы открыть её отдельно и увеличить.

Окна FEMM 5

Снимки интерфейса FEMM показывают геометрию, настройки и работу с результатами в FEMM 5. Откройте изображение, чтобы рассмотреть подписи и значения в полном размере.

Поперечная геометрия многослойного кабеля в модуле теплопроводности FEMM 5. Текстовые подписи скрыты в отображении, чтобы различались тонкие слои; зелёные точки — метки областей.
Поперечная геометрия многослойного кабеля в модуле теплопроводности FEMM 5. Текстовые подписи скрыты в отображении, чтобы различались тонкие слои; зелёные точки — метки областей. Открыть в полном размере
Сохранённое решение «Тепловое сопротивление кабеля». Температура T, К, и изотермы многослойного кабеля; стационарная теплопроводность.
Сохранённое решение «Тепловое сопротивление кабеля». Температура T, К, и изотермы многослойного кабеля; стационарная теплопроводность. Открыть в полном размере

Результаты и численные проверки

Сохранено решений FEMM: 3. Выполнено проверок: 8. Полная точность чисел и условия сравнения доступны в таблицах результатов JSON.

Результаты расчётов и производные итоги
Тепловое сопротивление жила–оболочка, К·м/ВтМасштаб сетки, ммНаибольшая относительная ошибка слояЭлементовТемпература в центре, КТепловое сопротивление слоёв, К·м/ВтМодельТемпературы межслойных границ, КАналитическое тепловое сопротивление, К·м/ВтТепловыделение, ВтУзлов
0,4860964830,027590992112881 значений; полные данные JSON6 значений; полные данные JSONmodel-01.feh6 значений; полные данные JSON5 значений; полные данные JSON29,9756375736
0,486496951,50,0081542167163771 значений; полные данные JSON6 значений; полные данные JSONmodel-02.feh6 значений; полные данные JSON5 значений; полные данные JSON29,9939088331
0,486676140,750,002351791505021 значений; полные данные JSON6 значений; полные данные JSONmodel-03.feh6 значений; полные данные JSON5 значений; полные данные JSON29,99847725505
Проверки опубликованного расчёта
КритерийПолученоДопуск или ожидаемое значениеИтог
Радиальные сопротивления, сетка 10,027590,03Выполнен
Радиальные сопротивления, сетка 20,0081540,03Выполнен
Радиальные сопротивления, сетка 30,0023520,03Выполнен
Сходимость температуры жилы, К0,0074680,25Выполнен
Аналитическая температура центра, К0,0025780,1Выполнен
Сопротивления слоёв на окончательной сетке0,0023520,005Выполнен
Мощность источника на окончательной сетке, Вт0,0015230,01Выполнен
Сопротивление жила-оболочка против 0.488 К м/Вт0,0027130,01Выполнен

Допуски относятся к указанной учебной задаче и способу сравнения. Число показанных цифр не означает такой же физической точности.

Модели, решения и программа

Для нового расчёта сохраните программу, модели и необходимые данные в одну рабочую папку, сохраняя структуру подпапок.

Полные численные результаты

Границы применимости