Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Математическое моделирование в астрофизике. В 2 частях. Ч.1. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
1 Мб
Скачать

En+1

= En +

k

Bn+211

Bn+211

 

kjn+21 ;

 

 

z,i

 

z,i

h k y,i+2

y,i−2

z,i

n+3

 

n+1

By,i+2

21

= By,i+2

21

+

 

 

 

(Ez,in+1+1 − Ez,in+1−1);

 

h

 

n+3

 

n+1

 

 

k

(Ey,in+1+1

− Ey,in+1−1).

 

Bz,i+2

21

= Bz,i+2

21

 

 

 

h

 

Уравнения для Bx и Ex отсутствуют, потому что в одномерном случае Bx = const, а Ex разумнее вычислять с помощью уравнения Пуассона, которое в одномерном случае принимает вид ∆xEx = ρ (в нормированных единицах).

Метод перешагивания при перемещении частиц предполагает также, что их координаты и скорости хранятся со сдвигом на полшага, например rnp и vnp+12 . Однако для вычисления плотности тока необходимо знать положения и скорости частиц одновременно. Проблему можно обойти, действуя по схеме, показанной на рис. 5.11. Пусть мы начинаем с tn, и нам известны поля и координаты частиц. Скорость на шаге n + 12 вычисляется одним из методов, описанных в главе 2. Далее мы можем по формуле (5.51) найти ток j, который вычисляется с положениями частиц на n шаге и скоростями на n + 12 шаге. Затем осуществляется перемещение частиц и находится rnp+1 = rnp + vnp+12 k. Теперь можно найти j+ – ток с новыми координатами

и теми же скоростями. Далее jn+21

оценивается как полусумма jи j+.

rpn−1

jn−21

rpn

 

jn+21

rpn+1

 

j

 

j+

 

 

 

j

 

 

j+

 

 

 

En−1, Bn−1

vpn−21

n

 

 

n

vpn+21

n+1

 

n+1

 

 

 

E

 

,

B

 

 

 

E

 

, B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tn−1

tn−21

tn

 

tn+21

tn+1

Рис. 5.11. Схема вычисления плотности тока, если координаты частиц заданы на целых шагах, а скорости на полуцелых

91

z y

Bz,i,j,k+21

x

 

 

 

 

 

 

 

 

 

Ez,i−21 ,j−21 ,k

 

 

By,i,j−21 ,k

 

 

Bx,i+21 ,j,k

 

 

 

 

 

 

 

Ey,i+21 ,j,k−21

 

 

 

 

 

Центр ячейки i, j, k

 

 

Ex,i,j−21 ,k−21

Рис. 5.12. Сетка Йее

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

В трехмерном случае осложняется ситуация в пространстве: сетка содержит уже грани, ребра и вершины. В этом случае удобно использовать так называемую сетку Йee (Yee lattice), когда магнитные поля задаются нормально к граням, а электрические вдоль ребер (рис. 5.12). Оказывается, что такой выбор сетки приводит к автоматическому сохранению дивергенции магнитного поля. Определим дивергенцию магнитного поля в ячейке через значения на гранях

( · B)ijk =

Bi+

21 ,j,k − Bi−21 ,j,k

 

Bi,j+21 ,k − Bi,j−21 ,k

Bi,j,k+

21 − Bi,j,k−21

 

h

+

 

h

+

 

h

и приращение магнитных полей на гранях через ротор электрического поля на ребрах

92

( ×

E)i+

1

,j,k

=

Ei+21 ,j+21 ,k − Ei+21 ,j−21 ,k

Ei+

21 ,j,k+21 − Ei+21 ,j,k−21

.

2

∆y

 

∆z

Тогда при вычислении ·B на следующем шаге все приращения полей на гранях попарно сократятся. Следовательно, дивергенция магнитного поля будет сохраняться с точностью до машинного числа и останется нулевой,

если начальные условия были корректны.

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

в виде

B = φ + × A,

где × A – искомая проекция на бездивергентное поле векторов.

Поиск φ сводится к уравнению Пуассона, которое можно решить одним

из методов, предложенных в главе 3:

 

· B = 2φ,

(5.77)

где B – текущее магнитное поле с ненулевой дивергенцией.

Решая уравнение (5.77), можно вычислить φ и найти бездивергентное поле:

B = B − φ.

Нулевая дивергенция магнитного поля очень важна, так как при несоблюдении этого закона возникают нефизичные силы, действующие вдоль магнитного поля и приводящие к грубому нарушению закона сохранения энергии [8]:

F · B = (B · B) · B.

Описанные методы сохранения нулевой дивергении универсальны и могут использоваться в PIC-кодах, МГД кодах и гибридных кодах.

5.18. Подготовка к моделированию

Резюмируя предыдущие части, можно выделить три основных подзадачи, выполняемых PIC-кодом на каждом шаге.

93

1.Current deposit – вычисление токов и плотностей зарядов в ячейках.

2.Field solver – нахождение электромагнитных полей.

3.Particle mover – перемещение частиц.

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

Следует сказать пару слов о выборе языка программирования, на котором будет написан код. Поскольку его может понадобиться запускать на различных компьютерах и многопроцессорных кластерах, следует выбирать популярные и широко распространенные языки, компиляторы для которых будут установлены по умолчанию. Также желательно избегать подключения редких библиотек. В настоящее время наиболее популярными являются языки программирования Fortran, C(C++) и Python. На многих операционных системах они установлены по умолчанию.

Fortran, который является самым низкоуровневым языком из перечисленных, сейчас используется все реже вследствие его ограниченных возможностей. Однако при создании ресурсоемких кодов не стоит забывать, что коды на этом языке при прочих равных работают быстрее. Например, библиотека Numpy высокоуровневого языка Python написаны именно на Fortran.

Python, несмотря на гибкость и функциональность, может быть использован только для создания пользовательского интерфейса, поскольку все переменные этого языка занимают существенно больший объем оперативной памяти, а программы на Python работают намного медленнее, чем в языках Fortran и С(C++).

Язык C++ сочетает преимущества объектно-ориентированного программирования и хорошего быстродействия, поэтому многие современные коды написаны на нем. В дальнейшем большинство примеров будут даны на этом языке. Представление данных в программе может быть различным.

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

94

мер, компоненты электрического поля могут храниться в виде массивов

Ex, Ey, Ez размерности Nc (число ячеек). Для реализации некоторых сложных алгоритмов удобнее структуры и классы данных. Например, в C(C++) можно определить тип CELL следующим образом:

typedef struct tagCELL

{

int r [3]; //x , y , z

struct tagCELL * neighbours [3][3][3];

// neighbour cells

Vector E , B , j; // fields , current double rho ; // charge density

PARTICLE *p; // list of particles in cell

} CELL ;

При этом заранее был определен класс Vector, включающий в себя три вещественных проекции вектора и допускающий векторные операции над ними, а также структура PARTICLE для хранения частиц.

Cтруктура CELL позволяет легко дифференцировать на сетке, потому что содержит указатели на все соседние ячейки. Адреса указателей присваиваются на стадии инициализации кода. Также ячейка содержит список всех находящихся в ней частиц, что удобно при подсчете токов и плотностей.

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

Для оценки необходимой памяти нужно посчитать, сколько ячеек и частиц потребуется для создания модели. Для этого объем области моделирования делят на объем ячейки (в PIC-коде размер ячейки не должен

95

превышать дебаевский радиус). После того как посчитано число ячеек, объем памяти для них вычисляется как число ячеек, умноженное на объем ячейки. В случае представления ячейки в виде структуры объем можно вычислить с помощью оператора sizeof(CELL).

Аналогичным образом вычисляется объем памяти для хранения частиц: число частиц Np = ppc ·Nc, умноженное на sizeof(PARTICLE). Обычно число частиц хотя бы на порядок превышает число ячеек. В задачах, где критически важен низкий уровень численных шумов, число частиц в ячейках ppc

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

Перед созданием кода нужно также определиться с форматом выходных данных. Результаты PIC-моделирования могут занимать много места на диске, поэтому часто для их хранения используются специальные сжатые форматы fits и hdf5, последний из которых является более современным. Эти форматы представляют собой файлы, содержащие коллекцию таблиц, чисел и изображений. Для их создания и обработки требуются специальные библиотеки.

5.19. Начальные и граничные условия

Начальные условия включают в себя значения электрического и магнитного поля в ячейках, координаты и скорости частиц. Часто координаты и скорости частиц задаются с использованием генератора случайных чисел. При этом полезно научиться генерировать случайные значения с заданной функцией распределения. Генератор случайных чисел в C++ выдает равнораспределенные целые числа в диапазоне от 0 до RAND_MAX (константа, зависящая от компилятора). Для того чтобы получить случайное вещественное число в диапазоне от a до b, можно выполнить несложное преобразование:

double GetRand ( double a ,

double

b)

 

{

 

 

 

return (a + (b - a) *

rand ()

/

( RAND_MAX + 1.0) );

}

 

 

 

96

Однако возвращаемое значение будет по-прежнему распределено равномерно по отрезку (a, b). Приведем два способа задания случайной величины x с дифференциальной функцией распределения f(x) ≡ dP/dx на отрезке (a, b), где P – вероятность попасть в определенный интервал значений. Первый способ основан на дифференциальном распределении. Для этого не обязательно, чтобы функция f была нормирована на единицу, достаточно знать ее максимальное значение fmax. Тогда алгоритм будет следующим (рис. 5.13, а).

1.Выбираем случайное число x0 на отрезке (a, b).

2.Выбираем случайное число f0 от 0 до fmax.

3.Сравниваем f(x0) и f0. Если f0 > f(x0) (точка не попала под кривую

f(x), как точка p0, см. рис. 5.13, а), повторяем шаги 1 и 2. Если f0 ≤ f(x0)

(точка p1, см. рис. 5.13, а) возвращаем x0 в качестве случайной величины. Таким образом, мы бросаем случайные точки на плоскость (x, f(x)), пока одна из них не попадет под кривую f(x). Вероятность получить на выходе величину x0 пропорциональна отношению f(x0)/fmax, т. е. полученные

случайные значения будут иметь заданное распределение.

Второй способ задания случайной величины основан на интегральной

a)

б )

fmax Fmax

f(x)

 

 

 

F (x)

 

 

f0

p1

 

p0

F0

 

 

f1

 

 

 

 

 

a

x1

x

x0 b

0 a

x0

b

 

 

 

 

x

 

Рис. 5.13. Cпособы получения случайной величины с заданной функцией распределения

97

rx

функции распределения F (x) = f(x)dx(см. рис. 5.13, б ).

a

Нормировка также не обязательна, достаточно знать Fmax = F (b). Берем случайное значение F0 от 0 до Fmax и находим такое x0, что F (x0) = F0. Функция распределения вблизи x0 будет равна

dP

 

dP

(F0) ·

dF

 

f(x0)

 

(x0) =

 

 

(x0) =

 

.

dx

dF

dx

Fmax

Преимуществом интегрального метода является то, что требуется лишь одна итерация. Однако для большинства функций распределения не удается аналитически найти F (x) и решить уравнение F (x0) = F0, поэтому приходится хранить табулированные значения F (xi) и численно искать x0.

В случае если мы задаем скорости с максвелловским распределением, границы интервала значений a и b формально равны ±∞. На практике обычно ограничиваются интервалом шириной не более десяти тепловых скоростей, так как вероятность получить значение за его пределами ничтожно мала.

Граничные условия для сеточных кодов были рассмотрены в разд. 3.3. В PIC-кодах также могут ставиться периодические, открытые и отражающие граничные условия. Однако моделирование электромагнитных полей требует особой осторожности при задании открытой и отражающей границы, чтобы не допустить излучения ею электромагнитных волн в область моделирования либо отражения от нее электромагнитных волн. Во избежание этих эффектов граница считается проводящей и на ней фиксируется нулевая тангенциальная компонента электрического поля. Кроме того, вблизи границы часто вводится искусственная вязкость, приводящая к плавному затуханию волн. Обычно при обработке результатов небольшую приграничную область исключают из рассмотрения. Тем не менее, отражающие граничные условия в общем случае могут сказываться на корректности результатов моделирования, поэтому их влияние надо учитывать индивидуально для каждой задачи.

98

5.20.Основные принципы гибридных кодов: нормировка, уравнения, алгоритм

Гибридные коды во многом напоминают кинетические, поскольку ионы моделируются в них точно так же, как в PIC-кодах. Основное отличие заключается в представлении электронов, которые обычно считаются безмассовой нейтрализующей жидкостью. Впрочем, бывают коды и с электронами ненулевой массы. Они более устойчиво работают на участках малой плотности (см., например, [3]). Однако мы ограничимся приближением нулевой

массы.

Система уравнений гибридного кода выглядит следующим образом:

drp

= v;

 

 

 

 

 

 

 

 

 

 

(5.78)

dt

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

dvp

=

qp

 

 

(E +

vp

× B − ηj);

 

(5.79)

dt

mp

c

 

∂B

= −c × E;

 

 

 

 

(5.80)

 

 

 

 

 

 

∂t

 

 

 

 

× B =

 

 

 

 

 

(5.81)

 

 

 

 

j;

 

 

 

 

 

 

 

c

 

 

 

 

 

 

 

 

due

 

 

 

 

 

 

1

 

(5.82)

neme

 

 

=

−neeE +

 

je × B

− pe + eneηj;

dt

c

pe = nekTe;

 

 

 

 

 

 

 

(5.83)

je = −neeue,

 

 

 

 

 

(5.84)

j = je + ji;

 

 

 

 

 

 

 

(5.85)

ne = ni,

 

 

 

 

 

 

 

 

 

 

(5.86)

где mp – масса иона p-го сорта; qp – его заряд; rp – радиус-вектор; vp

скорость; e – модуль заряда электрона; ue – скорость потока электронов; pe – их давление, ji – плотность тока ионов; je – плотность тока электронов;

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

Предполагается, что размер ячейки много больше дебаевского радиуса, поэтому во всех ячейках выполняется условие квазинейтральности ne = ni

P

(или ne = s Zsns для многокомпонентной плазмы, где Zs – зарядовое число

99

s-го сорта частиц). Также в законе Ампера (5.81) пренебрегли током смещения 1/c (∂E/∂t). Если теперь подставить в уравнение Эйлера для электронов (5.82) нулевую массу me = 0, то получится алгебраическое уравнение для электрического поля (так называемый обобщенный закон Ома):

E = nee

cje × B − pe

+ ηj.

1

1

 

Выражая ток электронов как разность полного тока и тока ионов и подставляя полный ток из (5.81), получаем

E = nee

 

( × B) × B − cji × B − pe

+ ηj

(5.87)

1

 

1

1

 

 

В дальнейшем для краткости мы будем считать η = 0.

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

1 ∂E

| × B|;

c ∂t

c ∂t

 

c

j .

 

1 ∂E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Учитывая, что |∂E/∂t| ωpiE ωpivB/c, | × B| B/li, а j env, получим два условия: v c и va c, т. е. гибридные коды подходят для решения нерелятивистских задач.

Как и в PIC-кодах, в гибридных кодах удобно отнормировать все величины для уменьшения числа коэффициентов и работы с величинами порядка единиц и десятков. Поскольку моделирование проводится на ионных масштабах, удобно нормировать на ионные длины и частоты. Если в качестве базовых размерностей выбрать начальную плотность ρ0[г/см3], а также инерционную длину и гирочастоту протона li[см] и Ωi−1], то скорость будет

измеряться в альвеновских va. Единицы измерения магнитного поля пропор-

циональны ρ0va = B0/ 4π. Чтобы избавиться от лишних коэффициентов, можно выбрать в качестве единицы измерения магнитного поля B0, а электрического – B0va/c.

100

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]