79
Параметром
этого
атрибута
должен
быть
список
экстентов
(
экстент
–
количество
элементов
массива
для
каждого
измерения
)
описываемых
массивов
в
виде
(экстент_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