Обзор
Формулировка
Исследуется распределение величины продольного поля на оси многокатушечного соленоида.
Внутри железного ярма установлено 5 концентрических токоведущих катушек. Вся конструкция имеет аксиальную симметрию. Необходимо найти распределение продольной компоненты магнитного поля вдоль оси системы и интеграл этой компоненты.
Схематично, исследуемая область выглядит следующим образом:

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

Математическая постановка
Фундаментальной математической моделью, используемой для моделирования практически всех макроскопических электромагнитных явлений, является система уравнений Максвелла, устанавливающая связь между компонентами электрического и магнитного полей, параметрами среды (электропроводимостью, магнитной и диэлектрической проницаемостью) и сторонними источниками электромагнитного поля в форме системы векторных дифференциальных уравнений:
где — напряженность магнитного поля, — вектор плотностей сторонних токов, — напряженность электрического поля, — удельная электрическая проводимость среды, — диэлектрическая проницаемость среды, — индукция магнитного поля (связанная с напряженностью соотношением , где — коэффициент магнитной проницаемости).
Задачей магнитостатики называют задачу моделирования магнитного поля, создаваемого стационарным (постоянным) электрическим током с известной плотностью распределения . Такие поля описываются системой из двух уравнений полной системы Максвелла:
Описание стационарных магнитных полей с использованием вектор-потенциала
Представим в виде ротора некоторой вектор-функции , называемой вектор-потенциалом: .
При таком представлении поля уравнение Гаусса превращается в тождество , и вектор-потенциал может быть найден из уравнения Ампера, в котором :
В случае осесимметричной задачи вектор плотности тока имеет одну ненулевую компоненту , причем и , и магнитная проницаемость не зависят от координаты : , . В этом случае магнитное поле полностью определяется только через одну компоненту вектор-потенциала , удовлетворяющую двумерному уравнению
или в цилиндрических координатах:
Сделаем замену переменной
и преобразуем полученное уравнение:
Подставляя полученные соотношения в исходное уравнение и упрощая его, получаем следующее эллиптическое уравнение:
Поле может быть найдено из следующих соотношений:
Граничные условия
Для рассматриваемой задачи целесообразно ввести следующие граничные условия:
- Условие на оси:
- Условие на удаленной границе (поле затухает):
слабая форма в таком случае будет иметь иной вид, но после замены переменной форма снова превратится в полученную выше.
Конечноэлементная сетка
При построении конечноэлементной сетки нужно учесть ряд важных моментов:
- Область должна быть разбита на несколько физических групп;
- Степень детализации сетки в области оси соленоида должна быть значительно выше, чем за пределами соленоида.
Для построения сетки воспользуемся средствами открытого пакета GMSH.

Численное моделирование
Для решения уравнения на построенной сетке используем вычислительную платформу для решения дифференциальных уравнений в частных производных методом конечных элементов FEniCS.
Постановка в слабой форме
Введем тестовую функцию , где (квадратно интегрируемые функции с квадратно интегрируемым градиентом и нулевым значением на границе Дирихле).
Умножаем исходное уравнение на
и интегрируем по области
Используя формулу Грина и учитывая нулевое значение тестовой функции на границе расчетной области, получаем уравнение в слабой форме:
Обратим внимание, что при выводе трехмерной осесимметричной задачи, появляется вес :
После интегрирования по :
Базис
Для аппроксимации функции и, соответственно, , будем использовать непрерывное функциональное пространство Галеркина первого порядка, что означает применение кусочно-линейных непрерывных базисных функций на треугольных элементах.
Учитывая вид уравнения для продольной компоненты поля
при численном вычислении требуется исключить саму ось: . Достичь этого можно двумя способами:
- Использовать разрывное пространство Галеркина нулевого порядка для аппроксимации поля, т.е. описывать решение кусочно-постоянными функциями на каждом конечном элементе.
- При вычислении поля исключить элементы, расположенные на оси. В таком случае, для аппроксимации поля можно использовать тот же базис, что и для аппроксимации вектор-потенциала.
Для текущей задачи был выбран первый вариант, т.к. сетка в области оси достаточно мелкая, а значит кусочно-постоянные функции опишут поле с достаточной точностью. При этом первый подход не требует дополнительных модификаций алгоритма аппроксимации, что значительно упрощает конечное решение.
Программная реализация
В процессе программного описания вариационной формы необходимо учесть вариацию физических параметров в области расчета. Для этого каждый параметр (магнитная проницаемость и ток) будет задаваться в виде кусочно-постоянных функций:
J = fem.Function(Q)
J.x.array[:] = 0.0
J.x.array[nbsn] = fem.Constant(data.mesh, (nbsn_n * nbsn_i) / nbsn_s)
J.x.array[nbti] = fem.Constant(data.mesh, (nbti_n * nbti_i) / nbti_s)
J.x.array[comp] = fem.Constant(data.mesh, (comp_n * comp_i) / comp_s)
mu0 = 4 * np.pi * 1e-7
mu = fem.Function(Q)
mu.x.array[air] = fem.Constant(data.mesh, mu0)
mu.x.array[iron] = fem.Constant(data.mesh, mu0 * 1000.0)
mu.x.array[nbsn] = fem.Constant(data.mesh, mu0)
mu.x.array[nbti] = fem.Constant(data.mesh, mu0)
mu.x.array[comp] = fem.Constant(data.mesh, mu0)
где - разрывное пространство Галеркина нулевого порядка:
Q = fem.functionspace(data.mesh, ('DG', 0))
Вариационная форма, в таком случае, принимает максимально простой вид:
u = ufl.TrialFunction(V)
v = ufl.TestFunction(V)
a = (1.0 / (mu*r)) * ufl.dot(ufl.grad(u), ufl.grad(v)) * ufl.dx
L = J * v * ufl.dx
где - непрерывное функциональное пространство Галеркина первого порядка:
V = fem.functionspace(data.mesh, ('CG', 1))
Распределение продольной компоненты будем интерполировать на пространство :
Bz = fem.Function(Q)
Bz.interpolate(fem.Expression((1.0 / r) * ufl.grad(uh)[1],
Q.element.interpolation_points))
Для вычисления интеграла продольной компоненты вдоль оси соленоида, необходимо объявить меру, которая будет включать элементы первого порядка (отрезки), расположенные на оси. В нашем случае, такие элементы принадлежать к 8-й физической группе (данная группа была выделена средствами GMSH на этапе построения сетки). После этого, интеграл вычисляется следующим образом:
dz = ufl.Measure("ds", domain=data.mesh, subdomain_data=data.facet_tags)
I = fem.assemble_scalar(fem.form(Bz * dz(8)))
Результат
В результате измерения распределения магнитного поля, получен интеграл продольной компоненты на оси соленоида:
Вектор-потенциал
На изображении ниже приведено распределение взвешенного по значения вектор-потенциала :

Продольная компонента индукции магнитного поля
На следующем изображении приведено распределение продольной компоненты индукции магнитного поля :

Распределение продольной компоненты поля по оси:

Верификация
Для проверки корректности полученного результата, приведем норму невязки слабой формы:
Помимо этого, проверим корректность глобальных физических интегралов, а именно значение магнитной энергии (полевой метод)
и сравним его со значением магнитной энергии, посчитанным через вектор-потенциал (метод источника)
После приведения выражений выше к цилиндрическим координатам, получаем