Описание языка Python PRADIS Language (PPL)
Назначение PPL
PPL (PRADIS Python Language) — внутренний язык PRADIS, который с использованием Python и функций PRADIS готовит данные для генерации PSL-файла — задания решателю PRADIS. Подготовку входных данных для PPL обеспечивает препроцессор на основе графических моделей.
- Автоматизация дискретизации
Генерация конечно-элементной сетки описывается декларативно или процедурно. Правило разбиения, заданное один раз, применяется к любой модели без ручного вмешательства. Это снижает вероятность ошибок при построении сетки для типовых конфигураций.
- Унификация жизненного цикла расчёта
Определение топологии модели, конфигурация решателя и постобработка результатов объединены в одном исполняемом сценарии. Исключается необходимость переключения между графическими интерфейсами или сторонними утилитами.
- Расширяемость без модификации ядра
Отсутствующая в стандартной библиотеке PRADIS функциональность (специфические граничные условия, нестандартные обработчики результатов, итерационные схемы) реализуется на Python с использованием PPL как прослойки. PPL не изменяет физические модели решателя, но позволяет надстраивать произвольную логику управления расчётом.
- Параметрический анализ
Многовариантные расчёты выполняются программно: варьирование параметров (жёсткость, масса, временной шаг) организуется циклами Python. Один PPL-скрипт генерирует множество PSL-заданий и, при необходимости, запускает их последовательно.
- Вычисляемые параметры
Параметры элементов не обязаны быть константами. Они могут быть результатами вычислений: алгебраических выражений, вызовов встроенных функций Python, импорта внешних данных. Это позволяет строить модели на основе расчётных зависимостей, а не только жёстко заданных значений.
- Интеграция с внешними источниками данных
Импорт параметров из файлов CSV, JSON, Excel, баз данных или веб-сервисов выполняется штатными средствами Python. PPL не вводит собственных механизмов ввода-вывода, используя стандартную экосистему языка.
- Автоматизация запуска
Генерация PSL, вызов решателя и запуск постпроцессора выполняются одной командой Run. Скрипты могут быть встроены в конвейеры CI/CD, системы оптимизации или параметрической идентификации.
Структура программы на PPL
Программа на PPL состоит из трёх частей:
Описание модели — создание узлов, элементов, связей между ними.
Описание визуализации — задание графических образов и параметров анимации.
Описание расчёта — выбор решателя, настройка вывода, сохранение результатов.
Файл с расширением .psl формируется решателем Pradis в каталоге проекта и служит для анализа потенциальных нештатных ситуаций, возникающих в ходе вычислительного процесса.
Библиотека классов и функций PPL
PPL расширяет стандартный Python классами и функциями из библиотеки PRADIS:
- Классы для описания узлов:
DOF1, XY, Point2d, XYZ, RotatXYZ, Point
- Классы для описания элементов (моделей):
имена соответствуют типам моделей PRADIS: MD, BALKA, STABL0, SHTERM, NEWMARK и другие (более 100 видов)
- Классы для параметров:
Diagram (табличная зависимость), pXY, pXYZ, TrapeziumData, InertiaMoment, SimpleMaterial, ContactForceModel
- Классы для визуализации:
RECTD, SPRITE, CIRCLE, LINE и другие примитивы
- Функции управления расчётом:
Run() — генерация PSL-файла и запуск решателя Post() — запуск постпроцессора
- Функции для работы с выходными переменными:
SUM, DIFF, MULT, DIV и другие арифметические операции над переменными
Как работает PPL
Ваша программа на Python (с использованием PPL)
│
▼
Вызов Run()
│
▼
PPL генерирует PSL-файл (с расширением .psl)
│
▼
Решатель PRADIS читает PSL и выполняет расчёт
│
▼
Результат расчёта
Примечание: PPL не заменяет PSL. Решатель PRADIS по-прежнему работает только с PSL. Сгенерированный PSL-файл сохраняется на диске и может быть просмотрен.
Пример программы на PPL
Следующий пример демонстрирует, как PPL описывает расчётную модель на Python, используя классы и функции библиотеки PRADIS. Программа моделирует движение механической системы — стержневого маятника с упругой опорой и сосредоточенной массой, приводимого двигателем с нелинейной характеристикой.
from include import *
try:
# Узлы
p1 = Point2d()
p2 = p1.x
pbase = DOF1()
# Базовые узлы (закрепления)
Base([pbase])
# Элементы
body = MD([p1], [1, 1])
d = Diagram(0, 0)
d.Add(2, 10)
Go = STABL0([p2, pbase], [1e6, d])
# Выходная переменная
displ_x = SUM([p2, p2.V(), p2.A(), body.W(1), body.I(1), body.S(1)], [1])
# Изображение
rb = pXY(0, 0)
img = RECTD(body, [rb, 2, 4], ['gold', 'plastic', 1.0])
# Интервал и решатель
rng = Range(displ_x, -10, 10)
slv = SHTERM([rng], end=2.0, outvar=3)
# Вывод
prn = DISP([rng], frm=1)
# Генерация PSL-задания и запуск постпроцессора
Run()
Post()
except af.LVPS_TException as e:
print(e.GetError())
Что реализует этот пример с физической точки зрения?
Твердое тело с массой 1 и моментом инерции 1
Упругий элемент с жёсткостью 1 000 000 и табличной характеристикой: точка 2 → 10
Расчёт горизонтального перемещения, скорости и ускорения
Визуализация в виде золотого пластикового прямоугольника размером 2 на 4
Решение до 2 секунд с выводом трёх выходных переменных
Что этот пример демонстрирует в контексте PPL?
PPL — это Python, а не новый язык
В коде присутствуют стандартные конструкции Python: - импорт модуля: from include import * - обработка исключений: try / except - создание переменных: p1, p2, pbase, body, d, rng - вызов функций: Run(), Post(), print() - создание объектов: Point2d(), DOF1(), Diagram()
Объектная модель расчётной схемы
Узлы создаются как объекты, на которые затем ссылаются элементы: - p1 = Point2d() — создание объекта-узла - p2 = p1.x — ссылка на степень свободы существующего узла - body = MD([p1], [1, 1]) — элемент напрямую использует объект p1, а не его номер
Разделение этапов
Код последовательно описывает три части, соответствуя структуре PPL: - Описание модели: создание узлов (p1, pbase), элементов (body, Go), связей (Base) - Описание визуализации: задание образа (rb, img) - Описание расчёта: настройка интервала (rng), выбор решателя (slv), вывод (prn)
Выходные переменные как формулы
Строка displ_x = SUM([p2, p2.V(), p2.A(), body.W(1), body.I(1), body.S(1)], [1]) задаёт вычисляемую величину на основе: - p2 — перемещение - p2.V() — скорость - p2.A() — ускорение - body.W(1) — компонента рабочего вектора элемента - body.I(1) — потоковая переменная - body.S(1) — компонента вектора состояния
Единый управляющий скрипт
Один файл содержит полный цикл расчёта: - создание узлов и элементов - описание визуализации - конфигурацию решателя - генерацию PSL-файла (Run()) - запуск постпроцессора (Post())
Возможные ошибки
Ниже приведены типичные ошибки, возникающие при работе с PPL, и их вероятные причины.
- ImportError: No module named „include“
Скрипт запущен не через Python из состава PRADIS
- PermissionError
Нет прав на запись в папку
- af.LVPS_TException
Ошибка в описании модели: неправильный параметр или неверная ссылка на узел
PPL vs PSL
PSL — входной язык решателя PRADIS. Решатель понимает только PSL. Модель в PSL описывается статически: узлы, элементы, связи — всё задаётся константами и ссылками по номерам.
PPL — надстройка над PSL. Программа на PPL генерирует PSL-файл, который затем подаётся на вход решателю.
Процесс работы:
PPL (ваш скрипт)
│
▼
Run() ────────► генерирует PSL-файл
│
▼
Запуск решателя (читает PSL)
│
▼
Результат расчёта
Что даёт PPL по сравнению с PSL?
Возможность PPL |
Чего нет в PSL |
|---|---|
Циклы (for) |
Массовое создание узлов |
Условия (if/else) |
Ветвления при построении модели |
Вычисляемые параметры |
Только константы |
Импорт данных |
Только ручной ввод |
Обработка ошибок |
Отсутствует |
Многовариантные расчёты |
Один расчёт на один PSL-файл |
Когда что выбрать?
Ситуация |
Инструмент |
|---|---|
Очень простая модель (2–5 элементов) |
Чистый PSL |
Параметрический расчёт |
PPL |
Многовариантный анализ |
PPL |
Сложная логика (условия, сценарии) |
PPL |
Отладка и прототипирование |
PPL |
Итог: Использование PPL обеспечивает возможность применения средств Python для генерации входных файлов расчёта при условии сохранения полной совместимости с решателем PRADIS. Схема использования PPL в расчётах: формирование данных в PPL → вызов метода Run() → трансляция в PSL → передача на вход решателю.
Словарь терминов
- Узел
Точка в пространстве со своим набором движений, называемых степенями свободы: смещения, повороты.
- Ветвь элемента
То же, что степень свободы элемента. Упрощённый термин для внутренних описаний.
- Внутренние переменные
Величины, которые программа вычисляет сама в процессе решения: силы, перемещения, скорости.
- Выходные переменные (ПРВП)
Величины, которые вы хотите видеть в результатах. Они вычисляются на основе внутренних переменных и сохраняются после расчёта.