Фортран 90
Для разработки параллельных программ часто используется язык программирования Фортран. Это одно из наиболее эффективных средств программирования вычислительных задач. Далее приводится краткое описание языка.
Формат записи исходного текста
Для записи исходного текста программы на Фортране могут использоваться фиксированный и свободный форматы.Первый из них характерен для стандарта Фортран 77, второй применяется в Фортране 90 и более новых версиях . Фортран 90 поддерживает также фиксированный формат, что обеспечивает совместимость со старыми стандартами записи. При записи исходного текста в фиксированном формате строка содержит 72 позиции. Первые пять позиций отведены для меток, а шестая может быть пустой или содержать любой, отличный от пробела символ. В последнем случае строка считается строкой продолжения и при обработке компилятором присоединяется к предыдущей строке программы. Оператор может занимать позиции с 7 по 72.
В свободном формате записи все позиции строки равноправны, ее длина составляет 132 символа.
Структура программы
Программа на Фортране состоит из главной программы и, возможно, некоторого числа подпрограмм.Подпрограммы могут быть функциями или процедурами,внешними, внутренними или модульными. Различные программные компоненты могут компилироваться раздельно.
Первым оператором главной программы является её заголовок PROGRAM. За ним следует имя программы:
PROGRAM ИМЯ_ПРОГРАММЫ
Имя программы обязательно начинается с буквы, затем могут идти буквы, цифры и символы подчеркивания, например:
PROGRAM QUADRATIC_EQUATION_SOLVER45
Максимальная длина любого имени в программах на Фортране - 31 символ. Первым оператором подпрограммы может быть только ее заголовок FUNCTION или SUBROUTINE. Последней строкой программного компонента должна быть строка с оператором END. Заключительный оператор главной программы может иметь также следующий вид:
END PROGRAM ИМЯ_ПРОГРАММЫ
ИМЯ_ПРОГРАММЫ является необязательной частью оператора.
После заголовка следуют описания переменных, констант, меток, подпрограмм и других объектов, используемых в программе. Эта ее часть называется разделом описаний.После раздела описаний следует раздел операторов.
Базовые типы данных
Перечень встроенных типов в порядке возрастания их ранга дан ниже.
- LOGICAL(1) и BYTE
- LOGICAL(2)
- LOGICAL(4)
- INTEGER(1)
- INTEGER(2)
- INTEGER(4)
- REAL(4)
- REAL(8)
- COMPLEX(8)
- COMPLEX(16)
У каждого встроенного типа Фортрана есть несколько разновидностей, которые отличаются друг от друга диапазоном значений и некоторыми другими характеристиками.
Значение символьного типа CHARACTER представляет собой строку символов. Длина строкового значения в Фортране может быть произвольной и задается с помощью параметра LEN в предложении описания строковой переменной, например:
CHARACTER(LEN = 430) :: Shakespeare_sonet
Предложение описания
Предложение описания переменных в Фортране 90 имеет вид:
ТИП[, АТРИБУТЫ] :: СПИСОК_ПЕРЕМЕННЫХ
В списке имена переменных разделяются запятыми, а ТИП задает общий тип переменных, являясь идентификатором типа:
REAL, PARAMETER :: salary = 2000
В Фортране 90 используются следующие атрибуты объектов:
- PARAMETER - объект является именованной константой;
- PUBLIC - объект является доступным за пределами модуля;
- PRIVATE - объект недоступен за пределами модуля;
- POINTER - объект является ссылкой (указателем);
- TARGET - объект можно использовать в качестве адресата в операторах назначения ссылок;
- ALLOCATABLE - объект является динамическим массивом;
- DIMENSION - объект является массивом;
- INTENT - определяет вид связи для параметра процедуры (т. е., является входным, выходным или и входным и выходным);
- OPTIONAL - необязательный параметр процедуры;
- SAVE - сохранять значение локальной переменной подпрограммы в промежутке между ее вызовами;
- EXTERNAL - для внешней функции;
- INTRINSIC - для внутренней функции.
Буквальные константы
Буквальные числовые константы записываются обычным образом. Комплексная буквальная константа записывается в круглых скобках:
Имеются две буквальные логические константы:
- .TRUE. - "истина";
- .FALSE. - "ложь".
Буквальная символьная константа обрамляется апострофами, которые не входят в значение, а являются ограничителями значения. Вместо апострофов могут быть использованы кавычки.
Арифметические и логические операции
Арифметические операции Фортрана (в порядке убывания приоритета):
- ** - возведение в степень;
- *, / - умножение, деление;
- -, + - вычитание, сложение.
Минус (-) и плюс (+) используются также как знаки унарных операций: В Фортране поддерживаются следующие операции отношения:
Знак операции | Альтернативное обозначение | Название операции сравнения |
---|---|---|
.LT. | < | меньше |
.LE. | <= | меньше или равно |
.GT. | > | больше |
.GE. | >= | больше или равно |
.EQ. | == | Равно |
.NE. | / = | не равно |
Для значений комплексного типа действительны только операции "равно" ( .EQ.) и "не равно" ( .NE.).
Логические операции:
Операция | Значение операции |
---|---|
.NOT. | Логическое отрицание |
.AND. | Логическое пересечение (умножение, логическое "И") |
.OR. | Логическое объединение (сложение, логическое "ИЛИ") |
. EQV.и .NEQV. | Логические эквивалентность и неэквивалентность (логические равенство и неравенство) |
Массивы
Массивы описываются с помощью атрибута DIMENSION:
REAL, DIMENSION(1:100) :: C
Параметром этого атрибута должен быть список экстентов (экстент - количество элементов массива для каждого измерения) описываемых массивов в виде
(экстент_1, экстент_2, ..., экстент_n)
Число экстентов определяет ранг массива. Каждый экстент записывается в виде:
[ нижняя_граница : ] верхняя_граница
Пример:
REAL, DIMENSION(0:10, 2, -3:3,11) :: FGRID
Если значение нижней границы опущено, ее значение полагается равным 1. В некоторых случаях, список экстентов сводится к списку разделенных запятыми двоеточий, число которых равно рангу массива. Только число экстентов задается при объявлении динамического массива:
REAL, ALLOCATABLE, DIMENSION(:, :) :: BE_LATER
Динамический массив - это массив, размер которого определяется при выполнении программы, тогда же происходит и выделение памяти под него. Пример:
PROGRAM dyn_array IMPLICIT NONE INTEGER SIZE REAL, ALLOCATABLE, DIMENSION(:) ::array WRITE(*, *) 'SIZE?' READ(*, *) SIZE IF(SIZE > 0) ALLOCATE(array(SIZE)) … IF(ALLOCATED(array)) DEALLOCATE(array) END PROGRAM dyn_array
Оператор описания массива может не содержать атрибута DIMENSION, форма массива может быть указана непосредственно после его идентификатора:
REAL X(10, 20, 30), Y(100), Z(2, 300, 2, 4)
Пример программы
Решение нелинейного уравнения методом Ньютона
PROGRAM NEWTON IMPLICIT NONE REAL (8) :: X, DX, F, DF X = 3.3 ! НАЧАЛЬНОЕ ПРИБЛИЖЕНИЕ DO ! НЬЮТОНОВСКИЕ ИТЕРАЦИИ DX = F(X) / DF(X) ! ВЫЧИСЛЕНИЕ ШАГА X = X - DX ! ВЫЧИСЛЕНИЕ ОЧЕРЕДНОГО ПРИБЛИЖЕНИЯ IF(DX <= SPACING(X)) EXIT ! ЦИКЛ ЗАВЕРШАЕТСЯ, КОГДА ! ШАГ МЕНЬШЕ РАССТОЯНИЯ МЕЖДУ ДВУМЯ ПОСЛЕДОВАТЕЛЬНЫМИ ! ВЕЩЕСТВЕННЫМИ ЗНАЧЕНИЯМИ END DO PRINT *, X ! ВЫВОД ЗНАЧЕНИЯ КОРНЯ PRINT *, F(X) ! ВЫВОД ЗНАЧЕНИЯ ФУНКЦИИ В ТОЧКЕ X PRINT *, DF(X) ! ВЫВОД ЗНАЧЕНИЯ ПРОИЗВОДНОЙ ! ФУНКЦИИ В ТОЧКЕ X END PROGRAM NEWTON REAL(8) FUNCTION F(X) IMPLICIT NONE REAL(8) :: X F = SIN(X) RETURN END