FEMM 5

Гармоническое электрическое поле · Плоскопараллельная

Два слоя с потерями: комплексное распределение напряжения

Соедините два диэлектрика с разными ε и tanδ последовательно по направлению поля. Рассчитайте комплексный ток и средние потери без подмены двух материалов усреднённой вещественной проницаемостью.

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

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

Принятые допущения и их назначение
Учебная модель FEMM 5Причина
Каждый слой имеет собственные ε и эквивалентную σПроводимости объединяются последовательно в комплексной форме.
Амплитудная нормировка согласована с мощностьюФактор 1/2 проверяется независимым аналитическим ответом.

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

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

Комплексная проводимость слоя

В каждом слое полный ток складывается из активной составляющей и тока смещения. Удельная комплексная проводимость γ=σ+jωε определяет фазор поля. При одинаковом сечении ток непрерывен, а комплексные сопротивления слоёв складываются.

\gamma_i=\sigma_i+j\omega\varepsilon_0\varepsilon_i,\quad Y=\frac{A}{d_1/\gamma_1+d_2/\gamma_2}
\sigma_i=\omega\varepsilon_0\varepsilon_i\tan\delta_i

Мощность и нормировка

Напряжение 220 В задано как действующее; в решатель вводится амплитуда √2·220 В. Аналитический ток равен Î=ŨY, а средняя активная мощность — Uд²Re(Y). Программа сравнивает эти величины с токами на выводах и объёмным интегралом потерь.

Из-за разных углов потерь напряжения слоёв в общем случае имеют разные фазы. Усреднение ε и tanδ без последовательного комплексного расчёта может дать неверное распределение поля и потерь.

\widehat I=Y\widehat U,\quad P=U_{\mathrm{д}}^2\operatorname{Re}Y=\frac12\operatorname{Re}(\widehat U\widehat I^*)

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

Плоскопараллельная

Величины, единицы и происхождение параметров
ПараметрЗначениеЕдиницаПроисхождение
Толщины слоёв4; 6ммУсловие учебной задачи
Проницаемости2,3; 41Условие учебной задачи
Тангенсы потерь0,0075; 0,021Условие учебной задачи
Высота и глубина10; 10ммУсловие учебной задачи
Частота100кГцУсловие учебной задачи
Действующее напряжение220ВУсловие учебной задачи

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

  1. Изучите размеры, материалы, возбуждение и выбранную двумерную постановку. Сначала вычислите аналитический ориентир в единицах СИ.
  2. Скачайте файлы по отдельным ссылкам в отдельную рабочую папку. Откройте reproduce.py во встроенном редакторе Python FEMM 5 и выполните сохранённый файл.
  3. Программа строит русифицированные модели, сохраняет их, закрывает и открывает заново. Затем выполняет расчёт и читает свойства проводников по точному русскому имени.
  4. Сравните три уровня пространственной сетки. В таблицах сохранены число узлов и элементов, интегральные величины и независимые критерии. Дополнительные режимы указаны в постановке.
  5. Откройте самый подробный сохранённый вход и соответствующее решение. Проверьте смысл единиц, знаков и объёмного множителя; новый запуск сохранит результаты в новой папке calculated-NN.

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

Программа встроенного Python FEMM 5
Python · reproduce.py
"""Гармоническое поле двух диэлектрических слоёв.
Среда: встроенный MicroPython FEMM 5; команды FEMM доступны глобально.
Геометрические размеры: миллиметры; поля и интегралы возвращаются в СИ.
Все материалы и проводники имеют русские имена. Каждая модель сохраняется,
закрывается и повторно открывается до нового расчёта, включая кириллицу.
Запуск создаёт новую папку calculated-NN рядом с программой; опубликованные
модели и предыдущие расчёты не перезаписываются. Все необходимые
исходные данные включены. Условия задачи и ограничения описаны в README.md.
"""
import os
import sys
import math
import json

saved = globals().get('__file__', '') or (sys.argv[0] if sys.argv else '')
base = os.path.dirname(os.path.abspath(saved)) if saved else os.getcwd()
index = 1
while os.path.exists(base + '/calculated-%02d' % index):
    index += 1
directory = base + '/calculated-%02d' % index
os.mkdir(directory)
records = []
checks = []
EPS0 = 8.85418781762e-12


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})


def label(x, y, material, mesh, group=1):
    ei_addblocklabel(x, y)
    ei_selectlabel(x, y)
    ei_setblockprop(material, 0, mesh, group)
    ei_clearselected()


def circle(x, radius, conductor, angle):
    ei_addnode(x - radius, 0)
    ei_addnode(x + radius, 0)
    ei_addarc(x - radius, 0, x + radius, 0, 180, angle)
    ei_addarc(x + radius, 0, x - radius, 0, 180, angle)
    ei_selectarcsegment(x, radius)
    ei_selectarcsegment(x, -radius)
    ei_setarcsegmentprop(angle, '<None>', 0, 0, conductor)
    ei_clearselected()


def solve(model):
    ei_saveas(model)
    ei_close()
    opendocument(model)
    ei_analyze(1)
    ei_loadsolution()
    eo_smooth('off')


def electric_result(mesh, model, input_name, output_name, exact_C):
    voltage_in, charge_in = eo_getconductorproperties(input_name)
    voltage_out, charge_out = eo_getconductorproperties(output_name)
    voltage = real(voltage_in) - real(voltage_out)
    charge = real(charge_in)
    eo_groupselectblock(1)
    energy = real(eo_blockintegral(0))
    eo_clearblock()
    capacitance = charge / voltage
    energy_C = 2 * energy / voltage ** 2
    row = {'mesh_mm': mesh, 'model': os.path.basename(model),
           'nodes': eo_numnodes(), 'elements': eo_numelements(),
           'voltage_V': voltage, 'charge_C': charge, 'energy_J': energy,
           'capacitance_F': capacitance, 'energy_capacitance_F': energy_C,
           'analytic_capacitance_F': exact_C,
           'analytic_C_relative_error': abs(capacitance / exact_C - 1),
           'energy_charge_relative_error': abs(energy_C / capacitance - 1)}
    records.append(row)
    check('Энергия и заряд: ' + os.path.basename(model),
          row['energy_charge_relative_error'], 1e-5)
    return row


def circle_xy(cx, cy, radius, conductor, angle):
    ei_addnode(cx - radius, cy)
    ei_addnode(cx + radius, cy)
    ei_addarc(cx - radius, cy, cx + radius, cy, 180, angle)
    ei_addarc(cx + radius, cy, cx - radius, cy, 180, angle)
    ei_selectarcsegment(cx, cy + radius)
    ei_selectarcsegment(cx, cy - radius)
    ei_setarcsegmentprop(angle, '<None>', 0, 0, conductor)
    ei_clearselected()


def polygon(points, conductor='<None>', mesh=0):
    for x, y in points:
        ei_addnode(x, y)
    for k, (x, y) in enumerate(points):
        x2, y2 = points[(k + 1) % len(points)]
        ei_addsegment(x, y, x2, y2)
        if conductor != '<None>':
            ei_selectsegment((x + x2) / 2, (y + y2) / 2)
            ei_setsegmentprop('<None>', mesh, 0, 0, 0, conductor)
            ei_clearselected()


def terminal(x, y, name, mesh):
    ei_selectsegment(x, y)
    ei_setsegmentprop('<None>', mesh, 0, 0, 0, name)
    ei_clearselected()


def summary(mesh, model, source, ground, exact_C=None):
    v1, q1 = eo_getconductorproperties(source)
    v0, q0 = eo_getconductorproperties(ground)
    v1, v0, q1, q0 = real(v1), real(v0), real(q1), real(q0)
    voltage = v1 - v0
    eo_groupselectblock(1)
    energy = real(eo_blockintegral(0))
    eo_clearblock()
    capacitance = q1 / voltage
    row = {'mesh_mm': mesh, 'model': os.path.basename(model),
           'nodes': eo_numnodes(), 'elements': eo_numelements(),
           'voltage_V': voltage, 'charge_C': q1, 'energy_J': energy,
           'capacitance_F': capacitance,
           'energy_capacitance_F': 2 * energy / voltage ** 2}
    if exact_C is not None:
        row['analytic_capacitance_F'] = exact_C
        row['analytic_C_relative_error'] = abs(capacitance / exact_C - 1)
    records.append(row)
    check('Энергия и терминальный заряд: ' + os.path.basename(model),
          abs(2 * energy / voltage ** 2 / capacitance - 1), 1e-5)
    return row


def field(x, y):
    values = eo_getpointvalues(x, y)
    return math.sqrt(real(values[3]) ** 2 + real(values[4]) ** 2)


def rectangle_field(mesh, filename, epsx=2, epsy=2, voltage=100, width=10, height=10, depth=100):
    newdocument(1)
    ei_probdef('millimeters', 'planar', 1e-10, depth, 30)
    ei_addmaterial('Диэлектрик учебного образца', epsx, epsy, 0)
    ei_addconductorprop('Питающий электрод', voltage, 0, 1)
    ei_addconductorprop('Заземлённый электрод', 0, 0, 1)
    polygon(((0, 0), (width, 0), (width, height), (0, height)))
    terminal(0, height / 2, 'Питающий электрод', mesh)
    terminal(width, height / 2, 'Заземлённый электрод', mesh)
    label(width / 2, height / 2, 'Диэлектрик учебного образца', mesh)
    model = directory + '/' + filename + '.fee'
    solve(model)
    return model


F = 100000
U_RMS = 220
U = U_RMS * math.sqrt(2)
data = ((2.3, 0.0075, 4), (4, 0.02, 6))
gamma = [complex(2 * math.pi * F * EPS0 * eps * loss, 2 * math.pi * F * EPS0 * eps) for eps, loss, d in data]
exact_Y = 0.01 * 0.01 / (0.004 / gamma[0] + 0.006 / gamma[1])
exact_I = U * exact_Y
exact_P = U_RMS ** 2 * exact_Y.real
for level, mesh in enumerate((1, 0.5, 0.25)):
    newdocument(3)
    ci_probdef('millimeters', 'planar', F, 1e-10, 10, 30)
    for k, (eps, loss, d) in enumerate(data):
        sigma = 2 * math.pi * F * EPS0 * eps * loss
        ci_addmaterial('Слой диэлектрика ' + str(k + 1), sigma, sigma, eps, eps, 0, 0)
    ci_addconductorprop('Питающий электрод', U, 0, 1)
    ci_addconductorprop('Заземлённый электрод', 0, 0, 1)
    points = ((0, 0), (4, 0), (10, 0), (10, 10), (4, 10), (0, 10))
    for x, y in points:
        ci_addnode(x, y)
    for k, (x, y) in enumerate(points):
        x2, y2 = points[(k + 1) % len(points)]
        ci_addsegment(x, y, x2, y2)
    ci_addsegment(4, 0, 4, 10)
    for x, name in ((0, 'Питающий электрод'), (10, 'Заземлённый электрод')):
        ci_selectsegment(x, 5)
        ci_setsegmentprop('<None>', mesh, 0, 0, 0, name)
        ci_clearselected()
    for k, x in enumerate((2, 7)):
        ci_addblocklabel(x, 5)
        ci_selectlabel(x, 5)
        ci_setblockprop('Слой диэлектрика ' + str(k + 1), 0, mesh, 1)
        ci_clearselected()
    model = directory + '/ac-layers-%02d.fec' % (level + 1)
    ci_saveas(model)
    ci_close()
    opendocument(model)
    ci_analyze(1)
    ci_loadsolution()
    current = complex(co_getconductorproperties('Питающий электрод')[1])
    return_current = complex(co_getconductorproperties('Заземлённый электрод')[1])
    co_groupselectblock(1)
    power = real(co_blockintegral(0))
    co_clearblock()
    row = {'mesh_mm': mesh, 'model': os.path.basename(model), 'nodes': co_numnodes(),
           'elements': co_numelements(), 'I_real_A': current.real, 'I_imag_A': current.imag,
           'losses_W': power, 'analytic_losses_W': exact_P,
           'terminal_power_W': 0.5 * U * current.real,
           'U_RMS_V': U_RMS, 'U_amplitude_V': U}
    records.append(row)
    check('Последовательные комплексные проводимости слоёв', abs(current - exact_I) / abs(exact_I), 1e-5)
    check('Аналитические активные потери', abs(power / exact_P - 1), 1e-5)
    check('Мощность объёма и электрода', abs(power / (0.5 * U * current.real) - 1), 1e-5)
    check('Баланс комплексных токов', abs(current + return_current) / abs(current), 1e-5)
    co_close()
    ci_close()

columns = {
    'mesh_mm': 'Размер сетки, мм', 'model': 'Файл модели',
    'nodes': 'Узлов', 'elements': 'Элементов',
    'voltage_V': 'Разность потенциалов, В', 'charge_C': 'Заряд, Кл',
    'energy_J': 'Энергия, Дж', 'capacitance_F': 'Ёмкость по заряду, Ф',
    'energy_capacitance_F': 'Ёмкость по энергии, Ф',
    'analytic_capacitance_F': 'Аналитическая ёмкость, Ф',
    'analytic_C_relative_error': 'Относительная ошибка ёмкости',
    'energy_charge_relative_error': 'Невязка энергии и заряда',
    'E_7p5mm_V_m': 'Поле при r=7,5 мм, В/м',
    'analytic_E_7p5mm_V_m': 'Аналитическое поле при r=7,5 мм, В/м',
    'E_150mm_V_m': 'Поле при r=150 мм, В/м',
    'analytic_E_150mm_V_m': 'Аналитическое поле при r=150 мм, В/м',
    'outer_radius_mm': 'Радиус внешней границы, мм',
    'insulation': 'Изоляция', 'analytic_Emax_kV_mm': 'Аналитический максимум поля, кВ/мм',
    'Emax_from_charge_kV_mm': 'Максимум поля по заряду, кВ/мм',
    'E_10mm_kV_mm': 'Поле при r=10 мм, кВ/мм',
    'E_25mm_kV_mm': 'Поле при r=25 мм, кВ/мм',
    'conductivity_S_m': 'Эквивалентная проводимость, См/м',
    'I_real_A': 'Активная компонента амплитуды тока, А',
    'I_imag_A': 'Квадратурная компонента амплитуды тока, А',
    'analytic_I_real_A': 'Аналитическая активная компонента, А',
    'analytic_I_imag_A': 'Аналитическая квадратурная компонента, А',
    'losses_W': 'Диэлектрические потери, Вт',
    'analytic_losses_W': 'Аналитические потери, Вт',
    'terminal_power_W': 'Средняя мощность электрода, Вт',
    'apparent_power_VA': 'Полная мощность, ВА',
    'U_RMS_V': 'Действующее напряжение, В', 'U_amplitude_V': 'Амплитуда напряжения, В'
}
columns.update({'orientation': 'Ориентация главных осей', 'E_center_V_m': 'Поле в центре, В/м', 'E_first_V_m': 'Поле первого слоя, В/м', 'E_second_V_m': 'Поле второго слоя, В/м', 'interface_V': 'Потенциал интерфейса, В', 'floating_voltage_V': 'Потенциал изолированного электрода, В', 'floating_charge_C': 'Заряд изолированного электрода, Кл', 'overlap_mm': 'Перекрытие электродов, мм', 'rounding_radius_mm': 'Радиус скругления, мм', 'E_corner_sample_V_m': 'Поле в 0,2 мм от скругления, В/м', 'screen': 'Исполнение', 'E_inner_sample_V_m': 'Поле в контрольной точке, В/м', 'excited_phase': 'Возбуждённая фаза', 'C_Aj_F': 'Коэффициент строки A, Ф', 'C_Bj_F': 'Коэффициент строки B, Ф', 'C_Cj_F': 'Коэффициент строки C, Ф'})
result = {'runtime': 'FEMM 5.0; встроенный MicroPython', 'records': records,
          'checks': checks, 'columns': columns,
          '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'], 'Не выполнен численный критерий'

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

Re(V̂), В: ac-layers-03.anc
Визуализация сохранённого решения FEMM 5 ac-layers-03.anc. Действительная компонента амплитудного фазора потенциала при фазе 0; это не RMS и не модуль. Показана расчётная область. Контуры деталей взяты из той же модели. Области вне сохранённых треугольников не заполняются. Это научный график сохранённых данных. Нажмите на карту, чтобы открыть её отдельно и увеличить.

Окна FEMM 5

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

Рабочая область модели «Два слоя с потерями: комплексное распределение напряжения». Нативный препроцессор FEMM 5.
Рабочая область модели «Два слоя с потерями: комплексное распределение напряжения». Нативный препроцессор FEMM 5. Открыть в полном размере
Сохранённое решение «Два слоя с потерями: комплексное распределение напряжения». Модуль комплексного потенциала |V|, В; гармонический режим в двух слоях изоляции.
Сохранённое решение «Два слоя с потерями: комплексное распределение напряжения». Модуль комплексного потенциала |V|, В; гармонический режим в двух слоях изоляции. Открыть в полном размере

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

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

Результаты расчётов и производные итоги
УзловЭлементовСредняя мощность электрода, ВтДействующее напряжение, ВРазмер сетки, ммАмплитуда напряжения, ВФайл моделиАктивная компонента амплитуды тока, ААналитические потери, ВтКвадратурная компонента амплитуды тока, АДиэлектрические потери, Вт
46979120110,5 × 10⁻⁶2201311,1ac-layers-01.fec710,1 × 10⁻⁹110,5 × 10⁻⁶53,44 × 10⁻⁶110,5 × 10⁻⁶
46979120110,5 × 10⁻⁶2200,5311,1ac-layers-02.fec710,1 × 10⁻⁹110,5 × 10⁻⁶53,44 × 10⁻⁶110,5 × 10⁻⁶
46979120110,5 × 10⁻⁶2200,25311,1ac-layers-03.fec710,1 × 10⁻⁹110,5 × 10⁻⁶53,44 × 10⁻⁶110,5 × 10⁻⁶
Проверки опубликованного расчёта
КритерийПолученоДопуск или ожидаемое значениеИтог
Последовательные комплексные проводимости слоёв385,9 × 10⁻¹²1e-05Выполнен
Аналитические активные потери58,6 × 10⁻¹²1e-05Выполнен
Мощность объёма и электрода2,201 × 10⁻⁹1e-05Выполнен
Баланс комплексных токов445,1 × 10⁻¹²1e-05Выполнен
Последовательные комплексные проводимости слоёв385,9 × 10⁻¹²1e-05Выполнен
Аналитические активные потери58,6 × 10⁻¹²1e-05Выполнен
Мощность объёма и электрода2,201 × 10⁻⁹1e-05Выполнен
Баланс комплексных токов445,1 × 10⁻¹²1e-05Выполнен
Последовательные комплексные проводимости слоёв385,9 × 10⁻¹²1e-05Выполнен
Аналитические активные потери58,6 × 10⁻¹²1e-05Выполнен
Мощность объёма и электрода2,201 × 10⁻⁹1e-05Выполнен
Баланс комплексных токов445,1 × 10⁻¹²1e-05Выполнен

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

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

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

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

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