rtsIDr (1158449), страница 23
Текст из файла (страница 23)
ceil((LastIndex - InitIndex + 1) / Step) ,
где:
| InitIndex | | начальное значение индексной переменной параллельного цикла для измерения *AxisPtr; |
| LastIndex | | конечное значение индексной переменной параллельного цикла для измерения *AxisPtr; |
| Step | | шаг изменения индексной переменной параллельного цикла для измерения *AxisPtr; |
| сeil | | функция нахождения наименьшего целого, не меньшего значения своего аргумента. |
При нулевом значении *AxisPtr возвращается размер всего объекта (произведение размеров всех измерений).
Если *ObjectRefPtr не является ссылкой ни на один из вышеперечисленных объектов, то функция возвращает нулевое значение.
| long locsiz_ ( | ObjectRef | *ObjectRefPtr, |
Функция locsiz_ аналогична рассмотренной выше функции getsiz_, но возвращает локальный размер измерения *AxisPtr (или локальный размер всего объекта), т.е. размер части объекта, отображённой на текущий процессор. Если объектом является многопроцессорная система, то значения, возвращаемые функциями getsiz_ и locsiz_, совпадают.
Отметим, что локальный размер всего объекта, не имеющего локальной части на текущем процессоре, равен нулю.
17.3Опрос признака распределенного массива
long tstda_ (ObjectRef *ObjectRefPtr);
Функция tstda_ позволяет установить, является ли объект, заданный ссылкой *ObjectRefPtr, распределённым массивом.
Возвращается значение:
0 объект не является распределённым массивом;
1 объект является распределённым массивом;
2 объект является полностью размноженным распределённым массивом.
17.4Опрос длины элемента распределенного массива
long getlen_ (long ArrayHeader[]);
ArrayHeader заголовок распределённого массива.
Функция getlen_ возвращает длину элемента заданного распределённого массива в байтах.
17.5Уничтожение заданного объекта
long delobj_ (ObjectRef *ObjectRefPtr);
*ObjectRefPtr ссылка на уничтожаемый объект.
Уничтожаемым объектом может быть:
-
распределённый массив (ссылка на него первое слово его заголовка);
-
представление абстрактной машины;
-
многопроцессорная система;
-
карта отображения представления абстрактной машины;
-
карта отображения распределённого массива;
-
редукционная переменная;
-
редукционная группа;
-
группа границ распределённых массивов;
-
буфер удалённых элементов регулярного доступа;
-
группа буферов удалённых элементов регулярного доступа;
-
буфер удалённых элементов нерегулярного доступа;
-
группа буферов удалённых элементов нерегулярного доступа.
Объект быть уничтожена функцией delobj_ только в том случае, если он был создан в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Возвращается нулевое значение.
17.6Опрос признака процессора ввода/вывода
long tstio_ (void);
Функция возвращает единицу, если текущий процессор является процессором ввода/вывода, и нуль в противном случае.
17.7Рассылка областей памяти процессора ввода/вывода
| long srmem_ ( | long | *MemoryCountPtr, |
| *MemoryCountPtr | | число областей рассылаемой памяти. |
| StartAddrArray | | массив, i-й элемент которого содержит начальный адрес (i+1)-й области, приведенный к типу AddrType. |
| LengthArray | | массив, i-й элемент которого содержит длину в байтах (i+1)-й области. |
Функция srmem_ передает заданные области памяти процессора ввода/вывода всем остальным процессорам решающего поля. При выполнении функции процессором ввода/вывода осуществляется передача, любым другим процессором приём. Число параметров, задаваемых в массивах LengthArray и StartAddrArray, должно быть равно *MemoryCountPtr. Длина каждой рассылаемой области не должна превосходить максимального положительного целого числа (LengthArray[i] ≤ (unsigned int)-1 >> 1).
Возвращается нулевое значение.
Для преобразования адреса переменной к виду, пригодному для использования в функции srmem_ , в системе поддержки предусмотрена функция
AddrType dvmadr_(void *VarPtr); ,
предназначенная для использования в Фортране.
Для различных типов переменных Фортрана могут быть использованы также функции
| AddrType | getash_ ( | void *VarPtr ); |
| AddrType | getai_ ( | void *VarPtr ); |
| AddrType | getal_ ( | void *VarPtr ); |
| AddrType | getaf_ ( | void *VarPtr ); |
| AddrType | getad_ ( | void *VarPtr ); |
| AddrType | getac_ ( | void *VarPtr ); |
| AddrType | getach_ ( | void *VarPtr, |
аналогичные функции dvmadr_ (параметр VarPtr – адрес текстовой строки, а StrLength – её длина, формируемая Фортран-компилятором).
Функции srmem_ и dvmadr_ (getash_, getai_, getal_, getaf_, getad_, getac_, getach_) могут быть использованы для реализации операций ввода/вывода.
18Об использовании функций системы поддержки в Фортране
Для согласования размещения в памяти массивов по столбцам, принятом в Фортране, с построчным их размещением, предполагаемым в языке C, требуется инверсный порядок задания индексов элементов массивов (по сравнению с их заданием в языке C). Кроме того, предполагаемые в данном документе начальные значения индексов массивов нулевые, что соответствует языку C. В Фортране единичные.
Типы данных (кроме базовых типов языка C, DVMFILE* и DVMHANDLE*), используемые при работе с функциями системы поддержки, определены как "unsigned long". Для них допустимы лишь операции присваивания и указания в качестве фактических аргументов при обращении к функциям и подпрограммам.
Каждый базовый тип данных языка C, используемый при обращении к функциям системы поддержки, должен иметь эквивалентное представление в виде некоторой конструкции языка Фортран. Контроль правильности представления базового типа данных языка C в Фортране осуществляется по длине этого представления с помощью функции
| void tpcntr_( | long | *ElmNumberPtr, |
| *ElmNumberPtr | | число элементов, заданных в массивах FirstAddrArray, NextAddrArray, TypeLengthArray и TypeCodeArray. |
| FirstAddrArray, NextAddrArray | | массивы, в i-х элементах которых содержатся адреса двух соседних элементов типа с номером TypeCodeArray[i] (в представлении языка Фортран). |
| TypeLengthArray | | массив, в i-м элементе которого задана предполагаемая длина типа с номером TypeCodeArray[i]. |
| TypeCodeArray | | массив, содержащий номера (коды) контролируемых типов данных языка C. |
Функция tpcntr_ предполагает следующую нумерацию типов языка C:
-
"int";
-
"long";
-
"float";
-
"double";
-
"char";
-
"short".
Если при выполнении функции tpcntr_ будет установлено, что длина данных типа с номером TypeCodeArray[i] не равна разности (NextAddrArray[i] – FirstAddrArray[i]) или значению TypeLengthArray[i], то программа пользователя будет завершена с выводом диагностики, содержащей:
-
значение i;
-
истинную и предполагаемую длины данных TypeCodeArray[i]-го типа;
-
разность (NextAddrArray[i] – FirstAddrArray[i]).
Обращение к функции tpcntr_ должно предшествовать инициализации системы поддержки из Фортран-программы с помощью функции linit_ (см. п. 2).
Пример.
integer getac, getash, getai, getal, getaf, getad, linit
integer dvm
integer faddr(8), naddr(8), tlen(8), tcode(8)
integer tint(2)
logical tlog(2)
character*1 tchar (2)
real tfloat (2)
double precision tdouble (2)
integer*2 tint2 (2)
integer*4 tint4 (2)
integer*8 tint8 (2)
C Инициализация массивов с адресами соседних элементов одинакового типа
faddr(1) = getai (tint(1))
naddr(1) = getai (tint(2))
faddr(2) = getal (tlog(1))
naddr(2) = getal (tlog(2))
faddr(3) = getaf (tfloat(1))
naddr(3) = getaf (tfloat(2))
faddr(4) = getad (tdouble(1))
naddr(4) = getad (tdouble(2))
faddr(5) = getach (tchar(1))
naddr(5) = getach (tchar(2))
faddr(6) = getash (tint2(1))
naddr(6) = getash (tint2(2))
faddr(7) = getai (tint4(1))
naddr(7) = getai (tint4(2))
faddr(8) = getai (tint8(1))
naddr(8) = getai (tint8(2))
С Инициализация массива с предполагаемыми длинами контролируемых типов
tlen(1) = 4
tlen(2) = 4
tlen(3) = 4
tlen(4) = 8
tlen(5) = 1
tlen(6) = 2
tlen(7) = 4
tlen(8) = 8
С Инициализация массивов с номерами контролируемых типов
tcode(1) = 1
tcode(2) = 1
tcode(3) = 3
tcode(4) = 4
tcode(5) = 5
tcode(6) = 6
tcode(7) = 1
tcode(8) = 2
C Контроль типов данных
call tpcntr (8, faddr, naddr, tlen, tcode)
C Инициализация системы поддержки
dvm = linit (0)
19Примеры программ, использующих функции системы поддержки
19.1Решение уравнения Лапласа методом Якоби
Применение основных функций системы поддержки проиллюстрируем примером численного решения двухмерного уравнения Лапласа
| 2U | 2U |
в заданной прямоугольной области с заданными краевыми условиями (задача Дирихле).
Трехточечная аппроксимация частных производных уравнения (1) на квадратной сетке с использованием пятиточечного шаблона
(i-1,j) , (i+1,j) , (i,j) , (i,j-1) , (i,j+1)
даёт разностное уравнение (схему "крест"), приводимое к виду
ui,j = (ui+1,j + ui-1,j + ui,j+1 + ui,j-1)/4 (i,j = 1, ... , k-2) (2) ,
| где: | k | | число точек сетки по каждому измерению; |
| ui,j | | значение сеточной функции в узле (i,j). |
Значения сеточной функции















