Обзор и архитектурные принципы

Раздел архитектурной документации TMC Suite. Назначение пакета, ключевые принципы организации кода и сборки, технологический стек.


1. Назначение пакета

TMC Suite — пакет программ для электродинамического моделирования планарных структур и визуализации результатов. Происхождение — авторская научная разработка (автор К. Н. Климов).

Пакет решает две крупные задачи:

  1. Расчёт — счётные ядра моделируют распространение электромагнитного поля в планарных структурах методом, заданным в исходном коде (H-поляризация и X-мода), и формируют выходные данные: матрицы рассеяния (S-матрицы), распределения поля, временны́е сигналы.
  2. Визуализация — вьюверы и FieldView отображают результаты: частотные характеристики S-матрицы, диаграммы направленности, временны́е сигналы и поля в 2D/3D.

2. Тип архитектуры

TMC Suite — это набор автономных настольных приложений Windows, объединённых:

  • общим набором статических библиотек (переиспользование кода чтения файлов, комплексной арифметики, разбора выражений и т.д.);
  • общими форматами файлов (программы обмениваются данными через файлы на диске, а не через общую память или IPC).

Каждая программа запускается и работает независимо. Связь между ними — через файлы: одно приложение пишет файл, другое его читает. Это классический конвейер на основе файлов (file-based pipeline), см. Поток данных.

            ┌────────────────────────┐
            │   6 статических .lib    │   ← общий переиспользуемый код
            └───────────┬────────────┘
                        │ линковка
        ┌───────────────┼───────────────┐
        ▼               ▼               ▼
   Счётные ядра      Вьюверы        FieldView
   (.exe)            (.exe)         (.exe, OpenGL)
        │               ▲               ▲
        └──── файлы ─────┴──── файлы ────┘

3. Ключевые архитектурные принципы

3.1. Исходники общие, сборки раздельные

Единственный комплект исходного кода лежит в src/. Результаты двух платформ складываются в разные папки:

  • win32 → dist/win32/lib, dist/win32/bin
  • win64 → dist/win64/lib, dist/win64/bin

Исходный код никогда не дублируется под платформы. Подробнее — Архитектура сборки.

3.2. Разделение «расчёт визуализация»

Счётные ядра и вьюверы — разные программы. Ядро не рисует графики, вьювер не считает. Это позволяет:

  • запускать тяжёлый расчёт отдельно (в т.ч. долго, без GUI-нагрузки);
  • просматривать готовые результаты повторно, без пересчёта;
  • развивать визуализацию независимо от математики.

3.3. Переиспользование через статические библиотеки

Общая функциональность (чтение/запись S-файлов, комплексная арифметика, разбор выражений, обработка ошибок, препроцессор, расчёт топологии/наведённых токов) вынесена в 6 статических библиотек. Программы линкуются с нужным подмножеством, см. Зависимости.

3.4. Неприкосновенность математики и общих заголовков

  • Математику расчётов не менять без явного разрешения — это научный код.
  • Общие заголовки не править ради отдельных конфигураций. Например, X-мода включается через 6 макросов препроцессора в настройках проекта, а не правкой Typerth.h / Tmcgrviw.h — иначе сломались бы H-мода и вьюверы.

3.5. Сохранение исходной кодировки

Файлы исходного кода содержат русские комментарии (вероятно Windows-1251). Кодировка сохраняется как есть и не меняется без проверки.


4. Технологический стек

Слой Технология
Язык C++ (legacy-код ранних версий Visual C++, переведён на современный toolset)
GUI MFC (Microsoft Foundation Classes) — окна, диалоги, документ/представление
3D-графика OpenGL (opengl32, glu32) — только в FieldView
Сборка Microsoft Visual Studio (toolset v145, VS 2022), MSBuild
Платформы Win32 и x64
Конфигурация сборки Property sheets в build/ (Common.props, LibOutput.props, ExeOutput.props)

Историческая справка

Раньше пакет собирался под win16 и win32 (старый код ранних версий Visual C++). Сборка под win64 — новая задача: она потребовала точечных правок разрядности (указатели не помещаются в int, LONGLONG_PTR в MFC, запрет ассемблерных вставок, удаление остатков win16-типов). Стратегия портирования — сначала полностью собрать win32, затем чинить 64-битные ошибки по одной. См. Архитектура сборки и журнал docs/build-guide/.../08-porting-changes.

Overview and architectural principles

Architecture documentation section of TMC Suite. Purpose of the package, key principles of code and build organization, technology stack.


1. Purpose of the package

TMC Suite is a set of programs for electrodynamic modeling of planar structures and visualization of the results. Its origin is an original scientific development (author K. N. Klimov).

The package addresses two major tasks:

  1. Computation — the compute kernels model the propagation of the electromagnetic field in planar structures using the method defined in the source code (H-polarization and X-mode) and produce output data: scattering matrices (S-matrices), field distributions, and time signals.
  2. Visualization — the viewers and FieldView display the results: S-matrix frequency responses, radiation patterns, time signals and fields in 2D/3D.

2. Type of architecture

TMC Suite is a set of standalone Windows desktop applications joined by:

  • a common set of static libraries (reuse of code for reading files, complex arithmetic, expression parsing, etc.);
  • common file formats (the programs exchange data through files on disk, not through shared memory or IPC).

Each program launches and runs independently. They communicate through files: one application writes a file, another reads it. This is a classic file-based pipeline; see Data flow.

            ┌────────────────────────┐
            │   6 static .lib files   │   ← shared reusable code
            └───────────┬────────────┘
                        │ linking
        ┌───────────────┼───────────────┐
        ▼               ▼               ▼
   Compute kernels    Viewers        FieldView
   (.exe)             (.exe)         (.exe, OpenGL)
        │               ▲               ▲
        └──── files ─────┴──── files ───┘

3. Key architectural principles

3.1. Shared sources, separate builds

A single set of source code lives in src/. The outputs of the two platforms go to separate folders:

  • win32 → dist/win32/lib, dist/win32/bin
  • win64 → dist/win64/lib, dist/win64/bin

Source code is never duplicated per platform. See Build architecture for details.

3.2. Separation of "computation vs. visualization"

The compute kernels and the viewers are different programs. A kernel does not draw graphs; a viewer does not compute. This makes it possible to:

  • run the heavy computation separately (including long runs, with no GUI load);
  • view finished results again, without recomputation;
  • develop visualization independently of the math.

3.3. Reuse through static libraries

Common functionality (reading/writing S-files, complex arithmetic, expression parsing, error handling, the preprocessor, topology / induced-current computation) is extracted into 6 static libraries. Each program links against the subset it needs; see Dependencies.

3.4. Untouchable math and shared headers

  • Do not change the computation math without explicit permission — it is scientific code.
  • Do not edit the shared headers for the sake of individual configurations. For example, the X-mode is enabled through 6 preprocessor macros in the project settings, not by editing Typerth.h / Tmcgrviw.h — otherwise the H-mode and the viewers would break.

3.5. Preserving the original encoding

The source files contain Russian comments (likely Windows-1251). The encoding is preserved as is and is not changed without verification.


4. Technology stack

Layer Technology
Language C++ (legacy code from early Visual C++ versions, moved to a modern toolset)
GUI MFC (Microsoft Foundation Classes) — windows, dialogs, document/view
3D graphics OpenGL (opengl32, glu32) — only in FieldView
Build Microsoft Visual Studio (toolset v145, VS 2022), MSBuild
Platforms Win32 and x64
Build configuration Property sheets in build/ (Common.props, LibOutput.props, ExeOutput.props)

Historical note

The package used to be built for win16 and win32 (old code from early Visual C++ versions). The win64 build is a new task: it required targeted width fixes (pointers do not fit into int, LONGLONG_PTR in MFC, no inline assembly, removal of win16-type remnants). The porting strategy is to first fully build win32, then fix 64-bit errors one by one. See Build architecture and the porting log docs/build-guide/.../08-porting-changes.