Перейти к содержанию

Архитектура решения

Решение OpenCS построено по принципам модульности, разделения ответственности (Separation of Concerns) и чистоты вычислительных ядер от платформенно-зависимого UI. Вся расчётная логика, работа с файлом проекта и исполнители задач собраны в библиотеке OpenCS.App без WPF; поверх неё работают два клиента — оконное приложение OpenCS (Windows) и консоль opencs (Windows и Linux).


Диаграмма зависимостей проектов

graph TD
    subgraph Clients ["Клиенты"]
        OpenCS["OpenCS (WPF, Windows)"]
        Cli["OpenCS.Cli — консоль opencs (Windows, Linux)"]
    end

    subgraph AppLayer ["Приложение без UI (net10.0)"]
        App["OpenCS.App (проект, БД, задачи, сервисы, строки)"]
        Reporting["OpenCS.Reporting (отчёты)"]
    end

    subgraph External ["Внешние программы"]
        OSCScore["OpenCS.OpenSees.CScore (модели OpenSees из CScore)"]
        OpenSees["OpenCS.OpenSees (Tcl, запуск, разбор)"]
        Gmsh["OpenCS.Gmsh (сетки Gmsh)"]
        ExtTools["OpenCS.ExternalTools (поиск программ и Python)"]
    end

    subgraph FEA ["МКЭ и теплофизика (CSfea)"]
        CSfea_CScore["CSfea.CScore (мост моделей)"]
        CSfea_Core["CSfea.Core (МКЭ-ядро)"]
        CSfea_Thermal["CSfea.Thermal (теплопередача)"]
        CSfea_Torsion["CSfea.Torsion (кручение Сен-Венана)"]
        CSfea_Sparse["CSfea.Sparse (разреженные матрицы)"]
    end

    subgraph CoreDomain ["Расчётное ядро и нормы"]
        CScore["CScore (фибровый метод, СП 63, СП 16, СП 20)"]
        CScore_Fire["CScore.Fire (огнестойкость СП 468)"]
    end

    subgraph Base ["Базовые библиотеки"]
        CSmath["CSmath"]
        CSTriangulation["CSTriangulation"]
    end

    OpenCS --> App
    Cli --> App

    App --> Reporting
    App --> OSCScore
    App --> CScore_Fire
    App --> CSfea_Torsion

    OSCScore --> OpenSees
    OSCScore --> CSfea_CScore
    OSCScore --> Gmsh
    OpenSees --> ExtTools
    Gmsh --> ExtTools
    Gmsh --> CScore

    CSfea_CScore --> CSfea_Core
    CSfea_CScore --> CScore
    CSfea_CScore --> Gmsh
    CScore_Fire --> CSfea_Thermal
    CScore_Fire --> CScore
    Reporting --> CScore

    CSfea_Core --> CSfea_Sparse
    CSfea_Thermal --> CSfea_Core
    CSfea_Torsion --> CSfea_Core
    CSfea_Sparse --> CSmath

    CScore --> CSmath
    CScore --> CSTriangulation
    CSTriangulation --> CSmath

OpenCS.App не ссылается на WPF и Windows Forms; это проверяется тестом границы в OpenCS.Tests. В WPF-проекте остаются только окна, представления и то, что пока требует WPF-типов: экспорт картинок и отчётов через представление сечения, импорт через COM (ЛИРА-САПР, SCAD, AutoCAD).

Поток пользовательского расчёта

sequenceDiagram
    participant User as Инженер
    participant Client as OpenCS или opencs
    participant Ctx as IProjectContext
    participant DB as DatabaseService / SQLite
    participant Exec as Исполнители задач
    participant Core as CScore / CSfea / OpenSees

    User->>Client: Открывает проект, запускает расчёт
    Client->>DB: Загрузка проекта и настроек
    Client->>Exec: CalcTask / FemCheck / FemAnalysis + контекст
    Exec->>Core: Обработчик задачи, интегратор, решатель
    Core-->>Exec: CalcResult
    Exec->>DB: Сохранение результата
    Exec-->>Client: Журнал, прогресс, уведомления через контекст

Исполнители (CalcTaskExecutor, FemCheckExecutor, FemAnalysisExecutor) не знают, кто их вызвал: всё, что раньше брали у окна приложения, они получают через IProjectContext — базу данных, настройки, коллекции проекта, журнал (ILogService), уведомления и вопросы пользователю (IUserNotifier), полосу занятости с отменой (IBusyHost). OpenCS реализует контекст своим окном, консоль — HeadlessProjectContext с выводом в stderr.


Описание подсистем

1. Базовые библиотеки

  • CSmath: фундамент проекта. Реализует векторную и матричную алгебру, сплайны Безье и B-сплайны, геометрические примитивы, пересечения и алгоритмы 2D/3D геометрии без внешних зависимостей.
  • CSTriangulation: библиотека построения триангуляционных сеток. Включает методы Advancing Front и конформную триангуляцию Делоне (CDT Рупперта) с контролем минимального угла и адаптивным измельчением.

2. Доменная модель сечений (CScore)

  • Фибровый метод (Fibre / Layered method): сечение дискретизируется на элементарные волокна (fibres), что позволяет точно вычислять физически нелинейные диаграммы деформирования, трещинообразование и пластичность.
  • СП 16.13330.2017: нормативные проверки прочности и устойчивости стальных элементов.
  • СП 20.13330: генератор сочетаний нагрузок и расчёт огибающих.
  • CScore.Abaqus: экспорт материалов в Abaqus — таблицы Concrete Damaged Plasticity для бетона и *Elastic + *Plastic для стали и арматуры (см. экспорт материалов в Abaqus).
  • CScore.Fire: теплофизические модели СП 468.1325800.2019, температурная деградация модулей упругости \(E(T)\) и расчётных сопротивлений \(R(T)\).

3. МКЭ-комплекс (CSfea)

  • CSfea.Core: ядро статического анализа. Стержневые элементы Эйлера — Бернулли (пространственные 3D балки с 6 степенями свободы на узел; в секущем нелинейном расчёте ЖБ — с учётом сдвиговой податливости, КЭ Тимошенко), плоские и пространственные оболочки (MITC3/MITC4).
  • CSfea.Sparse: оптимизированные структуры хранения разреженных СЛАУ (CSR, CSC, Skyline) и прямые/итерационные решатели.
  • CSfea.Torsion: специализированный модуль кручения тонкостенных и сплошных стержней.

4. Приложение без UI (OpenCS.App)

  • Проект: DatabaseService (SQLite, миграции схемы), модели проекта, настройки расчёта (CalcSettings, GmshSettings), проверки файла до открытия (ProjectFile).
  • Задачи: TaskRunner и обработчики всех видов расчётных задач, исполнители задач, проверок по КЭ и расчётов схем.
  • Сервисы: построение сеток схем, запуск CSfea, проверки по КЭ, полосы плит, субмодели.
  • Строки интерфейса: Loc читает словари Strings.ru-RU.xaml / Strings.en-US.xaml без WPF, поэтому сообщения журнала одинаковы в OpenCS и в консоли.

5. Консоль (OpenCS.Cli)

Команды info, list, run, export, tools поверх OpenCS.App (разбор аргументов — System.CommandLine). Файл проекта по умолчанию открывается на копии: конструктор DatabaseService применяет миграции к файлу и записывает недостающие настройки, поэтому даже чтение без копии изменило бы файл пользователя. Описание для пользователя — Консоль opencs.

Сборка называется OpenCS.Cli, а не opencs: на Windows opencs.dll и OpenCS.dll оконного приложения — один и тот же файл. Короткое имя дают обёртки opencs.cmd (Windows) и opencs (sh, Linux), которые копируются в выходную папку; в .gitattributes для sh-обёртки закреплены окончания строк LF.

6. Внешние программы (OpenCS.ExternalTools, OpenCS.OpenSees, OpenCS.Gmsh)

OpenCS.OpenSees содержит модели, генераторы Tcl, запуск OpenSees и чтение артефактов; OpenCS.Gmsh — построение сеток Gmsh. Где взять сами программы, решает небольшая сборка OpenCS.ExternalTools:

Источник OpenCS (режим Auto) Консоль (режим PythonPackages)
явный путь из настроек или параметров задачи 1 —
OPENSEES_EXE / OPENSEES_HOME, GMSH_EXE 2 —
штатный путь установки 3 —
PATH (OpenSees.exe / OpenSees, gmsh.exe / gmsh) 4 —
Python-пакеты openseespy, gmsh 5 единственный

Режим задаётся на время работы консоли через ExternalToolPolicy (значение AsyncLocal, переходит в задачи и потоки этого вызова и не влияет на другие вызовы в том же процессе) или переменной окружения OPENCS_EXTERNAL_TOOLS=python|auto. Режим пакетов строгий: путь к OpenSees.exe, пришедший из параметров задачи, тоже исполняется через пакет.

Интерпретатор Python ищется так: OPENCS_PYTHON → активное окружение (VIRTUAL_ENV, CONDA_PREFIX) → python из PATH; выбирается первый, у которого есть нужный пакет. Проверка пакетов — один запуск Python на интерпретатор, результат кэшируется на процесс. Через существующие параметры ExecutablePath выбранный источник проходит строкой вида python:opensees|<путь к python>; её разбирают только запускатели OpenSeesProcessRunner и GmshProcessRunner.

Мост Tcl → OpenSeesPy (OpenSeesPyBridge). Генераторы Tcl одни на оба пути. Для OpenSeesPy небольшой сценарий Python поднимает интерпретатор Tcl из tkinter.Tcl(), регистрирует каждую функцию openseespy.opensees как Tcl-команду и исполняет тот же .tcl, что получает OpenSees.exe: процедуры, циклы, запись файлов выполняет Tcl, расчёт — OpenSeesPy. Мост переводит то, что Tcl-разборщик OpenSees понимает, а Python-разборщик — нет: блочные команды pattern … { load … } и section Fiber … { fiber … }, тип ряда в строке pattern Plain 1 Linear, старый синтаксис element forceBeamColumn|dispBeamColumn tag i j nIP secTag transfTag (через beamIntegration с умолчаниями OpenSees: Lobatto и Legendre). Код Python хранится строкой в C# и кладётся во временную папку при первом запуске. Gmsh из пакета запускается сценарием gmsh.initialize(sys.argv, run=True) — он принимает те же аргументы, что gmsh.exe.

Пути, сохранённые в файле проекта (каталоги артефактов, пути к программам), могут прийти с другой ОС; путь, который на текущей системе не является полным, считается незаданным.

7. Отчёты (OpenCS.Reporting)

OpenCS.Reporting регистрирует провайдеры вывода результата (ReportProviderRegistry.CreateDefault()) и собственные рендереры форматов отчёта; используется командой экспорта отчёта в OpenCS.

Тесты

Проект Что проверяет
CScore.Tests расчётное ядро, нормы, интеграторы
CSfea.Tests МКЭ-ядро; верификационные задачи помечены категорией Verification и в обычный прогон не входят
OpenCS.OpenSees.Tests генераторы Tcl, запуск OpenSees, мост OpenSeesPy (в том числе сверка старого синтаксиса стержней с OpenSees.exe)
OpenCS.Gmsh.Tests построение сеток, поиск программ и Python-пакетов
OpenCS.Tests приложение, исполнители через IProjectContext, консоль в процессе (CliTests), граница OpenCS.App без WPF

OpenCS.Tests не входит в сборку решения — его нужно собирать отдельно. Весь набор OpenCS.OpenSees.Tests можно прогнать через OpenSeesPy, задав OPENCS_EXTERNAL_TOOLS=python.

См. также матрицу покрытия.