Вы находитесь на странице: 1из 30

Институт проблем механики

Российской Академии Наук

С. Д. Алгазин

ЧИСЛЕННЫЕ АЛГОРИТМЫ КЛАССИЧЕСКОЙ


МАТФИЗИКИ.

IV. Уравнение Пуассона.

Препринт № 698

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

The summary.
The Poisson equation in Torres and appearance of a body of rotation
is considered. The numerical algorithms without saturation are
constructed. The fast transformation Fourier is applied to the solution of
the appropriate discrete problem. It allows deciding an equation Poisson
faster, than the matrix of a discrete problem is multiplied on vector. The
programs on a Fortran are resulted.

055(02)2  Институт проблем механики РАН 2002

2
Введение.
Этот препринт продолжение серии препринтов [1-3]. Он
посвящён описанию программного комплекса для численного
решения трёхмерного уравнения Пуассона в торе и внешности тела
вращения. Сами алгоритмы описаны в [4-6]. Суть приведённых
алгоритмов состоит в следующем: на основе теории h-матрицы,
построенной в [6] строится дискретное уравнение Пуассона, которое
наследует свойство разделения переменных дифференциальной
задачи; для умножения полученной матрицы дискретной задачи на
вектор применяется быстрое преобразование Фурье. Таким образом,
дискретное уравнение Пуассона решается быстрее, чем матрица
дискретной задачи умножается на вектор. Точное количество
операций подсчитано в [4-6]. Заметим также, что применение
названного метода дискретизации позволяет также создать
экономные по памяти алгоритмы.
I. Уравнение Пуассона в торе.

При расчете движения пучка заряженных частиц (плазмы)


в самосогласованном электрическом поле требуется на
каждом шаге по времени пересчитывать потенциал
электрического поля, т. е. решать, уравнение Пуассона. Для
того чтобы расчет проводился за приемлемое время,
необходим быстрый алгоритм решения уравнения Пуассона.
В особенности это актуально для трехмерных задач. В этом
параграфе описывается алгоритм, которым дискретное
уравнение Пуассона в торе решается за O( N r2 Nθ2 N log N )
операций, где N r , Nθ , N число узлов сетки по переменным r, θ,
φ некоторой криволинейной системы координат.

3
Постановка задачи и дискретизация. Пусть рассматриваемый
тор Т получается вращением круга единичного радиуса вокруг оси
z некоторой декартовой системы координат (x, y, z). Причем центр
круга лежит в плоскости (x, у) на расстоянии R от оси z и плоскость
круга перпендикулярна плоскости (х, у).
Рассмотрим в этой области, например, задачу Дирихле для
уравнения Пуассона
∂ 2u ∂ 2u ∂ 2u
+ + = f ( x, y, z), ( x, y, z) ∈ T , u ∂G = 0.
∂x 2 ∂y 2 ∂z 2

В криволинейных координатах (r, θ, φ), связанных с декартовой


системой координат (x, у, z) соотношениями
x = ( R − r cosθ ) cos ϕ , y = ( R − r cosθ ) sin ϕ , z = r sin θ ,
0 ≤ ϕ < 2π , 0 ≤ θ < 2π , 0 ≤ r ≤ 1

оператор Лапласа
Δu=div grad u

записывается в виде
uϕ′′ 2 uθ′ sin θ − r u r′ cosθ
∆u = ∆ r ,θ u + + ,
( R − r cosθ ) 2
r ( R − r cosθ )
1 1
∆ r ,θ = (r u r′ )′r + 2 uθ′′2 .
r r

Для построения дискретного Лапласиана в торе рассмотрим


вспомогательную спектральную задачу
(1a ) ∆u (r ,θ , ϕ ) + λu (r ,θ , ϕ ) = 0, (r ,θ , ϕ ) ∈ T ,
(1б ) u r =1 = 0.

Здесь можно отделить переменную по φ в представить собственную


функцию в виде

u k (r ,θ , ϕ ) = vk (r ,θ )e ikϕ , k = 0, ± 1, ± 2, ... ,

где функция vk(r,θ) удовлетворяет уравнению


4
vk′ θ sin θ − rvk′ r cosθ k 2 vk
(2a ) ∆ r ,θ vk + − + λvk = 0,
r ( R − r cosθ ) ( R − r cosθ ) 2
(2б ) vk |r =1 = 0.

Построим дискретизацию спектральной задачи (2). Для этого введем


сетку по переменным (r, θ), состоящую из точек (rν,θp):
(2ν − 1)π 2πp
(3) rν = cos , ν = 1,2,..., N r , θ p = , Nθ = 2nθ + 1, p = 0,1,...,2nθ .
4Nr Nθ

Для дискретизации на этой сетке плоского оператора Лапласа Δrθ


применим методику, описанную в [6], а для дискретизации
младших членов в (2а) применим интерполяционную формулу из
[7]. При этом значения производных по r и θ в узлах сетки получаем
дифференцированием указанной интерполяционной формулы. В
результате получаем приближенную дискретную задачу на
собственные значения:
Λ k vk + λvk = 0,

где Λk - матрица размера m × m, m = N r Nθ , vk ∈ R m - вектор,


компоненты которого содержат приближенные значения
соответствующей собственной функции краевой задачи (2) в узлах
сетки (3). При этом узлы нумеруются, начиная с первой окружности
ν=1, против часовой стрелки р=0, 1, ..., 2пθ. Теперь для
дискретизации спектральной задачи (2) введем по φ сетку из N точек
2πq
ϕq = , q = 0,1,...,2n,
N

и, учитывая сказанное в [6], получаем приближенную задачу на


собственные значения в виде h-матрицы:

Hu+λu=0.

5
Здесь u ∈ R M , M = mN - вектор, компоненты которого содержат

приближенные значения соответствующей собственной функции в


узлах сетки. Причем узлы (rν, θp, φq ) нумеруются в следующем
порядке; ν=1,2,…,Nr , р=0,1,…,2nθ , q=0,1,…,2n, т. е. быстрее всего
меняется индекс ν, затем р и Q. Оценка погрешности описанного
приближенного метода решения спектральной задачи (1) получается
стандартным способом. После того как дискретный Лапласиан
построен, для приближенного решения уравнения Пуассона
требуется решить систему линейных уравнений

(4) Hu=f.
Здесь u, f ∈ R M , M = mN - векторы, компоненты которых содержат
приближенные значения решения уравнения Пуассона и его правой
части в узлах сетки. Оценка погрешности отклонения решения
дискретного уравнения Пуассона от точного может быть получена
стандартным способом. Отметим только некоторые качественные
особенности. Применяемая дискретизация основана на
интерполировании решения многочленами (алгебраическими и
тригонометрическими). Известно [8], что точность этой
интерполяции тем выше, чем глаже интерполируемая функция.
Таким образом, описанный алгоритм не имеет насыщения.
Указанное обстоятельство позволяет проводить расчеты уравнения
Пуассона с гладкой правой частью на редкой сетке.
Быстрое решение дискретного уравнения Пуассона. Для того
чтобы решить дискретное уравнение Пуассона (4), необходимо
обратить h-матрицу Н. Это делается по формуле, приведённой в [6].
Затем производится быстрое умножение этой матрицы на вектор
(см. [4]).

6
Например, при N=27 требуется 678 N r2 Nθ2 + 271N r Nθ операций, а
прямое умножение матрицы H-1 на вектор требует
1458 N r2 Nθ2 − 27 N r Nθ операций. При больших Nr и Nθ экономия
составляет около 53% операций.
Для того чтобы убедиться в устойчивости предложенного метода,
следует оценить норму матрицы H-1. Обозначим через ||.||2
спектральную норму матрицы. Тогда
H −1 2
= max Λ−k1
2

Вычисления при R=5 показывают, что максимум достигается при k =


0, слабо зависит от числа узлов по переменным (r, θ) и имеет
значение, близкое к 0.1928.
Заключение. Применение дискретного преобразования Фурье
для быстрого решения уравнения Пуассона в классическом
двумерном случае [9] основано на том, что разностный оператор
Лапласа наследует вид собственных функций оператора Лапласа.
Настоящая работа основана на аналогичном приеме: h-матрица
наследует спектральные свойства двумерного и трехмерного
оператора Лапласа. Для примера рассмотрено уравнение Пуассона в
торе, но аналогичные результаты справедливы и для других задач, в
результате дискретизации которых получается конечномерная
задача с h-матрицей.
II. Описание программного комплекса для решения
уравнения Пуассона в торе.
Решает поставленную задачу программа TOR5.

PROGRAM TOR5
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A0(3025),DR(3025),U(495),F(495)
DIMENSION A1(3025),A2(3025),A3(3025),A4(3025)
7
DIMENSION C0(81),C1(81),C(81)
DIMENSION DT(11,11)
C
C WRITE(5,*) 'M = ? '
C READ(5,*) M1
C WRITE(5,*) 'N = ? '
C READ (5,*) N
M1=5
N=11
C
C KAHAЛ BBOДA ДAHHЫX
NREAD = 3
OPEN(UNIT=3,FILE='DATA')
C KAHAЛ ПPOMEЖУTOЧHЫX BЫДAЧ
NOUT = 4
OPEN(UNIT=4,FILE='NOUT')
C
IM = 0
300 IM = IM + 1
IF (IM.GT.10) STOP
READ(NREAD,*) M
C
NT=M*N
NM=(N-1)/2
M2=M*M
C
READ (NREAD,*) (C0(I),I=1,M2)
READ (NREAD,*) (C1(I),I=1,M2)
IF (M1.NE.M) GO TO 300
WRITE (NOUT,*) ' M = ', M
WRITE(NOUT,*) 'LAMDA0'
WRITE(NOUT,*) (C0(I),I=1,M2)
WRITE(NOUT,*) 'LAMDA1'
WRITE(NOUT,*) (C1(I),I=1,M2)
C
CALL HMATR (A0,M,N,C0,C1,C)
CALL RASPAK(A0,M,NM)
CALL TRANSP (A0,NT)
NT2=NT*NT
DO 1 I=1,NT2
A0(I)=-A0(I)

8
A1(I)= A0(I)
A2(I)= A0(I)
A3(I)= A0(I)
1 A4(I)= A0(I)
C
RB=5.D0
C
CALL TOR (A0,M,N,NT,0,RB,DT,DR)
CALL TOR (A1,M,N,NT,1,RB,DT,DR)
CALL TOR (A2,M,N,NT,2,RB,DT,DR)
CALL TOR (A3,M,N,NT,3,RB,DT,DR)
CALL TOR (A4,M,N,NT,4,RB,DT,DR)
C
CALL DMINV (A0,NT,DET,U,F)
CALL DMINV (A1,NT,DET,U,F)
CALL DMINV (A2,NT,DET,U,F)
CALL DMINV (A3,NT,DET,U,F)
CALL DMINV (A4,NT,DET,U,F)
C
PI=3.141592653589D0
C
IJ=0
DO 10 NU=1,M
R=COS((2.D0*NU-1.D0)*PI/4.D0/M)
DO 10 L=1,N
T=2.D0*(L-1)*PI/N
DO 10 LF=1,9
FI=2.D0*(LF-1)*PI/9.D0
IJ=IJ+1
X=(RB-R*COS(T))*COS(FI)
Y=(RB-R*COS(T))*SIN(FI)
Z=R*SIN(T)
S=X**2+Y**2+Z**2-RB**2-1.D0
F(IJ)=S**2-4.D0*RB**2*(1.D0-Z**2)
10 U(IJ)=12.D0*S+8.D0*(X**2+Y**2+Z**2)+8.D0*RB**2
NG=NT*9
WRITE (NOUT,*) 'Точное значение'
WRITE (NOUT,12) (F(I),I=1,NG)
WRITE (*,*) 'Точное значение'
WRITE (*,12) (F(I),I=1,NG,9)
C
CALL DIVH (NT,2,A0,A1,A2,A3,A4,U,F)
9
C
WRITE (NOUT,*) 'Вычисленное значение'
WRITE (NOUT,12) (F(I),I=1,NG)
WRITE (*,*) 'Вычисленное значение'
WRITE (*,12) (F(I),I=1,NG,9)
12 FORMAT (4E18.11)
STOP
END

Эта программа решает уравнение Пуассона в торе (радиус


большого круга RB=5 задаётся в программе, радиус малого круга
равен 1) на сетке M1=5, N=11, т.е. в малом круге выбирается сетка
из 5 окружностей по 11 точек на каждой окружности (эти параметры
можно изменить). В большом круге выбирается сетка из 9 точек
(стандартная). Программа считывает начальные данные из файла
DATA [1].
Требуемые программы: HMATR, RASPAK, TRANSP, DMINV,
TOR, DIVH.
RASPAK, TRANSP (см. [1]); DMINV (вариант с двойной
точностью программ MINV [10]). Тексты остальных программ
приводятся ниже.

SUBROUTINE HMATR (H,M,N,LAMDA0,LAMDA1,C)


IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION
H(1),C(M,M),R(15),LAMDA0(M,M),LAMDA1(M,M)
REAL*8 LAMDA0,LAMDA1
INTEGER P
PI=3.141592653589D0
DO 4 I=1,M
4 R(I)=1./COS((2.*I-1.)*PI/4./M)**2
NM=(N+1)/2
I0=0
DO 1 NU=1,M
DO 1 MU=1,M
DO 1 L=1,NM
10
I0=I0+1
1 H(I0)=LAMDA0(NU,MU)/N
NM1=NM-1
DO 2 K=1,NM1
KK=K-2*(K/2)
IF(KK.EQ.0) GO TO 10
GO TO 11
10 DO 5 NU=1,M
DO 5 MU=1,M
C(NU,MU)=LAMDA0(NU,MU)
IF(NU.EQ.MU) C(NU,MU)=C(NU,MU)+4.*(K/2)**2*R(NU)
5 CONTINUE
GO TO 12
11 DO 6 NU=1,M
DO 6 MU=1,M
C(NU,MU)=LAMDA1(NU,MU)
IF(NU.EQ.MU) C(NU,MU)=C(NU,MU)+4.*(K/2)*(K/2+1)*R(NU)
6 CONTINUE
12 I0=0
DO 3 NU=1,M
DO 3 MU=1,M
I2=0
DO 3 P=1,NM
I0=I0+1
H(I0)=H(I0)+(2./N)*C(NU,MU)*COS(K*2.*PI*I2/N)
3 I2=I2+1
2 CONTINUE
RETURN
END

Описание параметров:
H – выходной массив длины m2(n+1);
M – m (число окружностей сетки);
N=2n+1 – число точек на каждой окружности;
LAMDA0, LAMDA1 – входные массивы размерности m x m, таблицы
которых приведены в файле DATE [1];
C – рабочий массив m x m.

11
SUBROUTINE TOR (A,M,N,NT,K,RB,DDT,DDR)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A(NT,NT),DDT(N,N),DDR(NT,NT)
DIMENSION A1(81),A2(81)
INTEGER P
CALL DT(N,DDT)
CALL DR(M,N,NT,DDR,A1,A2)
PI=3.141592653589D0
I=0
DO 1 MU=1,M
RMU=COS((2.D0*MU-1.D0)*PI/4.D0/M)
DO 1 P=1,N
SP=SIN((P-1.D0)*2.D0*PI/N)
CP=COS((P-1.D0)*2.D0*PI/N)
I=I+1
J=0
DO 1 NU=1,M
DO 1 L=1,N
D=RB-RMU*CP
J=J+1
IF(NU.NE.MU) GO TO 2
A(I,J)=A(I,J)+SP*DDT(P,L)/RMU/D
2 CONTINUE
A(I,J)=A(I,J)-CP*DDR(I,J)/D
IF(I.EQ.J) A(I,J)=A(I,J)-K*K/D**2
1 CONTINUE
RETURN
END

Описание параметров:

A – двумерный массив размер NT x NT, содержащий на выходе


клетку соответствующей h-матрицы;
M – m (число окружностей сетки в малом круге);
N=2*n+1 – число точек на каждой окружности в малом круге;
NT=M*N – число точек в малом круге;
K – номер клетки h-матрицы (в данном случае K=0,1,2,3.4);
RB – радиус большого круга;
DDT – рабочий массив размера N x N;
12
DDR – рабочий массив размера NT x NT;

Вызываемые подпрограммы : DT, DR.

SUBROUTINE DT(N,D)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION D(N,N)
PI=3.141592653589D0
NM=(N-1)/2
DO 1 I=1,N
DO 1 J=1,N
P=0.D0
DO 2 K=1,NM
2 P=P+K*SIN(K*2.D0*PI*(I-J)/N)
1 D(I,J)=-2.D0*P/N
RETURN
END

Описание параметров:

N – число узлов сетки по окружности в малом круге;


DT - матрица дифференцирования по θ.

SUBROUTINE DR(M,N,NT,D,A1,A2)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION D(NT,NT),A1(M,M),A2(M,M)
INTEGER P,DELTA
CALL A1A2 (M,A1,A2)
PI=3.141592653589D0
NM=(N-1)/2
I=0
DO 1 MU=1,M
DO 1 P =1,N
I=I+1
J=0
DO 1 NU=1,M
DO 1 L =1,N
13
J=J+1
IF(P.EQ.L) DELTA=1
IF(P.NE.L) DELTA=0
DN=0.5D0
DO 2 K=1,NM
2 DN=DN+(-1)**K*COS(K*2.D0*PI*(P-L)/N)
1 D(I,J)=A1(MU,NU)*DELTA-2.D0*A2(MU,NU)*DN/N
RETURN
END

Описание параметров:

M – m (число окружностей сетки в малом круге);


N=2*n+1 – число точек на каждой окружности в малом круге;
NT=M*N – число точек в малом круге;
D - выходной массив размера NT x NT, содержащий на выходе
матрицу дифференцирования по r;
A1, A2 – рабочие массивы размера M x M.

Вызываемые подпрограммы : A1A2.

SUBROUTINE A1A2 (M,A1,A2)


IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A1(M,M),A2(M,M)
INTEGER S
PI=3.141592653589D0
M1=2*M-1
DO 1 MU=1,M
PM=(2.D0*MU-1.D0)*PI/4.D0/M
SP=SIN(PM)
DO 1 NU=1,M
PN=(2.D0*NU-1.D0)*PI/4.D0/M
P1=0.D0
P2=0.D0
DO 2 S=1,M1
P1=P1+S*COS(S*PN)*SIN(S*PM)/SP
2 P2=P2+S*(-1)**S*COS(S*PN)*SIN(S*PM)/SP
A1(MU,NU)=P1/M
14
1 A2(MU,NU)=-P2/M
RETURN
END

Описание параметров:
M – m (число окружностей сетки в малом круге);
A1, A2 – выходные массивы размера M x M.

SUBROUTINE DIVH (M,R,C0,C1,C2,C3,C4,F,U)


IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION C0(M,M),C1(M,M),C2(M,M),C3(M,M),
*C4(M,M),F(1),U(1)
DIMENSION RL(0:4),AM(0:4),BM(4),FR(0:8),UR(9)
COMPLEX*16 A(0:8)
INTEGER R
N=3**R
NM=(N-1)/2
NT=M*N
DO 1 I=1,NT
1 U(I)=0.D0
DO 2 MU=1,M
DO 3 I=1,N
3 FR(I-1)=F((MU-1)*N+I)
CALL FUR(2,A,FR,1)
AM(0)=REAL(A(0))/N
DO 6 I=1,NM
AM(I)=2.D0*REAL(A(I))/N
6 BM(I)=2.D0*AIMAG(A(I))/N
DO 2 NU=1,M
RL(0)=C0(NU,MU)
RL(1)=C1(NU,MU)
RL(2)=C2(NU,MU)
RL(3)=C3(NU,MU)
RL(4)=C4(NU,MU)
CALL DIVHM1 (2,RL,AM,BM,UR)
DO 4 I=1,N
4 U((NU-1)*N+I)=U((NU-1)*N+I)+UR(I)
2 CONTINUE
RETURN
END
15
Эта программа производит умножение h-матрицы на вектор при
помощи быстрого преобразования фурье.
Описание параметров:
M – размер клетки h-матрицы;
R - (3R- число точек по φ). В данном случае R=2.
C0, C1, C2, C3, C4 – массивы размера M x M (клетки h-матрицы);
F - входной вектор (вектор на который производится умножение)
размера NT=M*N (N=3R);
U - выходной вектор (результат умножения) размера NT=M*N
(N=3R);

SUBROUTINE FUR (R,A,F,IP)


IMPLICIT REAL*8 (A-H,O-Z)
COMPLEX*16 A0(0:8),A1(0:8),A(0:8),C1(2),C2(8)
DIMENSION F(0:8),INDEX(0:8)
INTEGER R
COMPLEX*16 I
DATA C1 /(-0.5D0,0.86602540378D0),(-0.5D0,-
0.86602540378D0)/
DATA C2 /
*( .76604444312D+00, .64278760969D+00),
*( .17364817767D+00, .98480775301D+00),
*(-.50000000000D+00, .86602540378D+00),
*(-.93969262079D+00, .34202014333D+00),
*(-.93969262079D+00,-.34202014332D+00),
*(-.50000000000D+00,-.86602540378D+00),
*( .17364817767D+00,-.98480775301D+00),
*( .76604444312D+00,-.64278760969D+00)/
DATA INDEX /0,3,6,1,4,7,2,5,8/
PI=3.141592653589D0
I=(0.D0,1.D0)
N=3**R
N1=N-1
IF (R.EQ.1) THEN
16
A(0)=F(0)+F(1)+F(2)
A(1)=F(0)+C1(1)*F(1)+C1(2)*F(2)
IF(IP.EQ.1) RETURN
A(2)=F(0)+C1(2)*F(1)+C1(1)*F(2)
ENDIF
IF (R.EQ.2) THEN
J=0
DO 3 J=0,N1
3 A0(J)=F(INDEX(J))
DO 4 J2=0,2
J=3*J2
A1(J)=A0(J)+A0(1+J)+A0(2+J)
A1(1+J)=A0(J)+C1(1)*A0(1+J)+C1(2)*A0(2+J)
4 A1(2+J)=A0(J)+C1(2)*A0(1+J)+C1(1)*A0(2+J)
A(0)=A1(0)+A1(3)+A1(6)
A(1)=A1(1)+C2(1)*A1(4)+C2(2)*A1(7)
A(2)=A1(2)+C2(2)*A1(5)+C2(4)*A1(8)
A(3)=A1(0)+C2(3)*A1(3)+C2(6)*A1(6)
A(4)=A1(1)+C2(4)*A1(4)+C2(8)*A1(7)
IF(IP.EQ.1) RETURN
A(5)=A1(2)+C2(5)*A1(5)+C2(1)*A1(8)
A(6)=A1(0)+C2(6)*A1(3)+C2(3)*A1(6)
A(7)=A1(1)+C2(7)*A1(4)+C2(5)*A1(7)
A(8)=A1(2)+C2(8)*A1(5)+C2(7)*A1(8)
ENDIF
RETURN
END

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

N −1
qj
Aq = ∑f
j =0
j exp(2πi
N
), q = 0,1,...,2n; N = 2n + 1 = 3R , R = 1,2.

Описание параметров:
R = 1,2 – целое;
A – выходные коэффициенты Фурье (COMPLEX*16 длины N )
F - входные коэффициенты REAL*8 длины N (0:2n);
IP=1 вычисляется половина коэффициентов Фурье q=0,1,…,n;
IP=0 вычисляются все коэффициенты Фурье.

17
SUBROUTINE DIVHM1 (R,RL,AM,BM,U)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION RL(0:4),AM(0:4),BM(4),U(9),FA(0:8),FB(0:8)
COMPLEX*16 A(0:8),B(0:8)
INTEGER P,R
L=3**R
L1=L-1
LM=(L-1)/2
FA(0)=0.D0
FB(0)=0.D0
DO 1 P=1,LM
FA(P)=RL(P)*AM(P)
FB(P)=RL(P)*BM(P)
FA(L-P)= FA(P)
1 FB(L-P)=-FB(P)
CALL FUR(R,A,FA,0)
CALL FUR(R,B,FB,0)
S=0.D0
DO 3 I=0,LM
3 S=S+AM(I)*RL(I)
U(1)=S
DO 2 P=1,L1
2 U(P+1)=AM(0)*RL(0)+0.5D0*(REAL(A(P))+AIMAG(B(P)))
RETURN
END

Подпрограмма DIVHM1 вычисляет произведение циркулянта на


вектор с помощью быстрого преобразования Фурье.
Описание параметров:
R = 1,2 – целое;
RL(0:4) – содержит на входе собственные значения
симметричного циркулянта;
AM(0:4), BM(4) – коэффициенты Фурье вектора на который
производится умножение;
U(9) – результат умножения.

18
III. Дискретизация оператора Лапласа и быстрое решение
уравнения Пуассона для внешности тела вращения.

1. Рассмотрим уравнение Пуассона во внешности односвязного


тела вращения Ω:
∂ 2Φ ∂ 2Φ ∂ 2Φ
(III.1) + 2 + 2 = f ( x, y, z).
∂x 2 ∂y ∂z

Пусть на границе тела вращения дΩ задано краевое условие


Дирихле

Ф|дΩ =0.

Потребуем также, чтобы решение обращалось в нуль в


бесконечности. Введем криволинейную систему координат (r, θ, φ),
связанную с декартовой системой координат (х, у, z) соотношениями

(III.2) x=v(r,θ)cosφ, y=v(r,θ)sinφ, z=u(r, θ).


Если выполняются условия Коши-Римана
∂v 1 ∂u ∂u 1 ∂v
=− , = ,
∂r r ∂θ ∂r r ∂θ

то система координат (r, θ, φ) ортогональна и в этой системе


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

(III.3)
r  ∂  ∂Φ  ∂  v ∂Φ  1 ∂ 2 Φ
∆Φ = 2  ∂r  rv ∂r  + ∂θ  r ∂θ  + v 2 ∂ϕ 2 , w = (∂v / ∂θ ) + (∂u / ∂θ ) .
2 2 2

vw     

Удобно считать, что (r, θ, φ) - сферические координаты, а


соотношения (III.2) задают отображение шара единичного радиуса
на внешность рассматриваемого тела вращения Ω. Обозначим через
G область, получаемую меридиональным сечением тела вращения Ω

19
(т. е. тело Ω получается вращением области G вокруг оси z). Пусть
ψ=ψ(ξ), ψ=u+iv, ξ=r exp (iθ) - конформное отображение круга |
ξ| ≤ 1 на внешность области G, причем центр круга переходит в
бесконечность.
Тогда вместо внешней задачи для уравнения (III.1) имеем
внутреннюю задачу в шаре единичного радиуса, проколотом в
центре, для уравнения (III.3). Причем в центре шара и на его
границе, т. е. при z = 0 и z = 1, ставится граничное условие Ф = 0.
Далее будем считать, что конформное отображение круга еди-
ничного радиуса на внешность области G известно. Заметим, что для
численного построения конформного отображения имеются
надежные алгоритмы (см., например, [7], [11]).
Сделав в (III.3) замену переменных ζ=cos θ, получим

r  ∂  ∂Φ  2 ∂ v 2 ∂Φ 
 1 ∂ 2Φ
(III.4) ∆Φ =   rv  + 1 − ς 
r 1 − ς 
 + v 2 ∂ϕ 2 ,
vw2  ∂r  ∂r  ∂ς  ∂ς 

Система координат (r , ς , ϕ ), 0 < r ≤ 1, − 1 ≤ ς ≤ 1, 0 ≤ ϕ < 2π , наиболее

удобна для поставленной выше задачи.


2. Для дискретизации соотношения (III.4), т. е. для построения
дискретного лапласиана, воспользуемся результатами из [6].
Рассмотрев вспомогательную спектральную задачу
ΔΦ+λΦ=0, Φ|r=1=0, Φ|r=0=0,

и отделив переменную по φ, получим дискретный лапласиан в виде


h-матрицы:


l '

2
(III.5) H= Λ k ⊗ hk , L = 2l + 1,
L
k =0

где L - число узлов сетки по переменной φ (φk =2πk/L, k=0,1,…,L-1 -


узлы сетки), символ ⊗ обозначает кронекерово произведение
20
матриц Λk и k размера M x M и L x L соответственно. Матрицы Λk
размера, M x M, M = тп, получены дискретизацией диф-
ференциального соотношения, зависящего от k:

r  ∂  ∂Φ 1  2 ∂ v 2 ∂Φ 1 
 k2
(III.6)   rv  + 1 − ς  1 − ς  − Φ1 ,
vw2  ∂r  ∂r  ∂ς  r ∂ς  v 2

где m - число узлов сетки по r, n - число узлов сетки по ζ , Φ(r,ζ,φ)=


Φ1(r,ζ) Φ2(φ). Штрих у знака суммы означает, что слагаемое при k= 0
берется с коэффициентом 1/2.
Другими словами, построена h-матрица со свойствами,
аналогичными свойствам лапласиана от скалярной функции.
Рассмотрим подробно дискретизацию дифференциального
выражения (III.6). Выберем по r сетку, состоящую из т точек:
1 1 (2ν − 1)π
rν = + cosθ ν , θ ν = , ν = 1,2,..., m,
2 2 2m

и построим интерполяционную формулу

−1


m
 m(−1) ν −1

(III.7) Φ(r ) = Tm ( x)(r − 1)r Φν  (rν − 1)rν ( x − xν ) , Φν = Φ (rν ),
 sin θ ν 
ν =1

где х = 2r- 1, хν = 2rν – 1, Tm (x)= cos (m arccos х).


Первую и вторую производные по r, входящие в соотношения
(III.6), получим дифференцированием интерполяционной формулы.
По ζ выберем сетку, состоящую из п точек,
ς j = cosθ j , θ j = (2 j − 1)π /(2n), j = 1,2,..., n,

и применим интерполяционную формулу


−1


n
 n(−1) j −1 
(III.8) Φ (ς ) = Tn (ς )Φ j  (ς − ς j ) , Φ j = Φ (ς j ).
j =1
 sin θ j 

21
Нетрудно показать, что порядок аппроксимации построенной
таким образом дискретизации лапласиана зависит от гладкости
решения уравнения Пуассона. Причем аппроксимация тем лучше,
чем большим условиям гладкости удовлетворяет решение уравнения
Пуассона. Это следует из теорем о приближении гладких функций
многочленами [8]. Другими словами, построенный алгоритм не
имеет насыщения [7]. Для небольших m и n аппроксимация ин-
терполяционными многочленами (III.7) и (III.8) практически
совпадает с многочленом наилучшего приближения в норме С.
Соответственно, скорость убывания с ростом m и n погрешности
дискретизации этими многочленами совпадает со скоростью
стремления к нулю наилучшего приближения гладкой функции в
норме С.
3. Итак, для приближенного решения уравнения Пуассона (4.1)
нужно решить систему линейных уравнений

(III.9) HФ=f,
где матрица Н определена в (III.5), а Ф и f - векторы, компоненты
которых содержат значения соответствующих функций в узлах
сетки. В [6] показано, что


l '

2
H −1 = Λ−1 k ⊗ hk , L = 2l + 1,
L
k =0

т. е. обращение h-матрицы сводится к обращению l + 1 матриц, Λk, k


= 0,1,... ,l, и в результате получаем также h-матрицу. Матрицы Λk
вычисляются для заданной области один раз, и поэтому требуемое
для этого количество операций можно не учитывать. Следовательно,
решение дискретного уравнения Пуассона (III.1) сводится к
22
умножению h-матрицы H-1 на вектор. В практическом алгоритме
умножения Н-1 на вектор при N = 3μ, μ= 1, 2, . . . , можно применить
быстрое преобразование Фурье, тогда количество операций составит

m2n2(L+8Llog3L+2)+mn(mn-1)+4mn(Llog3L-l).

При μ = 3 и больших т и п получаем, что экономия числа операций


составляет 53% по сравнению с числом операций, необходимых для
непосредственного умножения матрицы Н-1 на вектор. С
возрастанием μ эффективность алгоритма увеличивается.
4. В качестве численного примера рассматривалось уравнение
Пуассона во внешности эллипсоида вращения
x2 / b 2 + y 2 / b 2 + z 2 / a 2 = 1

с правой частью

  2 x   2 y   2 z    2
2 2 2
 2 6 1  4 2 
f ( x, y, z) =  3 − 4   2  +  2  +  2   +  3 − 2  2 + 2 ,
R R   b   b   a    R R  b a 

где R( x, y, z) = x2 / b 2 + y 2 / b 2 + z 2 / a 2 .

Аналитическое решение этой задачи известно:


Ф(х,у,z)=1/R-1/R2 .
Известно также конформное отображение

1 a + b
ψ (ξ ) =  (a − b)ξ + , | ξ |≤ 1.
2 ξ 

Расчеты проводились на сетке из 225 (т = п = 5, L = 9) точек и на


сетке из 900 (т = п = 10, L = 9) точек при а = 1, b = 0.5. В последнем
случае совпадение точного и приближенного решений составляет
4—5 знаков после запятой.

23
IV. Описание программного комплекса для решения внешней
задачи для уравнения Пуассона.

Решение уравнения Пуассона во внешности тела вращения


производит программа AVZP8.

PROGRAM AVZP8
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION
C0(10000),C1(10000),C2(10000),C3(10000),C4(10000)
DIMENSION
U(900),F(900),DL1(100),DL2(100),DB1(100),DB2(100)
DIMENSION XX(100),YY(100)
COMMON AE,BE
R(X,Y,Z,AE,BE)=X**2/BE**2+Y**2/BE**2+Z**2/AE**2
WRITE (*,*) 'AE = ?'
READ (*,*) AE
WRITE (*,*) 'BE = ?'
READ (*,*) BE
C
M=5
M=10
N=5
N=10
WRITE (*,*) 'M = ?'
READ (*,*) M
WRITE (*,*) 'N = ?'
READ (*,*) N
NT=M*N
EPS=0.D0
CALL MLKG1 (C0,0,DL1,DL2,DB1,DB2,M,N,NT,EPS)
CALL MLKG1 (C1,1,DL1,DL2,DB1,DB2,M,N,NT,EPS)
CALL MLKG1 (C2,2,DL1,DL2,DB1,DB2,M,N,NT,EPS)
CALL MLKG1 (C3,3,DL1,DL2,DB1,DB2,M,N,NT,EPS)
CALL MLKG1 (C4,4,DL1,DL2,DB1,DB2,M,N,NT,EPS)
CALL DMINV (C0,NT,D,XX,YY)
CALL DMINV (C1,NT,D,XX,YY)
CALL DMINV (C2,NT,D,XX,YY)
CALL DMINV (C3,NT,D,XX,YY)
CALL DMINV (C4,NT,D,XX,YY)
PI=3.141592653589793238462643D0
24
L=9
I=0
DO 1 NU=1,N
TETA=(2.*NU-1.)*PI/2./N
DZ = COS(TETA)
DO 1 MU=1,M
RO=COS((2.*MU-1.)*PI/2./M)
RO=(RO+1.)/2.+ EPS*(-RO+1.)/2.
DO 1 K=0,8
FI=2.*PI*K/L
X=V(RO,DZ)*COS(FI)
Y=V(RO,DZ)*SIN(FI)
Z=UU(RO,DZ)
RB=R(X,Y,Z,AE,BE)
I=I+1
U(I)=(2./RB**3-6./RB**4)*(4.*X**2/BE**4+4.*Y**2/BE**4+
+4.*Z**2/AE**4)+(2./RB**3-1./RB**2)*
*(2./BE**2+2./BE**2+2./AE**2)
1 F(I)=1./RB-1./RB**2
NOUT = 4
OPEN(UNIT=4,FILE='NOUT')
NG=NT*L
WRITE(*,*) 'ТОЧНОЕ ЗНАЧЕНИЕ'
WRITE(*,12) (F(I),I=2,NG,36)
12 FORMAT(4E18.11)
WRITE(4,*) 'ТОЧНОЕ ЗНАЧЕНИЕ'
WRITE(4,*) (F(I),I=1,NG)
C
CALL DIVH (NT,2,C0,C1,C2,C3,C4,U,F)
C
WRITE(*,*) 'ВЫЧИСЛЕННОЕ ЗНАЧЕНИЕ'
WRITE(*,12) (F(I),I=2,NG,36)
WRITE(4,*) 'ВЫЧИСЛЕННОЕ ЗНАЧЕНИЕ'
WRITE(4,*) (F(I),I=1,NG)
STOP
END
FUNCTION UU(RO,DZ)
IMPLICIT REAL*8 (A-H,O-Z)
COMMON AE,BE
UU=0.5*((AE-BE)*RO+(AE+BE)/RO)*DZ
RETURN
END
25
FUNCTION V(RO,DZ)
IMPLICIT REAL*8 (A-H,O-Z)
COMMON AE,BE
V=0.5*((AE-BE)*RO-(AE+BE)/RO)*SQRT(1.-DZ**2)
RETURN
END
FUNCTION VR(RO,DZ)
IMPLICIT REAL*8 (A-H,O-Z)
COMMON AE,BE
VR=0.5*(AE-BE+(AE+BE)/RO**2)*SQRT(1.-DZ**2)
RETURN
END
FUNCTION VDZ (RO,DZ)
IMPLICIT REAL*8 (A-H,O-Z)
COMMON AE,BE
VDZ=-0.5*((AE-BE)*RO-(AE+BE)/RO)*DZ/SQRT(1.-DZ**2)
RETURN
END
FUNCTION W2 (RO,DZ)
IMPLICIT REAL*8 (A-H,O-Z)
COMMON AE,BE
W2=0.25*((AE-BE)*RO+(AE+BE)/RO)**2*(1.-DZ**2)+
+0.25*((AE-BE)*RO-
(AE+BE)/RO)**2*DZ**2
RETURN
END

SUBROUTINE MLKG1 (A,K,DL1,DL2,DB1,DB2,M,N,NT,EPS)


IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION
A(NT,NT),DL1(M,M),DL2(M,M),DB1(N,N),DB2(N,N)
PI=3.141592653589D0
CALL DIFR1(DL1,M,EPS)
CALL DIFR2 (DL2,M,EPS)
CALL DIF1 (DB1,N)
CALL DIF2 (DB2,N)
C
DO 2 I=1,NT
DO 2 J=1,NT
2 A(I,J)=0.D0
I1=0
DO 1 NU=1,N
26
DZN=COS((2.*NU-1)*PI/2./N)
DO 1 MU=1,M
ROM=(EPS+1.D0)/2.D0+COS((2.D0*MU-1.D0)*PI/2.D0/M)*(1.D0-
- EPS)/2.D0
I1=I1+1
I2=0
DO 1 NU1=1,N
DO 1 MU1=1,M
I2=I2+1
IF(NU.EQ.NU1) DN=1.D0
IF(NU.NE.NU1) DN=0.D0
IF(MU.EQ.MU1) DM=1.D0
IF(MU.NE.MU1) DM=0.D0
A(I1,I2)=(ROM+ROM**2*VR(ROM,DZN)/V(ROM,DZN))*
*DL1(MU,MU1)**DN+ROM**2*DL2(MU,MU1)*DN+
+(VDZ(ROM,DZN)*(1.- DZN**2)/V(ROM,DZN)-DZN)*
*DB1(NU,NU1)*DM+ (1.- DZN**2)*DB2(NU,NU1)*DM
A(I1,I2)=A(I1,I2)/W2(ROM,DZN)
IF(I1.EQ.I2) A(I1,I2)=A(I1,I2)-K**2/V(ROM,DZN)**2
1 CONTINUE
RETURN
END

Программа запрашивает в режиме диалога полуоси эллипса AE


и BE. После ввода этих параметров запрашиваются параметры сетки
M и N (эти величины не должны превосходить 10). Поφ параметр
сетки фиксированный L=9. Таким образом, максимальное число
узлов сетки 900. Если необходимо M и N увеличить, то необходимо
изменить операторы DIMENSION в начале программы.

Вызываемые подпрограммы:

MLKG1, DMINV,DIVH.

DMINV и DIVH описаны выше. MLKG1 описывается ниже.

27
SUBROUTINE MLKG1 (A,K,DL1,DL2,DB1,DB2,M,N,NT,EPS)
Эта подпрограмм вычисляет K-ую клетку A(NT,NT) (NT=M*N,
K=0,1,2,3,4) h-матрицы для внешней задачи уравнения Пуассона. M
и N – параметры сетки (вводятся в режиме диалога). EPS – параметр
при помощи которого вырезается нуль (в данной версии EPS=0.D0).
DL1(M,M),DL2(M,M),DB1(N,N),DB2(N,N) – рабочие массивы
Вызываемые подпрограммы: DIF1, DIF2, DIFR1, DIFR2.

SUBROUTINE DIF1(D1,N)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION D1(N,N)
PI=3.141592653589D0
N1=N-1
DO 1 I=1,N
TI=(2.*I-1.)*PI/2./N
DO 1 J=1,N
TJ=(2.*J-1.)*PI/2./N
P=0.D0
DO 2 K=1,N1
2 P=P+K*COS(K*TJ)*SIN(K*TI)/SIN(TI)
1 D1(I,J)=2.*P/N
RETURN
END

SUBROUTINE DIF2(D2,N)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION D2(N,N)
PI=3.141592653589D0
N1=N-1
DO 1 I=1,N
TI=(2.*I-1.)*PI/2./N
DO 1 J=1,N
TJ=(2.*J-1.)*PI/2./N
P=0.D0
DO 2 K=1,N1
2 P=P+K*COS(K*TJ)*(-K*COS(K*TI)/SIN(TI)**2+COS(TI)*
*SIN(K*TI)/SIN(TI)**3)
1 D2(I,J)=2.*P/N
28
RETURN
END

DIF1 – вычисляет матрицу дифференцирования без


удовлетворения краевым условиям на отрезке [-1,1]. DIF2 – тоже для
второй производной (дифференцирование по ζ).

SUBROUTINE DIFR2 (DR,M,EPS)


IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION DR(M,M)
PI=3.141592653589D0
DO 1 MU=1,M
TM=(2.*MU-1.)*PI/2./M
RM=0.5*(EPS+1.)+COS(TM)*0.5*(1.-EPS)
DO 1 NU=1,M
TN=(2.*NU-1.)*PI/2./M
RN=0.5*(EPS+1.)+COS(TN)*0.5*(1.-EPS)
P=1.D0/(RN-1.D0)/(RN-EPS)
DO 2 L=1,M-1
TL1=L*SIN(L*TM)/SIN(TM)
TL2=L**2*COS(L*TM)/SIN(TM)**2+L*SIN(L*TM)*
*COS(TM)/SIN(TM)**3
2 P=P+COS(L*TN)*(TL2*(2./(1.-EPS))**2*(RM-1.)*(RM-EPS)+
+(4./(1.-EPS))*TL1*(2.*RM-EPS-1.)+2.*COS(L*TM))/(RN-1.)/
/ (RN-EPS)
1 DR(MU,NU)=2.*P/M
RETURN
END

SUBROUTINE DIFR1 (DR,M,EPS)


IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION DR(M,M)
PI=3.141592653589D0
DO 1 MU=1,M
TM=(2.*MU-1.)*PI/2./M
RM=0.5*(EPS+1.)+COS(TM)*0.5*(1.-EPS)
DO 1 NU=1,M
TN=(2.*NU-1.)*PI/2./M
29
RN=0.5*(EPS+1.)+COS(TN)*0.5*(1.-EPS)
P=0.5*(2.*RM-EPS-1.)/(RN-1.)/(RN-EPS)
DO 2 L=1,M-1
2 P=P+2.*COS(L*TN)*L*SIN(L*TM)*(RM-1.)*(RM-EPS)/
/(1.-EPS)/SIN(TM)/(RN-1.)/(RN-EPS)+COS(L*TN)*COS(L*TM)*
*(2.*RM-EPS-1.)/(RN-1.)/(RN-EPS)
1 DR(MU,NU)=2.*P/M
RETURN
END

DIFR1 и DIFR2 – первое и второе дифференцирование по r,


удовлетворяющее однородным краевым условиям на отрезке [ε,1]
Пользователь должен задать подпрограммы – функции
(UU,V,VR,DZ,W2), которые для данной области вычисляют u(r,ζ),
v(r,ζ), vr(r,ζ), vζ(r,ζ), w2(r,ζ) (см. (III.6)). Все названные подпрограммы
– функции имеют параметры (RO,DZ).
Примечание. Все действительные параметры, в описанных
программах – двойной точности.
V. Заключение. По поводу получения полных версий описанных
программ обращайтесь по электронному адресу: algazinsd@mail.ru
или на адрес Института проблем механики РАН, 117525, Москва,
проспект Вернадского д.101, к.1.

Алгазин Сергей Дмитриевич

Численные алгоритмы классической матфизики.


IV. Уравнение Пуассона.

Подписано к печати 22.02.2002. Заказ № 8-2002. Тираж 50 экз.


________________________________________________________

Отпечатано на ризографе Института проблем механики РАН


117526, Москва, пр-т Вернадского, 101

30

Вам также может понравиться