FEMM 5

Часть III · Встроенный Python и воспроизводимая автоматизация → § 15 · Массивы, графики и таблицы

Занятие 15.1

Графики и численные массивы встроенного Python: данные, сетка и ограничения пакетов

Цель и задачи

Цель. Связать построенный график с сохранёнными численными данными.

Задачи

  • Вычислите аналитический температурный профиль и сохраните те же точки, которые показаны на графике.
  • Сопоставьте координаты и температуры аналитического ряда и отдельного фактического ряда FEMM.
Что нужно вспомнить перед началом

Если одно из понятий незнакомо, вернитесь к предыдущему занятию и воспроизведите его численный пример. После этого переходите к новой постановке.

Место занятия в инженерной методике

Расчётная лабораторная работа · Определение теплового сопротивления и установившегося нагрева

Инженерный вопрос. Каждая ли точка графика восстанавливается из таблицы и своего источника?

Температура, тепловое сопротивление и постоянная времени связывают потери с охлаждением и длительностью включения. Это позволяет сравнить материалы, отвод тепла и рабочие циклы по количественным критериям.

Лабораторная работа:

Последовательность решения, отчёт и критерии результата

Результат получают из наблюдаемых величин и проверяют в условиях данного практикума.

Последовательность решения

  1. Обосновать постановку и способ измерения. Согласуйте источники мощности, теплопроводность и условия отвода; выберите температуру, поток или тепловое сопротивление как искомую характеристику.

  2. Пластина с объёмным тепловыделением — аналитический эталон. Проверьте аналитический тепловой путь и баланс в условиях геометрии примера.

  3. Постройте табличный и графический профили T(x); затем добавьте отдельный ряд фактически извлечённых значений FEMM, не смешивая происхождение рядов.. Выполните действия практикума по его исходной таблице. Сопоставьте координаты и температуры аналитического ряда и отдельного фактического ряда FEMM.

  4. Ответить на вопрос по своим результатам. Восстановите профиль или тепловое сопротивление из таблицы; сопоставьте суммарные источники и выходящие потоки.

Что включить в отчёт

Результат этого занятия. Подписанные ряды и таблица с раздельным происхождением и оценкой расхождения профилей.

Данные именно этого опыта. Сопоставьте координаты и температуры аналитического ряда и отдельного фактического ряда FEMM.

Оформление наблюдений. Температуры в заданных местах, потоки через границы, мощности по областям и свойства; для сопротивления — определённая разность температур и мощность.

Как обосновать результат

Проверка из практикума. Сравнивайте объёмный источник в Вт/м³ с полным потоком в Вт после интегрирования по объёму. Прямое численное сравнение возможно только при совпадении всех исходных данных и постановки.

Независимый контроль. Сопоставьте суммарную мощность источников с выходящим тепловым потоком и аналитическим пределом, допустимым для этой геометрии.

Критерий выполнения. Чистый численный self-check работает без numpy/scipy; таблица и график совпадают; неподдерживаемая функция сообщает ограничение вместо скрытой подмены.

Точность и расхождения. Сеточную устойчивость температуры и потока оценивайте отдельно. Неопределённость теплоотдачи и теплопроводности нельзя устранить уменьшением конечного элемента.

Основание сравнения. Опора — закон Фурье и аналитический тепловой баланс из занятия. Теплоотдача и свойства материала являются исходными данными; одномерный предел применим только при согласованном пути тепла.

Вывод для устройства

Определите доминирующий тепловой путь и влияние материала или границы; решение о допустимом нагреве требует заданной температуры среды и предела материала.

Границы вывода. Результат зависит от источников, среды, теплоотдачи и теплоёмкости. Упрощённый эталон не заменяет неизвестные условия охлаждения реального устройства.

Теория и вывод формул

Представление расчётных данных объединяет обработку массивов и построение графиков. Во встроенном Python FEMM 5 для этого используются функция plot и доступные функции пакетов numpy и scipy.

Соглашения об обозначениях и единицах
  • \(i(t)\), \(u(t)\) — мгновенные значения; \(\widehat I\), \(\widehat U\) — комплексные амплитуды; \(\underline I_{\text{д}}\), \(\underline U_{\text{д}}\) — комплексные действующие значения. Для синусоиды \(\widehat I=\sqrt{2}\,\underline I_{\text{д}}\); действующее значение тока равно \(|\underline I_{\text{д}}|\). Нормировка обязательно учитывается в формулах мощности.
  • \(\Phi=\int_S\mathbf B\cdot\mathrm d\mathbf S\) — поток через ориентированную поверхность; \(\Psi=\sum_k\oint_{C_k}\mathbf A\cdot\mathrm d\mathbf l\) — потокосцепление последовательных витков с согласованными замкнутыми контурами. Только при одинаковом сцепленном потоке каждого витка \(\Psi=N\Phi\). Обе величины измеряются в веберах: число витков безразмерно. Запись «Вб·виток» подчёркивает суммирование.
  • \(\theta_{\text{м}}\), \(\Omega\) (также \(\omega_{\text{мех}}\)) — механические угол и угловая скорость. Для основной гармоники \(\theta_{\text{э}}=p\theta_{\text{м}}\), \(\omega_{\text{э}}=p\Omega\), где \(p\) — число пар полюсов. Геометрический период зубцов задаётся отдельно. В производных по углу используйте радианы.
  • Статическая индуктивность \(L_{\text{ст}}=\Psi/i\) — наклон секущей из начала координат; это определение используется при \(\Psi(0)=0\) и \(i\ne0\). Динамическая индуктивность \(L_{\text{дин}}=\partial\Psi/\partial i\) — наклон касательной (дифференциальная, инкрементальная); положение и остальные токи фиксированы. Для линейной характеристики без смещения обе равны одной индуктивности \(L\). При постоянных магнитах и взаимном возбуждении сначала учитывают ненулевое смещение потокосцепления.
  • Положительные направления, оси и специальные индексы определяются в конкретной задаче. Единицу берите из условия или заголовка таблицы; перед подстановкой в формулу СИ переводите миллиметры в метры, миллигенри в генри и градусы в радианы.
  • Численные результаты обычно показаны с четырьмя значащими цифрами; для сравнения близких значений в таблицах сходимости сохранено больше цифр. Полные значения остаются в исходных расчётных данных. Малые остатки вычисления координат на осях показаны как ноль; малые физические величины сохраняются в показательной записи.
Указатель формул этого занятия
  1. (15.1) · Вывод контрольного соотношения

Физический и методический смысл

Графики строятся встроенной функцией plot; массивы и численные операции задаются функциями numpy и scipy из поставки FEMM 5.

График — представление чисел, а не отдельный источник истины. Исходные координаты, единицы и выборки сохраняют независимо от изображения; отображение собственной сетки не следует выдавать за рассчитанную FEMM сетку.

Вывод контрольного соотношения

Вычислите аналитический температурный профиль и сохраните те же точки, которые показаны на графике.

-kT^{\prime\prime}=q_v,\quad T(x)=300+\frac{q_v}{2k}(a^2-x^2),\quad T_{\max}=300+\frac{q_va^2}{2k}
(15.1)
Постоянная теплопроводность; параболический профиль является аналитическим решением, с которым сравнивают FEM.
  1. Условие симметрии даёт T'(0)=0. Двойное интегрирование уравнения Пуассона даёт параболу.

  2. Превышение температуры в центре равно 10^{6}\cdot 0{,}01^{2}/(2\cdot 10)=5 К.

  3. Объём 2aS=2\cdot 10^{-5}\,\mathrm{м^3} выделяет 20 Вт; каждая торцевая сторона отводит 10 Вт.

Границы применимости. Постоянная теплопроводность; параболический профиль является аналитическим решением, с которым сравнивают FEM.

Связь с опытом в FEMM

Постройте табличный и графический профили T(x); затем добавьте отдельный ряд фактически извлечённых значений FEMM, не смешивая происхождение рядов.

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

Проверка и границы вывода

Чистый численный self-check работает без numpy/scipy; таблица и график совпадают; неподдерживаемая функция сообщает ограничение вместо скрытой подмены.

Сравнивайте объёмный источник в Вт/м³ с полным потоком в Вт после интегрирования по объёму.

Интерполяция между редкими точками не создаёт дополнительные полевые решения; каждая серия должна иметь подпись происхождения.

Пояснения к официальному руководству

Подробности, которые следует учитывать при настройке и проверке модели. Все учебные пояснения.

Формулы и таблицы руководства к этому занятию

Изображение результата и исходные числа экспортируются отдельно

Edit/Copy as Bitmap копирует текущий вид в буфер как растровое изображение. Команды семейства savebitmap записывают такой вид в файл; воспроизводимый рисунок требует заранее задать окно, шкалу, отображаемую величину и подписи. Это изображение области модели, а не полный снимок нативного окна с панелями.

FEMM 5 не создаёт векторный экспорт. Старые команды savemetafile сохранены только для совместимости и не выполняют сохранение; отсутствие ошибки после их вызова не подтверждает появление файла. Перед включением рисунка в отчёт проверьте существование, размеры и читаемость реально полученного изображения.

Численные данные профиля сохраняют кнопкой Export в окне X-Y Plot в CSV с заголовками. Для отчёта полезны оба файла: рисунок показывает тенденцию, CSV сохраняет исходные отсчёты. Укажите единицы, длину контура, количество точек, сторону чтения на интерфейсе и состояние сглаживания. Наличие CSV не означает, что вычислительная модель или её сетка прошли проверку.

Проверьте на своей модели

  • Сохраните один график и его CSV, откройте оба и сопоставьте крайние значения.
  • Не включайте пустой или отсутствующий metafile в пакет; для воспроизводимого рисунка используйте реально поддерживаемый растровый экспорт.

Источник: [33]. § 2.10

Файлы, таблицы, память и протокол серии

Имя open имеет два назначения. Единственный аргумент с расширением .fem/.fee/.feh/.fec открывает документ FEMM; файловое чтение/запись определяется иными аргументами. Для ясности открытия модели используйте opendocument, а для результатов — with open(path, "w", newline="") as f. Контекстный менеджер закрывает файл до следующего шага серии; ожидание конца сценария при множестве открытых файлов может исчерпать дескрипторы.

Пути с кириллицей поддерживаются; обратная косая черта нормализуется, а возвращаемые пути используют прямую. В строке Python обратную черту нужно экранировать либо использовать прямые разделители. Текстовый режим преобразует перевод строки платформы; rb/wb сохраняет точные байты. Ошибки файловых операций вызывают OSError и должны фиксироваться, а не превращаться в строку якобы успешного расчёта.

Для числового массива np.savetxt поддерживает delimiter и header, пишет заголовок с # и пятнадцать знаков после точки, но не параметр fmt. Общий CSV со строками, кавычками, запятыми внутри поля или переводом строки требует CSV-парсера. Ручной split(",") допустим лишь для заранее ограниченного формата собственных числовых файлов. По актуальному описанию csv.writer/reader используют newline="", иначе на Windows возможны лишние пустые строки.

print в FEMM по умолчанию разделяет аргументы табуляцией. Для машинного журнала задавайте sep/end явно; сообщения об ошибках можно направлять в sys.stderr. Внешний TCP-клиент не получает этот вывод через строку результата команды.

FEMM не задаёт отдельный фиксированный предел кучи сценария: объём массивов ограничен доступной памятью системы. gc.mem_free сообщает свободное место внутри уже удерживаемой памяти, а не запас всей машины. gc.threshold принимается, но игнорируется. gc.collect принудительно запускает сборку; несколько вызовов могут потребоваться для возврата большой области ОС. Это не повод хранить крупную сетку списком отдельных Python-чисел.

Таблица Р.40.1. Файлы, таблицы, память и протокол серии
Функция / группаКонтракт, важный для практикума
os.getcwd, os.chdir; getcwd, setcurrentdirectoryЧтение и установка текущего каталога
os.listdir([path])Список имён; сортируйте явно, если порядок серии существенен
os.mkdir, os.makedirsОдин каталог либо также отсутствующие родители
os.remove/unlink, os.rmdir, os.renameФайл, каталог и смена имени/пути — разные операции
os.stat(path)10 полей: mode,inode,device,links,uid,gid,size,atime,mtime,ctime; size находится в [6]
os.path.exists/isdir/isfile/getsizeПроверка назначения и размера пути
os.path.abspath/join/split/splitext/dirname/basenameПостроение абсолютных путей и разбор компонентов

Проверьте на своей модели

  • Сохраните и прочитайте CSV с кириллической строкой и запятой в поле, проверьте число строк.
  • Проверьте, что пути модели, решения и таблицы уникальны для параметра серии.
  • Не интерпретируйте gc.mem_free как объём свободной ОЗУ компьютера.

Источник: [33]. § 3.2 · § 3.3 · § 3.5

Узлы, элементы и пакетное чтение поля

У сетки есть два разных числа строк: Nn узлов и Ne треугольников. Вводные абзацы PDF описывают готовые numpy-массивы внутри FEMM и плоскую передачу через IPC с восстановлением формы обёрткой. Нативная проверка 16.10.2026 подтвердила массивы координат и полей, но обнаружила важное отличие getallelements: вместо документированной Ne×7 матрицы текущая сборка возвращает кортеж из четырёх массивов. Поэтому сначала проверяйте фактический контейнер, а не назначайте ему форму по краткой таблице.

На четырёх сохранённых решениях магнитного, электростатического, теплового и токового модулей получено: connectivity — Ne×3 int32, centroids — Ne×2 float64, areas — Ne float64, groups — Ne int32. Это четыре члена tuple в таком порядке. Первая тройка connectivity совпала с первыми полями getelement(1), а координаты getallnodes()[0] — с getnode(1). Передать np.int32 аргументом getallelements нельзя: в проверенной сборке команда принимает ноль аргументов. Эта проверка внутреннего Python не устанавливает форму ответа внешнего IPC.

Нумерация узлов API начинается с 1, а индексация массива Python и matplotlib — с 0. В элементной строке первые три поля являются номерами узлов; следующие два — координатами центра, затем идут площадь и группа. При переводе в matplotlib вычитайте 1 только из номеров узлов. Храните индексы как int32: int16 переполняется после 32767 и может превратить корректную сетку в набор отрицательных индексов.

Индексы FEMM и массивов Python

i_{\mathrm{Python}}=i_{\mathrm{FEMM}}-1,\qquad0\le i_{\mathrm{Python}}<N_n
(М.Н.19)
Вычитать единицу требуется только из номеров узлов треугольника. Координаты, площадь и группа сохраняют свои значения.

Обозначения и единицы

  • N_n — число узлов; i_{\mathrm{FEMM}} — номер API от 1; i_{\mathrm{Python}} — индекс массива от 0. Все три величины целочисленные и безразмерные.

Условия применения. Для связности используйте int32. Знаковый int16 ограничен диапазоном −32768…32767 и может молча переполниться.

Формула выделяет математический смысл вычитания 1 из трёх индексов в примере matplotlib. Контейнер getallelements в проверенной сборке отличается от описания PDF; это отдельно разобрано в разделе.

Потенциалы V в электростатике и токопроводимости, а также T в теплопроводности возвращаются по узлам. Их производные D, J, F возвращаются по элементам и не сглаживаются. Магнитный mo_getalla согласно стр.115 выдаёт A в центрах элементов; это принципиальное исключение, которое нельзя соединить с массивом узлов как равнодлинные данные.

Для узлового графика A пример руководства получает координаты mo_getnode(k), затем A через mo_getpointvalues(x,y)[0]. Для крупной серии заранее выделяйте массивы и заполняйте их, а не накапливайте списки Python-чисел. Сроки выполнения примера в руководстве относятся к его модели и компьютеру; их нельзя обещать для произвольной сетки.

Сравнение показывает, почему массивы нужно выделять заранее и читать крупными блоками. Числа относятся к одному измерению автора: переносить их на свой компьютер как норматив скорости нельзя.

Таблица М.Н.38. Пример влияния контейнера на чтение сетки
Хранение данных узловВремя цикла для 20 000 элементов
numpy array1,9 мс
Python list69,7 мс
  • Это конкретное измерение автора руководства, не гарантированный benchmark курса. Контекст: модель около 73 000 узлов и 146 000 элементов; сравнивается цикл с различным хранением узловых данных.
  • Массив уменьшает количество отдельных объектов и нагрузку сборщика памяти; перенос больших массивов выполняйте одной операцией.

В гармонической магнитной и токовой постановке фазовые величины могут быть комплексными. Перед построением рисунка выберите \operatorname{Re}, \operatorname{Im}, модуль или фазу как отдельный шаг обработки. Смешение узлового потенциала, элементного поля и сглаженного точечного запроса может создать ошибку анализа даже при внешне одинаковом изображении.

Таблица Р.44.1. Узлы, элементы и пакетное чтение поля
ЗапросФорма и расположение
*_getallnodesNn×2: координаты всех узлов
*_getallelements в PDFNe×7: n_{1},n_{2},n_{3},xc,yc,area,group
*_getallelements в проверенной сборкеtuple: connectivity Ne×3; centroids Ne×2; areas Ne; groups Ne
mo_getallb / mo_getallaNe×2: B; Ne: A в центрах элементов
eo_getalld / eo_getallvNe×2: D; Nn: узловой V
ho_getallf / ho_getalltNe×2: F; Nn: узловой T
co_getallj / co_getallvNe×2: J; Nn: узловой V
mo_getallgapb / mo_getallgapanpts×2: B_r,B_{\theta }; npts: A; по умолчанию npts=360
mo_getallgapharmonicsNh×6: acc,acs,brc,brs,btc,bts для каждой гармоники

Проверьте на своей модели

  • Проверьте размеры всех массивов по numnodes/numelements, прежде чем объединять столбцы.
  • Подтвердите, что каждая тройка индексов после вычитания 1 лежит в диапазоне 0…Nn−1.
  • Для mo_getalla укажите расположение значений по элементам; для ho_getallt — по узлам.

Источник: [33]. § 3.7.5 · § 3.9.5 · § 3.11.5 · § 3.13.5 · § 4.3

Возвраты интегралов, гармоники зазора и ориентация контура

Перед интегралом очищайте старый контур или выбор областей и создавайте новый явно. Числовой type выбирает физическую операцию в конкретном модуле: одинаковое число не переносится из mo в eo/ho/co. Например, код 2 у mo_blockintegral означает энергию, у eo/ho_blockintegral — объём, а у co_blockintegral — полную мощность.

Перед вызовом mo_blockintegral выберите нужный документ результата и найдите код именно этой команды. Очистите прежнее выделение, выберите области интегрирования и затем запишите код вместе с результатом и единицей.

Таблица М.Н.7. Результаты и коды mo_blockintegral
КодВеличинаЕдиница / смысл
0Интеграл A\cdot JЕдиницы зависят от определения A и источника; см. формулу индуктивности
1Интеграл AИнтеграл потенциала по объёму
2Энергия магнитного поляДж
3Гистерезисные и/или вихревые потери в шихтовкеВт
4Омические потериВт
5Площадь поперечного сечениям²
6Суммарные потериВт
7Полный токА
8Интеграл B_x или B_r по объёмуТл·м³
9Интеграл B_y или B_z по объёмуТл·м³
10Объёмм³
11F_x /r силы Лоренца, постоянная составляющаяН
12F_y /z силы Лоренца, постоянная составляющаяН
13F_x /r силы Лоренца, 2\omegaН
14F_y /z силы Лоренца, 2\omegaН
15Момент Лоренца, постоянная составляющаяН·м
16Момент Лоренца, 2\omegaН·м
17Коэнергия магнитного поляДж
18F_x /r взвешенного тензора напряжений, постоянная составляющаяН
19F_y /z взвешенного тензора напряжений, постоянная составляющаяН
20F_x /r взвешенного тензора напряжений, 2\omegaН
21F_y /z взвешенного тензора напряжений, 2\omegaН
22Момент взвешенного тензора напряжений, постоянная составляющаяН·м
23Момент взвешенного тензора напряжений, 2\omegaН·м
24Интеграл R^{2}: момент инерции / плотностьм⁵ при объёмном интегрировании
25F_x /r взвешенного тензора напряжений, 1\omegaН
26F_y /z взвешенного тензора напряжений, 1\omegaН
27Момент взвешенного тензора напряжений, 1\omegaН·м
28F_x /r силы Лоренца, 1\omegaН
29F_y /z силы Лоренца, 1\omegaН
30Момент Лоренца, 1\omegaН·м
  • Все коды 0–30 сохранены. Члены 1\omega описывают взаимодействие постоянного решения с малым переменным полем в режиме дифференциальной проницаемости; это не обычная гармоническая сила 2\omega.
  • У кода 24 для получения момента инерции результат умножают на массовую плотность, кг/м³. В плоской задаче ось проходит через x=y=0, в осесимметричной — через r=0.

Перед вызовом mo_getpointvalues выберите нужный документ результата и найдите код именно этой команды. Здесь приведён порядок всех возвращаемых полей; физическую точку и единицы координат задают до запроса. Позиции таблицы начинаются с 1, индексы Python — с 0.

Таблица М.Н.8. Результаты и коды mo_getpointvalues
ПозицияСимволВеличинаЕдиница / нормировка
1AВекторный потенциал A либо поток \varphi в осесимметрииВб/м либо Вб; учитывайте тип постановки
2B_{1}B_x в плоской задаче или B_r в осесимметричнойТл
3B_{2}B_y или B_zТл
4SigУдельная электрическая проводимость \sigmaЕдиница возврата в этой таблице PDF не указана
5EПлотность запасённой энергииДж/м³
6H_{1}Hx или HrА/м
7H_{2}Hy или HzА/м
8JeВихревая плотность токаМасштаб А/м² или МА/м² таблицей не уточнён
9J_sЗаданная плотность токаМасштаб А/м² или МА/м² таблицей не уточнён
10Mu1Относительная \mu _{x} или \mu _{r}1
11Mu2Относительная \mu _{y} или \mu _{z}1
12PeПлотность омических потерьВт/м³
13PhПлотность гистерезисных потерьВт/м³
14ffКоэффициент заполнения шихтованного материала1
  • Позиции здесь записаны от 1 как в порядке выдачи; индекс Python равен позиции минус 1. Все 14 результатов следует распаковывать в этом порядке.
  • В магнитостатике мнимые части равны нулю. Не подставляйте единицы ввода mi_addmaterial в вывод Sig/Je/J_s без проверки конкретной сборки на однородном эталоне: исходная таблица их не объявляет.

Перед вызовом mo_makeplot выберите нужный документ результата и найдите код именно этой команды. Сначала постройте контур; PlotType выбирает величину вдоль него. Координата X графика — расстояние по пути, число отсчётов не уточняет сетку.

Таблица М.Н.9. Результаты и коды mo_makeplot
КодВеличинаЕдиница / смысл
0Потенциал A или \varphiВб/м или Вб
1|B|Тл
2B·nТл
3B·tТл
4|H|А/м
5H\cdot nА/м
6H\cdot tА/м
7Вихревая плотность тока JeddyНормировку возврата сверить с заголовком экспорта
8Полная плотность тока Jsource + JeddyНормировку возврата сверить с заголовком экспорта
  • NumPoints задаёт число отсчётов на имеющемся решении, а не размер сетки. При Filename данные сохраняются как CSV; четвёртый FileFormat принят для совместимости и игнорируется.

Перед вызовом mo_showvectorplot выберите нужный документ результата и найдите код именно этой команды. Код выбирает физический вектор и его комплексную составляющую; масштаб стрелок задаётся отдельно и не меняет решение.

Таблица М.Н.42. Результаты и коды mo_showvectorplot
КодВеличинаЕдиница / смысл
0Выключено—
1Re(B)Тл
2Re(H)А/м
3Im(B)Тл
4Im(H)А/м
5Re(B) и Im(B)Тл
6Re(H) и Im(H)А/м

Перед вызовом mo_showdensityplot выберите нужный документ результата и найдите код именно этой команды. Код выбирает смысл цветовой шкалы. При сравнении вариантов фиксируйте одинаковую величину и границы шкалы.

Таблица М.Н.47. Результаты и коды mo_showdensityplot
КодВеличинаЕдиница / смысл
bmag|B|Тл
brealДействительная составляющая BТл
bimagМнимая составляющая BТл
logbЛогарифмический модуль BЛогарифмическая шкала
hmag|H|А/м
hrealДействительная составляющая HА/м
himagМнимая составляющая HА/м
jmag|J|Нормировку сверить с легендой
jrealДействительная составляющая JНормировку сверить с легендой
jimagМнимая составляющая JНормировку сверить с легендой
  • Имена — строки Python. При legend = −1 остальные параметры игнорируются и используются настройки по умолчанию.

Различайте количество физических величин и конкретный тип Python-контейнера. Документация часто пишет «один результат», не устанавливая скаляр или одноэлементный кортеж. Ранее выполненный нативный эталон курса подтвердил кортеж для eo_blockintegral(0) в своём режиме; это не проверка всех других кодов. Перед массовой выгрузкой исследуйте repr/type нужного ответа на малой модели.

Обе команды возвращают четыре величины в одинаковом порядке. Используйте глубину и масштаб единицы в метрах, чтобы связать координаты модели с физическими интегралами; частоту нельзя принимать за геометрическую глубину.

Таблица М.Н.10. Порядок mo_getprobleminfo и co_getprobleminfo
ПозицияВеличинаЗначение / единица
1Тип задачи0 — плоская; 1 — осесимметричная
2ЧастотаГц
3Глубина плоской задачим
4Масштаб единицы длины геометриим на одну единицу координат
  • Таблицы на обеих страницах совпадают по порядку четырёх результатов. Позиция 1 в Python имеет индекс 0. Для eo/ho возвращаются только три значения: тип, глубина в метрах, масштаб единицы в метрах (без частоты).

mo_lineintegral может возвращать среднее и полный интеграл, либо компоненты постоянной и удвоенной по частоте силы. Члены 2\omega имеют смысл при ненулевой частоте. Текст упоминает взаимодействие постоянного и малого переменного поля в режиме дифференциальной проницаемости, но таблица не задаёт дополнительные индексы 1\omega: не добавляйте их в распаковку по предположению.

Перед вызовом mo_lineintegral выберите нужный документ результата и найдите код именно этой команды. Заново задайте контур и его направление: таблица связывает числовой type с физической величиной, а не с номером строки меню другого модуля.

Таблица М.Н.6. Результаты и коды mo_lineintegral
typeОперацияРезультат 1Результат 2Результат 3Результат 4
0Поток B\cdot nПолный потокСредняя нормальная B——
1Циркуляция H\cdot tПолный интегралСредняя касательная H——
2Геометрия контураДлинаПлощадь поверхности——
3Сила тензора напряженийF_x /r, постояннаяF_y /z, постояннаяF_x /r, 2\omegaF_y /z, 2\omega
4Момент тензора напряженийПостоянный моментМомент 2\omega——
5Квадрат B\cdot nПолный интеграл (B\cdot n)^{2}Среднее (B\cdot n)^{2}——
  • В исходной строке 2 колонки сдвинуты. Восстановлена пара «длина, площадь поверхности» по §2.3.10 и нативной проверке курса.
  • Физические единицы: поток — Вб, B — Тл, циркуляция H — А, H — А/м, длина — м, площадь — м², сила — Н, момент — Н·м. Для интеграла квадрата используйте определение и фактическую нормировку операции; это не поток и не сила.
  • В AC постоянная составляющая означает среднюю за период. Члены 2\omega относятся к ненулевой частоте. Текст PDF упоминает 1\omega-взаимодействие, но не добавляет в эту таблицу новые возвращаемые позиции.

Контурный bendcontour требует не менее двух точек, угла от -180^\circ до +180{}^\circ и положительного anglestep. При менее чем двух точках операция игнорируется. Ориентация n/t задаётся направлением обхода; при смене направления отдельно проверяются знаки потока, напряжения и температурной разности.

У mo_gapintegral коды 0/2/3/5 возвращают одну величину момента или энергии, а 1/4/6 — две компоненты силы F_x,F_y. mo_getgapharmonics без n сообщает максимальный доступный порядок; с n даёт шесть коэффициентов. Угол в API задаётся в градусах, тогда как math.cos/math.sin принимают радианы.

Восстановление одной гармоники в воздушном зазоре

\begin{aligned}A_n(\theta)&=a_{cc}\cos(n\theta)+a_{cs}\sin(n\theta),\\B_{r,n}(\theta)&=b_{rc}\cos(n\theta)+b_{rs}\sin(n\theta),\\B_{\theta,n}(\theta)&=b_{tc}\cos(n\theta)+b_{ts}\sin(n\theta),\\\theta&=\theta_{\mathrm{deg}}\pi/180.\end{aligned}
(М.Н.18)
Три пары коэффициентов mo_getgapharmonics описывают потенциал, радиальную и касательную индукцию одной гармоники. Восстановив её, можно сопоставить результат с прямым чтением поля зазора.

Обозначения и единицы

  • n — безразмерный порядок пространственной гармоники в mo_getgapharmonics(BdryName,n); \theta — угол реконструкции, рад. \theta_{\mathrm{deg}} — та же выбранная точка в градусах: такой угловой аргумент принимают mo_getgapa и mo_getgapb, но не mo_getgapharmonics.
  • a_{cc},a_{cs} — коэффициенты потенциала, Вб/м; b_{rc},b_{rs},b_{tc},b_{ts} — коэффициенты индукции, Тл. Порядок этих шести коэффициентов совпадает с порядком возврата API.

Условия применения. Воздушный зазор рассматривается в плоской магнитной задаче. При использовании math.sin/\cos переводите градусы в радианы. Сумма по нескольким n нужна для полного поля, если присутствуют другие гармоники.

В PDF записаны три строки без номера, а ниже сказано «angle is specified in degrees». В курсе явно добавлен перевод градусов в радианы, чтобы не передавать градусы напрямую в math.sin/\cos.

Перед вызовом mo_gapintegral выберите нужный документ результата и найдите код именно этой команды. Интегрирование относится к именованному элементу воздушного зазора. Таблица также показывает, надо ожидать один физический результат или две компоненты силы.

Таблица М.Н.11. Результаты и коды mo_gapintegral
КодВеличинаЕдиница / смысл
0Постоянный / средний моментН·м; один результат
1Постоянная / средняя силаН; два результата F_x,F_y
2Запасённая энергияДж; один результат
3Момент 2\omegaН·м; один результат
4Сила 2\omegaН; два результата F_x,F_y
5Момент взаимодействияН·м; один результат
6Сила взаимодействияН; два результата F_x,F_y
  • BdryName — имя элемента воздушного зазора. Коды 5/6 относятся к взаимодействию опорного и малого переменного решения; их не следует принимать за самостоятельный полный момент произвольного AC-режима.

Проверьте на своей модели

  • Выберите один контур и проверьте смысл изменения знака при его обходе в другую сторону.
  • Прочитайте фактический контейнер нужного integral перед распаковкой; сохраните версию FEMM.
  • Восстановите B_r по коэффициентам одной гармоники и сравните с прямым getgapb в согласованных углах.

Источник: [33]. § 3.7.1 · § 3.7.2 · § 3.9.1 · § 3.11.1 · § 3.13.1

Числовой график, карта поля и экспорт

makeplot строит зависимость выбранной величины вдоль текущего контура. NumPoints задаёт выборку графика, а не число конечных элементов. Если передать Filename, FEMM 5 записывает CSV с заголовком; старый четвёртый FileFormat принимается, но игнорируется. Изменение расширения имени файла не превращает CSV в изображение.

Встроенный plot принимает массив x и до семи массивов y с необязательными подписями и работает без внешнего CPython. Для сложного оформления, подграфиков, логарифмических осей, аннотаций и векторного файла можно подключить matplotlib. savebitmap сохраняет вид FEMM; savemetafile в Qt оставлен как совместимое имя и ничего не делает.

У showdensityplot порядок параметров различается: магнитная команда размещает type после верхней/нижней границ, а остальные модули — перед ними. У магнитной карты type строковый (bmag, breal, bimag, logb, hmag/hreal/himag, jmag/jreal/jimag), у других модулей он числовой. Вызов с −1 для настроек по умолчанию документирован у mo_showdensityplot; не переносите его на другие карты без проверки.

У всех showcontourplot число линий −1 означает использование настроек по умолчанию и позволяет сокращённый вызов с одним аргументом. Для обычного числа линий задавайте пределы. У mo/co дополнительный type выбирает real, imag или both; у стационарных eo/ho такого выбора нет. В тепловом описании lower_V/upper_V — сохранённые имена аргументов, но физическая величина изолиний — температура.

При сравнении режимов фиксируйте пределы карты, размер стрелок, состояние smoothing, положение контура и компоненту комплексной величины. Выбор реальной части зависит от фазы возбуждения, а модуль не сохраняет знак. Изображение и исходная числовая таблица должны сопровождать друг друга.

Таблица Р.46.1. Числовой график, карта поля и экспорт
КартаПорядок аргументов
mo_showdensityplotlegend,gscale,upper_B,lower_B,type
eo_showdensityplotlegend,gscale,type,upper_D,lower_D
ho/co_showdensityplotlegend,gscale,type,upper,lower
mo_showcontourplotnumcontours,lower_A,upper_A,type
eo/ho_showcontourplotnumcontours,lower_V,upper_V
co_showcontourplotnumcontours,lower_V,upper_V,type; скобка исправлена по описанию PDF

Проверьте на своей модели

  • Экспортируйте makeplot в CSV и убедитесь, что количество строк соответствует выбранной выборке.
  • Постройте два режима на одной шкале и отдельно подпишите выбранную комплексную компоненту.
  • Не применяйте параметры магнитной карты к тепловой по памяти.

Источник: [33]. § 3.7.1 · § 3.7.4 · § 3.9.4 · § 3.11.4 · § 3.13.4 · § 4.2

Внешний CPython и граница передачи объектов

При импорте matplotlib, xlsxwriter, zipfile или pandas FEMM обращается к отдельному CPython-процессу на этой же машине. FEMM не устанавливает эти библиотеки автоматически. Для интерактивного графика руководство задаёт CPython не ниже 3.9, matplotlib и оконный backend; Tk достаточен, Qt через PyQt6/PySide6 необязателен. Без графического backend неграфические библиотеки моста могут работать.

Интерпретатор выбирается автоматически либо задаётся через Edit → Scripting Preferences и pybridge.set_interpreter; эта настройка сохраняется. FEMMQT_PYTHON задаёт выбор на один запуск. Ошибка BridgeError перечисляет проверенные интерпретаторы, поэтому устанавливать пакет нужно именно в выбранное окружение, а не в произвольный Python из PATH. pybridge.info позволяет включить версии и backend в описание условий построения рисунка.

Числа, строки, массивы и контейнеры этих значений могут передаваться по значению; сложные объекты остаются во внешнем процессе и доступны через proxy. put отправляет массив целиком, fetch возвращает значение в FEMM. DataFrame и его столбец могут оставаться удалёнными; для локального массива используется fetch(column.to_numpy()). Передача массива целиком обычно экономнее тысячи обращений к отдельным элементам.

Открытый файл принадлежит своему процессу: библиотеке внешнего CPython передайте путь либо файл, открытый через pybridge.open. Встроенную Python-функцию нельзя передать внешнему оптимизатору или обработчику графического события как callback. Определите функцию через pybridge.exec на внешней стороне либо оставьте управляющий цикл и вызовы FEMM во встроенном интерпретаторе.

Пространство eval/exec сохраняется между вызовами. restart/shutdown и отмена зависшего вызова клавишей Esc уничтожают внешний процесс и его рисунки; при следующем обращении он может стартовать заново, но прежние переменные и proxy нужно восстановить. Рисунки находятся в отдельных окнах и не встраиваются в окно FEMM. Одновременно допускается один вызов моста.

Таблица Р.47.1. Внешний CPython и граница передачи объектов
Вход в pybridgeНазначение
import_module(name)Получить удалённый модуль
eval(expr), exec(statements)Вычислить выражение или исполнить код во внешнем пространстве
put(name,value), fetch(obj)Передать по имени во внешний процесс / получить значение в FEMM
open(path,mode,...)Открыть файл во внешнем процессе; newline="" показан для CSV
set_interpreter(path), info()Выбрать CPython / прочитать сведения окружения
restart(), shutdown()Сбросить или завершить вспомогательный процесс и его окна

Проверьте на своей модели

  • Сохраните pybridge.info перед экспортом рисунка.
  • Передавайте данные таблицы через write_row/write_column или массив, а не вызовом на каждую ячейку.
  • Объясните, почему путь файла пересылается, а локальный FileIO или функция FEMM — нет.

Источник: [33]. § 4 · § 4.1 · § 4.4 · § 4.6

Какие NumPy и SciPy выполняют вычисления

import numpy и import scipy внутри FEMM выбирают локальную ulab-библиотеку. Это позволяет выполнять численную обработку без передачи каждого вектора между процессами. Руководство перечисляет комплексную линейную алгебру, FFT, полиномы, линейную интерполяцию, свёртку, trapz и ввод/вывод таблиц. Наличие отдельного имени в перечне не гарантирует весь набор аргументов соответствующего CPython API.

Более широкие методы вызываются явно через pybridge.import_module или exec. В пространстве pybridge.eval имя np означает уже внешний NumPy; одинаковая краткая переменная в двух пространствах не указывает на один объект. Сначала закончите локальный расчёт массива, затем передайте его для одной крупной внешней операции.

Когда один шаг оптимизации должен запустить FEMM, удобно оставить цикл во встроенном scipy.optimize.fmin/newton и вызывать решатель из локальной целевой функции. Внешний least_squares не сможет вызвать функцию, определённую внутри FEMM, через мост. Перенос функции во внешний процесс помогает лишь тогда, когда её вычисления могут происходить там без такого обратного вызова.

Таблица Р.48.1. Какие NumPy и SciPy выполняют вычисления
Документировано локальноДля расширенного варианта нужен внешний CPython
linalg: solve,inv,det,eig,qr,svd,pinv,cond,rank,cholesky,norm; комплексные матрицыПроверяйте совместимость сигнатур конкретного метода
polyfit/polyval; interpcurve_fit/least_squares и сплайны
fft, convolve; signal.sosfiltПроектирование фильтров, welch, periodogram
integrate.quad; optimize.bisect/newton/fminodeint, solve_ivp и другие дополнительные алгоритмы
Массивы и доступные элементарные операцииscipy.stats

Проверьте на своей модели

  • Для выбранного алгоритма отметьте процесс исполнения и число передач массивов.
  • Проверьте поддержку нужных аргументов локальной функции на малом массиве.
  • Не передавайте встроенную целевую функцию как callback внешнему SciPy.

Источник: [33]. § 4.5 · § 4.6

Разобранный численный пример

Пластина с объёмным тепловыделением — аналитический эталон

Дано. Половина толщины a=10\,\mathrm{мм}; высота 10 мм; глубина 100 мм; k=10\,\mathrm{Вт/(м\cdot К)}; q_v=10^{6}\,\mathrm{Вт/м^3}; T(-a)=T(a)=300\,\mathrm{К}.

  1. Условие симметрии даёт T'(0)=0. Двойное интегрирование уравнения Пуассона даёт параболу.

  2. Превышение температуры в центре равно 10^{6}\cdot 0{,}01^{2}/(2\cdot 10)=5 К.

  3. Объём 2aS=2\cdot 10^{-5}\,\mathrm{м^3} выделяет 20 Вт; каждая торцевая сторона отводит 10 Вт.

Ответ: T_{\max}=305\,\mathrm{К}; полный источник 20 Вт; поток через каждый охлаждаемый торец 10 Вт.

Проверка: Сравнивайте объёмный источник в Вт/м³ с полным потоком в Вт после интегрирования по объёму. Значения получены аналитически и сами по себе не подтверждают выполнения полевого расчёта FEMM.

Практикум в FEMM 5

Постройте табличный и графический профили T(x); затем добавьте отдельный ряд фактически извлечённых значений FEMM, не смешивая происхождение рядов.

Таблица 15.1. Исходные данные практикума
Исходная величинаЗначениеЕдиница
a10мм
q_v1 × 10⁶Вт/м³
k10Вт/(м·К)
T_{0}300К
  1. В Heat Flow Problem постройте прямоугольник (−10,0)–(10,10) мм, Depth=100.
  2. Материал: k_x=k_y=10, Volume Heat Generation=1000000 Вт/м³. Слева и справа Fixed Temperature=300 К, горизонтальные стороны изолированы.
  3. Уточните сетку трижды по толщине. В каждом варианте считайте T(0{,}5), а не максимум сглаженной картины поля.
  4. Вычислите интеграл объёмного источника и два граничных потока; запишите направление нормали и невязку баланса.

Ожидаемый результат. T_{\max}=305\,\mathrm{К}; полный источник 20 Вт; поток через каждый охлаждаемый торец 10 Вт. Для FEMM сравнение действительно только при совпадении идеализации и граничных условий.

Как проверить. Сравнивайте объёмный источник в Вт/м³ с полным потоком в Вт после интегрирования по объёму. Прямое численное сравнение возможно только при совпадении всех исходных данных и постановки.

Обработка и анализ результатов

Каждая ли точка графика восстанавливается из таблицы и своего источника?

  1. Сопоставьте координаты и температуры аналитического ряда и отдельного фактического ряда FEMM.
  2. Восстановите профиль или тепловое сопротивление из таблицы; сопоставьте суммарные источники и выходящие потоки.

С чем сравнить. Опора — закон Фурье и аналитический тепловой баланс из занятия. Теплоотдача и свойства материала являются исходными данными; одномерный предел применим только при согласованном пути тепла.

Итог работы. Подписанные ряды и таблица с раздельным происхождением и оценкой расхождения профилей.

Программа с русскими пояснениями: Контрольный вычислительный фрагмент · Порядок запуска

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

Одномерное стационарное уравнение теплопроводности с постоянными k и q_v даёт параболу T(x) = T_b + q_v(a² − x²)/(2k). За один проход вычисляется 21 точка, включая границы с температурой 300 К и центр с температурой 305 К. Постоянный коэффициент вынесен за цикл. После проверки таблица выводится в CSV с запятой в заголовке и каждой строке; шесть знаков после точки задают формат вывода, а не точность FEMM. Таблица является аналитическим эталоном при отсутствии боковых тепловых потоков.

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

Среда: встроенный 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))

Самостоятельная работа

Постройте табличный и графический профили T(x); затем добавьте отдельный ряд фактически извлечённых значений FEMM, не смешивая происхождение рядов. Сопоставьте исходный и изменённый режимы, сохраните исходные файлы, результаты и объяснение различия.

Критерий выполнения: Чистый численный self-check работает без numpy/scipy; таблица и график совпадают; неподдерживаемая функция сообщает ограничение вместо скрытой подмены.
Первоисточники и дополнительное чтение по занятию
  1. [33] — 90–95, 158–164
Пояснения и типичные ошибки
Зачем нужен численный контроль без графической библиотеки?

Он позволяет отдельно проверить формулу и данные, не связывая корректность результата с отображением.

Какое контрольное число и единица проверяют этот опыт?

T_{\max}=305\,\mathrm{К}; полный источник 20 Вт; поток через каждый охлаждаемый торец 10 Вт.

При каких предположениях получена приведённая формула?

Постоянная теплопроводность; параболический профиль является аналитическим решением, с которым сравнивают FEM.

На что обратить внимание

  • Интерполяция между редкими точками не создаёт дополнительные полевые решения; каждая серия должна иметь подпись происхождения.
  • Постоянная теплопроводность; параболический профиль является аналитическим решением, с которым сравнивают FEM.