Математическое моделирование в астрофизике. В 2 частях. Ч.2. Учебное пособие
.pdfгде ρ – плотность вещества; v – скорость потока вещества; e – удельная внутренняя энергия вещества; p – давление вещества; Φ – гравитационный потенциал; (ρvv) – формальная запись вектора с компонентами вида
∂(ρvivj)/∂xj.
Законы сохранения энергии и импульса излучения неявно учитывают движение среды: коэффициенты излучения и поглощения в правых частях
зависят от эффекта Доплера.
В одномерном статическом случае с изотропным излучением (например, в атмосфере звезды) выражения, описывающие перенос излучения, су-
щественно упрощаются: |
|
|
|
|
||
|
∂Fν |
|
∂Pν |
1 |
|
|
|
|
= 4πην − cχνEν, |
|
= − |
|
χνFν. |
|
∂z |
∂z |
c |
|||
Для вещества мы имеем семь неизвестных (плотность, три проекции скорости, плотность энергии, давление и температура) и семь уравнений (уравнение неразрывности, три проекции уравнения Эйлера, закон сохранения потока энергии, связь плотности энергии с температурой и скоростью, уравнение состояния). Для излучения мы имеем десять неизвестных (плотность энергии излучения, три проекции потока, шесть независимых компонент тензора давления) и всего четыре уравнения (закон сохранения энергии
итри проекции закона сохранения импульса). Для замыкания системы необходимо задать аналог уравнения состояния – тензор Эддингтона, который
идаст недостающие шесть уравнений, связав давление излучения с плотностью его энергии. Трудность заключается в том, что тензор Эддингтона в большинстве случаев неизвестен.
Часто используют диффузионное приближение, при котором излучение
изотропно: |
103 |
1/3 |
0 . |
|
Fij = |
||||
|
|
/ |
0 |
0 |
|
0 |
0 |
1/3 |
|
|
|
|
|
|
В случае направленного потока излучения, напротив, имеется только одна ненулевая компонента тензора Эддингтона: Fzz = 1.
Диффузионное приближение может быть использовано внутри излучающей области при условии, что ее размер существенно превышает длину
41
свободного пробега фотона. Излучение внутри абсолютно черного тела – пример области применимости диффузионного приближения. Приближение направленного потока действует в противоположном случае, когда рассеянием фотонов можно пренебречь. Однако часто бывают неприменимы оба этих подхода (например, вблизи границы излучающей области). В [9, 14] была предложена формула для тензора Эддингтона, сочетающая свойства диффузного и направленного излучения:
|
Fij = |
1 − ξ |
δij + |
3ξ − 1 |
ninj; |
|
|
|||||
|
|
2 |
|
2 |
|
|
|
|
||||
ξ = |
|
3 + 4f2 |
|
; f = |
|F | |
; ni = |
Fi |
. |
||||
|
|
|
|
|
|
|
||||||
|
|
|
|
|
||||||||
5 + 2 4 − 3f2 |
|
|
cE |
|F | |
||||||||
Этот подход, также |
называемый M1-приближением, используется в со- |
|||||||||||
p |
|
|
|
|
|
|
|
|
||||
временных РГД моделях С. И. Блинникова с соавторами [3,18].
3.3. Оценка динамической значимости излучения
Радиационно-гидродинамические коды сложны и ресурсоемки, поэтому применять их следует только при моделировании систем, где излучение динамически значимо. В противном случае разумно моделировать структуру объекта гидродинамическим или магнитогидродинамическим (МГД) кодом, а затем воспользоваться результатами для моделирования его излучения. Для оценки динамической значимости излучения используют два безраз-
мерных параметра.
1. |
Отношение плотностей энергии: |
|
|
|
|
|
|
|
|||||
|
R = |
плотность энергии вещества |
|
= |
23nkT |
= |
0,028n |
. |
|||||
|
плотность энергии излучения |
|
|
|
|
||||||||
|
|
|
aRT 4 |
|
T 3 |
||||||||
2. |
Отношение потоков энергии (число Больцмана): |
|
|
||||||||||
|
|
|
ρCpT v 4ρT Cpv v |
|
|
|
|||||||
|
|
B = |
|
= |
|
|
|
R. |
|
|
|
||
|
|
σRT 4 |
aRT 4c |
c |
|
|
|
||||||
Для того чтобы излучение было динамически незначимо, необходимо, чтобы оба этих числа были много больше единицы. Очевидно, что определяющим параметром является B, поскольку оно не превосходит R (а в большинстве случаев существенно меньше него).
42
Радиационно-гидродинамический подход необходимо использовать при моделировании строения звезд, вспышек сверхновых, плотного звездного ветра массивных звезд, радиативных ударных волн, аккреционных дисков и протозвезд.
3.4. Дискретизация уравнений РГД
Приведем пример системы уравнений РГД для сферически-симметричной
модели звезды. Будем работать в рамках диффузионного (чернотельного) приближения без рассеяния и считать излучение локально термодинамически равновесным, т. е. полностью определяющимся температурой и коэффициентом поглощения в данной точке. Тогда система (3.3) может быть преобразована к виду
|
∂ρ |
|
|
1 |
|
∂r2ρu |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
+ |
|
|
|
|
|
|
|
|
|
|
= 0, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
∂t |
r2 |
|
|
|
|
|
|
∂r |
|
|
|
∂P Gρm 4π |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||
∂ρu 1 ∂r2ρu2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ |
|
|
|
|
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
ρκHH = 0, |
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
∂t |
|
|
|
|
r |
|
|
|
|
|
∂r |
|
|
|
|
|
|
∂r |
|
|
|
|
|
|
r |
|
|
|
− c |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
1 ∂r ρeu |
|
|
|
1 ∂r u |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
∂ρe |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ P |
|
|
|
|
|
|
|
|
|
+ 4πρ(κJ J |
|
|
κSS) |
|
|
ρϵnuc = 0, |
|
(3.4) |
||||||||||||||||||||
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||
|
∂t |
|
|
|
r |
|
|
|
|
|
∂r |
|
|
|
|
|
|
|
r |
|
∂r |
|
|
|
|
|
|
|
|
|
|
|
|
− |
|
|
|
|
|
|
− |
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
∂J |
+ |
|
|
1 |
|
|
∂r2Ju |
+ |
|
1 |
|
∂r2H |
+ |
|
1 |
K |
1 |
|
∂r2u |
|
|
1 |
|
3K − J |
u + ρ(κJ J |
|
κSS) = 0, |
||||||||||||||||||||||||||||||||
|
|
|
|
2 |
|
|
2 |
|
|
|
|
|
|
|
|
2 |
|
|
− c |
|
− |
|||||||||||||||||||||||||||||||||||||||||
c ∂t |
|
|
|
|
r ∂r |
|
|
|
|
|
r ∂r |
|
|
|
|
c r ∂r |
|
|
|
|
r |
|
|
|
||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 1 |
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
1 |
|
1 |
|
|
|
2 |
|
|
|
|
|
||||||||||||
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ |
|
+ |
|
|
|
|
|
− |
+ |
|
H |
|
|
|
|
|
|
|
|
+ ρκHH = 0, |
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
c r |
|
|
|
∂r |
|
|
|
∂r |
|
|
|
|
|
|
r |
|
|
|
|
c |
|
r |
|
|
∂r |
|
|
|
|
|
|||||||||||||||||||
c ∂t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||
|
|
|
∂H |
|
|
|
|
|
|
|
|
∂r Hu |
|
|
|
∂K |
|
|
|
K |
J |
|
|
|
|
|
|
|
|
|
∂r u |
|
|
|
|
|||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
dr′ – масса внутри радиуса r; S – интегральная по частоте |
|||||||||||||||||||||||||||||||||||||||
где m = r |
|
4πρr′ |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
функция источника; ϵnuc – удельное энерговыделение ядерных реакций; J,
H и K – моменты удельной интенсивности излучения. Они определяются следующим образом:
{ |
J, H, K |
} |
= |
1 |
w∞ |
J, H, K |
} |
νdν = |
|
1 |
w∞dν w1 Iν(r, µ, t)µ{0,1,2}dµ. |
(3.5) |
|||
2 |
|
|
|||||||||||||
|
|
{ |
|
|
2 |
−1 |
|
||||||||
|
|
|
|
|
0 |
|
|
|
0 |
|
|||||
Взвешенные значения коэффициента поглощения, необходимые для уче- |
|||||||||||||||
та взаимодействия излучения с веществом |
|
|
|
||||||||||||
|
|
|
|
|
|
κ{J, H, S} = w∞κν |
{J, H, S}ν |
dν. |
(3.6) |
||||||
|
|
|
|
|
|
|
|
0 |
|
|
|
{J, H, S} |
|
||
43
Подынтегральное выражение в (3.6) содержит неизвестные значения J,
H и S, что делает систему (3.4) интегро-дифференциальной. Однако при моделировании областей звезды, отстоящих от границы далее нескольких длин свободного пробега фотона, обычно допустимо воспользоваться приближением абсолютно черного тела. Тогда вместо Iν в (3.5) подставляется формула Планка (3.1) c температурой, соответствующей температуре в данной ячейке на предыдущем шаге. При этом средняя интенсивность излучения равна удельной (Jν = Bν), и можно получить планковское среднее значение коэффициента поглощения:
r∞
κνBνdν κP = 0 r∞ .
Bνdν
|
|
|
0 |
|
|
|
|
|
При вычислении κH корректнее использовать росселандово среднее: |
||||||||
|
|
r∞ |
1 |
∂B∂Tν dν |
||||
1 |
|
κν |
||||||
|
|
= |
0 |
|
|
. |
||
|
κR |
r∞ |
∂Bν |
dν |
||||
|
|
|
∂T |
|
||||
|
|
|
0 |
|
|
|
|
|
Существуют базы данных, где хранятся таблицы значений κP и κR для различных значений температуры и плотности вещества, а также для различных химических составов. Например, открытая база данных OPAL содержит значение росселандова среднего, а также табулированное уравнение состояние вещества в виде адиабатического индекса γ(ρ, T ).
Корректнее использовать κP вместо κ{J, S} и κR вместо κH. Однако подстановка росселандова среднего вместо κ{J, S} влияет на точность решения значительно меньше, нежели замена подынтегральных значений J, H и S
чернотельными аппроксимациями. Поэтому допустимо считать все коэффициенты поглощения в системе (3.4) равными росселандову среднему. Следует отметить, что описанный подход имеет ограниченную область применимости. Существуют и более точные оценки поглощения среды, например, приближение серой непрозрачности [5], где учитывается расширение поглощающей оболочки.
44
При пространственной дискретизации системы уравнений РГД используется метод конечных объемов (значения ρ, P , e и J задаются в центрах ячеек, значения u и H – на границах). Также система центрируется по вре-
мени, т. е. уравнения вида |
∂h |
|
= H (t) преобразуются к виду |
|||||||
∂t |
||||||||||
|
|
|
|
|
|
|
||||
|
h(t + k) − h(t) |
= |
H (t + k) + H (t) |
. |
||||||
|
|
|
|
|
||||||
|
|
k |
2 |
|
||||||
При этом уравнения записываются в консервативной форме: |
||||||||||
|
|
∂ |
w |
ρdV + w ρudA = 0 |
||||||
|
|
|
||||||||
|
|
∂t |
|
∂V |
||||||
|
|
|
|
V |
|
|||||
.
При оценке потоков F на границе может быть использован адаптированный метод Римана [3]:
F = FHLLcorr + Fadv,
где Fadv – поток, связанный с движением среды; FHLLcorr – модифицированный HLL-решатель Римана:
FL, |
λmin ≥ 0, |
|
|
|
|
|
λminFR + δλminλmax(UR |
|
UL ) |
λmaxFL |
|
|||
|
λmax ≤ 0, |
|
|
|
FHLLcorr = FR, |
− |
, λmin < 0 < λmax, |
||
|
− |
λmax − λmin |
||
|
|
|
|
|
где UL, UR, FL, FR – значения произвольной физической величины и ее потока слева и справа от границы ячейки; δ – численный фактор, зависящий от оптической толщи соседних ячеек; λmin, λmax – минимальное и максимальное собственные числа матрицы, получающейся при линеаризации системы уравнений РГД. Пример линеаризации задачи Римана рассмотрен в первой части данного пособия.
После дискретизации система дифференциальных уравнений на сетке преобразуется в систему алгебраических уравнений размерности N×M, где
N – количество ячеек; M – количество неизвестных в каждой ячейке. Полученную систему следует решать согласованно на всей сетке, поскольку излучение связывает все части системы.
45
3.5. Итерационное решение систем алгебраических уравнений Ньютона
Обозначим дискретную систему уравнений РГД:
G( Xl ) = 0, l = 1 . . . N, |
(3.7) |
где X = Xl(n) = (ρ(ln), u(ln), Jl(n)...) – вектор физических величин размерности
M, а Xl = 0,5(X(t + k) + X(t)). Мы ищем X(t + k), зная X(t).
Одним из методов решения таких задач является неявный метод Ньютона, который в случае одного уравнения называется также методом касательных.
Он имеет простую геометрическую интерпретацию (рис. 3.1). Найдем решение уравнения f(x) = 0, стартуя с начальной догадки x = x0. Проведем касательную к f(x) в этой точке и найдем x1 на пересечении данной касательной с осью абсцисс. Далее находим xn+1 = xn − f(xn)/f′(xn) до достижения заданной точности (|xn+1 − xn| < ε или |f(xn+1)| < ε).
f |
|
|
|
x3 |
x1 |
x0 |
x2 |
x |
|
||
Рис. 3.1. Решение уравнения f(x) = 0 методом Ньютона |
||
46
Для систем метод работает аналогично. Пусть имеется система уравнений вида
f1(x1, x2, ..., xn) = 0,
f2(x1, x2, ..., xn) = 0,
...
fn(x1, x2, ..., xn) = 0.
Предположим, что xk = x0k и найдем x методом последовательных приближений, решая систему линейных уравнений
n |
∂f |
|
|
Xk |
i |
j+1 |
j |
fi + |
|
(xk |
− xk) = 0, |
∂xk |
|||
=1 |
|
|
|
где j – номер итерации. |
|
|
|
Рассмотрим применение метода Ньютона для решения дискретной си-
стемы уравнений РГД. Разложим систему (3.7) в ряд Тейлора:
G(X(j+1)) = G(X(j)) + |
∂G |
(X(j+1) − X(j)) = 0. |
|
||
∂X(j) |
Будем считать, что X(j+1) является ее решением, т. е. G(X(j+1)) = 0.
Тогда приращение решения находится методом последовательных приближений до достижения заданной точности:
|
|
|
− Xj = − |
∂G |
|
−1 |
|
|
δX ≡ Xj+1 |
|
G(X(j)), |
||
|
|
∂X |
||||
где |
∂G |
– матрица Якоби. |
|
|
|
|
∂X |
|
|
|
|
||
|
|
|
|
|
|
Упражнения
1.Найти зависимость интенсивности излучения от оптической толщи при распространении света в оптически плотной не излучающей среде: аналитически и численно методом Рунге-Кутты 4-го порядка. Сравнить результаты. Считать I|τ=0 = 1, т. е. нормировать на начальную интенсивность.
2.Оценить и сравнить параметр R (отношение энергии вещества к энергию излучения) в центре Солнца и в центре звезды класса O (плотность порядка 3 г/см3, температура порядка 4·107 K). Сделать вывод о динамической значимости излучения в этих объектах.
47
3.Найти в интернете базу данных непрозрачности (opacity) OPAL, по ней определить росселандово среднее значение непрозрачности для следующих параметров среды: солнечный состав (70 % водорода, 28 % гелия по массе); температура – 107 K; плотность – 10 г/см3.
4.Решить методом Ньютона уравнение cos2(x) = x2 − x3.
4.ОПТИМИЗАЦИЯ, ВЕКТОРИЗАЦИЯ
ИПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
Большинство описанных в данном пособии кодов отличаются высокой ресурсоемкостью, и их использование на персональных компьютерах ограничено. Чаще всего моделирование астрофизических объектов производится на специализированных вычислительных машинах. Однако для рационального использования многопроцессорных вычислительных комплексов код необходимо организовать особым образом. В этой главе изложены основные принципы оптимизации и параллельных вычислений.
4.1. Основные принципы оптимизации вычислений
Прежде чем переходить к параллельным вычислениям, следует оптимизировать код, т. е. максимально увеличить скорость расчетов без потери точности. В этом разделе мы рассмотрим несколько типовых ошибок, способных существенно замедлить счет. Будут приведены примеры оптимизации программ на языке C++ с использованием компилятора g++ операционной системы Ubuntu. Другим часто используемым в науке языком программирования является Fortran. Вычисления на этом языке во многих случаях работают быстрее аналогичных вычислений на C++, который является более гибким и функциональным в использовании. В частности, С++ позволяет использовать методы объектно-ориентированного программирования.
Следует отметить, что интерпретатор популярного высокуровневого языка программирования Python оптимизирует код автоматически, однако использование высокуровневых языков программирования значительно
48
снижает скорость работы программы и увеличивает расход оперативной памяти. Однако Python может использоваться для создания удобной пользовательской оболочки ресурсоемких астрофизических кодов, написанных на низкуровневых языках.
При оптимизации необходимо измерять время работы программы. Для этого будем использовать библиотеку <time.h>, содержащую несколько удобных функций измерения времени. Во второй главе рассматривалась функция time_t time(time_t *tp), возвращающая время в секундах, прошедшее с полуночи 01.01.1970 (или −1, если оно неизвестно). Обычно тип time_t
является целочисленным (int или long int). Если указатель tp не равен
NULL, то возвращаемое значение записывается также и в *tp. Во второй главе использовалась функция time(NULL), так как возвращаемое значение требовалось только для инициализации случайной последовательности и далее не использовалось.
Функция time дает результат с точностью до секунды, что в принципе может быть достаточно для отладки медленно работающих кодов. Находить разницу двух времен в секундах в вещественном формате удобно с помощью функции double difftime(time_t t2, time_t t1). Более точной является функция clock_t clock(void), которая возвращает время от начала выполнения программы, измеряемое в тактах процессора (или
−1, если оно неизвестно). Для пересчета в секунды используется константа CLOCKS_PER_SEC. Время в секундах выражается как tsec = clock()/ CLOCKS_PER_SEC. Поскольку CLOCKS_PER_SEC много больше единицы, время измеряется с высокой точностью.
В качестве примера нерационально написанной программы приведем отрывок кода на C++, вычисляющий суммарную кинетическую энергию миллиарда частиц без учета одной (листинг 4.1). Похожая программа может понадобиться, например, при обработке экспериментальных данных. Если известно, что для некоторых частиц данные измерены ошибочно, они не должны быть включены в рассмотрение. В данном примере скорости частиц задаются в самой программе.
49
Листинг 4.1. Пример программы для оптимизации скорости счета
|
|
|
|
|
|
|
на языке С++ |
||
1 |
# include |
" time .h" |
|
|
|||||
2 |
# include |
" math .h" |
|
|
|||||
3 |
# include |
" stdio .h" |
|
|
|||||
4 |
|
|
|
|
|
|
|
|
|
5 |
int |
NP |
= |
1000000000; |
|
|
|||
6 |
|
|
|
|
|
|
|
|
|
7 |
int |
main ( int |
argc , char ** |
argv ) |
|||||
8 |
{ |
|
|
|
|
|
|
|
|
9 |
float |
m |
|
= |
1; |
|
|
|
|
10 |
double |
v |
= |
0; |
|
|
|||
11 |
double |
E |
= |
0; |
|
|
|||
12 |
time_t t1 = time ( NULL ); |
|
|||||||
13 |
for ( int |
i |
= |
0; i < |
NP ; |
i ++) |
|||
14 |
{ |
|
|
|
|
|
|
|
|
15 |
|
if |
(i |
|
!= |
5000000) |
|
|
|
16 |
|
{ |
|
|
|
|
|
|
|
17 |
|
v |
= |
|
v |
+ |
1; |
|
|
18 |
|
E += |
|
m |
* |
pow (v , |
2) / |
2; |
|
19}
20}
21time_t t2 = time ( NULL );
22printf (" total work time = %f seconds \n",
23difftime (t2 , t1));
24}
Влистинге 4.1 измеряется и выводится на экран время выполнения основного цикла по всем частицам. На компьютере автора оно оказалось равно 13 секундам. Однако это значение зависит от текущей тактовой частоты процессора и наличия фоновых процессов. Поэтому при оптимизации следует измерить время выполнения цикла несколько раз, как в листинге 4.2.
50
