PRADIS
РАЗРАБОТКА ПГО НА ФОРТРАНЕ
ПРОГРАММНЫЙ КОМПЛЕКС ДЛЯ АВТОМАТИЗАЦИИ МОДЕЛИРОВАНИЯ НЕСТАЦИОНАРНЫХ ПРОЦЕССОВ В МЕХАНИЧЕСКИХ СИСТЕМАХ И СИСТЕМАХ ИНОЙ ФИЗИЧЕСКОЙ ПРИРОДЫ
ВЕРСИЯ 4.3
1. Описание общей схемы работы ПГО
5. Описание формата репозитория.
6. Описание процесса добавления новой ПГО
ПГО на Фортране для ПостПроцессора (ПП) разрабатываются в виде DLL библиотек подключаемых к ПП с использованием плагин механизма. ПП загружает нужную DLL, которая содержит процедуру ПГО. Информация о ПГО и DLL описывается в файле ропозитория ПГО (PGO_List.txt). Репозиторий ПГО содержит в своем списке не только ПГО, написанные на Фортране, но и ПГО, написанные на С++. Собственно говоря, основным языком разработки ПГО для ПП является С++, так как этот язык предоставляет доступ ко всем ресурсам графического ядра. На Фортране возможен доступ лишь к операциям создания геометрических объектов.
Когда требуется нарисовать объект или изменились его координаты, ПП вызывает соответствующую процедуру ПГО. В ПГО передаются все массивы, так же как и при вызове ПГО из решателя.
Графический объект ПГО на Фортране создается с помощью набора графических примитивов, входящих в соответствующую библиотеку, написанную на Фортране. Графические примитивы вызываются как подпрограммы с определенными параметрами. Эти параметры передаются в специальный объект ПП, который строит на их основе вызуальный образ сответствующий примитиву и отображает его в 3D окне ПП. Параметры передаются в объект через специально выделенний массив.
Входные данные для ПГО берутся из массива A решателя, которые во время выполнения решателя записываются в специальный файл, имеющий имя такое же, как имя файла задания и расширение .DAT. В ПГО входные данные передаются через входные параметры, структура которых описана в документе plugins.doc и в параграфе 2 этого документа.
ПГО теперь, в отличие от старого способа задания входных параметров, имеют строго регламентированный список входных параметров. Список параметров следующий:
· NAMEX: имя модели, связанной с ПГО. Массив пробелов, при значениях параметров паспорта VPS=0 и EXT=0 (неподвижный графический образ). Имеет тип CHARACTER * 8 при реализации вызова на FORTRAN.
· I: вектор сил (моментов) для элемента. Имеет тип REAL * 8 при реализации вызова на FORTRAN.
· X: вектор перемещений узлов модели, связанной с ПГО, размерности EXT. Не используется при значении параметров паспорта VPS=0 и EXT=0, а также при значении параметра UNV>0 (в этом случае используется вектор INNER). Имеет тип REAL * 8 при реализации вызова на FORTRAN.
· V: вектор скоростей узлов модели, связанной с ПГО, размерности EXT. Не используется при значении параметров паспорта VPS=0 и EXT=0, а также при значении параметра UNV>0 (в этом случае используется вектор INNER). Имеет тип REAL * 8 при реализации вызова на FORTRAN.
· A: вектор ускорений узлов модели, связанной с ПГО, размерности EXT. Не используется при значении параметров паспорта VPS=0 и EXT=0, а также при значении параметра UNV>0 (в этом случае используется вектор INNER).
· INNER: вектор вещественных чисел имеющих смысл степеней свободы модели элемента, связанной с ПГО. Не используется при значении параметров паспорта VPS=0 и EXT=0, а также при значении параметра UNV=0 (в этом случае используются вектора X,V,A).
· EXT: количество степеней свободы модели элемента, связанной с ПГО (длина INNER). Имеет тип INTEGER * 4 при реализации вызова на FORTRAN.
· PARX: вектор параметров модели, связанной с ПГО. Не используется при значении параметров паспорта VPS=0 и EXT=0. Имеет тип REAL * 8 при реализации вызова на FORTRAN. Нулевой элемент этого массива содержит количество параметров.
· WRKX: рабочий вектор модели, связанной с ПГО. Не используется при значении параметров паспорта VPS=0 и EXT=0. Имеет тип REAL * 8 при реализации вызова на FORTRAN.
· PAR: вектор параметров ПГО. Имеет тип REAL * 8 при реализации вызова на FORTRAN.
· WRK: рабочий вектор ПГО. Имеет тип REAL * 8 при реализации вызова на FORTRAN.
· PARLR2: вектор параметров текущего слоя изображения. Имеет тип REAL * 8 при реализации вызова на FORTRAN.
Соответственно заголовок ПГО и описание входных параметров во всех ПГО должны быть идентичными и выглядеть следующим образом:
SUBROUTINE TSTPGO (
, NAMEX,
, I,
, X_, V_, A_,
, INNER, EXT,
, PARX, WRKX,
, PAR, WRK,
, PARLR2 )
C Формальные параметры
CHARACTER*8 NAMEX
REAL * 8 I (1)
REAL * 8 X_(6), V_(6), A_(6)
REAL * 8 INNER(1), PARX(1), WRKX(1), PAR(1), WRK(1), PARLR2(1)
INTEGER * 4 EXT
Так же в ПГО передается из решателя неименованный блок COMMON, значения которого доступны через включение в текст ПГО файла common.inc входящего в состав комплекса. Он включается добавлением в текст программы следующей строки:
include 'common.inc'
Библиотека графических операторов находится в файле graphs.inc и подключается в ПГО добавлением в текст программы следующей строки:
include 'graphs.inc'
В состав библиотеки входят следующие операторы:
C Функция задания цвета рисования
C ПАРАМЕТРЫ:
C COL - цвет рисования объекта
C 1 желтый
C 2 яркозеленый
C 3 светлокоричневый
C 4 розовокрасный
C 5 светлосиний
C 6 белоголубой
C 7 темнокрасный
C 8 грязнозеленый
C 9 фиолетовый
C 10 темнозеленый
C 11 светлокрасный
C 12 синий
C 13 серый
C 14 белый
SUBROUTINE COLOR(COL)
REAL * 8 COL
C Функция рисования цилиндра
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты центра основания цилиндра
C X2, Y2, Z2 - координаты центра верхней части цилиндра
C DIAM - диаметр цилиндра
SUBROUTINE CYLINDER(X1, Y1, Z1, X2, Y2, Z2, DIAM)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2, DIAM
C Функция рисования сферы
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты центра сферы
C DIAM - диаметр сферы
SUBROUTINE SPHERE(X1, Y1, Z1, DIAM)
REAL * 8 X1, Y1, Z1, DIAM
C Функция рисования прямой линии
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты первой точки линии
C X2, Y2, Z2 - координаты второй точки лини
SUBROUTINE LINE(X1, Y1, Z1, X2, Y2, Z2)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2
C Функция рисования круга
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты центра круга
C X2, Y2, Z2 - координаты точки, лежащей на оси круга
C DIAM - диаметр круга
C FACE - если = 0, то рисуется контур
C - если = 1, то рисуется поверхность
SUBROUTINE CIRCLE(X1, Y1, Z1, X2, Y2, Z2, DIAM, FACE)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2, DIAM, FACE
C Функция рисования четырехугольгольной призмы
C ПАРАМЕТРЫ:
C X1, Y1, Z1, X2, Y2, Z2,
C X3, Y3, Z3, X4, Y4, Z4 - координаты четырех точек основания призмы
C X5, Y5, Z5 - координаты верхней точки призмы, лежащей на том же ребре,
C что и точка X1, Y1, Z1
SUBROUTINE BOX(X1, Y1, Z1, X2, Y2, Z2,
' X3, Y3, Z3, X4, Y4, Z4, X5, Y5, Z5)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2,
' X3, Y3, Z3, X4, Y4, Z4, X5, Y5, Z5
C Функция рисования дуги
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты центра дуги
C X2, Y2, Z2 - координаты точки, лежащей на оси дуги
C ANG1, ANG2 - углы, между которыми рисуется дуга
C DIAM - диаметр дуги
SUBROUTINE ARC(X1, Y1, Z1, X2, Y2, Z2, ANG1, ANG2, DIAM)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2, ANG1, ANG2, DIAM
C Функция загрузки графического файла
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты расположения центра загружаемого образа
C NOMB - номер файла
C SCALE - масштабный коеффициент
SUBROUTINE LOADGM(X1, Y1, Z1, NOMB, SCALE)
REAL * 8 X1, Y1, Z1, NOMB
Данная функция загружает графический файл, созданный каким либо средством трехмерного моделирования и сохраненный в формате BRep (формат OpenCASCADE). Этот файл должен находиться в той же папке, что и файл DAT и иметь точно определенное имя: <имя файла задания>.<номер файла = NOMB>.img. Например, для задания с именем swing этот файл может иметь следующие имена: swing.1.img, swing.2.img, .... swing.100.img и т.п. Нулевая точка образа из файла помещается в заданную точку X1, Y1, Z1. Размер образа изменяется на SCALE масштабный коеффициент. Если SCALE =1, то размер не изменяется.
C Функция рисования конуса
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты центра основания конуса
C X2, Y2, Z2 - координаты точки, лежащей на оси конуса
C R1 - диаметр основания конуса (может быть равен нулю)
C R2 - диаметр верхней части конуса (может быть равен нулю)
C H - высота конуса
SUBROUTINE CONE(X1, Y1, Z1, X2, Y2, Z2, R1, R2, H)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2, R1, R2, H
C Функция рисования треугольника
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты первой точки треугольника
C X2, Y2, Z2 - координаты второй точки треугольника
C X3, Y3, Z3 - координаты третьей точки треугольника
C FACE - если = 0, то рисуется контур
C - если = 1, то рисуется поверхность
SUBROUTINE TRIANGLE(X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, FACE)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, FACE
C Функция рисования четырехугольника
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты первой точки четырехугольника
C X2, Y2, Z2 - координаты второй точки четырехугольника
C X3, Y3, Z3 - координаты третьей точки четырехугольника
C X4, Y4, Z4 - координаты четвертой точки четырехугольника
C FACE - если = 0, то рисуется контур
C - если = 1, то рисуется поверхность
SUBROUTINE RECTANGLE(X1, Y1, Z1, X2, Y2, Z2,
' X3, Y3, Z3, X4, Y4, Z4, FACE)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2,
' X3, Y3, Z3, X4, Y4, Z4, FACE
C Функция рисования триэдра (3D системы координат)
C ПАРАМЕТРЫ:
C X1,Y1,Z1 - начальные координаты точки A (центра подвижного базиса)
C по осям OX, OY, OZ;
C X2,Y2,Z2 - начальные координаты точки B, определяющей совместно
C с точкой A начальное положение локальной оси Z'
C подвижного базиса (ось Z' направлена от A к B)
C X3,Y3,Z3 - начальные координаты точки C, определяющей совместно
C с точками A и B плоскость расположения оси X';
C LENGTH - длина осей изображаемого базиса.
SUBROUTINE TRIHEDRON(X1, Y1, Z1, X2, Y2, Z2,
' X3, Y3, Z3, LENGTH)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2,
' X3, Y3, Z3, LENGTH
C Функция рисования эллипсоида
C ПАРАМЕТРЫ:
C X1,Y1,Z1 - начал. координаты точки A
C X2,Y2,Z2 - начал. координаты точки B
C X3,Y3,Z3 - начал. координаты точки C
C X4,Y4,Z4 - начал. координаты точки D
C R1,R2,R3 - полуоси эллипсоида, R1, R2, R3 (>0).
C DEGREE - степень эллипсоида (p>1)
SUBROUTINE ELLIPSOID(X1, Y1, Z1, X2, Y2, Z2,
' X3, Y3, Z3, X4, Y4, Z4,
' R1, R2, R3, DEGREE)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2,
' X3, Y3, Z3, X4, Y4, Z4,
' R1, R2, R3, DEGREE
C Функция рисования вектора
C ПАРАМЕТРЫ:
C X1, Y1, Z1 - координаты начальной
C X2, Y2, Z2 - координаты конечной точки
C LEN - размер стрелки
SUBROUTINE VECTOR( X1, Y1, Z1, X2, Y2, Z2, LEN)
REAL * 8 X1, Y1, Z1, X2, Y2, Z2, LEN
C Функция возвращающая минимальное значение расстояния между двумя точками
REAL * 8 FUNCTION MINLEN()
Данная функция используется для проверки правильности параметров задаваемых в графические операторы. Если какие либо точки находятся ближе друг к другу, чем значение возвращаемого этой функцией значения, то эти точки считаются идентичными и расстояние между ними равно нулю.
C Функция возвращающая код ошибки
C Коды:
C 0 - нет ошибок
C 1 - расстояние между двумя точками равно нулю
C 2 - диаметр меньше или равен нулю
C 3 - масштабный коэффициент меньше или равен нулю
C 4 - высота меньше или равна нулю
C 5 - длинна меньше или равна нулю
C 6 - степень эллипсоида меньше или равна единице
C 7 – неверный код цвета
С 8 – превышено предельное количество примитивов
INTEGER * 4 FUNCTION ERRCODE()
Эту функцию следует вызывать после каждого графического оператора для проверки правильности входных параметров. Если функция возвращает код, отличный от нуля, значит входные параметры были заданы неправильно и никакого рисования не происходит.
Ниже приведены примеры вызовов этих операторов:
CALL SPHERE(X1,X2,X3, DIAM * 2.)
CALL CYLINDER(X1,X2,X3, X4,X5,X6, DIAM)
CALL SPHERE(X4,X5,X6, DIAM * 2.)
CALL LINE(X1,X2,X3, X4,X5,X6)
CALL CIRCLE(X1,X2,X3, X4,X5,X6, DIAM * 5, FACE)
CALL BOX(X1,X2,X3, X4,X5,X6, X7,X8,X9, X10,X11,X12,
' X13,X14,X15)
CALL ARC(X1,X2,X3, X4,X5,X6, ANG1, ANG2, DIAM * 8)
CALL LOADGM(X4,X5,X6, NOMB, SCALE)
CALL CONE(X1,X2,X3, X4,X5,X6, R1, R2, H)
CALL TRIANGLE(X1,X2,X3, X4,X5,X6, X7,X8,X9, FACE)
CALL RECTANGLE(X1,X2,X3, X4,X5,X6, X7,X8,X9, X10,X11,X12, FACE)
CALL TRIHEDRON(X1,X2,X3, X4,X5,X6, X7,X8,X9, LENGTH)
CALL ELLIPSOID(X1,X2,X3, X4,X5,X6, X7,X8,X9, X10,X11,X12,
' R1, R2, R3, DEGREE)
CALL VECTOR( X1,X2,X3, X4,X5,X6, LEN)
ERRC=ERRCODE()
MINLN=MINLEN()
Далее приведен пример текста простой ПГО:
C IMAGE TSTPGO:EXT=6, PAR=2
C
C HELP Образ элемента сжимающегося цилиндрического
C HELP стержня с шарами на концах
C
C Дата создания 04/09/2006 11:52am
C Дата последней корректировки 05/09/2006 03:55pm
include 'init.inc'
include 'graphs.inc'
SUBROUTINE TSTPGO (
, NAMEX,
, I,
, X_, V_, A_,
, INNER, EXT,
, PARX, WRKX,
, PAR, WRK,
, PARLR2 )
!DEC$ ATTRIBUTES DLLEXPORT::TSTPGO
include 'common.inc'
C Формальные параметры
CHARACTER*8 NAMEX
REAL * 8 I (1)
REAL * 8 X_(6), V_(6), A_(6)
REAL * 8 INNER(1), PARX(1), WRKX(1), PAR(1), WRK(1), PARLR2(1)
INTEGER * 4 EXT, ERRC, COL, ERRCODE
REAL * 8 X1, X2, X3, X4, X5, X6,
REAL * 8 DIAM, MINLN, MINLEN
X1 = PARX(1) + X_(1)
X2 = PARX(2) + X_(2)
X3 = PARX(3) + X_(3)
X4 = PARX(4) + X_(4)
X5 = PARX(5) + X_(5)
X6 = PARX(6) + X_(6)
DIAM = PAR(1)
COL = 4.
CALL COLOR(COL)
MINLN=MINLEN()
L = SQRT((X1-X4)*(X1-X4)+(X2-X5)*(X2-X5)+(X3-X6)*(X3-X6))
IF(L .LT. MINLN) GOTO 1
IF(DIAM .LT. MINLN) GOTO 1
CALL SPHERE(X1,X2,X3, DIAM * 2.)
ERRC=ERRCODE()
IF(ERRC .GT.O) GOTO 1
CALL CYLINDER(X1,X2,X3, X4,X5,X6, DIAM)
IF(ERRC .GT.O) GOTO 1
CALL SPHERE(X4,X5,X6, DIAM * 2.)
IF(ERRC .GT.O) GOTO 1
1 RETURN
END
Репозиторий ПГО хранится в текстовом файле PGO_List.txt. Файл хранится в том же каталоге, где находится выполняемый файл ПП Postprocessor.exe. Для каждой ПГО список содержит три параметра, записанные через запятую:
Для ПГО на Фортране параметр «имя вызываемой функции ПП» всегда должно быть FORTRAN, а параметр «имя DLL библиотеки» должно быть всегда PGO. Имя же самой DLL библиотеки, содержащей данную ПГО, должно полностью совпадать с именем ПГО. Например, для ПГО с именем TSTPGO имя быблиотеки должно быть TSTPGO.DLL, а строка в репозитории должна быть следующая: “TSTPGO, FORTRAN, PGO”.
Внимание. В будущем предполагается изменение формата репозитория.
Ниже приведен текст репозитория ПП для версии 4.0 (7.09.2006):
DOTD, DOTD, PGO
AERHT,AERHT, PGO
GSV, GSV, PGO
GRETS, GRETS, PGO
PRUG, PRUG, PGO
AKLAB, AKLAB, PGO
D3LAB, D3LAB, PGO
GROT2, GROT2, PGO
GROT3, GROT3, PGO
TRTER, TRTER, PGO
KN3EFV, KN3EFV, PGO
KN3FFV, KN3FFV, PGO
EL3DP, EL3DP, PGO
LSK3D, LSK3D, PGO
POINT, Point, PGO
PRLGRM, PRLGRM, PGO
RECTD, RECTD, PGO
LSK, LSK, PGO
LINED, Lined, PGO
LINEV, Linev, PGO
CIL3DC, CIL3DC, PGO
GCYL, GCYL, PGO
AMORT, AMORT, PGO
ARROW, ARROW, PGO
CMASS, CMASS, PGO
GNIRS, GNIRS, PGO
HS2VS, HS2VS, PGO
OPORA, OPORA, PGO
OPORAD, OPORAD, PGO
SILUET, SILUET, PGO
KONTUR, KONTUR, PGO
PRUZS, PRUZS, PGO
TSTPGO, FORTRAN, PGO
ELP3D, ELP3D, PGO
Допустим мы захотели создать новую ПГО на фортране под именем «PGOTST». Для этого нам потребуется выполнить следующее:
1. Запустите Microsoft Visual Studio. Как правило такой значок на рабочем столе:
2. Выберите пункт меню File / New.
3. Выберите в закладке Projects пункт Win32 Dynamic-Link Library. Введите имя ПГО PGOTST и папку, в которой будет находиться ваша ПГО.
4. Далее выберите An empty DLL project.
5. Жмите ОК.
6. Скопируйте файлы init.inc, common.inc, graphs.inc в только что созданную папку проекта, указанную в окне выше.
7. Выберите пункт меню Project / Add to project / Files. Этот пункт меню позволит Вам добавлять файлы в проект.
8. Добавьте файлы init.inc, common.inc, graphs.inc из папки проекта.
9. Снова выберите пункт меню File / New.
10. Во вкладке Files выберите пункт Fortran Fixed Format Source File. Введите имя файла PGOTST.
11. Выберите пункт Project -> Settings…
12. В появившемся диалоговом окне выберите закладку Fortran. Выберите пункт Run Time в верхнем поп-ап меню с названием Category. Сделайте не выбранным (уберите галочку) пункт Array & String Bounds. Нажмите кнопку Ok.
13. Введите текст программы ПГО.
14. Нажмите «Ctrl-s», чтобы сохранить текст программы.
15. Выберите пункт меню Build / Build PGOTST.dll или просто нажмите F7. Программа начнёт компилироваться.
16. Дождитесь, когда компиляция закончится и внизу появится сообщение о количестве ошибок (errors) и предупреждений (warnings).
17. Если ошибок не нулевое количество (0 error(s) ), то вероятнее всего в вашей программе на фортране присутствуют ошибки. Исправьте их и вернитесь к пункту 12. Если ошибок ноль, то переходите к следующему пункту.
18. В папке проекта должна была быть создана папка Debug, в ней лежит только что созданная Вами библиотека PGOTST.dll. Скопируйте её в папку %DINSYS%\dinama\post.
19. В папке ПП лежит файл PGO_list.txt. Добавьте в коней файла ещё одну строчку: PGOTST, FORTRAN, PGO.
20. Скопируйте в папку DINAMA/pradis32 файл PGOTST.FOR из папки проекта.
21. Удалите из DINAMA/pradis32/PGOTST.FOR все вычисления и строку «include 'graphs.inc'». Остаётся что-то вроде пустой ПГО. Не забудьте, что первая строка должна быть вида: «C IMAGE PGOTST:EXT=6, PAR=2».
22. Перейдите в DINAMA/pradis32 и запустите «arm + PGOTST».
23. Теперь Вы можете пользоваться новой ПГО PGOTST как любой другой.