norma-r (1158383), страница 4
Текст из файла (страница 4)
Имя-индекса есть индексная переменная, множество значений которой определяется диапазоном const-expression .. const-expression. Границами диапазона являются целые положительные константные выражения, построенные из целых констант, параметров области и арифметических операций. Требуется, чтобы в программе всем параметрам области были присвоены конкретные значения в описании параметров области. Значение нижней границы диапазона должно быть не больше значения верхней границы.
Многомерная область строится при помощи операции “;” произведения прямоугольных областей.
Пример описания двумерной области, полученной с помощью операции произведения одномерных областей AxisK и AxisL:
Square: (AxisK : (k=1..15) ; AxisL : (l=1..5) ) .
Область Square может быть описана также другими способами (например, с учетом описания, приведенного выше):
Square : (RegionK ; AxisL : (l=1..5) ).
Операция “;” произведения прямоугольных областей обладает следующим свойством: если A и B - области, то A;B=B;A .
Это означает, что порядок направлений индексного пространства при описании области не фиксируется (или, что с точки зрения пользователя то же самое, фиксируется некоторым произвольным образом). Если порядок направлений индексного пространства существенен (например, необходимо согласование направлений при использовании величин на одних и тех же областях в различных разделах), то он может быть задан при помощи описания INDEX (см. п. 5.1.2).
Области, являющиеся операндами операции произведения областей, должны иметь различные имена индексов.
Модификация прямоугольной области может состоять в добавлении некоторого числа точек, в удалении точек или изменении диапазона. Модификация двух первых типов описывается при помощи функций границ LEFT(n) и RIGHT(n). Функция LEFT применяется к левой границе диапазона, функция RIGHT - к правой границе диапазона. Знак "+" перед функцией означает, что к одномерной области добавляются точки, "-" - что из одномерной области удаляются точки. Обе эти функции имеют один параметр n, определяющий число точек, которые необходимо удалить или добавить к области. В качестве фактического параметра функций LEFT и RIGHT может быть задана только целая положительная константа. Обращение к функциям допустимо лишь в контексте с именем одномерной области, задающей модифицируемый диапазон:
name-onedimensional-domain {+,-} LEFT(n)
или
name-onedimensional-domain {+,-} RIGHT(n).
Например, описание
FlushK : Square / AxisK - LEFT(2) + RIGHT(2) .
определяет область FlushK, состоящую из точек k=3 .. 17.
Границы диапазона, получаемого в результате применения функций LEFT или RIGHT, должны быть положительными целыми, причем левая граница не должна превосходить правую.
Описание
Square2: Square / AxisK+Left(1)-Right(2) .
неверно, так как левая граница получаемого в результате диапазона k=0..13 не является положительной.
Область, модифицируемая при помощи функций Left или Right должна быть многомерной областью.
Можно изменить составляющую одномерную область и путем явного переопределения диапазонов. Для этого в модификации надо указать имя индекса направления и его новое значение. Например:
Newsquare: Square / AxiisK+RIGHT(3), L=50...80.
Если список модификаций содержит более одного элемента, то заданные в этом списке модификации действуют на модифицируемую область в порядке написания слева направо.
Кроме определения прямоугольных областей, в Норме имеется возможность задания диагональных областей путем наложения условий на уже определенную область (прямоугольную или диагональную).
Диагональная область определяется при помощи условий на индексы некоторой ранее определенной области D и состоит из тех точек области D, в которых эти условия принимают значение ’’истина’’. Например, описания
KL: ( (k=1..10) ; (l=1..10) ) . Diagonal: KL/ k=l.
задают область Diagonal , состоящую из точек (k=1, l=1), (k=2, l=2), ...., (k=10, l=10).
Индексы величин, используемых при записи условия на индексы, не обязательно должны входить в множество индексов области D, на которую накладываются условия --- это могут быть внешние индексы (см. п. 5.2.3.2).
Допустимый вид условий на индексы позволяет статически определить точки, из которых состоит диагональная область (это возможно, конечно, и для прямоугольной области). Поэтому прямоугольные и диагональные области являются статическими объектами, в отличие от условных областей, рассматриваемых ниже.
5.1.1.2. Описание условной области
declaration-of-conditional-domain :
name-conditional domain , name-conditional-domain : name-domain / condition-on-domain
Помимо задания статических областей, в Норме имеется возможность задания условной области, которая состоит из точек индексного пространства, число и координаты которых могут меняться в зависимости от выполнения (или не выполнения) условий на область.
Идея задания условной области заключается в следующем. Ранее определенная область D разбивается на две непересекающиеся подобласти D1 и D2. Первая подобласть состоит из точек области D , в которых заданное условие на область принимает значение “истина”, вторая - из точек, в которых оно принимает значение ’’ложь’’. При этом D1
D2= D , D1
D2=
.
Например, пусть заданы области:
Domain: ( ( i=2..n) ) ; ( j=1..m ) ) .
Domain1,Domain2: Domain / x+y[ i-1, j ] - z[ j+1 ] > 0 .
Это описание определяет разбиение исходной области Domain на области Domain1 и Domain2, такие, что
Domain1
Domain2 = Domain, Domain1
Domain2 =
.
Область Domain1 состоит из точек Domain, в которых условие x+y[i-1, j] - z[j +1] > 0 принимает значение “истина”, Domain2 - из точек, в которых условие принимает значение “ложь”.
Индексы величин, используемых при записи условия, не обязательно должны входить в множество индексов области D, на которую накладываются условия - это могут быть внешние индексы (см. п. 5.2.3.2).
Ниже приведен фрагмент программы, описывающий условные области Bf2PI и BfNot2PI, затем область BfNot2PI разбивается на условные области Nodes и NotNodes, а область NotNodes - в свою очередь на условные области DomainTrue, DomainFalse:
DOMAIN PARAMETERS N=3, NV=3 .
Bnu : (Nu=0..2*N) . Bf : ( II=0..(2*N+1) * (2*NV+1 ) . BfNu : (Bf ; Nu) .
Bf2PI , BfNot2PI : BfNu / II=(2*N+1)*(2*NV+! ) AND NU=0 .
Nodes , NotNodes : BfNot2PI / ABS (BTNodes -BT ) < 0.0001 .
DomainTrue , DomainFalse : Nodes / ABS(BTNu - BTNodes ) < 0.0001 .
VARIABLE BT, BTNodes DEFINED ON Bf DOUBLE .
VARIABLE BTNu DEFINED ON Bnu DOUBLE .
5.1.2. Описание индексов областей
declaration-of-domain-indexes :
INDEX list-name-index
При описании области порядок направлений индексного пространства не фиксируется (или, что с точки зрения автора программы то же самое, фиксируется некоторым произвольным образом). Если порядок направлений индексного пространства существенен (например, необходимо согласование направлений при использовании величин на одних и тех же областях в различных разделах), то он задается при помощи описания индексов областей. Порядок направлений индексного пространства совпадает с порядком перечисления имен индексов в описании INDEX (слева направо).
Рассмотрим вызов раздела B из раздела A с передачей из раздела A в раздел B значений величины X, определенной на области SquareInA:
PART A.
BEGIN
INDEX k,l .
SquareInA.: (AxisK: (k=1..5) ;AxisL: (l=1..10) ).
VARIABLE X DEFINED ON SquareInA.
COMPUTE B( X ON SquareInA).
END PART
PART B. X
BEGIN
INDEX i,j.
SquareInB : (AxisK: (i=1..5) ; AxisL: (j=1..10) ) .
VARIABLE X DEFINED ON SquareInB.
END PART
Описания INDEX k,l и INDEX i,j устанавливают соответствие между индексами: i~k,j~l , то есть значения величины X трактуются в обоих разделах одинаково. Если описание INDEX i,j из раздела B заменить на INDEX j,i , то значения по соответствующим направлениям оказываются несогласованными: 5
10, 10
5.
5.1.3. Описание величин
declaration-of-scalar-variables :
VARIABLE list-name-scalar [ type ]
declaration-of-variables-on-domains :
VARIABLE list-name-variable-on-domain DEFINED ON name-unconditional-domain [ type ]
type :
{ REAL, INTEGER, DOUBLE }
Скалярные величины (скаляры) и величины на области относятся к арифметическим величинам. Описание ставит в соответствие каждой арифметической величине уникальное в текущем разделе имя величины, а также задает тип величины: REAL, INTEGER или DOUBLE (по умолчанию - тип REAL).
Пример описания скаляров:
VARIABLE Alpha, X, H. VARIABLE IJK, Z INTEGER.
Каждая величина на области связывается с указанной в описании областью. Эта область определяет имена индексов, которые могут использоваться в индексных выражениях при обращении к данной величине, причем порядок указания индексных выражений не существенен. Для индексов не требуется специального описания - они вводятся при описании областей.
Square: (AxisK: (k=1..5) ; AxisL: (l=1..5) ).
VARIABLE First,Last DEFINED ON Square.
VARIABLE SingleK DEFINED ON AxisK DOUBLE.
VARIABLE SingleL DEFINED ON AxisL INTEGER.
Приведенные описания определяют величины First, Last на области Square; это означает, что эти величины могут иметь в индексных выражениях индексы k и l; величины SingleK, SingleL определены, соответственно, на областях AxisK и AxisL, то есть могут иметь в индексных выражениях индексы k и l соответственно. При этом обращения First[k-1,l+1] и First[l+1,k-1] эквивалентны (подробнее см п. 5.1.2).















