Архитектура решения
Решение 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.
См. также матрицу покрытия.