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

Расчетное задание / КМ4 / Отчет КМ4 Долгов Р ТФ-12-20

.pdf
Скачиваний:
6
Добавлен:
16.05.2024
Размер:
2.35 Mб
Скачать

Компиляция – 0 ошибок, 0 предупреждений.

Для наглядности сравним результаты из программы и примера в IMSL.

IMSL:

11

Fortran:

Результаты совпадают.

Подпрограмма №3: Compute determinant after factoring (Вычислить определитель после разложения на множители).

Задача: Вычислить определитель комплексной Эрмитовой матрицы с учетом разложения вида U·DUH.

Для этого используем: CALL LFDHF (N, FAC, LDFAC, IPVT, DET1, DET2)

12

Входные параметры подпрограммы:

1.N — Число уравнений.

2.FAC — Комплексная матрица размерностью NxN, содержащая разложение матрицы коэффициентов A в качестве выходных данных процедуры LFCHF/DLFCHF или LFTHF/DLFTHTHF. Используется только верхний треугольник FAC.

3.LDFAC — ведущее измерение FAC в точности так, как указано в инструкции измерения вызывающей программы.

4.IPVT — вектор длины N, содержащий сводную информацию для факторизации A в качестве выходных данных из процедуры

LFCHF/DLFCHF или LFTHF/DLFTHTHF.

Выходные параметры подпрограммы:

1.DET1 — скалярный параметр, содержащий мантиссу определителя. Значение, установленное в 1, нормализуется таким образом, что 1.0 = |DET1| < 10.0 или DET 1 = 0.0.

2.DET2 — скалярный параметр, содержащий показатель степени определителя. Определитель возвращается в виде det(A) = DET1∙10DET2.

Алгоритм.

Процедура LFDHF вычисляет определитель комплексной Эрмитовой

матрицы неопределенных коэффициентов. Чтобы вычислить определитель, матрица коэффициентов должна сначала подвергнуться разложению вида U·DUH. Это можно сделать, вызвав либо LFCHF, либо LFТHF. Поскольку det U =

± 1, для вычисления определителя используется формула det(A) = det(U) det(D) det UH = det(D). Det(D) вычисляется как произведение определителей его блоков.

Пример решения.

Перенесем пример из библиотеки IMSL в систему программирования Fortran и сравним результаты описанные в IMSL и полученные в программе.

13

Компиляция – 0 ошибок, 0 предупреждений.

14

Линкинг – 0 ошибок, о предупреждений.

Для наглядности сравним результаты из программы и примера в IMSL.

IMSL:

15

Fortran:

Результаты совпадают.

Объединение процедур.

Листинг программы с одинарной точностью.

program odinarnaya_tochonst implicit none

! Объявление переменных

INTEGER LDA, N, I, j, k, z, v PARAMETER (LDA=3, N=3) INTEGER IPVT(N), NOUT

REAL RCOND, DET1, DET2, START, FINISH

COMPLEX A(LDA,LDA), B(N,3), X(N,3), FAC(LDA,LDA), C(N), D(N), RES(N), M1(3,12000000), M2(3,12000000), M3(12000000)

CALL CPU_TIME (START)

DATA A/(3.0,0.0), (1.0,1.0), (4.0,0.0), (1.0,-1.0), (2.0,0.0), (-5.0,-1.0), (4.0,0.0), (- 5.0,1.0), (-2.0,0.0)/

DATA B/(7.0,32.0), (-39.0,-21.0), (51.0,9.0), (-6.0,11.0), (-5.5,-22.5), (16.0,17.0), (- 2.0,-17.0), (4.0,10.0), (-2.0,12.0)/

DATA C/(7.0,32.0), (-39.0,-21.0), (51.0,9.0)/ DO j=1,12000000-2,3

DO k=0,2 M1(1,j+k)=A(1,1+k) M1(2,j+k)=A(2,1+k) M1(3,j+k)=A(3,1+k) A(1,1+k)=A(1,1+k)+(0.001/j) A(2,1+k)=A(2,1+k)+(0.001/j)

16

A(3,1+k)=A(3,1+k)+(0.001/j)

M2(1,j+k)=B(1,1+k)

M2(2,j+k)=B(2,1+k)

M2(3,j+k)=B(3,1+k)

B(1,1+k)=B(1,1+k)+(0.001/j)

B(2,1+k)=B(2,1+k)+(0.001/j)

B(3,1+k)=B(3,1+k)+(0.001/j)

M3(j+k)=C(1+k)

C(1+k)=C(1+k)+(0.001/j) end do

end do

DO z=1,12000000-2,3 ! Программа 1

CALL LFTHF (N, A, LDA, FAC, LDA, IPVT) DO 10 I=1, 3

CALL LFSHF (N, FAC, LDA, IPVT, B(1,I), X(1,I)) 10 CONTINUE

CALL WRCRN ('X', N, 3, X, N, 0) ! Программа 2

CALL UMACH (2, NOUT)

CALL LFCHF (N, A, LDA, FAC, LDA, IPVT, RCOND) WRITE (NOUT,99998) RCOND, 1.0E0/RCOND

DO 20 I=1, 3

CALL LFIHF (N, A, LDA, FAC, LDA, IPVT, C, D, RES) WRITE (NOUT,99999) I

CALL WRCRN ('D', 1, N, D, 1, 0) CALL WRCRN ('RES', 1, N, RES, 1, 0) C(2) = C(2) + (0.2E0, 0.2E0)

20 CONTINUE

99998 FORMAT (' RCOND = ',F5.3,/,' L1 Condition number = ',F6.3) 99999 FORMAT (//,' For problem ', I1)

! Программа 3

CALL LFTHF (N, A, LDA, FAC, LDA, IPVT) CALL LFDHF (N, FAC, LDA, IPVT, DET1, DET2) CALL UMACH (2, NOUT)

DO k=0,2 A(1,1+k)=M1(1,z+k) A(2,1+k)=M1(2,z+k) A(3,1+k)=M1(3,z+k) B(1,1+k)=M2(1,z+k) B(2,1+k)=M2(2,z+k) B(3,1+k)=M2(3,z+k) C(1+k)=M3(z+k) END DO

END DO

17

WRITE (NOUT,99997) DET1, DET2

99997 FORMAT (' The determinant is', F5.1, ' * 10**', F2.0) CALL CPU_TIME (FINISH)

PRINT *, 'TIME = ', FINISH-START, ' SEC' end program odinarnaya_tochonst

Листинг программы с двойной точностью.

program dvoinaya_tochnost implicit none

!Объявление переменных

INTEGER LDA, N, I, j, k, z, v PARAMETER (LDA=3, N=3) INTEGER IPVT(N), NOUT

REAL(8) RCOND, DET1, DET2, START, FINISH

COMPLEX(8) A(LDA,LDA), B(N,3), X(N,3), FAC(LDA,LDA), C(N), D(N), RES(N), M1(3,12000000), M2(3,12000000), M3(12000000)

CALL CPU_TIME (START)

DATA A/(3.0,0.0), (1.0,1.0), (4.0,0.0), (1.0,-1.0), (2.0,0.0), (-5.0,-1.0), (4.0,0.0), (- 5.0,1.0), (-2.0,0.0)/

DATA B/(7.0,32.0), (-39.0,-21.0), (51.0,9.0), (-6.0,11.0), (-5.5,-22.5), (16.0,17.0), (- 2.0,-17.0), (4.0,10.0), (-2.0,12.0)/

DATA C/(7.0,32.0), (-39.0,-21.0), (51.0,9.0)/ DO j=1,12000000-2,3

DO k=0,2 M1(1,j+k)=A(1,1+k) M1(2,j+k)=A(2,1+k) M1(3,j+k)=A(3,1+k) A(1,1+k)=A(1,1+k)+(0.001/j) A(2,1+k)=A(2,1+k)+(0.001/j) A(3,1+k)=A(3,1+k)+(0.001/j) M2(1,j+k)=B(1,1+k) M2(2,j+k)=B(2,1+k) M2(3,j+k)=B(3,1+k) B(1,1+k)=B(1,1+k)+(0.001/j) B(2,1+k)=B(2,1+k)+(0.001/j) B(3,1+k)=B(3,1+k)+(0.001/j) M3(j+k)=C(1+k) C(1+k)=C(1+k)+(0.001/j) end do

end do

DO z=1,12000000-2,3

!Программа 1

CALL DLFTHF (N, A, LDA, FAC, LDA, IPVT)

DO 10 I=1, 3

18

CALL DLFSHF (N, FAC, LDA, IPVT, B(1,I), X(1,I)) 10 CONTINUE

CALL WRCRN ('X', N, 3, X, N, 0) ! Программа 2

CALL UMACH (2, NOUT)

CALL DLFCHF (N, A, LDA, FAC, LDA, IPVT, RCOND) WRITE (NOUT,99998) RCOND, 1.0E0/RCOND

DO 20 I=1, 3

CALL DLFIHF (N, A, LDA, FAC, LDA, IPVT, C, D, RES) WRITE (NOUT,99999) I

CALL WRCRN ('D', 1, N, D, 1, 0) CALL WRCRN ('RES', 1, N, RES, 1, 0) C(2) = C(2) + (0.2E0, 0.2E0)

20 CONTINUE

99998 FORMAT (' RCOND = ',F5.3,/,' L1 Condition number = ',F6.3) 99999 FORMAT (//,' For problem ', I1)

! Программа 3

CALL DLFTHF (N, A, LDA, FAC, LDA, IPVT) CALL DLFDHF (N, FAC, LDA, IPVT, DET1, DET2) CALL UMACH (2, NOUT)

DO k=0,2 A(1,1+k)=M1(1,z+k) A(2,1+k)=M1(2,z+k) A(3,1+k)=M1(3,z+k) B(1,1+k)=M2(1,z+k) B(2,1+k)=M2(2,z+k) B(3,1+k)=M2(3,z+k) C(1+k)=M3(z+k) END DO

END DO

WRITE (NOUT,99997) DET1, DET2

99997 FORMAT (' The determinant is', F5.1, ' * 10**', F2.0) CALL CPU_TIME (FINISH)

PRINT *, 'TIME = ', FINISH-START, ' SEC' end program dvoinaya_tochnost

Расчет памяти.

В программе используется матрица А размерностью 3х3, матрица В размерностью 3х3, а также вектор-столбец С 3х1. В постановке задачи исследования производительности ПК необходимо выполнение программы минимум 40 секунд времени, с учётом ограничения на используемую RAMпамять компьютера (минимум 300-400 Мб), поэтому для увеличения

19

используемой процессом памяти было необходимо создать буферную матрицу. При 300 Мб выполняется минимум по времени. Посчитаем необходимое количество элементов:

(300 ∙ 1024 ∙ 1024) / (4 ∙ 3 ∙ 2 + 1) = 11234736 элементов.

Примем значение 12000000. Тогда объем памяти для одинарной точности будет составлять 320,43 Мб. Соответсвтенно для двойной точности объем памяти составит 640,86 Мб.

4 Байта предоставляется 1 элементу вещественного типа REAL. Так как будет использоваться 2 буферные матрицы – делим на 2. Таким образом, 2 буферные матрицы будет иметь размерность (3, 12000000), а буферный вектор столбец (12000000).

Основные параметры тестируемой системы.

CPU – Intel(R) Core(TM) i7-12800 1.80 GHz 3.70 GHz; 14 ядер, 20 потоков

RAM – 16.00 Гб Kingston 9905600-119.A00G DDR4 SO-DIMM 8 Gb, Kingston 9905600-119.A00G DDR4 SO-DIMM 8 Gb

SSD – NVMe Kingston RBUSNS8 1 Тб

Windows 11 Домашняя для одного языка, 64-разрядная

Результаты измерений.

Таблица 1 – результаты 90 расчетов в режиме debug с одинарной точностью

Т1 =

Т2 =

Т3 =

Т4 =

Т5 =

Т6 =

Т7 =

Т8 =

Т9 =

Т10 =

22.92

17.09

16.93

10.98

18.56

20.42

13.76

21.00

27.79

21.67

Т11 =

Т12 =

Т13 =

Т14 =

Т15 =

Т16 =

Т17 =

Т18 =

Т19 =

Т20 =

23.56

17.00

23.23

27.26

41.85

18.45

9.734

8.031

12.85

17.94

Т21 =

Т22 =

Т23 =

Т24 =

Т25 =

Т26 =

Т27 =

Т28 =

Т29 =

Т30 =

14.96

9.265

18.91

14.78

14.07

18.92

17.14

16.96

19.55

25.28

Т31 =

Т32 =

Т33 =

Т34 =

Т35 =

Т36 =

Т37 =

Т38 =

Т39 =

Т40 =

27.58

21.50

21.50

21.94

21.70

16.00

23.31

20.59

20.21

22.71

Т41 =

Т42 =

Т43 =

Т44 =

Т45 =

Т46 =

Т47 =

Т48 =

Т49 =

Т50 =

17.21

25.10

27.70

22.70

21.98

21.85

26.62

18.73

20.50

28.92

Т51 =

Т52 =

Т53 =

Т54 =

Т55 =

Т56 =

Т57 =

Т58 =

Т59 =

Т60 =

29.76

20.01

31.85

24.59

30.53

33.31

25.51

34.10

23.57

29.32

Т61 =

Т62 =

Т63 =

Т64 =

Т65 =

Т66 =

Т67 =

Т68 =

Т69 =

Т70 =

46.40

52.34

25.12

15.09

22.28

22.31

16.57

27.84

10.87

5.984

Т71 =

Т72 =

Т73 =

Т74 =

Т75 =

Т76 =

Т77 =

Т78 =

Т79 =

Т80 =

16.34

11.40

16.73

16.43

18.89

16.75

14.69

7.328

8.141

12.23

Т81 =

Т82 =

Т83 =

Т84 =

Т85 =

Т86 =

Т87 =

Т88 =

Т89 =

Т90 =

13.73

18.97

11.73

27.20

22.09

28.05

27.56

13.84

7.250

12.83

20

Соседние файлы в папке КМ4