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

Страницы работы

Содержание работы

Цель работы

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

Ход выполнения работы

1. Написана программа, реализующая на языке ФОРТРАН требуемые действия над матрицами произвольной (задаваемой пользователем) размерности с учетом следующих требований:

· для распределения памяти под необходимые массивы используются идеи псевдодинамической памяти; память выделяется в головной программе, путём описания 1 одномерного массива большой размерности; вся оставшаяся после распределения память находиться в конце этого массива; при недостатке памяти выдавается соответствующее сообщение;

· каждое действие должно быть реализовано в виде подпрограммы;

· вычисления производятся оптимальным, на мой взгляд, образом;

· все вводимые данные должны проверятся на корректность, для любых данных программа должна давать корректный результат (сообщение об ошибке на английском языке – корректный результат, сообщение системы о делении на ноль - некорректный результат);

· все входные данные должны вводиться из файлов (матрица и вектор в разных файлах); в первой строке файла хранятся размерности объекта

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

· матрица в файле хранится в заданном формате.

2. Протестирована разработанная программа на матрицах небольшой размерности.

3. Реализовано задание лабораторной работы с использованием написанных

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

прямого доступа.

4. Для тестирования программы написана программа перевода текстовых

файлов, содержащих матрицу в заданном формате, в файлы прямого доступа.

5. Разработана программа генерации тестов большой размерности, при представлении матриц в заданном формате. Программа создаёт файлы прямого доступа.

6. Разработана программа, распечатывающая матрицы, представленные по формату, в виде плотных матриц.

7. Протестированы все разработанные программы. Для тестирования использовались матрицы большой и максимально возможной размерности.


Тескты программ

Программа умножения матрицы на столбец, читает данные не из бинарных файлов

program fort3

      implicit none

      common /error/e

      common /array/a

      integer e/0/

      real a

      dimension a(2000000)

      call InputMatrix

      if (e.eq.0) call InputVector

      if (e.eq.0) call Calc

      if (e.eq.0) call Output

      return

      end

      subroutine InputMatrix

      common /error/e

      common /array/a(2000000)

      common /maximize/ maxi, maxj

      integer i/1/, j/1/, maxi/0/, maxj/0/

      open (1,file='Matrix.f',err=10)

       read(1,*,err=11) maxi, maxj

       if((maxi.lt.0).and.(maxj.lt.0)) e=2

       if((maxi*(maxj+2)).gt.2000000) e=1

       if(e.ne.0) then

        print *, 'Error in maxi, maxj'

        return

       endif

20      if(j.le.maxj)then

30          if(i.le.maxi)then

                if(j.eq.1) then

                    read(1,*,err=11) a(i+maxi*maxj)

                else

                    read(1,*,err=11) a((j-1)*maxi+i)

                endif

                i=i+1

                goto 30

            endif

            i=1

            j=j+1

            goto 20

        endif

      close(1)

      return

10    print *, 'Can not open Matrix.f file.'

      goto 12

11    print *, 'Error in Matrix.f file.'

12    e=3

      close(1)

      return

      end

      subroutine InputVector

      common /error/e

      common /array/a(2000000)

      common /maximize/ maxi, maxj

      integer i/1/

      open (2,file='Vector.f',err=50)

60      if(i.le.maxi)then

            read(2,*,err=51) a(maxi*(maxj+1)+i)

            i=i+1

            goto 60

            endif

      close(2)

      return

50    print *, 'Can not open Vector.f file.'

      goto 52

51    print *, 'Error in Vector.f file.'

52    e=3

      close(2)

      return

      end

      subroutine Calc

      common /error/e

      common /array/a(2000000)

      common /maximize/ maxi, maxj

      integer i/1/, j/1/

      real s/0/

70      if(j.le.maxi)then

80          if((i.lt.(maxj+j)).and.(i.gt.(j-maxj)))then

                if(i.eq.j) then

                    s=s+a(maxi*maxj+i)*a(maxi*(maxj+1)+i)

                endif

                if(i.gt.j)then

                    s=s+a(maxi*(maxj+1)+i)*a(maxi*(i-j)+i)

                endif

                if(i.lt.j)then

                    s=s+a(maxi*(maxj+1)+i)*a(maxi*(j-i)+j)

                endif

                i=i+1

                goto 80

            endif

            a(j)=s

            j=j+1

            i=(j-maxj)+1

            s=0

            goto 70

        endif

      return

      end

      subroutine Output

      common /array/a(2000000)

      common /maximize/ maxi, maxj

      integer i/1/

      open (3,file='Result.csv',err=100)

110   if(i.le.maxi)then

        write(3, 111) a(i)

        i=i+1

        goto 110

      endif

      close(3)

      return

100   print *, 'Can not open Result.csv file.'

      return

111   format(E10.4, ';')

      end


Программа умножения матрицы на столбец, читает данные из бинарных файлов

      program fort3

      implicit none

      common /error/e

      common /array/a

      integer e/0/

Похожие материалы

Информация о работе