Имя | Смысл/вид | Тип. |
array | Имя отображаемого массива / входной | Числовой |
status | Статус вызова fagl-подпрограммы. В случае успеха равен нулю/ выходной | integer(4) |
filename | Строка, возвращаемая faglGetShareName/ выходной | CHARACTER(*) |
filename | Имя файла без расширения, если файл пишется в директорию, из которой вызвано приложение, либо полное имя файла / входной. | CHARACTER(*) |
lbnd | Массив ранга 1, размер которого равен рангу отображаемого массива / выходной | INTEGER(4) |
title | Строка, отображаемая в заголовке экземпляра AV / входной | CHARACTER(*) |
Для вызова приведенных выше подпрограмм в использующем их программном компоненте следует выполнить ссылку:
Useavdef ! Ссылка на модуль avdef.f90
Модуль AVDEF содержит интерфейсы fagl-подпрограмм.
Перечисленные подпрограммы обычно используются следующим образом:
1. до отображения массива array вызовите faglStartWatch с параметром array;
2. если необходимо отображать массив, имея нижнюю левую границу, отличную от единицы, примените faglLBound;
3. для отображения сообщения, сопровождающего выводимые данные, вызовите faglName;
4. для запуска AV и отображения массива array вызовите faglShow с первым параметром, равным array. AV будет функционировать до тех пор, пока не выполнена команда faglClose;
5. если хранимые массивом данные подверглись изменениям, то для их отображения вызовите faglClose;
6. для сохранения массива array в виде файла с расширением AGL (ArrayGraphingLanguage) вызовите faglSaveAsFile, использовав array в качестве первого параметра. При этом AV может быть некактивным;
7. при необходимости можно вызвать faglGetShareName и получить строку filename, позволяющую процедурам Avis2D и AvisGrid осуществлять доступ к памяти, занятой массивом.
8. после завершения просмотра массива вызовите faglEndWatch.
Для массивов отображаемых в AV рекомендуется использовать атрибут !DEC$ATTRIBUTESarray_visualizer :: array. Действие этого атрибута таково: память, занимаемая массивом array, используется и AV и приложением. При отсутствии атрибута будут созданы две области данных array и при каждом обновлении массива после вызова faglUpdate данные будут копироваться из области, принадлежащей приложению, в область, используемую AV.
Заметим, что DEC-атрибут ARRAY_VISUALIZER может быть применен только с динамическими объектами, т.е. объектами, обладающими атрибутом PIONTER или ALLOCATABLE.
FAV - подпрограммы.
Fav – подпрограммы управляют AV и обеспечивают взаимодействие AV с приложением. Как правило, fav- и fagl- подпрограммы используются совместно. Fav – подпрограммы подразделяются на группы, имеющие названия:
· запуск AV
· доступ к данным
· зона вывода
· фильтрация данных
· палитра
· оси координат
· выбор
· виды изображений
· 3D вид
· растровая карта
· векторный граф
· отображение данных
· камера
· маркер
· разное
Работа с fav-подпрограммами станет возможной после выполнения ссылки:
Use avviewer
в которой модуль AVVIEWER содержит интерфейсы и константы подпрограмм.
Поскольку fav – подпрограмм очень много (более 100), приведем описание только тех из них, которые используются в программе.
Подпрограмма | Что выполняет |
Запуск AV | |
favStartViewer | Запускает экземпляр AV |
favEndViewer | Завершает работу экземпляра AV |
Доступ к данным | |
favSetArray | Загружает в AV заданный массив |
Фильтрация данных | |
favUpdate | Вызывается, когда нужно обновить изображение, созданное AV, чтобы отобразить изменения, произошедшие с момента последнего обновления данных или начальной загрузки. |
Оси координат | |
favSetDimScale | Ассоциирует ось координат с массивом, содержащим разметку оси. |
favSetUseAxisLabel | Включает/отключает вывод заданных пользователем имен осей координат |
favSetAxisLabel | Задает имя указанной оси координат. |
Виды изображений | |
favSetGraphType | Задает видовой режим |
Разное | |
favSetArrayName | Задает текст, выводимый на заголовочной полосе AV |
favShowWindow | Отображает/скрывает окно AV |
1.4 Разработка программы визуализации
Задачей ставилось создание ПО, позволяющего просматривать результаты расчетов в графическом виде, использую при этом библиотеки AV и язык CompaqVisualFortran (CVF).
Интерфейс с рассчитывающей программой был выбран файловый, т.е. входными данными для программы console являются два файла. Один – читающийся первым с начальными установками для массива, осей координат. Второй – непосредственно результаты. Тип файлов – не компрессированные, текстовые. Последнее выбрано исходя из соображений совместимости не только с Fortran-программами, но и с C/C++ и даже Pascal-программами.
Требования к выводу информации.
Для вывода были поставлены следующие задачи:
· для двумерных массивов – вывод в 3D виде с возможностью анимации
· для двумерных массивов – вывод в виде растровой карты (контрастной заливки)
· вывод одномерных случаев (сечений массива) с возможностью анимации.
Выбор пользовательского интерфейса.
Из соображений простоты программы, ее размеров, а также легкости модификации был выбран консольный интерфейс. Благодаря этому программа имеет небольшой листинг, простую структуру и легка для понимания. Для добавления новых возможностей, новых команд нет необходимости изменять файлы ресурсов (как было бы в случае WIN32 приложения), и несколько различных подпрограмм. Достаточно лишь внести в условия проверки команд новую команду и написать подпрограмму ее обработки. В дополнение к этому следует заметить, что также повышена переносимость программы на различные платформы, т.е. достаточно перекомпилировать код (может быть с небольшими изменениями) на соответствующем компиляторе для нужной платформы (естественно для этой платформы должна быть версия AV).
Структура программы.
Программу можно логически разбить на 6 блоков, выполняющих каждый свои функции (в листинге (Приложение 1) они помечены комментариями):
1. Block_1: описание переменных и массивов. Все массивы имеют атрибут allocatable, для совместимости с DEC-атрибутом ARRAY_VISUALIZER. Рабочие массивы следующие: TDMas – трехмерный массив, в который заносятся все результаты расчетов. VMas – двумерный массив, отображаемый в 3D-виде и в растровой заливке. PXMas и PYMas – одномерные массивы, соответствующие сечениям по координатам. XAxis и YAxis – одномерные массивы, содержащие разбивку шкал.
2. Block_2: считывание служебной информации, результатов расчетов, формирование массивов шкал. Этот блок начинается с оператора callHelp(), вызывающего соответствующую подпрограмму, показывающую команды программы. Потом задаются значения по умолчанию для имен и масштабов шкал. Далее организовывается ввод имен файлов – сначала файла со служебной информацией, потом файла с данными. Имена должны быть не больше 70 символов (включая пути). Далее идет считывание файла со служебной информацией, потом размещение массивов в памяти, после чего задаются массивы шкал и, наконец считываются отображаемые данные, которые распределяются между всеми массивами, участвующими в визуализации (начальное состояние: для PXMasi=1, для PYMasj=1, для всех массивов k=1)
3. Block_3: задание начальных установок AV с помощью подпрограмм API.
4. Block_4: блок обработки команд. Состоит из операторов if..then…endif . Если команда распознана, то передается управление соответствующей подпрограмме. При вводе команды newfile передается управление блоку 2, а при вводе команды exit передается управление блоку 5.
5. Block_5: завершение программы. Освобождение ресурсов, задействованных для связи с AV, освобождение памяти, выделенной под массивы и закрытие оболочки AV.
6. Block_6: блок описания подпрограмм. Все подпрограммы являются встроенными и содержатся в разделе contains. Все подпрограммы предназначены для обработки команд. Почти все из них (кроме Animat и Paus) не содержат локальных переменных, для упрощения взаимодействия, структуры, сокращения количества требуемых ресурсов.
Графически структуру программы можно изобразить как это сделано на рис 4 (оговоримся сразу – это не блок-схема программы, это только схематичное изображение структуры).
Как легко можно заметить, для модификации программы, добавления в нее новых команд и возможностей достаточно изменять только блоки 4 и 6, т. е. добавлять новые условия и подпрограммы. Так же желательно включать новые команды в подпрограмму Help. Это позволит пользователям в любой момент получить список команд программы.
Почти все подпрограммы, реализующие команды используют глобальные массивы TDMas, VMas, PXMas, PYMas, XAxis, YAxis – это позволяет не передавать их, а также оперировать ими, в случае необходимости в основной программе. Так же подпрограммы используют глобальные переменные plx, ply, pld и vis.
Каждая из них равна единице если соответствующий режим включен и равна нулю в противоположном случае. Эти переменные используются для того чтобы не переключаться каждый раз в новый режим. Также они используются подпрограммой Animat() для определения, какой массив ей заполнять.