FEMM 5

Электростатика · Осесимметричная

Проходной изолятор: поле плавающего конического экрана

Добавьте электрически изолированный конический экран в осесимметричный изолятор. Определите его неизвестный потенциал и проследите, как экран изменяет ёмкость и распределение поля.

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

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

Принятые допущения и их назначение
Учебная модель FEMM 5Причина
Два исполнения: без экрана и с тонким конусомЕсть аналитический исходный эталон и отдельная сложная геометрия.
Нулевой суммарный заряд экранаПотенциал определяется полем, а не назначается вручную.

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

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

Осесимметричный изолятор и внутренний экран

Базовая модель представляет участок коаксиальной изоляции длиной 40 мм. Без экрана она имеет точную цилиндрическую ёмкость. Вторая модель содержит тонкий конический металлический экран: его меридиональная линия идёт от (r,z)=(10,8) до (14,32) мм.

Экран изолирован и нейтрален, поэтому задаётся qf=0, а общий потенциал Vf ищет решатель. Наклонная линия не совпадает с исходной цилиндрической эквипотенциалью; экран действительно меняет поле.

q_f=0,\quad V_f=\mathrm{const},\quad C_0=\frac{2\pi\varepsilon_0\varepsilon_r l}{\ln(b/a)}

Корректное сравнение вариантов

Для обоих исполнений выполнены три сетки. Базовая модель сравнивается с точной ёмкостью, экранированная — по сохранению энергии, нулевому заряду экрана и сходимости. Поле считывается в точке r=7,z=20 мм.

У тонкого экрана имеются идеальные острые торцы. Поэтому результат не объявляет гарантированного снижения максимального поля или электрической прочности. Изменение контрольной точки и ёмкости показывает действие экрана; инженерная оптимизация требует торцевых скруглений и отдельного поиска максимумов.

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

Осесимметричная

Величины, единицы и происхождение параметров
ПараметрЗначениеЕдиницаПроисхождение
Радиусы жилы и обоймы5; 20ммУсловие учебной задачи
Длина40ммУсловие учебной задачи
Проницаемость31Условие учебной задачи
Напряжение1000ВУсловие учебной задачи
Начало экрана (r,z)10; 8ммУсловие учебной задачи
Конец экрана (r,z)14; 32ммУсловие учебной задачи
Заряд экрана0КлУсловие учебной задачи

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

  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


for shield in (False, True):
    for level, mesh in enumerate((1, 0.5, 0.25)):
        newdocument(1)
        ei_probdef('millimeters', 'axi', 1e-10, 1, 30)
        ei_addmaterial('Диэлектрик проходного изолятора', 3, 3, 0)
        ei_addconductorprop('Высоковольтная жила', 1000, 0, 1)
        ei_addconductorprop('Заземлённая обойма', 0, 0, 1)
        polygon(((5, 0), (20, 0), (20, 40), (5, 40)))
        terminal(5, 20, 'Высоковольтная жила', mesh)
        terminal(20, 20, 'Заземлённая обойма', mesh)
        if shield:
            ei_addconductorprop('Изолированный конический экран', 0, 0, 0)
            ei_addnode(10, 8)
            ei_addnode(14, 32)
            ei_addsegment(10, 8, 14, 32)
            terminal(12, 20, 'Изолированный конический экран', mesh / 2)
        label(7, 20, 'Диэлектрик проходного изолятора', mesh)
        stem = 'screened' if shield else 'bare'
        model = directory + '/' + stem + '-%02d.fee' % (level + 1)
        solve(model)
        exact = None if shield else 2 * math.pi * EPS0 * 3 * 0.04 / math.log(4)
        row = summary(mesh, model, 'Высоковольтная жила', 'Заземлённая обойма', exact)
        row['screen'] = 'Конический плавающий экран' if shield else 'Без экрана'
        row['E_inner_sample_V_m'] = field(7, 20)
        if shield:
            vf, qf = eo_getconductorproperties('Изолированный конический экран')
            row['floating_voltage_V'] = real(vf)
            row['floating_charge_C'] = real(qf)
            check('Экран электрически изолирован', abs(real(qf)), 1e-14)
        else:
            check('Аналитическая ёмкость базового изолятора', row['analytic_C_relative_error'], 0.005)
        eo_close()
        ei_close()
    check('Сходимость ёмкости ' + stem, abs(records[-1]['capacitance_F'] / records[-2]['capacitance_F'] - 1), 0.01)

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'], 'Не выполнен численный критерий'

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

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

Окна FEMM 5

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

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

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

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

Результаты расчётов и производные итоги
Ёмкость по заряду, ФАналитическая ёмкость, ФЗаряд, КлФайл моделиУзловРазность потенциалов, ВИсполнениеЁмкость по энергии, ФЭлементовОтносительная ошибка ёмкостиПоле в контрольной точке, В/мЭнергия, ДжРазмер сетки, ммЗаряд изолированного электрода, КлПотенциал изолированного электрода, В
4,8168528 × 10⁻¹²4,8156442 × 10⁻¹²4,8168528 × 10⁻⁹bare-01.fee31661000Без экрана4,8168528 × 10⁻¹²6085250,97661 × 10⁻⁶105875,052,4084264 × 10⁻⁶1——
4,8167361 × 10⁻¹²4,8156442 × 10⁻¹²4,8167361 × 10⁻⁹bare-02.fee32851000Без экрана4,8167361 × 10⁻¹²6252226,74372 × 10⁻⁶98491,9832,408368 × 10⁻⁶0,5——
4,8159481 × 10⁻¹²4,8156442 × 10⁻¹²4,8159481 × 10⁻⁹bare-03.fee116641000Без экрана4,815948 × 10⁻¹²2274363,106061 × 10⁻⁶104263,92,407974 × 10⁻⁶0,25——
4,9436495 × 10⁻¹²—4,9436495 × 10⁻⁹screened-01.fee32981000Конический плавающий экран4,9436495 × 10⁻¹²6345—106908,392,4718248 × 10⁻⁶10364,46246
4,9435315 × 10⁻¹²—4,9435315 × 10⁻⁹screened-02.fee39751000Конический плавающий экран4,9435315 × 10⁻¹²7629—100708,22,4717657 × 10⁻⁶0,50364,51401
4,9416593 × 10⁻¹²—4,9416593 × 10⁻⁹screened-03.fee131571000Конический плавающий экран4,9416593 × 10⁻¹²25712—103652,862,4708297 × 10⁻⁶0,250364,46532
Проверки опубликованного расчёта
КритерийПолученоДопуск или ожидаемое значениеИтог
Энергия и терминальный заряд: bare-01.fee114 × 10⁻¹²1e-05Выполнен
Аналитическая ёмкость базового изолятора251 × 10⁻⁶0,005Выполнен
Энергия и терминальный заряд: bare-02.fee363,9 × 10⁻¹²1e-05Выполнен
Аналитическая ёмкость базового изолятора226,7 × 10⁻⁶0,005Выполнен
Энергия и терминальный заряд: bare-03.fee453,9 × 10⁻¹²1e-05Выполнен
Аналитическая ёмкость базового изолятора63,11 × 10⁻⁶0,005Выполнен
Сходимость ёмкости bare163,6 × 10⁻⁶0,01Выполнен
Энергия и терминальный заряд: screened-01.fee73,6 × 10⁻¹²1e-05Выполнен
Экран электрически изолирован01e-14Выполнен
Энергия и терминальный заряд: screened-02.fee86,49 × 10⁻¹²1e-05Выполнен
Экран электрически изолирован01e-14Выполнен
Энергия и терминальный заряд: screened-03.fee132,3 × 10⁻¹²1e-05Выполнен
Экран электрически изолирован01e-14Выполнен
Сходимость ёмкости screened378,7 × 10⁻⁶0,01Выполнен

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

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

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

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

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