Теория: Обзор наиболее важных средств Fortran 90


Возможности расширения языка

Новый язык содержит возможности для пользователя расширять его собственными понятиями, например, для интервальной арифметики, арифметики рациональных или динамических символьных строк. Путем определения новых типов данных или операторов, и перегружаемых операций и процедур (так что вы можете использовать плюс + как символ сложения интервалов, а не только для обычных чисел), мы можем создать пакет (модуль) без использования препроцессора. Мы можем в скором времени ожидать число расширений для различных приложений в форме модулей от различных производителей. Некоторые уже доступны в NAG.

Структуры (производные типы)

В Фортран раньше не разрешалось использование некоторых типов, определенных пользователем. Теперь это можно делать

Вы можете группировать Ваши данные, используя производные типы. При этом можно комбинировать встроенные типы (включая массивы и указатели). Доступ к компонентам новых типов осуществляется использованием уточнителя, а в качестве разделителя в нем знак процента. (Производные типы известны в VAX Fortran как записи.)

Ниже приведен пример

  TYPE staff_member
         CHARACTER(LEN=20) :: first_name, last_name
         INTEGER           :: identification, department
  END TYPE

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

  TYPE(staff_member), DIMENSION(100)  :: staff

Отдельная единица может быть вызвана как staff(number), а поле может быть вызвано как staff(number)%first_name. Вы можете образовать гнездо определений

  TYPE company
       CHARACTER(LEN=20)                     :: company_name
       TYPE(staff_member), DIMENSION(100)    :: staff
  END TYPE
  :
  TYPE(company), DIMENSION(10)   :: several_companies

Значительно более интересный пример - это разреженная матрица A, имеющаяс более сотни ненулевых элементов, которая может быть специфицирована следующим оператором

    TYPE NONZERO
           REAL VALUE
           INTEGER ROW, COLUMN
    END TYPE
    
и

    TYPE (NONZERO)  :: A(100)

Вы тогда получаете значение A(10), записав A(10)%VALUE. Присваивание может быть записано как

A(15) = NONZERO(17.0,3,7)

Для того, чтобы использовать в COMMON определенные пользователем в примере типы, или чтобы безусловно сделать так, чтобы два типа данных, которые выглядят как один и тот же, рассмотривались как идентичные, вы можете использовать оператор SEQUENCE, в последнем случае требуется , чтобы переменная была специфицирована как PRIVATE.

! Еще один пример, использующий производные типы и модули

module pipedef

type pipe ! определяется новый тип 'pipe', который

real diameter ! включает две компоненты типа reals, 

real flowrate ! компоненту типа integer

! и компоненту типа character.

integer length

character(len=10) :: flowtype

end type pipe

end module pipedef

 

program main

use pipedef ! Связывает с модулем pipedef программу main.

type(pipe) water1, gas1

! объявляет две переменные типа 'pipe'.

water1 = pipe(4.5,44.8,1200,"turbulent")

! присваивает значение переменной water1.

gas1%diameter = 14.9 ! присваивает значение

gas1%flowrate = 91.284 ! частям переменной gas1.

gas1%length = 2550

gas1%flowtype = 'laminar'

.

.

end program

Указатели

Указатели позволяют программе вызвать более одной области памяти с одним именем. По сравнению с указателями языка С указатели в Fortran 90 более ограничены, и поэтому легче для отладки и оптимизации. Объекты данных с атрибутами-указателями могут иметь ассоциированную с ними память, выделяемую и возвращаемую, которую можно использовать динамически. Указатели могут быть ассоциированы с другими указателями и с другими объектами, облегчая работу с такими структурами данных как списки и деревья.

Вид семейства

Тип семейства дает возможность пользователю запросить, какой встроеннный тип использован базовым для точности и диапазона значений. Это средства среду вычислений. Программисты, которые адресуют свои программы разным машинам, должны иметь дело с различным числом точных цифр. Используя семейство (kind), программист может специфицировать требуемую числовую точность.

! Пример, использующий атрибут KIND и функцию KIND .

! Этот пример потребует от компилятора

! символьный тип данных kind(2)

! Это допустимо в F90, но не обязательно.

program main

integer, parameter :: kanji_char_kind = 2

! Используем атрибут kind, чтобы определить известный kind.

character(kind = kanji_char_kind, len=20), dimension(20) :: name

! Используем функцию kind,

! чтобы определить kind из объекта известного kind.

real(kind = kind(0.0d0)) :: pi=3.14159265359d0

open(unit=1, file='names', form='formatted', access='sequential')

read(1,10) (name(i), i=1,20)

write(*,20) name

write(*,30) pi

close(unit=1)

10 format(a20)

20 format(1x,t7,a20,t30,a20,t55,a20)

30 format(1x,1p,d18.11)

end program

Объявления (декларации, спецификации)

Объекты данных могут иметь комбинацию 12 различных атрибутов, таких как POINTER, SAVE, и т.д. Fortran 90 вводит "объектно-ориентированные " объявления, в которых объекты с одинаковыми комбинациями атрибутов могли быть декларированы со всеми их атрибутами в одном операторе. В одной строке могут теперь быть записаны:

      REAL, DIMENSION (3), PARAMETER :: &
      a = (/ 0.0, 0.0, 0.0 /), b = (/ 1.0, 1.0, 1.0 /)

      COMPLEX, DIMENSION(10) :: john

Тогда как переменные a и b задают константный вектор из 3 элементов и значения с плавающей точкой 0.0 и 1.0, соответственно, в то время как john задается как вектор типа complex из 10 элементов типа complex, все еще не присвоены значения ни одной переменной.

Двойная точность может быть реализована более общим методом, чтобы дать настраиваемую точность, даваемую параметром KIND, для которого точность мы определим полностью для всех типов переменных.

      INTEGER, PARAMETER :: LP = SELECTED_REAL_KIND(20)
      REAL (KIND = LP)   :: X, Y, Z

Выше приведенные операторы объявляют переменные X, Y и Z как REAL с плавающей точкой с числом десятичных цифр, меньшим 20 с типом данных, называемым LP (где LP стандартное сокращение для LONG PRECISION).

Конструкторы

Массив и объекты производных типов данных могут быть инициализированы в операторе объявления. Конструктор может быть использован как константа там, где ожидается массив или производный тип.

IMPLICIT NONE*

Если Вы хотите использовать алгол-принцип спецификации всех переменных, это достигается командой IMPLICIT NONE с явными описаниями типа.

Эта стандартизация популярного расширения F77 делает обязательным для всех объектов данных явное объявление.

Теория  Далее>>>

Rambler's Top100

Copyright © fortran-online.info, 2007