Изучение псевдодинамического распределения памяти на языке ФОРТРАН. Изучение форматов хранения матриц большой размерности (Лабораторная работа № 3), страница 2

!n - размерность матрицы и вектора, m - последний элемент массива ia

!----------------------------------------------------------------------------     

      subroutine Input2 (Rmem, n, m)

      dimension Rmem(*)

      open (8, file='F:\l3\Test1\al.txt', status='old')

      open (9, file='F:\l3\Test1\di.txt', status='old')

      open (11, file='F:\l3\Test1\b.txt', status='old')

      read (8, *) (Rmem(i), i=1, m-1)

      read (9, *) (Rmem(i), i=i, i+n-1)

      read (11, *) (Rmem(i), i=i, i+n-1)

      close (8)

      close (9)

      close (10)

      close (10)

      end

!---------------------------------------------------------------------------------

!Подпрограмма перемножения матрицы в разреженном формате на вектор:

!n - размерность матрицы и вектора, m - последний элемент массива ia,

!c - вектор, результат умножения, ia, ja, al, di, b - исходные данные

!---------------------------------------------------------------------------------

      subroutine Mult (n, m, ia, ja, al, di, b, c)

      dimension ia(n+1), c(n)

      dimension ja(m-1), al(m-1), di(n), b(n)

      do i=1, n

         c(i)=0

      end do  

      do i=1, n

         i_a=ia(i+1)-ia(i)

         j=0

         do while (j.lt.i_a)

                   c(i)=c(i)+al(ia(i)+j)*b(ja(ia(i)+j))

                   c(ja(ia(i)+j))=c(ja(ia(i)+j))+al(ia(i)+j)*b(i)

                   j=j+1

         end do

         c(i)=c(i)+di(i)*b(i)

      end do

      end

!---------------------------------------------------------------------------------

!Подпрограмма вывода результирующего вектора в файл:

!n - размерность вектора, Rmem - часть массива Rmem для хранения результата

!---------------------------------------------------------------------------------     

      subroutine Output (n, Rmem)

      dimension Rmem(*)

      open (2, file='F:\l3\Test1\c.txt', status='old')

      write (2, *) (Rmem(i), i=1, n)

      close (2)

      end

!---------------------------------------------------------------------------------

!Подпрограмма проверки исходных данных на корректность(существование матрицы и вектора,

!возможнось их перемножения):

!n - размерность матрицы, nb - размерность вектора,

!mem - максимальный доступный размер массивов

!---------------------------------------------------------------------------------     

      subroutine Check1 (n, nb, mem)

      if (n.ne.nb.or.n.lt.1.or.nb.lt.1) then                        !Размерность вектора не равна

           print *, 'Nekorrektnie dannie'                   !размерности матрицы или размерность

           pause                                                               !вектора или матрицы меньше 1

           stop

      else

           if (n+1.lt.mem) then                                                             !Размернось первого

                print *, 'Nedostayo4no panyati dlya hraneniya dannih'   !исходногомассива

                pause                                                                                            !больше, чем

                stop                                                                                   !доступная память

           end if

      end if

      end

!---------------------------------------------------------------------------------

!Подпрограмма проверки исходных данных на корректность(не превышают ли исходные данные

!и результат доступный размер памяти):

!n - размерность матрицы, nb - размерность вектора,

!mem - максимальный доступный размер массивов

!---------------------------------------------------------------------------------     

      subroutine Check2 (n, m, mem)

      if (4*n+2*m+1.lt.mem) then                                                 !Сумма размерностей

          print *, 'Nedostayo4no panyati dlya hraneniya dannih '        !массивов исходных данных

          pause                                                                 !больше, чем доступная память

          stop

      end if

      end

6. Набор тестов

Исходные данные: n(размерность исходной матрицы), ia, ja, al, id, nb(размерность вектора), b

Результаты, назначение теста

5

1 1 2 3 5 7

1 1 1 2 1 2

1 1 1 1 1 1

6

1 3 2 4 6 5

Неверные данные; проверка на корректность данных (размерности вектора и матрицы не совпадают)

0

1 1 2 3 5 7

1 1 1 2 1 2

1 1 1 1 1 1

0

1 3 2 4 6

Неверные данные; проверка на корректность данных (размерности вектора и матрицы меньше 1)

108

1 1 2 3 5 7

1 1 1 2 1 2

1 1 1 1 1 1

108

1 3 2 4 6

Нехватка памяти

5

1 1 1 1 1 1

0 0 0 0 0

5

1 1 1 1 1

Нулевая матрица

0 0 0 0 0

5

1 1 1 1 1 1

1 1 1 1 1

5

1 1 1 1 1

Единичная матрица

1 1 1 1 1

5

1 1 2 3 5 7

1 1 1 2 1 2

0.5 1.3 5.6 3 2.01 0.9

1 1 1 1 1 1

5

1.4 3 2 4.5 6.1

Вещественные элементы матрицы и вектора