Описание языка 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 состоит из трёх частей:

  1. Описание модели — создание узлов, элементов, связей между ними.

  2. Описание визуализации — задание графических образов и параметров анимации.

  3. Описание расчёта — выбор решателя, настройка вывода, сохранение результатов.

Файл с расширением .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?

  1. PPL — это Python, а не новый язык

    В коде присутствуют стандартные конструкции Python: - импорт модуля: from include import * - обработка исключений: try / except - создание переменных: p1, p2, pbase, body, d, rng - вызов функций: Run(), Post(), print() - создание объектов: Point2d(), DOF1(), Diagram()

  2. Объектная модель расчётной схемы

    Узлы создаются как объекты, на которые затем ссылаются элементы: - p1 = Point2d() — создание объекта-узла - p2 = p1.x — ссылка на степень свободы существующего узла - body = MD([p1], [1, 1]) — элемент напрямую использует объект p1, а не его номер

  3. Разделение этапов

    Код последовательно описывает три части, соответствуя структуре PPL: - Описание модели: создание узлов (p1, pbase), элементов (body, Go), связей (Base) - Описание визуализации: задание образа (rb, img) - Описание расчёта: настройка интервала (rng), выбор решателя (slv), вывод (prn)

  4. Выходные переменные как формулы

    Строка 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) — компонента вектора состояния

  5. Единый управляющий скрипт

    Один файл содержит полный цикл расчёта: - создание узлов и элементов - описание визуализации - конфигурацию решателя - генерацию 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 → передача на вход решателю.

Словарь терминов

Узел

Точка в пространстве со своим набором движений, называемых степенями свободы: смещения, повороты.

Ветвь элемента

То же, что степень свободы элемента. Упрощённый термин для внутренних описаний.

Внутренние переменные

Величины, которые программа вычисляет сама в процессе решения: силы, перемещения, скорости.

Выходные переменные (ПРВП)

Величины, которые вы хотите видеть в результатах. Они вычисляются на основе внутренних переменных и сохраняются после расчёта.