Документация Engee

Пакет поддержки ЛОГОС

ЛОГОС — пакет программ для промышленного 3D-моделирования и многопрофильного инженерного анализа. Интеграция с Engee организована через механизм Пользовательских Функций (ПФ) в модуле ЛОГОС «Платформа», который предназначен для подключения сторонних расчетных модулей.

Для интеграции с ЛОГОС требуется установленная и запущенная подсистема Engee.Интеграции. Убедитесь, что клиентская программа запущена и подключена к текущей сессии Engee перед началом интеграции.

Подробные инструкции по установке и настройке см. в статье Engee.Интеграции.

Интеграция выполняется посредством регистрации пользовательских функций, написанных на Python, в контексте интегрирующего решателя ЛОГОС. Эти функции принимают и отправляют данные из/в Engee по протоколу UDP через конкретные порты:

  • Порт 6848 — для приема сигналов из Engee в ЛОГОС;

  • Порт 6849 — для передачи сигналов из ЛОГОС в Engee.

Такое взаимодействие позволяет организовать косимуляцию — совместный расчет, где обе системы обмениваются данными в реальном времени. Это открывает возможности для:

  • Использования специализированных моделей Engee внутри прочностных расчетов ЛОГОС;

  • Передачи расчетных параметров между системами на каждом шаге интегрирования;

  • Создания комплексных моделей, объединяющих физику из разных доменов.

Пользовательские функции в ЛОГОС

Пользовательская функция (ПФ) — это функция обратного вызова, вызываемая расчетным модулем в процессе расчета задачи. Механизм ПФ позволяет изменять или дополнять поведение существующего расчетного модуля без его модификации.

Коннектор ПФ — это интерфейс (указатель на функцию), через который расчетный модуль вызывает пользовательскую функцию с заранее определенным набором параметров. Во время инициализации задачи модуль сопряжения загружает библиотеки с ПФ, инициализирует коннекторы и вызывает ПФ в нужные моменты расчета.

Каждая ПФ имеет свой API — набор аргументов и возвращаемых значений. Интерфейс ПФ может отображаться автоматически в редакторе ЛОГОС-Платформы при создании или подключении пользовательской функции.

Общая схема работы ПФ:

  1. Расчетный модуль (например, ЛОГОС-Тепло или ЛОГОС-Прочность) содержит встроенные коннекторы ПФ, к которым пользователь может подключить свою функцию.

  2. Коннектор передает в ПФ все необходимые данные для текущего шага расчета (например, температуру, напряжения, плотность и т.д.).

  3. ПФ выполняет пользовательскую логику (например, пересчет коэффициента теплопроводности или вычисление критерия разрушения).

  4. Результаты возвращаются в расчетный модуль, где используются в процессе моделирования.

Для корректной работы ПФ необходимо, чтобы ее интерфейс соответствовал интерфейсу коннектора, к которому она подключается.

Перечень ПФ в расчетных модулях ЛОГОС приведен ниже. Более подробно о ПФ ЛОГОС читайте в официальной документации ЛОГОС.

Встроенные пользовательские функции расчетных модулей ЛОГОС
ЛОГОС-Тепло
Имя функции Назначение Основные параметры

1

sourceHeat

Инициализация источника тепла в центре ячейки.

x, y, z, time, t, region, source, qdt

2

patchTFixed

Граничное условие с фиксированной температурой.

namePatch, flag, x, y, z, time, kappa, Rho, Cv, T

3

patchTFlux

Граничное условие с тепловым потоком.

namePatch, flag, x, y, z, time, kappa, Rho, Cv, T, fQ

4

patchTConvection

Граничное условие конвекции.

namePatch, flag, x, y, z, time, kappa, Rho, Cv, T, fTs, fAlfa

5

kappa

Определяет коэффициент теплопроводности.

nameMaterial, x, y, z, time, T, kappa

6

rho

Определяет плотность материала.

nameMaterial, x, y, z, time, T, Rho

7

cv

Определяет теплоемкость.

nameMaterial, x, y, z, time, T, Cv

8

ablationRate

Скорость массового уноса материала.

T, centerX, Y, Z, normalX, Y, Z


ЛОГОС-Прочность
Имя функции Назначение Основные параметры

1

MatUser_ST

Пользовательский расчет напряжений.

Strain, Stress, MatConst, Temp, Time, statev

2

Mat_User_ST_GetDMatrix

Расчет матрицы материальных констант.

MatConst, statev, matD, nComp

3

ErosionUser_ST

Пользовательский критерий разрушения (стационарный).

crit_val, Strain, Stress, nComp

4

MatUser

Расчет напряжений для динамических задач.

strainVelF, stress, pu, eu, epsp, rou, ts, eraseFlag

5

EOSUser

Пользовательское уравнение состояния.

pu, eu, rou, divU, ts, time

6

ErosionUser

Критерий разрушения для динамических задач.

strain, epsp, eraseFlag, time


ЛОГОС-Аэро
Имя функции Назначение Основные параметры

1

UF_InitVelocity

Инициализация поля скоростей.

cellIndex, time, x, y, z, u, v, w

2

UF_InitPressure

Инициализация поля давления.

cellIndex, time, x, y, z, p

3

UF_InitTemperature

Инициализация поля температуры.

cellIndex, time, x, y, z, t

4

UF_InitCK

Инициализация концентраций компонентов.

cellIndex, time, x, y, z, count, ck

5

UF_SourceEnergy

Источник энергии.

cellIndex, time, x, y, z, e

6

UF_SourceMomentum

Источник импульса.

cellIndex, time, x, y, z, u, v, w

7

UF_DynamicViscosity

Динамическая вязкость.

t, p, count, y, ml

8

UF_ThermalConductivity

Коэффициент теплопроводности.

t, p, count, y, kp

9

UF_SpecificHeat

Теплоемкость при постоянном давлении.

t, p, count, y, cp

10

UF_BC_Param

Параметры граничных условий.

faceIndex, patch, iteration, time, x, y, z, parameters

Перечисленные пользовательские функции встроены в основные расчетные модули ЛОГОС и могут использоваться в качестве шаблонов при разработке собственных ПФ на Python или для интеграции с Engee.

Модуль косимуляции

Модуль косимуляции cosimulation.py — это вспомогательный модуль на языке Python, обеспечивающий обмен между Engee и ЛОГОС по протоколу UDP. Модуль позволяет организовать двунаправленный обмен сигналами между системами в реальном времени по следующей логике:

  • Создаются два UDP-сокета: прием (порт 6848) и передача (порт 6849);

  • Модуль один раз инициализирует соединение и хранит время модели Engee;

  • Пользовательская функция ЛОГОС вызывает cosimulate(time, signals) и получает список значений от Engee.

Для работы достаточно разместить cosimulation.py рядом с пользовательскими функциями и импортировать его в начале кода:

import cosimulation     # или: from cosimulation import engee_sim

Ниже приведен полный пример файла cosimulation.py. Этот модуль выполняет настройку двух UDP-соединений между ЛОГОС и Engee, обменивается данными на каждом шаге расчета и хранит текущее модельное время системы Engee. Класс EngeeSim создает соединение, принимает сигналы от Engee и отправляет сигналы обратно из ЛОГОС.

В конце файла создается глобальный объект engee_sim, который инициализируется при импорте и используется в пользовательских функциях.

Содержимое файла cosimulation.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket
import struct
from typing import List

# Абстракция для взаимодействия Engee и LOGOS
class EngeeSim:
    def __init__(self):
        # Сокеты для связи
        self.sock_comm = None  # сокет для отправки данных (LOGOS -> Engee)
        self.sock_snd = None   # сокет для приема данных (Engee -> LOGOS)
        # Параметры модели Engee
        self.engee_model_time = 0.0
        self.engee_sample_time = 0.0

    def __del__(self):
        # При удалении объекта закрываем сокеты
        if self.sock_comm:
            self.sock_comm.close()
        if self.sock_snd:
            self.sock_snd.close()

    def init_intercommunicate(self):
        # Инициализация UDP-соединения.
        self.sock_comm = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock_snd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock_snd.settimeout(0.05)
        # Порт 6849 — передача данных из LOGOS в Engee
        self.sock_comm.connect(("127.0.0.1", 6849))
        # Порт 6848 — прием данных от Engee
        self.sock_snd.bind(("127.0.0.1", 6848))
        # Отправляем служебное сообщение для установления связи
        self.sock_comm.send(b"INIT")

    def cosimulate(self, logos_model_time: float, signals: List[float]):
        # Обмен сигналами между LOGOS и Engee на каждом шаге расчета.
        # Проверяем синхронизацию по времени модели
        if logos_model_time <= engee_sim.engee_model_time + engee_sim.engee_sample_time:
            return []

        try:
            # Принимаем данные от Engee
            recv_data = self.sock_snd.recv(2048)
        except socket.timeout:
            # Если данных нет — возвращаем пустой список
            return []

        # Распаковываем данные как double (8 байт)
        engee_data = []
        for i in range(0, len(recv_data), 8):
            chunk = recv_data[i:i+8]
            engee_data.append(struct.unpack('d', chunk)[0])

        # Первые два значения — шаг и модельное время Engee
        engee_sim.engee_sample_time = engee_data[0]
        engee_sim.engee_model_time = engee_data[1]
        engee_data = engee_data[2:]

        # Упаковываем сигналы из LOGOS для отправки в Engee
        packed_data = b""
        for sig in signals:
            packed_data += struct.pack("d", sig)

        # Отправляем данные в Engee
        self.sock_comm.send(packed_data)
        return engee_data

##################################################################
# Инициализация передачи данных между Engee и LOGOS
engee_sim = EngeeSim()
engee_sim.init_intercommunicate()
##################################################################

Использование в пользовательской функции

Чтобы связать расчет в ЛОГОС с моделью Engee, нужно подключить модуль cosimulation.py и вызвать его метод cosimulate() внутри пользовательской функции (ПФ). Это позволит на каждом шаге обмениваться сигналами: отправлять данные из ЛОГОС в Engee и получать оттуда значения, которые можно использовать в расчетах.

  1. Откройте вашу пользовательскую функцию в модуле Платформа.

  2. В самое начало функции добавьте строку импорта:

    import cosimulation   # или: from cosimulation import engee_sim
  3. Затем добавьте вызов cosimulate() для обмена данными с Engee.

Ниже показан готовый пример функции:

import cosimulation  # Подключаем модуль косимуляции

def erosion_user(nsh, nip, ncmr, nhv, Cmr, strainVelF, strain, stress,
                 pu, eu, epsp, rou, divU, ts, loc, tt, time, eraseFlag):

    # Отправляем в Engee три сигнала: давление, энергию и плотность
    signals_from_engee = cosimulation.engee_sim.cosimulate(time, [pu, eu, rou])

    # Если данных нет (Engee еще не ответил) — возвращаем все без изменений
    if not signals_from_engee:
        return nsh, nip, ncmr, nhv, Cmr, strainVelF, strain, stress, \
               pu, eu, epsp, rou, divU, ts, loc, tt, time, eraseFlag

    # Извлекаем сигналы, полученные из Engee
    strain_from_engee = signals_from_engee[0]   # предельная пластическая деформация
    epsp_from_engee = signals_from_engee[1]     # текущая пластическая деформация

    # Критерий разрушения: если epsp >= strain, элемент считается разрушенным
    if epsp_from_engee >= strain_from_engee:
        eraseFlag = True

    # Возвращаем обновленные значения в расчет ЛОГОС
    return nsh, nip, ncmr, nhv, Cmr, strainVelF, strain, stress, \
           pu, eu, epsp_from_engee, rou, divU, ts, loc, tt, time, eraseFlag

Как это работает:

  1. Импорт модуля — при импорте cosimulation.py автоматически создается и настраивается объект engee_sim, который открывает UDP-соединение с Engee.

  2. Вызов cosimulate() — при каждом шаге расчета ЛОГОС:

    • Первым аргументом передается текущее модельное время (time);

    • Вторым — список сигналов, которые нужно отправить в Engee (например, [pu, eu, rou]).

  3. Обмен данными:

    • Модуль отправляет эти сигналы в Engee через порт 6849;

    • Далее ожидается ответ от Engee на порту 6848;

    • Если ответ получен, модуль возвращает список значений, пришедших из Engee.

  4. Использование данных — возвращенные значения можно использовать в логике функции, например для задания определенных условий.

  5. Если данных нет — cosimulate() вернет пустой список, и расчет продолжится без обмена.

Регистрация и запуск пользовательской функции в ЛОГОС

После подготовки модуля cosimulation.py и написания пользовательской функции (например, erosion_user) необходимо подключить ее в ЛОГОС и запустить совместный расчет с Engee.

Шаг 1. Подключение функции в ЛОГОС

  1. Откройте модуль «Платформа» в ЛОГОС.

  2. Вкладка Проект → выберите нужное расчетное задание. Пример пути, где может находиться проект: VNIIEF/LOGOS-EXAMPLES-5.3.24.109/LOGOS-MIP/Projects/project_name

    logos 1

  3. Нажмите по задаче правой кнопкой мыши и выберите «Свойства».

    logos 2

    Откроется окно Редактор одиночной задачи:

    logos 3

  4. В списке коннекторов ПФ найдите подходящий (например, erosion_user для расчета эрозии).

    logos 4

  5. Дважды кликните по коннектору, чтобы открыть Редактор пользовательских функций.

  6. В открывшемся редакторе вставьте код вашей функции, использующей cosimulate():

    import cosimulation  # Импортируем модуль косимуляции
    
    def erosion_user(nsh, nip, ncmr, nhv, Cmr, strainVelF, strain, stress,
                     pu, eu, epsp, rou, divU, ts, loc, tt, time, eraseFlag):
    
        # Обмен сигналами между LOGOS и Engee
        signals = cosimulation.engee_sim.cosimulate(time, [pu, eu, rou])
    
        if not signals:
            return nsh, nip, ncmr, nhv, Cmr, strainVelF, strain, stress, \
                   pu, eu, epsp, rou, divU, ts, loc, tt, time, eraseFlag
    
        strain_from_engee, epsp_from_engee = signals
    
        # Критерий разрушения: если epsp >= strain, элемент считается разрушенным
        if epsp_from_engee >= strain_from_engee:
            eraseFlag = True
    
        return nsh, nip, ncmr, nhv, Cmr, strainVelF, strain_from_engee, stress, \
               pu, eu, epsp_from_engee, rou, divU, ts, loc, tt, time, eraseFlag
  7. Вернитесь в Редактор задачи, выберите созданную функцию и подключите ее к соответствующему коннектору.

Для каждой задачи в ЛОГОС может быть свой набор коннекторов. Перед подключением убедитесь, что сигнатура вашей функции (список аргументов) совпадает с интерфейсом выбранного коннектора.


Шаг 2. Запуск косимуляции

Порядок запуска важен для корректной синхронизации Engee и ЛОГОС.

  1. Сначала запустите модель в Engee. Она должна быть загружена и ожидать подключения от ЛОГОС.

  2. Затем запустите расчет в ЛОГОС (в течение 1 минуты после старта модели в Engee).

    logos 5

Engee необходимо запускать первым! Если запустить ЛОГОС до запуска модели в Engee, соединение установлено не будет.

Шаг расчета в Engee должен быть равен или кратен шагу расчета ЛОГОС.


Шаг 3. Проверка успешного соединения

После запуска проверьте сообщения в логе Engee. Успешное подключение отображается строками:

INFO | Object has been created: Logos
INFO | Successfully interconnected with LOGOS!

Шаг 4. Контроль передаваемых сигналов

Для проверки данных, поступающих из ЛОГОС, откройте Инспектор данных data inspector icon в Engee:

logos 6 logos 7

Здесь можно наблюдать значения сигналов, передаваемых между системами в реальном времени.

Шаг 5. Завершение расчета

После окончания расчета обе программы завершают работу синхронно. Результаты расчета можно просмотреть в ЛОГОС через модуль Scientific View — выберите нужный выходной файл в Постпроцессоре:

logos 8