norma-r (1158383), страница 5
Текст из файла (страница 5)
При обращение к величине на области действует правило задания индексов по умолчанию: индексные выражения, совпадающие с именем индекса, могут быть опущены. Например, обращения First[k,l], First[k], First[l], First к величине First эквивалентны.
В случае, если какой-либо индекс задается константой (константным выражением), необходимо указать, к какому индексному направлению относится данная константа, например First[k=5,l-1]. Если надо одно индексное направление связать зависимостью с другим, то это также необходимо делать явно, например диагональные элементы матрицы First можно определить как First[k,l=k] или First[k=l.
5.1.4. Описание параметров области
declaration-of-domain-parameters :
DOMAIN PARAMETERS list-prescription
prescription :
name-domain-parameter = int-const
Границы диапазонов при описании областей могут задаваться неявно - при помощи параметров области. Значения этих параметров должны быть определены в разделе в описании параметров области, например
DOMAIN PARAMETERS M=3, J=90, DomainLeftBoundParameter=15.
Параметры области могут входить в арифметические выражения и константные выражения.
5.1.5. Описание входных и выходных величин
declaration-of-input :
INPUT list-input-scalar
INPUT input-on-domain
input-scalar :
name-scalar [ attributes ]
input-on-domain :
list input-output-variable ON unconditional domain
input-output-variable :
name-variable-on-domain [ attributes ]
declaration-of-output :
OUTPUT list-output-scalar
OUTPUT output-on-domain
output-scalar :
name-scalar [ attributes ]
output-on-domain :
list- input-output-variable ON domain
attributes :
( list-attribute )
attribute :
STR( int-constant )
string
ORDER( list-name-index )
FILE = ' file-name '
ALL
format
format :
I int-constant
{ F,E,D } int-constant . int-constant
Описание входных (выходных) величин означает, что подлежат вводу (выводу) значения всех величин, указанных в списке ввода (вывода). Например, описания
B1 , B2 : B / Z<Eps.
INPUT Velocity ON A. OUTPUT Tau ON B1.
INPUT X, ALPHA.
являются запросами на ввод значений скаляров X, ALPHA, величины Velocity во всех точках области A, а также на вывод значений величины Tau во всех точках области B1, в которых выполнено условие Z<Eps .
Порядок, в котором будут вводиться (выводиться) величины при этом не задается - он определяется в процессе трансляции. Минимальная единица информации, которая вводится (выводится) как единое целое - скаляр или величина на области. Управление вводом (выводом) этих единиц может осуществляться при помощи атрибутов.
Атрибуты действуют на величину (список величин), после которой они указаны. Например, описание
INPUT R1,R2 (FILE ='myfile') ON Grid.
является запросом на ввод из файла myfile.dat значений величины R2 в области Grid, то есть для всех значений индексов этой области, и величины R1 в области Grid из файла norma.dat (имя файла по умолчанию).
Атрибуты позволяют управлять формой входных и выходных данных и связывать данные с входными и выходными файлами:
• STR(n) задает пропуск n-1 строки;
• ‘string’ задает вывод текстовой константы string;
• ORDER указывает порядок изменения индексов при выводе: самым старшим индексом является самый правый, самым младшим - самый левый; для очередного значения каждого старшего индекса младшие принимают все свои значения;
• FILE задает имя входного или выходного файла; способ задания имени файла определяется при реализации (обычно входной файл по умолчанию имеет расширение .dat; при задании имени файла это расширение может быть опущено; если атрибут FILE не задан, то ввод осуществляется из файла norma.dat, а вывод -- на экран дисплея);
• ALL приводит к выводу имени величины и ее координат (значений индексов) для каждого значения величины на области.
• format задает формат для числовых значений при вводе и выводе и соответствует спецификаторам формата I, F, E, D в языке Фортран. По умолчанию установлены форматы: E15.8 для величин типа REAL, D15.8 для величин типа DOUBLE, I5 для величин типа INTEGER.
Для входных величин разрешены только атрибуты format и FILE.
Примеры описания входных величин:
INPUT One (FILE=‘file1’,F10.2), Two(FILE=‘file2.dat’ ) ON Grid2.
Примеры описания выходных величин:
OUTPUT Velocity(' Velocity = ' ,F9.1) .
OUTPUT X(FILE='FILE17' , ORDER(J,K,I), ALL, F5.1) ON Grid.
OUTPUT Y('Matrix of values Y parameter', FILE=‘OT5’ ,ALL,F15.2) ON ABC.
Для вывода данных в более сложной форме (таблицы, графики и т.п.) следует использовать либо средства стандартных библиотек и пакетов, либо собственные программы, написанные на других языках (см. п. 5.2.5).
Синтаксис файла исходных данных:
file :
input-element { input-element }*
input-element :
name-scalar = arithm-constant;
name-variable-on-domain ( list-index-range ) = data ;
index-range :
name-index = int-constant .. int-constant
data :
list-data-element
data-element :
int-constant
body
int-constant ( data )
Программист может:
располагать элементы ввода в произвольном порядке,
изменением порядка следования индексов управлять порядком расположения числовых значений в файле,
сокращенно записывать повторяющиеся данные.
Пример содержимого файла исходных данных:
C(K=1..10)=5(-10.1) ,5(1.01);
ALPHA=3.17; BETA=-0.12; GAMMA=0.000000001;
C(K=11..20)=5(10.1),5(-1.01);
Пример содержимого файла data.dat исходных данных для программы Gauss:
MAIN PART Gauss.
! Solution of linear equations by Gauss-Jourdan method.
BEGIN
Ot:(t=0..n). Oi:(i=1..n). Oj:(j=1..n).
Oij:(Oi;Oj). Otij:(Ot;Oij).
Oti:(Ot;Oi). Otij1:Otij / t=1..n. Oti1:Oti / t=1..n.
DOMAIN PARAMETERS n=5.
VARIABLE a ON Oij. VARIABLE m ON Otij.
VARIABLE b, ON Oi. VARIABLE r ON Oti.
INPUT a(FILE='data') ON Oij, b(FILE='data') ON Oi.
OUTPUT x(FILE='results',ALL) ON Oi.
FOR Otij/ t=0 ASSUME m=a.
FOR Oti / t=0 ASSUME r=b.
OtiEQtij1,OtiNEtj1:Otij1 / i=t. OiEQti1,OiNEti1:Oti1 / i=t.
FOR OtiEQtj1 ASSUME m = m[t-1,i=t]/m[t-1,i=t,j=t].
FOR OiEQj1 ASSUME r = r[t-1,i=t]/m[t-1,i=t,j=t].
FOR OiNEtj1 ASSUME m = m[t-1]-m[t-1,j=t]*m[i=t].
FOR OiNEti1 ASSUME r = r[t-1]-m[t-1,j=t]*m[i=t].
FOR Oi ASSUME x = r [t=n].
END PART.
Входной файл data.dat:
B(I=1..3)=5.0, 13.0, 3.0;
A(I=1..5,J=1..5)=2.0, 3.0, -4.0, 5.0, -1.0,
3.0, 4.0, -1.0, 6.0, 1.0,
2.0, 0.0, -3.0, 0.0, 4.0,
0.0, 2.0, 0.0, 0.3, 0.0,
3.0, -1.0, 2(0.0), 1.0;
B(I=4..5)= 5.0, 3.0;
Значения многомерных массивов данных располагаются в файле в соответствии с указанными индексами, причем первыми меняются значения более правого индекса - в приведенном примере матрица A(I,J) задана по строкам, то есть I =1, J = 1,2,3,4,5, затем I = 2, J = 1,2,3,4,5 и так далее до I =5, J = 1,2,3,4,5.
Способ задания входного файла data.dat, конечно, не является единственным.
5.1.6. Описание внешних имен
declaration-of-external-names :
declaration-of-external-functions
declaration-of-external-parts
declaration-of-external-functions :
EXTERNAL FUNCTION list-name-external-function [ type ]
declaration-of-external-parts :
EXTERNAL PART list-name-external-simple-part
В описании внешних имен обязательно указываются имена функций или разделов, которые являются фактическими или формальными параметрами раздела или функции. По умолчанию внешняя функция имеет тип REAL.
EXTERNAL FUNCTION Last,First DOUBLE.
EXTERNAL PART Middle.
5.1.7. Описание индексов распределения
declaration-of-distribution-indexes :
DISTRIBUTION INDEX name-index = simple-range , name-index = simple-range
simple-range :
int-constant .. int-constant
Описание индексов распределения служит для отображения двух индексных направлений индексного пространства области задачи на матрицу процессорных элементов (ПЭ) распределенной системы. Разделы или функции, в которых присутствует это описание, называются распределенными, если оно отсутствует - нераспределенными. В распределенном разделе или функции это описание должно встречаться не более одного раза.
Данное описание приводит к распределению между ПЭ системы как данных, так и управления, и автоматической генерации операторов обмена данными между ПЭ, если это необходимо. Распределению подлежат величины, участвующие в расчетах и имеющие индексы, совпадающие с указанными в описании DISTRIBUTION INDEX.
Например, если задано описание
DISTRIBUTION INDEX i=1..8, j=1..1.
то все переменные, определенные на областях с индексами i и j, будут распределены по ПЭi,j с виртуальными номерами строк i=1..8 в столбце с номером j=1 матрицы ПЭ.
Вычисления, описанные в нераспределенном разделе или нераспределенной функции, выполняются целиком в одном ПЭ (хотя таких ПЭ может быть и несколько).
Описание
DISTRIBUTION INDEX i=2...8,j=0..0.
неверно: считается, что элементы матрицы ПЭ нумеруются, начиная с 1.
5.2. Операторы в языке Норма
operator :
scalar-operator
operator-ASSUME
call-part
В Норме определены три вида операторов: скалярный оператор, оператор ASSUME и вызов раздела. Операторы предназначаются для описания вычислительных действий, необходимых для решения задачи.
5.2.1. Скалярный оператор
scalar-operator :
name-scalar = scalar-arithm-expression
scalar-arithm-expression :
arithm-expression
Скалярный оператор предназначен для вычисления арифметических значений скаляров. По существу, это аналог оператора присваивания традиционных языков программирования, в левой части которого указывается имя скаляра, а в правой части - скалярное арифметическое выражение, построенное обычным образом из скаляров, арифметических констант, параметров области, обращений к функциям, величин на области с индексами-константами.
В скалярное арифметическое выражение не могут входить величины, определенные на области, у которых индексные выражения не являются константами (исключением из этого правила являются аргументы функций редукции, см. п. 5.2.3).
IJ: ( ( i=1..MaxI) ; (j=1..MaxJ ) ).
DOMAIN PARAMETERS MaxI = 3, MaxJ = 90.
VARIABLE ScalarV INTEGER. VARIABLE Pi DOUBLE.
VARIABLE ArrayV DEFINED ON IJ DOUBLE.
ScalarV = MaxI*(MaxJ-1)/2+SQRT(PI)/SIN(ArrayV[i=1,j=55]).















