next up previous contents
След.: Упражнения Выше: f08_new_win Пред.: Оператор DATA   Содержание


Комассивы

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

Терминология аналогична: термины для массивов снабжаются приставкой «ко». Коиндексы (coindices) комассива определяют его элементы (объекты данных на других образах), коранг определяет число коиндексов, необходимых для идентификации образа, то есть число коизмерений (codimension), коразмер (cosize) определяет число образов, конфигурация (coshape, термин «коконфигурация» выглядит не слишком эстетично; впрочем, русскоязычная терминология в области технологии комассивов пока не устоялась) -- одномерный массив размера, равного корангу, содержащий количество возможных значений каждого коиндекса. Коразмер многомерного комассива не обязательно равен произведению элементов конфигурации комассива (число образов определяется при запуске программы и зависит от системы и настроек компилятора). Иными словами, комассив не обязан быть прямоугольным. Порядок элементов комассива ранга больше единицы определяется так же, как и порядок в массиве, поэтому некорректность некоторых наборов коиндексов может не быть очевидной без учета этого фактора. Например, если образов 16 и объявление было

REAL:: A[5,*]

то обращение A[2,4] некорректно, так как требует образ с номером 17. А A[1,4] обращается к образу 16 и потому корректно.

Комассивы объявляются с атрибутом CODIMENSION. В квадратных скобках указываются коизмерения.Сумма измерений и коизмерений не должна превосходить $ 15$ . Последним измерением должна быть звездочка *, так как количество образов на этом этапе принципиально неизвестно. Например,

REAL, DIMENSION(3), CODIMENSION[*]:: A

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

A[1] -- весь массив A на образе 1.

A(2)[3] -- второй элемент массива A на образе 3.

A(2:3)[2] -- секция массива A на образе 2.

Следует иметь в виду параллельность выполнения образов. Так, если код A[1] = 7.40 присутствует на всех образах, то он и будет выполнен всеми образами, причем в хаотичном порядке, что не эффективно, а в ряде случаев создает ситуацию гонки. Например, если записываемые значения различны, значение A на первом образе нельзя предсказать.



Подсекции

Ilya A. Chernov 2012-12-19
X