- •1. Цель работы
- •2. Задание
- •3. Общее описание проекта
- •4. Способы достижения интероперабельности
- •5. Заключение
- •4. Диаграмма Use Cases и описание прецедентов
- •9. Заключение
- •4. Исходный код инфраструктуры персистентности
- •5. Исходный код контроллеров rest api
- •6. Исходный код юнит-тестов
- •7. Заключение
- •5. Исходный код программной реализации gui
- •6. Экранные снимки, разработанного gui
- •7. Заключение
- •4. Подсистема управления правами доступа
- •5. Проекты руководств системного программиста, системного оператора и системного администратора
- •6. Заключение
- •5. Протокол испытаний
- •6. Заключение
- •Список использованной литературы
5. Заключение
В ходе выполнения данной работы была исследована интероперабельность для системы прогнозирования зоны разлива нефтепродуктов, предназначенного для применения в рамках единого информационного пространства. Проект направлен на решение актуальной экологической и промышленной задачи, связанной с быстрой и точной оценкой последствий аварий, вызванных разливом опасных веществ. Модуль реализует прогнозирование распространения нефтепродуктов с учётом физических факторов среды, опираясь на математическое моделирование и современные средства визуализации в среде Unity.
Разработка охватывает как научные, так и практические аспекты, предлагая решение, пригодное как для использования специалистами, так и широким кругом пользователей, не обладающих глубокими техническими знаниями. Это обеспечивается за счёт интуитивно понятного интерфейса и гибкой архитектуры, способной адаптироваться к различным условиям эксплуатации.
Использование ETL-решений позволило создать систему, способную эффективно взаимодействовать с внешними источниками данных и вписываться в более широкую цифровую инфраструктуру.
ЛАБОРАТОРНАЯ РАБОТА № 2 РАЗРАБОТКА ОБЪЕКТНОЙ МОДЕЛИ
1. Цель работы
Приобретение навыков разработки объектной модели интероперабельного программного модуля для единого информационного пространства.
2. Задание
Согласно своему варианту выполнить разработку объектной модели интероперабельного программного модуля для единого информационного пространства.
3. Архитектура модуля
Вся функциональность прогнозирования зоны разлива объединена в одном C# WPF-приложении как интерактивном клиенте для моделирования и анализа.
1. При запуске приложения открывается топографический сайт в элементе WebBrowser:
1.1. В интерфейсе WPF реализованы инструменты для выбора точки разлива на карте.
1.2. Пользователь задаёт тип жидкости, объём, время и температуру через панели управления.
2. После указания объёма автоматически строится круг максимальной зоны тонкого слоя разлива:
2.1. Задаётся тип поверхности (грунт, асфальт, песок и др.).
3. При старте моделирования собираются данные о высотах местности внутри круга через JavaScript, а также текущий масштаб.
4. Расчётная подсистема выполняет гибридный метод: Oil Surface Flow Screening Model для инфильтрации и испарения вместе со SPH-методом для динамики жидкости:
4.1. Логика реализована в слоях C#-классов, организованных по DDD.
5. Результаты выводятся в виде 2D-контуров и 3D-сцен в WPF и снабжены инструментами измерения площади и анализа сценариев.
4. Диаграмма Use Cases и описание прецедентов
Рис.1. Диаграмма Use Cases
Описание прецедентов на основе диаграммы Use Cases (см. рис. 1):
1. Открытие карты
1.1 Актор: User
1.2 Действие: старт приложения, загрузка топографического сайта в WebBrowser
1.3 Результат: карта готова к взаимодействию
2. Установка параметров разлива
2.1 Актор: User
2.2 Действие: выбор точки, типа жидкости, объёма и температуры
2.3 Результат: отображение круга максимальной зоны тонкого слоя и диалог выбора поверхности
3. Ручное измерение площади
3.1 Актор: User
3.2 Действие: выбор инструмента, построение многоугольника
3.3 Результат: отображение площади в м²
4. Измерение расстояния
4.1 Актор: User
4.2 Действие: выбор инструмента, отметка точек
4.3 Результат: отображение длины пути в метрах
5. Диаграмма деятельности
Рис.2. Диаграмма деятельности
6. Диаграмма последовательностей
Рис.3. Диаграмма последовательностей
7. Диаграмма классов
Рис.4. Диаграмма классов
8. Спецификации классов
Класс Simulation3D отвечает за настройку и выполнение трёхмерной физической симуляции: он содержит числовые поля timeScale (масштаб времени), fixedTimeStep (флаг жёсткого шага времени), iterationsPerFrame (число итераций за кадр), gravity (гравитация), smoothingRadius (радиус сглаживания), targetDensity (целевую плотность), pressureMultiplier (коэффициент давления), nearPressureMultiplier (коэффициент ближнего давления) и viscosityStrength (сила вязкости). Для вычислений используются объекты ComputeShader и вспомогательный класс ComputeHelper, а начальные данные генерирует Spawner3D; сетка препятствий представлена BuildingsGrid. Все текстуры и буферы (positionBuffer, velocityBuffer, densityBuffer и другие) хранятся в ComputeBuffer.
При старте (метод Start) буферы и параметры шейдера инициализируются, а в методе Update реализовано переключение между фиксированным и динамическим шагом симуляции. Основной расчёт каждого шага выполняется в методе RunSimulationStep, который последовательно запускает нужные шейдерные ядра. Метод UpdateSettings принимает текущее приращение времени и обновляет параметры шейдера, а SetInitialBufferData загружает в буферы данные о точках генерации частиц и о стенах. При уничтожении объекта (OnDestroy) все буферы освобождаются.
Класс ComputeHelper предоставляет универсальные методы для работы с вычислительными буферами: создание структурированного буфера заданного типа и размера через CreateStructuredBuffer<T>, связывание буфера с конкретным шейдером и ядром в SetBuffer, запуск расчёта через Dispatch и освобождение ресурсов в методе Release.
Пакет GPUSort организует сортировку данных на GPU: метод SetBuffers принимает буферы индексов и смещений, после чего SortAndCalculateOffsets выполняет саму сортировку и подсчёт оффсетов.
Spawner3D хранит внутри себя массив структур SpawnData, описывающих исходные точки и скорости частиц, и предоставляет их через метод GetSpawnData.
BuildingsGrid хранит информацию о стенах в виде массивов размеров и центров (WallsData) и отдаёт её по запросу посредством метода GetWallsData.
