Препроцессор-описание Панфилов А.А. 2013г.

advertisement
Панфилов А.А. 2013г.
ОПИСАНИЕ ПРЕПРОЦЕССОРА
1.1. Постановка задачи, решаемой препроцессором.
Процедура задания исходных данных для расчета в учебной CAE
системы Sigma характеризуется следующими существенными недостатками:
 отсутствием
полноценного
графического
редактора
формы
пластины. Наиболее удобным способом подготовки геометрической
модели является импорт её из CAD-систем;
 сложностью создания зон нестандартной геометрической формы;
 программным заданием граничных условий, внешних воздействий и
свойств конечных элементов;
 применением для генерации сетки только одного метода – метода
изопараметрических координат. Использование других методов
требует работы с дополнительным программным обеспечением.
Для решения этих и некоторых других задач разработана модульная
система подготовки исходных данных для Sigma на основе графического
интерфейса - препроцессор. Основные требования к препроцессору
следующие:
 построение и редактирование общей геометрии пластины на основе
примитивов: прямая линия, дуга, окружность;
 использование концепции
4-х узловых зон для работы методов
построения сетки КЭ;
 возможность сохранения общей геометрии пластины и импорт её в
Sigma для дальнейшего построения сетки КЭ, задания граничных
условий и внешних воздействий, используя встроенные в Sigma
средства. В этом случае препроцессор должен использоваться для
построения сложной конфигурации зон пластины как альтернатива
менее гибкому редактору зон в Sigma.
1
 построение сетки КЭ альтернативными методами:
метод изопараметрических координат;
фронтальный метод;
триангуляция по Делоне.
 внедрение графического режима (в том числе демонстрационного) в
процесс генерации сетки конечных элементов.
 автоматизированные процедуры реализации внешних воздействий и
граничных условий;
 автоматизированные процедуры назначения свойств материала
отдельным зонам или конечным элементам геометрической модели
пластины.
2
1.2. Выбор средств разработки.
Для разработки сложного программного комплекса, призванного
облегчить задачу формирования начальных данных для CAE-системы,
средства разработки необходимо выбирать, ориентируясь на следующие
требования:
1. Возможность быстрого создания множества управляющих элементов
и форм пользовательского интерфейса;
2. Возможность
создания
иерархической
структуры
данных,
основанной на объектах.
3. Наличие
библиотеки
стандартных
методов
и
алгоритмов,
необходимых для решения поставленной задачи.
4. Высокое быстродействие всех графических элементов, низкая
величина времени отклика программы на действия пользователя.
5. Обеспечение
читаемости
высокой
кода:
скорости
дальнейшее
разработки
развитие
без
системы
уменьшения
предполагает
доработку её исходных кодов.
Удобными для автора работы и удовлетворяющими все требования
приведенного списка оказались следующие инструменты:
1. Язык C# с использованием платформы .NET (разработка велась в
IDE Microsoft Visual Studio 2010 Ultimate).
2. Библиотека Tao Framework.
1.2.1. Язык программирования C#
C# (произносится си шарп) — объектно-ориентированный язык
программирования. Разработан в 1998—2001 годах группой инженеров под
руководством Андерса Хейлсберга в компании Microsoft как язык разработки
приложений для платформы Microsoft .NET Framework и впоследствии был
стандартизирован как ECMA-334 и ISO/IEC 23270.
3
C# относится к семье языков с C-подобным синтаксисом, из них его
синтаксис наиболее близок к C++ и Java. Язык имеет статическую
типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе
операторов явного и неявного приведения типа), делегаты, атрибуты,
события, свойства, обобщённые типы и методы, итераторы, анонимные
функции с поддержкой замыканий, LINQ, исключения, комментарии в
формате XML.
Переняв многое от своих предшественников — языков C++, Java,
Delphi, Модула и Smalltalk — С#, опираясь на практику их использования,
исключает некоторые модели, зарекомендовавшие себя как проблематичные
при разработке программных систем, например, C# в отличие от C++ не
поддерживает множественное наследование классов (между тем допускается
множественное наследование интерфейсов).
1.2.2. Платформа .NET
Платформа .NET Framework — это интегрированный компонент
Windows, который поддерживает создание и выполнение нового поколения
приложений и веб-служб XML. При разработке платформы .NET Framework
учитывались следующие цели.
Обеспечение
согласованной
объектно-ориентированной
среды
программирования для локального сохранения и выполнения объектного
кода, для локального выполнения кода, распределенного в Интернете, либо
для удаленного выполнения.
Обеспечение среды выполнения кода, минимизирующей конфликты
при развертывании программного обеспечения и управлении версиями.
Обеспечение среды выполнения кода, гарантирующей безопасное
выполнение кода, включая код, созданный неизвестным или не полностью
доверенным сторонним изготовителем.
4
Обеспечение среды выполнения кода, исключающей проблемы с
производительностью сред выполнения сценариев или интерпретируемого
кода.
Обеспечение единых принципов работы разработчиков для разных
типов приложений, таких как приложения Windows и веб-приложения.
Разработка взаимодействия на основе промышленных стандартов, которое
обеспечит интеграцию кода платформы .NET Framework с любым другим
кодом.
Двумя
основными
компонентами
платформы
.NET
Framework
являются общеязыковая среда выполнения (CLR) и библиотека классов .NET
Framework.
Основой платформы .NET Framework является среда CLR. Среду
выполнения можно считать агентом, который управляет кодом во время
выполнения и предоставляет основные службы, такие как управление
памятью, управление потоками и удаленное взаимодействие. При этом
накладываются условия строгой типизации и другие виды проверки точности
кода, обеспечивающие безопасность и надежность. Фактически основной
задачей среды выполнения является управление кодом. Код, который
обращается к среде выполнения, называют управляемым кодом, а код,
который не обращается к среде выполнения, называют неуправляемым
кодом.
Другой основной компонент платформы .NET Framework - библиотека
классов, представляет собой полную объектно-ориентированную коллекцию
типов, которые применяются для разработки приложений, начиная от
обычных, запускаемых из командной строки или с графическим интерфейсом
пользователя, и заканчивая приложениями, использующими последние
технологические возможности ASP.NET, такие как Web Forms и веб-службы
XML.
Платформа .NET Framework может размещаться неуправляемыми
компонентами, которые загружают среду CLR в собственные процессы и
5
запускают выполнение управляемого
кода, создавая таким образом
программную среду, позволяющую использовать средства как управляемого,
так и неуправляемого выполнения.Платформа .NET Framework не только
предоставляет несколько базовых сред выполнения, но также поддерживает
разработку базовых сред выполнения независимыми производителями.
Например, ASP.NET размещает среду выполнения и обеспечивает
масштабируемую среду для управляемого кода на стороне сервера. ASP.NET
работает непосредственно со средой выполнения, чтобы обеспечить
выполнение приложений ASP.NET и веб-служб XML, обсуждаемых ниже в
этом разделе.
Обозреватель
Internet
Explorer
может
служить
примером
неуправляемого приложения, размещающего среду выполнения (в виде
расширений типов MIME).Размещение среды выполнения в обозревателе
Internet Explorer позволяет внедрять управляемые компоненты или элементы
управления Windows Forms в HTML-документы. Такое размещение среды
делает
возможным
(аналогичного
существенными
выполнение
элементам
управляемого
управления
преимуществами
Microsoft®
управляемого
мобильного
ActiveX®),
кода,
такими
кода
но
с
как
выполнение в условиях неполного доверия и изолированное хранение
файлов.
1.2.3. Tao Framework
Tao Framework — это библиотека, предоставляющая разработчикам
.NET и Mono доступ к возможностям популярных библиотек вроде OpenGL и
SDL. Она изначально была создана программистом на C# и OpenGL Randy
Ridge, и с тех пор значительно расширена другими разработчиками.
Описание технологии OpenGL выходит за рамки данной работы.
6
1.3. Описание системы
Preprocessor - система подготовки исходных данных для CAE-системы
«Sigma»
является
модульной
системой.
Ниже
приведена
схема
взаимодействия её основных модулей.
Модуль взаимодейтсвия с
Sigma: импорт и экспорт
данных.
Модуль
нагрузок.
Графический
интерфейс
пользователя
Модуль
закреплений.
Модуль
построения
геометрической
модели
палстины.
задания
Модуль анализа сетки.
Ядро
Модуль формирования 4-х
узловых зон.
Модуль
сетки КЭ.
наложения
Модуль
назначения
материалов.
формирования
Модуль визуализации.
Сеточные генераторы:
Метод
изопараметрических
координат
Фронтальный метод
Алгоритмы триангуляции
по Делоне
Модули
сетки:
оптимизации
Увеличение
минимального угла КЭ.
Позиционирование
узлов
по
центру
тяжести
Модуль
взаимодействия
с
подсистемой Рапперта
Внешний модуль: подсистема Рапперта.
7
1.4. Описание основных модулей системы
1.4.1. Ядро
Ядром препроцессора будем называть совокупность структур и
методов, необходимых для обеспечения корректного взаимодействия всех
модулей системы.
Основные функции, возлагаемые на ядро:
 обмен данными между модулями, предназначенными для работы с
отдельными элементами пластины, и модулем хранения данных;
 организация
взаимодействия
между
графическим
интерфейсом
пользователя и модулем хранения данных;
 хранение данных модели;
 организация ввода/вывода данных пластины с использованием её
графического отображения.
 обеспечение необходимых функций для работы с проектом: создание,
удаление, сохранение, отмена/повтор внесенных изменений и т.п.
Основным классом, используемым в ядре, является класс FullModel.
1.4.2. Графический интерфейс пользователя
Графический интерфейс в системе реализован с использованием
стандартной библиотеки WinForms. В разработанной системе используется
технология MDI (Multi Document Interface), что позволяет одновременно
работать с несколькими проектами. Ниже приведен основной вид панели
инструментов системы и пример внешнего вида системы при работе с
несколькими проектами.
Внешний вид панели инструментов препроцессора
8
Пример рабочего пространства препроцессора при открытии нескольких окон.
1.4.3. Модуль построения геометрической модели пластины
Одним из двух способов получения геометрической модели пластины в
препроцессоре является её построение с использование предлагаемых
системой средств.
Для
построения
модели
используются
такие
геометрические
примитивы как точка, прямая линия, дуга, окружность.
Добавление, редактирование и удаление осуществляются с помощью
управляющих элементов системы.
Ниже приведен список используемых управляющих элементов для
каждого из примитивов.
Точка.
Создание возможно как с помощью управляемого элемента, так и
обычным кликом мышки по графическому представлению модели:
9
Добавление точки
Редактирование точки возможно как с помощью управляемого
элемента, так и перетаскиванием точки по рабочей области:
Редактирование точки
Удаление точки возможно как с помощью управляемого элемента,
так и щелчком по удаляемой точке:
Удаление точки
Прямая линия
Создать линию можно используя управляющий элемент – в этом
случае необходимо вручную указать номера образующих прямую
точек – либо выбрав две точки мышкой:
10
Создание линий
Редактирование линий возможно путем перемещения образующих
её точек (см. описание редактирования точек).
Удаление линий возможно путем использования управляющего
элемента либо щелчком по удаляемой линии:
Удаление линий
Дуга
Создание дуги возможно путем указания трех необходимых для
построения точек (начало, конец, центр дуги) в управляющем
элементе, либо путем выделения этих точек мышкой:
Добавление дуги
При этом обязательным является выполнение следующих условий:
должно быть указано направление обхода точек; расстояния от
центра дуги до точек её начала и конца должны быть одинаковыми.
Редактирование дуги осуществляется при помощи редактирования
образующих её точек. Редактирование центра дуги невозможно.
Удаление дуги происходит аналогично удалению прямых линий.
11
Окружность
Создание окружности возможно с помощью управляемого элемента,
либо путем двух кликов мышкой по рабочей области: для выбора
центра окружности и для указания её радиуса. При этом при
перемещении мышки, можно «прицепить» окружность к уже
имеющейся точке:
Добавление окружности
Удаление окружности возможно путем удаления точки её центра
либо с использованием управляющего элемента.
Немаловажную роль играет возможность разбиения уже имеющихся
линий на части при помощи управляющего элемента добавления точек. Так,
при попадании новой точки на линию, эта линия будет разбита в зависимости
от своего типа:
Разбиение прямой: образование двух прямых
Разбиение дуги: образование двух дуг
12
Разбиение окружности: образование двух дуг
При разбиении линий система гарантирует коррекцию координат новой
точки таким образом, чтобы они удовлетворяли уравнению прямой. При
разбиении дуги – что точка будет удалена от центра дуги на расстояние
равное её радиусу.
1.4.4. Модуль формирования 4-х узловых зон
Формирование
4-х
узловых
зон
необходимо
для
применения
большинства методов триангуляции, реализованных в системе.
Зона может иметь форму:
прямоугольника;
четырехугольника общего вида;
треугольника
Виды зон в препроцессоре.
Система предлагает два варианта задания зон:
1. Пользователь указывает линии, образующие зону. Для этого
использует управляющий элемент либо выбирает линии щелчком
мыши по рабочему пространству:
Формирование зон при ручном поиске линий
13
2. Пользователь щелкает внутри предполагаемой зоны, и система сама
производит поиск линий.
И в том и в другом случае препроцессор сообщает об ошибках
формирования зоны. Результатом успешной работы того или иного метода
станет создание зоны:
Пример зоны в препроцессоре
Система автоматически добавляет промежуточные узлы на линии зон.
Особый интерес вызывает случай, когда одной из сторон зоны оказывается
дуга. При помощи такого промежуточного узла, дуга аппроксимируется
двумя отрезками:
Аппроксимация дуги отрезками
У пользователя так же есть возможность удалить созданные зоны. Для
этого в препроцессоре реализованы две функции: удаление всех зон и
удаление конкретной зоны путем указания её номера в управляющем
элементе либо кликом по ней в рабочей области.
14
1.4.5. Модуль формирования сетки конечных элементов
Одной из главных и самых сложных задач, стоящих перед
препроцессором является формирование сетки конечных элементов.
Ниже приведено общее описание реализованных в препроцессоре
методов триангуляции. Так же будут приведены примеры триангуляции
модели фиксированной геометрической формы различными методами:
Геометрия модели, используемая в дальнейшем для триангуляции.
15
1.4.6. Модуль
триангуляции
методом
изопараметрических
координат
Форма триангуляции методом изопараметрических координат
Метод разработан Эдгебергом, Зенкевичем и Филлипсом. В 1969 г.
впервые были разработаны универсальные программы - генераторы СКЭ, В
настоящее время продолжаются исследования по усовершенствованию
методов изопараметрическох координат и их программной реализации.
II
III
I
VII
IV
V
VI
Пример разбиения исходной пластины на подобласти
Методы изопараметрических координат предполагает представление
расчетной области в виде совокупностей подобластей, каждой из которых
ставится в соответствие изопараметрический квадратичный элемент. Таким
образом, локальные координаты  и  преобразуются в глобальные x и y.
В изопараметрической системе координат применяется неравномерное
разбиение по 
и (или)  . Это дает возможность производить сгущение
узлов сетки в заданной части исходной области.
16

y





x
Преобразование координат
Сеточный генератор,
реализующий метод изопараметрических
координат, разбивает область на треугольные конечные элементы. При этом
их форма получается разной. Идеальный случай – когда все они
равносторонние и, следовательно, их углы одинаковые – по 60 градусов. В
реальности этого добиться невозможно. Более того, нередко один, а то и два
угла треугольника бывают очень острыми, что сказывается на точности
расчетов.
При разбиении модели на КЭ необходимо указать параметр NRC,
можно изменить имя сетки, так как система автоматически предлагает имя.
Имя сетки используется для удобства, так как система может сохранять
несколько разбиений для одной геометрической модели:
Дерево сеток в препроцессоре
17
Пример триангуляции исходной пластины при NRC =5:
Пример для NRC = 12:
Здесь и далее конечные элементы зеленого цвета означают КЭ с углами
приближенными к 60 ° . Элементы с углами выше 90 ° обозначены яркооранжевым цветом.
18
1.4.7. Модуль триангуляции фронтальным методом
Главное окно модуля триангуляции фронтальным методом
Модуль
триангуляции
фронтальным
методом
реализован
как
отдельный элемент MDI. Модуль использует свой тип данных для хранения
данных о геометрической модели, реализованный с помощью класса
MyFrontSegment. Формально сегмент является аналогом зоны, но помимо
информации о геометрической конфигурации части пластины хранит также
данные о конечных элементах, образованных в её пределах.
Рассмотрим подробнее алгоритм триангуляции, реализованный в
модуле.
Плоская
многосвязная
область,
подлежащая
триангуляции,
представляется в виде непересекающегося объединения базовых лини. Две
(или более) базовых линий могут иметь общие концевые точки (узлы). Таким
образом,
простейшим
элементом
топологической
модели
плоского
континуума является точка, которая определяется порядковым номером и
19
координатами. Затем идет базовая линия, которая также имеет свой
порядковый номер с указанием номеров образующих ее базовых узлов.
Базовая подобласть, в свою очередь, имеет номер с указанием номеров ее
ограничивающих базовых линий.
2
3
2
3
10
1
4
II
10 базовые узлы
4
8
базовые линии
II
базовые подобласти
11
I
5
6
7
5
12
1
9
6
8
7
9
8
Топология модели плоского многосвязного тела
Описанная структура характеризует топологию образования моделей
плоских областей.
Поскольку линию можно задавать несколькими определенным образом
согласованными точками, целесообразно для кодировки линейных элементов
разработать шаблон или логические схемы преобразования множества
исходных данных. Руководствуясь соображениями простоты и наибольшей
унификации, ограничимся рассмотрением базовых элементов двух типов:
прямой и окружности.
Прямолинейный базовый элемент может быть образован, если задано
положение начального и конечного базовых узлов, а промежуточные узлы
располагаются между ними. Для того, чтобы получить неравноотстоящие
промежуточные узлы, можно задать множитель α, определяющим отношение
каждого данного интервала к следующему.
20
Базовый элемент в форме дуги окружности может быть определен
заданием трех базовых узлов, среди которых средний узел не обязательно
должен совпадать с каким-либо промежуточным узлом, так как он служит
для нахождения координат центра окружности. Разбивка (как равномерная,
так и неравномерная) базового кругового элемента осуществляется путем
разбивки соответствующего ему центрального угла.
базовые узлы
е
ен и
сгущ
ln + 1
ln

а)
промежуточные узлы
ln
ln  1
0
б)
Y’
X’
0
в)
Образование линейных элементов: а – прямая линия, б – дуга окружности, в – участок
параболы
Таким образом, контур базовых подобластей представляется в виде
непересекающегося объединения прямолинейных элементов, концевыми
узлами которых является упорядоченная совокупность узлов дискретизации
базовых линий. Топологической модели плоского континуума соответствует
непересекающееся
объединение
односвязных
подобластей
в
форме
многоугольников, аппроксимирующих базовые подобласти.
21
II
I
Аппроксимация границ базовых подобластей (базовых линий) отрезками прямых.
На основании информации о сформированных граничных узлах (узлах
дискретизации базовых линий) производится автоматическая триангуляция
базовых подобластей.
Метод триангуляции, применяемый в данной работе заключается в
последовательном построении треугольной сетки внутрь подобласти с
учетом локальных свойств текущей границы. Стратегия метода может быть
охарактеризована двумя способами формирования треугольных элементов:
«выравнивание», т.е. уменьшение текущей границы;
«выемка», т.е. построением нового узла текущей границы.
22
а)
б)
в)
г)
Преобразование текущей границы: а,в,г – выравнивание, б - выемка.
Применение того или иного способа определяется путем проверки
локальных свойств текущей границы в соответствии с рядом установленных
критериев.
Ниже приведена таблица этих критериев.
№ п/п
1.
2.
3.
4.
5.
Критерий образования треугольных элементов
Угол на текущей границе, меньший 85-90°, срезается
Поиск минимального угла на текущей границе, большего 85-90°,
деление его лучом в соответствии с длинами двух смежных линий,
образующих данный угол, и образование на луче новых узла
Поиск минимального угла на текущей границе, большего 85-90°,
деление его лучом в соответствии с длинами четырех линий,
образующих данный угол, и образование на луче нового узла
Поиск минимального угла на текущей границе, большего 85-90°,
деление его лучами в соответствии с длинами четырех линий,
образующих данный угол, и образование на лучах нового узла
Поиск минимального угла на текущей границе, большего 85-90°,
деление его лучами в соответствии с длинами четырех линий,
образующих данный угол, и образование на лучах нового узла
23
Поиск минимального угла на текущей границе, большего 85-90°,
деление его лучом пополам, длина которого определяется функцией
плотности в данной области, и образование на луче нового узла
6.
Выравнивание
текущей
границы,
согласно
критерию,
является
обязательным (если только это возможно) для каждого этапа триангуляции.
В результате его использования достигается выпуклость текущей границы.
Критерии 2-6 определяют стратегию выбора локального участка
текущей границы, где производится построение нового узла, т.е. они
соответствуют способу «выемка». Эти критерии содержат логически
обоснованные ограничения, накладываемые на величины α, R, a1, a2.
а)
б)
b b
R 2 3
2
1   2
i-2
г)
i-1
i
b1 i+1 1 R

b2
b3
2
b3
b1 i+1
b2
j
j
i+2
b1 i+1
b2
i-1
R
i
b4
i-1
b3
i-2
a2
b4
i-1
b3
i
R  F ( xi , yi )
1   2
i-2
a2
b3  b4
2
д)
b1  b2 a  b3  b4
2
2
2
b b b b
R 1 2 3 4
4
a1 
i+2
b4
a2 
a1
i
a1
b1  b2
2
i-2
j
i+2
R
i+1 1  2
b2
a1 
1   2
j
i+2
в)
b b b b
R 1 2 3 4
4
i-2
j
i+2
R
i+1 1  2
i-1
i
Критерии построения нового узла текущей границы (способ «выемка»)
Критерии 2-5 могут произвольно варьироваться и применяться в
любых сочетаниях один с другим. Однако при этом обязательна проверка
алгоритма на сложных тестовых примерах, поскольку в некоторых случаях
сочетания критериев могут привести к триангуляции с пересекающимися
сторонами треугольников или к неравномерной разбивке со сгущением в
нежелательных местах. Триангуляция, происходящая без вырождения
24
треугольных
элементов,
всегда
заканчивается,
ввиду
обязательного
исключения узла с прилегающим углом в 85-90° и менее.
Отметим, что выбор конкретного критерия (совокупности критериев),
характеризующего способ «выемка», определяется:
Количеством узлов и элементов для соответствующей базовой подобласти;
Равномерностью и регулярностью сетки конечных элементов;
Необходимым изменением плотности элементов в заданных районах базовой
подобласти.
Завершающей фазой работы алгоритма построения треугольной сетки
внутрь подобласти с учетом локальных свойств текущей границы является
итерационная
регуляризация
сформированной
сетки.
Процедура
регуляризации заключается в совмещении внутренних узлов базовой
подобласти с центроидами многоугольников, составленных из треугольных
элементов, окружающих внутренние узлы.
Отдельно
поясним
критерий
формирования
новых
узлов,
учитывающий функцию плотности. Данный критерий не применяется в
совокупности с другими критериями, поскольку в качестве локальных
свойств подобласти он учитывает лишь величину угла, длина луча,
образующего новый узел целиком определяется величиной функции
плотности в точке формирования нового узла.
Функция плотности характеризует уровень сгущенности конечных
элементов на всей области и на отдельных участках. Функция плотности –
это некоторое число, которому будет равна длина луча при формировании
нового узла, если узел формируется из точки задания функции плотности.
Таким образом, функция плотности имеет определенный физический смысл,
выражающий длину нового формируемого ребра. Выбирается некоторое
стандартное значение функции плотности, задаваемое для всей области,
далее для некоторых участков указывается иное - дополнительное значение
функции плотности, позволяющее увеличивать или уменьшать стандартное
значение плотности треугольных элементов. В случае если дополнительные
25
значения функции плотности не заданы (либо новый узел формируется вне
радиуса действия дополнительных точек задания функции плотности, длина
Ri будет одинакова для всей области и равна стандартному значению
функции плотности f ст .
f ст
2
точка, от которой строится новый
узел
Rд
радиус действия функции
плотности, задаваемой
дополнительно в некоторой точке
Rд
l1
R2
2
F  f1
Rд
F  f3
F  f3
F  f2
F  f4
l4
расстояние от точки построения
нового узла до точки задания
дополнительной функции
плотности (вычисляется лишь в том
случае, если точка построения
нового узла находится в радиусе
действия дополнительной функции
плотности)
f ст
стандартное значение функции
плотности (одинаково для всей
области голубого цвета)
l4
f ст
F  f5
R1
l5
R3
1
значение дополнительной функции
плотности в точке ее задания
(уменьшается с удалением от
точки)
3
Критерий построения нового узла текущей границы с использованием функции
плотности (способ «выемка»)
Точки 1 и 2 находятся в радиусе действия дополнительных точек
задания функции плотности, поэтому величина Ri в них будет определяться
как стандартным значением функции плотности, так и дополнительными.
Для каждой дополнительной точки задания функции плотности, в зоне
действия которой находится узел, от которого строится новый элемент,
вычисляется весовой коэффициент по формуле:
ki  1 
li
Rд
где li – расстояние от узла построения нового элемента до точки
задания функции плотности;
26
Rд – радиус действия функции плотности, задаваемой дополнительно.
Затем с учетом весовых коэффициентов всех дополнительных точек,
радиус действия которых захватывает перестраиваемый узел, вычисляется
значение R для этой точки и формируется новый узел по формуле:
n
Rj 
0.75  f ст   fi  ki
i 1
n 1
где f ст - стандартное значение функции плотности;
n – количество точек задания функции плотности, в радиусе действия
которых находится перестраиваемый узел;
k i – весовые коэффициенты точек задания дополнительных значений
функции плотности;
f i - задаваемые значения функции плотности.
В модуле реализована возможность выбора критерия для построения
узла методом «выемка», возможность задания минимального угла для метода
«выравнивание», а так же реализована возможность построения сетки КЭ с
использования функции плотности. При этом необходимо задать значение
функции плотности по умолчанию, а для отдельных областей пластины
плотность задается при помощи управляющего элемента формы.
Форма настроек модуля триангуляции фронтальным методом
27
Приведем примеры триангуляции имеющейся модели фронтальным
методом с различными параметрами.
Пример 1. Триангуляция с использованием критерия «по двум
сторонам с делением угла пополам». На границы зон были добавлены узлы с
шагом 1.5 для получения более густой сетки КЭ.
Пример 2. Триангуляция с использованием функции плотности.
Распределение плотности
28
Результат триангуляции с использованием функции плотности
1.4.8. Модуль триангуляции по Делоне
В системе реализованы два алгоритма получения триангуляции по
Делоне. Остановимся подробнее на определении такой триангуляции и
рассмотрим реализованные алгоритмы.
Форма модуля триангуляции по Делоне
29
Триангуляция Делоне является одним из самых популярных в
последнее время способов построения триангуляционной сетки. Она
применяется во многих ГИС системах для построения моделей рельефа.
Триангуляция Делоне – это разбиение нерегулярного множества
опорных точек на
такую сеть треугольников, которая отвечала бы
сформулированной еще в 30-е годы теореме Делоне о пустом шаре. В
приложении к двумерному пространству она формулируется следующим
образом: система взаимосвязанных неперекрывающихся треугольников
имеет наименьший периметр, если ни одна из вершин не попадает внутрь ни
одной из окружностей, описанных вокруг образованных треугольников.
Триангуляция Делоне
Это
означает,
что
образовавшиеся
треугольники
при
такой
триангуляции максимально приближаются к равносторонним, а каждая из
сторон образовавшихся треугольников из противолежащей вершины видна
под максимальным углом из всех возможных точек соответствующей
полуплоскости. Это именно та оптимальная триангуляция, по ребрам
которой, например, делается обычно линейная интерполяция для построения
изолиний.
30
Триангуляция Делоне для 100 точек, выбранных случайным образом в пределах
прямоугольника.
Для формирования триангуляции Делоне потребуется несколько новых
определений. Набор точек считается круговым, если существует некоторая
окружность, на которой лежат все точки набора. Такая окружность будет
описанной
для
данного
набора
точек.
Описанная
окружность
для
треугольника проходит через все три ее (не коллинеарные) вершины.
Говорят, что окружность будет свободной от точек в отношении к заданному
набору гочек S, если внутри окружности нет ни одной точки из набора S. Но,
однако, точки из набора S могут располагаться на самой свободной от точек
окружности.
Триангуляция набора точек S будет триангуляцией Делоне, если
описанная окружность для каждого треугольника будет свободна от точек.
Для
упрощения
алгоритма
триангуляции
можно
сделать
два
предположения относительно точек в наборе S. Во-первых, чтобы вообще
существовала триангуляция, мы должны полагать, что набор S содержит по
крайней мере три точки и они не коллинеарны. Во-вторых, для уникальности
триангуляции Делоне необходимо, чтобы никакие четыре точки из набора S
не лежали на одной описанной окружности. Легко видеть, что без такого
предположения гриангуляция Делоне не будет уникальной, ибо 4 точки на
31
одной описанной окружности позволяют реализовать две различные
триангуляции Делоне.
Таким образом, для получения триангуляции для Делоне в рамках
препроцессора необходимо решить две задачи:
Генерация набора опорных точек;
Реализация алгоритма триангуляции.
Решение первой задачи система предлагает одним из следующих
методов:
Хаотическая генерация точек;
Хаотическая генерация точек с распределение плотности;
Прямоугольная регулярная;
Равноугольная регулярная;
Использование узлов уже имеющейся сетки.
Каждый из этих подходов направлен на построение множества точек 𝑃ℎ
в некоторой области Ω 𝜖 𝐼𝑅2 . Во многих практических приложения требуется
равномерное
распределение
точек,
поэтому
далее
нам
понадобится
обозначение 𝑑(𝑧, 𝑃ℎ ) - минимальное расстояние между точкой 𝑧 = (𝑥, 𝑦) и
отличными от неё точками множества 𝑃ℎ . На первом этапе (общем для всех
методов) граница множества Ω разбивается точками с шагом ℎ , которые
включаются в 𝑃ℎ . Область Ω можно поместить в некоторый прямоугольник
𝑅𝑒𝑐𝑡(Ω ), это облегчит генерацию точек.
32
Объемлющий прямоугольник области 𝛺.
При генерации точек в прямоугольнике 𝑅𝑒𝑐𝑡(Ω ) нужно проверять
попала ли точка в область Ω , и только в случае положительного ответа
помещать во множество 𝑃ℎ . К тому же, надо убедиться что 𝑑(𝑧, 𝑃ℎ ) ≥ ℎ.
Для препроцессора понятие области Ω тождественно (в общем случае)
понятия восьмиугольников, ограничивающих определенную зону пластины.
Таким образом, для проверки условия 𝑧(𝑥, 𝑦)𝜖Ω
можно использовать
известные решения задачи о принадлежности точки многоугольнику.
1.4.8.1.
Методы генерации точек
Хаотическая генерация точек.
Рассмотрим псевдослучайную генерацию точек. Зададим датчику
псевдослучайных числе диапазон для генерации в 𝑅𝑒𝑐𝑡(Ω ). Поскольку в 𝑃ℎ
включаются только точки, попавшие в Ω и не попавшие в ℎ-окрестность уже
включенных точек, в общем случае необходимо неоднократно использовать
датчик псевдослучайных чисел.
При увеличении мощности множества 𝑃ℎ количество попыток может
неограниченно расти, поэтому необходимо задать некоторую константу,
зависящую от требуемой равномерности размещения точек, достигнув
которую счетчик попыток останавливает процесс генерации. На практике
достаточно значение 1000. В этом методе 𝑑(𝑧, 𝑃ℎ ) ≥ ℎ.
33
Пользователь препроцессора имеет возможность задать следующие
параметры алгоритма генерации:
Количество точек на зону;
Минимальное расстояние между точками ℎ;
Предельное количество попыток генерации координат новой точки.
Хаотическая генерация точек с распределением плотности.
Такая генерация использует метод хаотической генерации, но
позволяет пользователю задать ряд дополнительных параметров. Такими
параметрами являются:
Список плотности зон: список зон с указанным для них количеством точек и
минимальным расстоянием между этими точкам;
Список плотности подобластей: список подобластей пластины с указанным
для каждой из них количеством точек и минимальным расстоянием между
ними. Каждая подобласть представляет задана окружности выбранным
пользователем радиусом и координатами своего центра.
Алгоритм генерации можно представить в виде последовательности
следующих шагов:
1. Использовать метод хаотической генерации точек с заданными по
умолчанию параметрами для зон, не указанных в списке плотности
зон.
2. Использовать метод хаотический генерации точек для зон,
указанных в списке плотности. Использовать индивидуальные для
зоны параметры.
3. Для каждого элемента списка плотности подобластей: удалить все
точки, попавшие в подобласть в ходе генерации п.1 и п.2, кроме
точек соответствующих узлам зон.
4. Для каждого элемента списка плотности подобластей: использовать
метод хаотической генерации точек для подобласти. Для проверки
принадлежности точки подобласти использовать два условия:
𝑧(𝑥, 𝑦)𝜖 Ω; (x − x0 )2 + (y − y0 )2 ≤ R2 ,
34
Где:
𝑧0 (𝑥0 , 𝑦0 ) – точка центра окружности, описывающей подобласть
𝑅 – радиус этой окружности.
Алгоритм является гибким инструментом для генерации точек с
различной плотности распределения по пластине. При правильном и
разумном использовании, алгоритм позволяет в дальнейшем получить
триангуляцию, удовлетворяющую условию Делоне с учетом желаемой
сгущенности конечных элементов в выбранных пользователям областях
пластины.
Прямоугольная регулярная структура точек.
Эффективным и экономичным является регулярное разбиение области
𝑅𝑒𝑐𝑡(Ω) семейством вертикальных и горизонтальных линий с шагом ℎ.
Прямоугольная регулярная структура точек.
Во множество 𝑃ℎ включаются точки пересечения этих линий, попавшие
в Ω, за исключением околограничных точек. В этом методе 𝑑(𝑧, 𝑃ℎ ) = ℎ.
Равноугольная регулярная структура точек.
Другой подход заключается в разбиении области Ω горизонтальными и
наклонными линями с углом пересечения в 60 ° . Расстояние между
35
горизонтальными линиями положим
с шагом ℎ по оси 𝑥 (т.е.
ℎ √3
2
ℎ √3
2
, а вертикальные линии проводятся
- также расстояние между ними).
Равноугольная регулярная структура точек.
Это множество точек можно получить и другим путем: построить
прямоугольное регулярное множество точек с шагом ℎ по оси 𝑥 и шагом
ℎ √3
2
по оси 𝑦, а затем сдвинуть каждый четный горизонтальный ряд точек на
ℎ
вектор ( , 0). Такой метод построения равноугольной регулярной структуры
2
точек и реализован в системе. Данное множество точек предназначено для
получения равносторонних треугольников внутри области Ω .
Использование узлов имеющейся сетки
Данный метод по сути не является генератором точек. Система
копирует узлы одной из уже имеющихся сеток текущей модели и
предоставляет полученный набор методам триангуляции. Формально
триангуляция на таком наборе представляет собой оптимизацию уже
имеющейся сетки.
1.4.8.2.
Алгоритмы триангуляции Делоне
Сгенерированный тем или иным методом набор опорных точек далее
передаётся одному из двух (по выбору пользователя) реализованных в
системе методу триангуляции по Делоне. Рассмотрим подробнее каждый из
них.
36
Алгоритм S-Hull.
Этот новый алгоритм был разработан в 2011 году. Его создателями
являются Phil Atkin, Dr. Sinclair. Этот алгоритм обладает высокой
(O(nlog(n))) скоростью работы и предназначен для построения триангуляции
по Делоне на наборе двумерных точек. Подробное описание алгоритма
можно найти на сайте их создателей: http://s-hull.org/ . Ниже приведена
последовательность шагов алгоритма.
Для набора уникальных точек 𝑥𝑖 в области 𝑅2:
1. Выбрать начальную точку 𝑥0 из 𝑥𝑖 .
2. Сортировать точки по критерию |𝑥𝑖 − 𝑥0 |2 .
3. Найти точку 𝑥𝑗 наиболее близку к 𝑥0 .
4. Найти точку 𝑥𝑘 , которая образовала бы вместе с точками 𝑥0 и 𝑥𝑗
окружность наименьшего диаметра и запомнить центр окружности
𝐶.
5. Упорядочить точки [𝑥0 , 𝑥𝑗 , 𝑥𝑘 ] для образования праворукой системы:
эти три точки образуют базовую выпуклую оболочку.
6. Упорядочить оставшиеся точки согласно критерию |𝑥𝑖 − 𝐶|2 для
формирования набора 𝑠𝑖 .
7. Последовательно добавлять точки набора 𝑠𝑖 к двумерной выпуклой
оболочке, изначально образованной треугольником |𝑥0 , 𝑥𝑗 , 𝑥𝑘 |. При
добавлении новой точки, границы имеющееся выпуклой оболочки,
видимые из этой точки, образуют новые треугольники.
8. На этом этапе получена непересекающаяся триангуляция набора
точек. (Этот метод показывает потрясающую скорость при создании
такой триангуляции).
9. В соседствующих парах треугольников должна быть произведена
смена диагонали для создания триангуляции Делоне на основе
имеющейся непересекающейся триангуляции.
37
Алгоритм Пола Бурка.
Алгоритм разработан в 1989 году, его создателем является Paul Bourke.
Изначально алгоритм был разработан триангуляции топографического
рельефа по имеющейся информации о его высоте в различных подобластях.
Подробное
описание
алгоритма
http://paulbourke.net/papers/triangulate/
.
можно
найти
Ниже
приведено
по
адресу:
упрощенное
описание алгоритма.
На любом этапе процесса триангуляции имеется уже существующая
сетка и некоторая точка, которую необходимо добавить. Процесс начинает с
создание супертреугольника: искусственного треугольника, включающего в
себя все точки набора. В конце процесса триангуляции, все треугольники,
границы которых лежат на ребрах супертреугольника, должны быть удалены.
Новая точка
Предыдущая
точка
добавленная
Имеющаяся сетка
Добавление новой точки к существующей сетке
Определяются все треугольники, чьи описанные окружности включают
в
себя
новую
точку.
В
совокупности
они
образуют
замкнутый
многоугольник.
Многоугольник, образованный
треугольниками,
чьи
описанные
окружности
включают в себя новую точку.
Образование «включающего» многоугольника
38
Все треугольники, образующие этот многоугольник должны быть
удалены. Добавляются новые треугольники, образованные добавляемой
точкой и ребрами многоугольника.
Результирующие
треугольники, образованные с
использованием новой точки
Создание новых треугольников.
Добавление новой точки приводит к увеличению числа треугольников
в сетке на два. Таким образом, количество треугольников в два раза
превышает количество опорных точек. (Это утверждение включает в себя
также супертреугольник. По завершении процесса триангуляции некоторые
треугольники будут удалены и количество треугольников станет меньше
удвоенное количество опорных точек).
1.4.8.3.
Ниже
Примеры работы алгоритма
приведены
примеры
триангуляции
исходной
модели
с
использованием описанных алгоритмов. На практике оказалось, что
результат триангуляции в бόльшей степени зависит от выбранного метода
генерации точек, нежели от выбранного алгоритма триангуляции. В связи с
этим для примеров использован алгоритм S-hull.
Пример 1. Хаотическая генерация. Параметры:
Количество точек на зону: 100;
Минимальное расстояние между точками: 0.5;
Ограничение попыток добавления новой точки: 1000.
39
Пример 1.
Пример 2. Прямоугольная регулярная структура точек.
Пример 2.
40
Пример 3. Равноугольная регулярная структура точек.
Пример 3.
Пример 4. В этом примере будет продемонстрирован алгоритм
хаотической генерации с распределением плотности. Основные параметры
совпадают с параметрами примера 1. Заданы дополнительные параметры:
Плотность 50 для зон 1, 4, 5, 8. В этих зон минимальное расстояние между
точками увеличено до 1.0;
Плотность 80 для подобласти в центральной части пластины с радиусом 5.
Минимальное расстояние между точками: 0.8.
41
Пример 4.
Ниже приведена форма настроек метода и пример выделения
подобласти:
Настройки генерации точек для триангуляции по Делоне.
42
1.4.9. Модуль оптимизации сетки.
В препроцессоре доступны 2 метода оптимизации сетки и мощный
внешний модуль для оптимизации с использованием методов Рапперта,
который будет описан отдельно. Рассмотрим «резидентные» методы
оптимизации.
1.4.9.1.
Метод увеличения минимального угла в КЭ
Примечание: Звездой узла будем называть совокупность конечных
элементов, одним из узлов которых является данный узел.
1. определить граничные и внутренние узлы (выделить внутренние
узлы)
2. организовать перебор внутренних узлов
3. для текущего внутреннего узла определить звезду.
4. организовать перебор элементов звезды.
5. определить минимальный угол и минимальную сторону в каждом из
элементов и выбрать из них минимальный угол(назовем 1-й угол) и
соответствующую ему сторону.
6. на основе полученной минимальной стороны определить шаг и
направление сдвига.
6а. изменить координату текущего внутреннего узла на шаг.
7. определить минимальный угол(назовем 2-й угол) и сторону звезды
при новом положении узла.
8. если 2-й угол больше 1-го, то запомнить новое положение текущего
узла, присвоить значение 2-го угла 1-му углу и повторить пункты
6а,7; иначе если 2-й угол не больше 1-го, то изменить направление
сдвига и выполнить пункты 6а,7.
9. по завершении перебора всех узлов если была изменена координата
хотя бы одного узла и число проходов меньше 100 (можно задать
любое другое число) сделать еще один проход, то есть выполнить
пункты 2-9.
43
Пример работы алгоритма:
Перед оптимизацией.
После оптимизации.
Минимальный угол: 24,69°
1.4.9.2.
Минимальный угол: 36,95°
Регуляризация
Идея метода заключается в позиционировании каждого узла по центру
тяжести многоугольника, образованного его звездой.
Данный алгоритм реализует изменение координат узла относительно
многоугольника, который образуют элементы, в составе которых встречается
искомый узел.
Координаты
находятся
по
формуле
центра
масс
выпуклого
получения
результата
многоугольника:
Формула
достаточно
громоздка
и
для
необходимы существенные затраты машинного времени.
Алгоритм выполняется в цикле для всех узлов до тех пор, пока
минимальное перемещение узла не станет меньше заданного достаточно
малого 𝜀 или пока количество итераций не достигнет 1000.
44
Пример работы алгоритма:
Перед оптимизацией.
После оптимизации.
Отмечается увеличение КЭ, форма которых
близка к равностороннему треугольнику.
1.4.10. Внешний модуль – подсистема Рапперта.
1.4.10.1.
Основные понятия
При описании своего алгоритма Рапперт вводит свою терминологию,
которой будем придерживаться и мы.
Элемент
по
смыслу
совпадает
с
конечным
элементом.
Это
элементарная часть пространства на множество которых мы хотим разбить
более сложную область этого пространства. В нашем случае элементом
является треугольник.
Узел (node) — точка в которой сходятся грани и соприкасаются
несколько элементов. В отличие от вершин элементов узел общий для всех
соприкасающихся в одной точке элементов.
45
Сегмент (segment) — это отрезок, соединяющий две соседние точки
лежащие на границе области разбиения, другими словами этот отрезок
принадлежит контурам области.
Грань
(edge)
—
это
отрезок
по
которому
граничат
два
соприкасающихся треугольника. Используя предыдущее определение можно
сказать, что все множество отрезков, соединяющих вершины элементов, в
любой момент работы алгоритма складывается из сегментов и граней.
Включенная точка (encroached point) — любая вершина текущей сетки,
которая находится внутри окружности, радиусом которой является любой
сегмент.
"Неправильный треугольник" (bad triangle) — это треугольник
неудовлетворяющий глобальным условиям, которые накладываются на
генерируемую сетку.
Вытянутый треугольник (skinny triangle) — треугольник, имеющий
одну сторону, намного отличающуюся от других двух. То есть треугольник
слишком вытянут вдоль некоторой прямой. На критериях "вытянутости" мы
остановимся ниже.
1.4.10.2.
Базовые процедуры алгоритма
Алгоритм опирается на две базовые процедуры: a) разбиение
неправильного треугольника с введением нового узла и b) разбиение
сегмента, принадлежащего границе области разбиения с введением нового
узла.
При разбиении треугольника происходит следующее:
1. Вычисляются координаты центра окружности, описанной вокруг
треугольника, подлежащего разбиению.
2. В эту точку добавляется новый узел.
3. Удаляется треугольник, подлежащий разбиению и прилегающие и
добавляются новые.
46
Разбиение «неправильного» треугольника
Вторая базовая процедура состоит в следующем:
1. Если
в
окружность,
диаметром
которой
является
сегмент,
принадлежащий границе области разбиения, попадает точка, не
принадлежащая этому сегменту, то сегмент делится на две части.
2. Удаляется треугольник, которому принадлежал первоначальный
сегмент, и добавляются два новых треугольника
Разбиение "неправильного" сегмента посередине и добавление двух новых треугольников
1.4.10.3.
Принцип работы
Принцип
работы
алгоритма
состоит
в
цикле
определения
"неправильных" треугольников, т.е. треугольников, не удовлетворяющих
определенному критерию, и произведение над ним одной из базовых
процедур. В оригинальном алгоритме, предложенным Джимом Раппертом
используется один критерий — минимальный угол в треугольниках сетки. В
каждом треугольнике сетки определяется минимальный угол и, затем,
сравниваются минимальные углы для всех треугольников с целью
нахождения минимального угла сетки. Другими словами, минимальный угол
в сетке равен минимально возможному углу, образованному двумя
сегментами, либо двумя гранями, либо сегментом и гранью, имеющими
общий узел.
47
Для задачи генерации конечно-элементной сетки этого критерия
недостаточно, дело в том, что функции, значения которых мы хотим
получить в узлах сетки, нелинейны, при этом они могут иметь области с
большими
значениями
своих
производных
(области
концентрации
напряжений). При больших размерах конечного элемента, велик риск
попросту упустить максимальные значения напряжений, поэтому был введен
еще один критерий — условие максимальной площади треугольника.
Сочетание этих двух ограничений гарантирует, что в сетке углы всех
треугольников не менее значения, заданного пользователем, а площади всех
треугольников не более другого значения, также задаваемого пользователем.
Математически
доказано,
что
критерий
минимального
угла
автоматически обеспечивает сгущение сетки вблизи мелких подробностей:
отверстий, углов, вырезов, т.е. концентраторов напряжений. А критерий
максимальной площади является дополнительным, регулирующим размер
треугольников.
Введение этого критерия было необходимо для адаптации этого
алгоритма к методу конечных элементов. Этот дополнительный критерий
снижает «эффективность» получаемого разбиения, т.к. введением этого
критерия мы ограничиваем площадь треугольников сверху, тем самым,
увеличивая количество треугольников в получаемой сетке. Но, задав
минимальную площадь треугольника достаточно большой, можно сделать
так, что фактически будет работать только критерий минимального угла.
Все
описанные
процедуры
выполняются
в
определенной
последовательности, они имеют разный приоритет. Общая схема работы
алгоритма следующая:
1. Производится поиск включенной (encroached) точки перебором всех
точек и сегментов (только сегментов, но не граней).
2. Если такая точка найдена то над сегментом, который включает ее
выполняется процедура деления сегмента пополам и производится
48
возврат на шаг 1. Если включенных точек не было найдено, то
алгоритм переходит на следующий шаг.
3. Производится поиск треугольника с минимальным углом.
4. Если минимальный угол меньше заданного параметра, то над
треугольником, его содержащем производится процедура деления и
производится возврат на шаг 1. В противном случае происходит
переход на следующий шаг.
5. Производится поиск треугольника максимальной площадью.
6. Если максимальная площадь больше заданного параметра, то над
таким треугольником производится процедура деления и производится
возврат на шаг 1. В противном случае происходит переход на
следующий шаг.
7. Все условия удовлетворены. Конец работы алгоритма
Автор
в
доказательства,
своей
работе
гарантирующие
приводит
строгие
правильную
работу
математические
алгоритма
при
минимальном угле α < 20°.
1.4.10.4.
Модификация алгоритма Рапперта
В работе для Journal of Algorithms раскрыт только лишь чисто
математический
аспект
проблемы,
хотя
вероятней
всего
алгоритм
разрабатывался для решения прикладных задач и для генерации конечноэлементной сетки в том числе. К тому же, и математическая сторона была
раскрыта не полностью, а только лишь с точки зрения сходимости и
некоторых особенностей. Ряд самых неочевидных подводных камней не
поднимается на обсуждение. Видимо это объясняется тем, что это проект
NASA и, вероятно, имеет какую-то степень закрытости.
В том варианте, в котором он был предложен автором, алгоритм не
обладал хорошей сходимостью и устойчивостью. Опытным путем было
установлено, что углы α > 25° были недоступны для него. Для повышения
49
качества работы алгоритма, помимо двух вышеперечисленных процедур
была введена еще одна — процедура поворота диагонали. К сожалению,
автор опустил этот момент и не упомянул о нем, несмотря на то что, ее роль
в работе алгоритма очень высока. Эта процедура, на самом деле, неявно
присутствует в оригинальном алгоритме Рапперта, но все же эту процедуру
лучше выделить в отдельную и остановиться на ней подробно. Это упрощает
и понимание работы алгоритма, и его программирование. На рисунках видно,
что
помимо
непосредственного
добавления
новых
треугольников,
производятся и еще некоторые операции. Эти операции есть ничто иное как
смена диагонали.
Суть ее заключается в следующем. Два треугольника, имеющие общую
грань, образуют четырехугольник, разделенный диагональю. Внутри такого
образования диагональ имеет два возможных положения. На рисунке
показаны эти положения — отрезки ac и bd.
Два треугольника, имеющие общую грань,
образуют
четырехугольник,
разделенный
диагональю.
Внутри
такого
образования
диагональ имеет два возможных варианта
построения.
Описание взаимодействия препроцессора с подсистемой триангуляции
сетки методом Рапперта
Подсистема триангуляции сетки методом Рапперта принимает на вход
два файла – Result1.bin и Result2.bin. В препроцессоре реализована процедура
генерации этих файлов для любых типов сетки. При завершении работы с
подсистемой результаты триангуляции будут загружены в препроцессор.
Имя будущей сетки определяется ещё в препроцессоре при импорте в
подсистему.
50
Главное окно подсистемы рапперта
Назначение: объединяет все модули подсистемы и организовывает
работу с различными вариантами модифицируемой сетки конечных
элементов.
Подсистема подверглась изменениям, необходимым для корректного
взаимодействия с препроцессором. Также из системы были изъяты функции
отображения сетки и её анализа, т.к. они уже реализованы в препроцессоре.
Подсистема используется исключительно в качестве модуля внесения
изменений, визуализация же результатов её работы происходит уже в
препроцессоре при сохранении варианта сетки.
51
1.4.11. Подсистема задания закреплений
Для дальнейшего расчета пластины необходимо указать граничные
условия (закрепления). Закрепляются узлы конечных элементов. Узел может
быть закреплен по оси X или по оси Y, или сразу по двум осям.
Закрепления задаются на основе линий. Для задания закреплений
необходимо указать линию, и система автоматически определить узлы КЭ,
которые лежат на этой линии.
Так
же
пользователю
предоставляется
возможность
выбрать
закрепляемые линии кликом по рабочей области. В любом случае, успешно
закрепление линии будет сопровождено визуализацией:
Отображение закрепленной линии
1.4.12. Подсистема задания нагрузок
Если по сторонам пластины или конечного элемента приложены
распределённые внешние нагрузки, то их надо привести к узловым силам,
так как в МКЭ внешние воздействия могут прикладываться только в узлах.
При этом необходимо, чтобы силы, приложенные в узлах, находящихся
в зоне приложения распределённой нагрузки, создавали в целом такое же
эквивалентное воздействие, что и теоретическая распределённая нагрузка.
Существует много подходов к распределению сил от неравномерной
нагрузки по узлам и, в частности, исходят из следующего принципа: узловые
52
силы эквивалентны внешним распределённым нагрузкам, если имеет место
равенство их работ на возможных перемещениях.
Простейшее соблюдение этого принципа приводит к следующей схеме
– к узлу прикладывается сила, равная интегралу от функции нагрузки в
пределах от середин расстояний от данного узла до двух соседних
нагруженных узлов, если все три узла лежат на одной прямой. В том случае,
если данный узел имеет только один соседний нагруженный (нагрузка
распространяется только до данного узла), то сила, приходящаяся на данный
узел равна интегралу от функции нагрузки в пределах от данного узла до
середины расстояния до другого соседнего нагруженного узла.
Графически это можно представить заштрихованными площадями S1
для узла, имеющего два соседних нагруженных узла, и S2 для узла,
имеющего только один соседний нагруженный узел.
Для вычисления площадей применяются методы приближённого
вычисления интегралов, основанные на замене интеграла конечной суммой.
53
𝑏
Для вычисления ∫𝑎 𝑦(𝑥)𝑑𝑥 промежуток от a = x0 до b = xn разбивается на n
равных частей, и для точек деления x0, x1, x2, x3,…, xn-1, xn вычисляются
значения y0, y1, y2, y3,…, yn-1, yn интегрируемой функции y(x). Затем
применяется формула парабол (Симпсона) с учетом ℎ =
𝑏
∫ 𝑦(𝑥) ≈
𝑎
𝑏−𝑎
𝑛
:
ℎ
(𝑦 + 4𝑦1 + 2𝑦2 + 4𝑦3 + ⋯ + 2𝑦𝑛−2 + 4𝑦𝑛−1 + 𝑦𝑛 )
3 0
При задании нагрузок, аналогично заданию закреплений, указывается
нагружаемая линия или линии (прямые линии должны лежать на одной
прямой, дуги должны быть частью одной окружности), и система
автоматически определит узлы КЭ, которые лежат на этой линии.
Приложение нагрузок.
Для
анализа
строк
выражений,
составленных
из
стандартных
математических операторов +,-,/,*, функций sin, cos, скобок, применяется
библиотека, с помощью которой можно переводить выражения из строковой
формы инфиксной записи в обработанное представление, составленное в
постфиксной нотации, и затем вычислять их.
54
Результат успешного приложения нагрузок:
1.4.13. Модуль назначения материалов
В данном препроцессоре реализована библиотека материалов с
возможностью добавления новых материалов, их редактирования, а так же
удаления.
Добавление нового материала:
Просмотр и редактирование имеющихся материалов:
55
Материалы назначать можно как группам КЭ, объединенных зонами,
так и отдельным КЭ.
При этом материалы, используемые в модели, отображаются на экране
вместе со всеми свойствами. Так же, любой из используемых материалов
можно легко удалить из модели. При этом все КЭ с этим материалом будут
помечены как КЭ с незаданными свойствами.
Назначение материалов КЭ:
Примечание. Некоторые методы триангуляции и оптимизации могут
привести к тому, что КЭ выйдут за пределы зон, в рамках которых они были
образованы. Для этого случая в препроцессоре реализована процедура
определения зоны конечного элемента путем определения принадлежности
его центра тяжести к какой-либо из зон. Для более точного назначения
материалов в этом случае необходимо использовать возможность назначения
материала отдельному КЭ.
Ниже приведен пример сетки с заданными материалами по зонам (для
триангуляции использован фронтальный метод):
56
1.4.14. Модуль анализа сетки
Для препроцессора был разработан мощный модуль анализа сетки
конечных элементов. Основные возможности модуля:
Поиск КЭ, содержащих слишком малые или слишком большие углы.
Пороговые значения минимально и максимально допустимых углов задаются
пользователем;
Поиск КЭ с площадью превышающей максимально допустимую. Этот порог
также задается пользователем;
Визуальное отображение результатов анализа: выделение цветом «плохих» и
«хороших» КЭ.
Обзор полной статистики по сетке. Пример такой статистики выглядит так:
«Статистика по сетке: Сетка №3.
Заданные параметры:
Минимально допустимый угол: 20
57
Максимально допустимый угол: 120
Минимально допустимая площадь: 0,2
Всего конечных элементов: 774
Из них содержат недопустимых углов: 35 (2,4% от общего числа).
Элементов с углом меньше допустимого: 3 (0,21% от общего числа).
Элементов с углом больше допустимого: 32 (2,19% от общего числа).
Минимальный угол: 1,6, в элементе: 1101.
Максимальный угол: 176,58, в элементе: 912.
Элементов с площадью меньше допустимой: 451 (30,93% от общего
числа).
Минимальная площадь: 0,01, у элемента: 912
Максимальная площадь: 1,19, у элемента: 635».
Отображение информации по конкретному КЭ при наведении на него
мышкой в рабочей области:
Информация об отдельном элементе
Модуль анализа стал незаменимым помощником в ходе выполнения
данной работы, позволил оперативно отслеживать сбои в работе алгоритмов,
сравнивать различные методы оптимизации, находить ошибки в построении
сетки КЭ.
58
Управляющий элемент модуля анализа сетки
Как видно из приведенной картинки, модуль даёт возможность
показать цветовую градацию по двум параметрам:
Площадь КЭ
Минимальный угол КЭ
59
1.4.15. Модуль взаимодействия с Sigma
1.4.15.1.
Экспорт
Для расчета в CAE Sigma необходимо произвести экспорт модели. При этом модель должна быть разбита на КЭ,
иметь граничные условия, нагрузки. Конечным элементам должны быть назначены материалы.
Схема взаимодействия препроцессора с CAE Sigma:
Подсистема
экспорта в CAE
Sigma
Файл с
координатами узлов
– prep_griddm.nodes
Файл с номерами
узлов, образующих
КЭ –
prep_griddm.elems
Файл с
Файл с
закрепленными
узлами –
bounds.nodes
материалами –
materials.elems
CAE Sigma
Файл с
нагруженными
узлами –
forces.nodes
Файл с
геометрической
моделью пластины
- *.sfm
60
Рассмотрим подробно структуру файлов, которые создает подсистема
экспорта в CAE Sigma.
Prep_griddm.nodes
Это файл с координатами узлов. Содержит также общее число узлов.
Число узлов
Координата X узла 1
Координата Y узла 1
Координата X узла 2
Координата Y узла 2
…
…
Координата X узла n
Координата Y узла n
n
X1
Y1
X2
Y2
…
…
Xn
Yn
Prep_griddm.elems
Это файл с номерами узлов, образующих конечные элементы. Каждый
КЭ состоит из трех узлов. Файл содержит также общее число КЭ.
n
N11
N21
N31
N12
N22
N32
…
…
…
N1n
N2n
N3n
Число КЭ
Номер узла 1 в первом КЭ
Номер узла 2 в первом КЭ
Номер узла 3 в первом КЭ
Номер узла 1 во втором
КЭ
Номер узла 2 во втором
КЭ
Номер узла 3 во втором
КЭ
…
…
…
Номер узла 1 в n-м КЭ
Номер узла 2 в n-м КЭ
Номер узла 3 в n-м КЭ
35
Bounds.nodes
Это
файл
с
закрепленными
узлами.
Содержит
общее
число
закрепленных узлов и типы закреплений для каждого фиксированного узла.
n
N1 [пробел] FixType
N2 [пробел] FixType
N3 [пробел] FixType
…
…
Nn [пробел] FixType
Число закрепленных узлов
Номер 1-го закрепленного узла [пробел] тип закрепления
Номер 2-го закрепленного узла [пробел] тип закрепления
Номер 3-го закрепленного узла [пробел] тип закрепления
…
…
Номер n-го закрепленного узла [пробел] тип закрепления
Materials.elems
Это файл с материалами. Хранит номера свойств материалов для всех
конечных элементов. Позиция номера свойства материала в файле
соответствует номеру КЭ. Т.е. на первой позиции находится свойство для КЭ
с номером 1 и т.д.
Номер свойства для 1-го КЭ
Номер свойства для 2-го КЭ
Номер свойства для 3-го КЭ
…
Номер свойства для N-го КЭ
Prop_num1
Prop_num2
Prop_num3
…
Prop_numN
Forces.nodes
Это файл со значениями сил во всех узлах. Если узел не нагружен, то
значение силы равно нулю. Хранятся значения проекций силы на X и на Y.
Позиция сил в файле соответствует номеру узла. Т.е. на первой позиции
находится сила для узла с номером 1 и т.д.
n
FX [пробел] FY
FX [пробел] FY
FX [пробел] FY
…
FX [пробел] FY
Число нагруженных узлов
Узел 1 - Проекция силы на X [пробел] Проекция силы на Y
Узел 2 - Проекция силы на X [пробел] Проекция силы на Y
Узел 3 - Проекция силы на X [пробел] Проекция силы на Y
…
Узел N - Проекция силы на X [пробел] Проекция силы на Y
*.sfm
Геометрическая модель пластины в CAE Sigma хранится в отдельном
файле с расширением *.sfm.
62
Файл
*.sfm
содержит
основные
части:
Служебная информация
Основные параметры пластины
Координаты узлов пластины
Название
Количество Примечание
байт
Служебная информация
Префикс
10
Предназначен для идентификации этого
файла как файла содержащего форму
пластина. При открытии какого-нибудь
файла с таким же расширением, но другого
приложение
программа
сможет
идентифицировать как файл не являющийся
файлом формы.
Версия
4
Предназначена для определения к какой
версии
модуля
редактирования
принадлежит файл. И сможет ли модуль
справиться с открытием файла. Каждый из
этих 4 байт является числом версии. Первые
две важные и изменение их приводит к не
читаемости файла, т.е. изменение его
формата. Последние две цифры показывают
изменение реализации модуля, но не
формата файла.
Размер числа
1
Хранит количество байт отведенных под
хранение числа с плавающей точкой.
Основные параметры пластины
Тип задачи
1
Вариант
1
Параметр разбиения
2
Ширина.
8
Высота.
8
Радиус отверстия
8
Толщина пластины
8
Суммарная нагрузка по X
8
Суммарная нагрузка по Y
8
Число случаев нагружения
4
Число степеней свободы
4
Число узлов в элементе
4
Число материалов
4
Модуль E
8
8
Модуль 
L
8
SB
8
Количество зон
4
Общее число узлов
4
Координаты узлов пластины
Координаты узлов
N*18
N – количество узлов
63
Номера узлов зоны
N*2
Номер узла (2 байта)
X координата (8 байт)
Y координата (8 байт)
N – количество зон
количество узлов в зоне
умноженное
на
Поддержка препроцессора была включена в Sigma версии 6.0hk. К
сожалению, в этой версии была вырезана возможность задания граничных
условий и наложения нагрузок программным методом. Однако было
обнаружено, что возможен экспорт только геометрии пластины с разбиением
на зоны. В таком случае можно использовать версию Sigma без поддержки
препроцессора, но используя импортированную из него геометрию. В этих
целях в препроцессор была добавлена возможность выбора типа экспорта:
Также был разработан модуль для Sigma, обеспечивающий поддержку
препроцессора без необходимости исключения возможности программной
реализации граничных условий. Этот модуль будет включен в следующую
стабильную сборку Sigma
1.4.15.2.
Импорт из Sigma
В препроцессоре реализована возможность импорта пластины из
Sigma. Импорт происходит путем чтения информации о модели из .sfm
файла, используемого Sigma.
Так как пластине в Sigma хранится уже с разбиением на зоны, это
разбиение также импортируется в препроцессор. Однако ничто не мешает
пользователю удалить имеющиеся зоны и задать собственное разбиение
(возможно, предварительно изменив геометрию пластины).
Ниже представлен пример импорта пластины из Sigma.
64
Представление модели в препроцессоре
Представление модели в Sigma
1.4.16. Модуль визуализации
Важную роль в такой системе как препроцессор играют средства
визуализации
модели:
на
экране
пользователя
могут
одновременно
отображаться тысячи конечных элементов со своими номерами, свойствами
и даже с номерами узлов. Прибавить к этому нагрузки, закрепления, сетку
координат – на модуль визуализации ложится сложная задача отображения
такого количества графических элементов. Стандартная для WinForms
библиотека отображения GDI+ показала свою непригодность для решения
такого типа задач. К тому же необходимо было добиться плавного изменения
картинки при масштабировании или перемещении модели.
Для этих целей был разработан специальный класс Visualizer,
использующий
инструментом
библиотеку
для
Tao
визуализации
Framework.
модели
в
Этот
класс
препроцессоре,
послужил
модуле
триангуляции фронтальным методом и даже был интегрирован в систему
Pandora для дальнейшей её разработки.
65
Класс содержит методы для отображения всех типов объектов,
используемых в препроцессоре. Приведем лишь некоторые из них,
являющиеся по мнению автора основными:
DrawPointsArray: отображение всех типов точек/узлов;
DrawLinesArray: отображение всех типов прямых линий;
DrawArc: отрисовка дуги путем её интерполяции короткими отрезками;
DrawCircle: отрисовка окружности;
DrawArea: отрисовка зон пластины;
DrawString: визуализация текстовой строки;
DrawForces: визуализация нагрузок;
DrawBound: визуализация закреплений;
DrawElements: отображение сетки КЭ.
Каждый из этих методов имеет ряд параметров, определяющих цвет,
толщину, тип отображаемых элементов и может быть легко применен для
отображения большинства графических элементов даже вне препроцессора.
Быстродействие модуля обеспечивается за счет реализации буферной
логики: каждая операция отображения заносится в память и хранится там до
тех пор, пока не будет вызвана функция DrawRecord, которая и
«выбрасывает» содержимое буфера на экран. Причем каждая операция
визуализации имеет один из двух типов:
Визуализация геометрического объекта;
Визуализация объекта с наложением текстур (используется для отображения
текста).
Каждая из этих операций использует свой тип данных для хранения
данных.
1.4.16.1.
Структура DrawingOperation
Структура используется для отображения геометрических объектов.
Ниже приведена спецификация этой структуры.
private struct DrawingOperation
{
66
public
public
public
public
public
int paramsList;
int mode;
float[] pts;
float[] cls;
int count;
public DrawingOperation(int drawMode, float[]
vertexCordArray, int paramsListId, float[] vertexColorArray = null)
{
cls = vertexColorArray;
paramsList = paramsListId;
mode = drawMode;
count = vertexCordArray.Length / 2;
pts = vertexCordArray;
}
}
По названию членов класса и параметров конструктора несложно
догадаться об их назначении. Для отображения данных, хранимой в такой
структуре, достаточно вызвать стандартный метод OpenGL для отрисовки
массива объектов:
Gl.glDrawArrays(drawOp.mode, 0, drawOp.count);
1.4.16.2.
Структура TexturedDrawingOperation
Структура используется для визуализации текстовых строк.
private struct TexturedDrawingOperation
{
public int texId;
public float[] pts, tex;
public int count;
public TexturedDrawingOperation(int textureId, float[]
vertexCordArray, float[] textureCordArray)
{
texId = textureId;
count = vertexCordArray.Length / 2;
pts = vertexCordArray;
tex = textureCordArray;
}
}
Для визуализации строки с помощью такой структуры необходимо
вызвать стандартный метод OpenGL для отрисовки объектов и указать
необходимость использования буфера текстур:
67
Gl.glBindTexture(Gl.GL_TEXTURE_2D, tOp.texId);
Gl.glTexCoordPointer(2, Gl.GL_FLOAT, 0, tOp.tex);
Gl.glDrawArrays(Gl.GL_QUADS, 0, tOp.count);
1.5. Общий порядок действий при работе с препроцессором
Создать
проект
импортируе
м
новый
Импортируем геометрическую
модель пластины из *.sfm
файла или создаем сами?
Создаем сами
Импортировать
геометрическую модель
пластины из *.sfm файла
Создать контурные (опорные)
точки будущей пластины
На основе контурных (опорных) точек
создать прямые линии, дуги и
окружности
Если есть окружности, то разбить их
минимум на две дуги путем
добавления новых точек на
окружность
На основе созданных линий и дуг
определить (создать) зоны –
квадратичные четырехугольники
Разбить модель пластины на конечные
элемент, используя1 любой из методов
триангуляции
1
Анализ сетки
68
ДА
2. СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1. Разработка обучающих подсистем САПР, А. В. Бродский, В. А. Столярчук,
С. А. Ульянов, Учебное пособие, МАИ, Москва, 1990
2. Метод конечных элементов в технике, О. Зенкевич, Москва, "МИР", 1975
3. Метод конечных элементов. Основы, Р. Галлагер, Москва, "МИР", 1984
4. Метод конечных элементов и САПР, Ж.-К. Сабоннадьер, Ж.-Л. Кулон,
"МИР", 1989
5. Разработка САПР. Проблемы и принципы создания САПР. 1 книга
А. В. Петров, В. М. Черненький, Москва, "Высшая школа", 1990
6. Разработка
САПР.
Графические
системы
САПР.
7
книга
В. Е. Климов, Москва, "Высшая школа", 1990
7. Применение метода конечных элементов, Сегерлинд, Москва «МИР», 1979
8. Триангуляция Делоне и её применение, А.В. Скворцов, Издательство
Томского Университета, 2002
9. Вычислительная геометрия: триангуляция, Попов С., Попов Ю., 2008,
http://rain.ifmo.ru/cat
10. Разработка
САПР.
Лабораторный
практикум
на
базе
учебно-
исследовательской САПР. 10 книга, А. В. Петров, Москва, "Высшая школа",
1991
11. Методические указания к дипломному проектированию по курсу «Охрана
труда», Москва, 1983
12. Мотузко Ф.Я. Охрана труда. – М.: Высшая школа, 1989.
13. Безопасность жизнедеятельности. /Под ред. Н.А. Белова - М.: Знание,
2000
14. Дьяков В.И. Безопасность жизнедеятельности. Общие вопросы БЖД в
условиях производства и природные аспекты БЖД / ИГЭУ. Иваново, 2000.
15. Безопасность жизнедеятельности.: Учеб. для вузов / С.В. Белов, А.В.
Ильницкая, А.Ф. Козьяков и др.; Под общ. Ред. С.В. Белова, – М.: Высш. шк.,
1999.
69
16. Дипломные работы выпускников кафедры 609 МАИ: Комашенко Н.А.,
Боков П.Ю., Рябинина В.Н.
17. «Моделирование систем. Конспект лекций», Столярчук В.А.
18. OpenGL Суперкнига, Третье издание, Ричард С.Райт-мл. и Бенджамин
Липчак, Москва 2006.
19. http://paulbourke.net/papers/triangulate/ : триангуляция Делоне методом
Пола Бурка
20. http://www.s-hull.org/ : триангуляция Делоне алгоритмом S-Hull
21. http://ru.wikipedia.org/
70
ПРИЛОЖЕНИЕ А. ПРИМЕР ПОДГОТОВКИ ИСХОДНЫХ В
ПРЕПРОЦЕССОРЕ С ПОСЛЕДУЮЩИМ РАСЧЕТОМ В SIGMA.
1. Создадим новый проект, в результате появится следующее окно:
2. Нанесем опорные точки пластины с помощью управляющего
элемента «добавить точки» и нажмем кнопку масштабирования «по
центру»:
71
3. Соединим точки линиями, а с использованием точек 1,2 и 3
построим дугу. Для этого выберем точку 3 начальной точкой дуги,
точку 2 – конечной, а точка 1 станет её центром:
4. Нанесем дополнительные точки и линии, чтобы обозначить
конфигурацию зон:
72
5. Разобьем линии 1, 5, 15, 16 и 17, добавив на каждую из них по точке
примерно по центру. Центры этих линий соединим отрезками:
6. Образуем 8 зон, кликнув по центру каждого из образовавшихся
четырехугольников:
7. Получено разбиение на зоны. На этом этапе можно экспортировать
модель в Sigma для расчет с использованием программного метода
задания закрепления и наложения нагрузок. Сделаем же это!
73
Пластина рассчиталась корректно. Запомним максимальное
эквивалентное напряжение: 14777,6; и вернемся в препроцессор.
8. Триангуляция пластины фронтальным методом.
Для этого откроем модуль триангуляции фронтальным методом.
Зададим в секции «Узлы» шаг 1.5 и нажмем кнопку «Равномерное
распределение. Можно увидеть, как узлы равномерно распределились
по границам зон:
74
9. Попробуем изменить функцию плотности, сгустив сетку в районах
приложения нагрузок. В настройках выберем использование
функции плотности, а значение функции плотности по умолчанию
зададим равным 2:
10. Зададим функцию плотности со значением 0,5 и радиусом 5 в
областях показанных на рисунке:
75
11.Наконец, нажмем кнопку «Построить» в секции «Сетка» и затем –
кнопку «Сохранить сетку». В препроцессоре увидим результат
своих стараний:
12. На этом этапе можно проанализировать сетку и при необходимости
провести её оптимизацию. Но предположим, что сетка нас
устраивает.
13. Используя управляющий элемент «Закрепления», закрепим
пластину как показано на рисунке:
76
14. Прикладываем нагрузки: при открытой форме нагрузок щелкаем по
линиям 9 и 10. Указываем функцию нагрузки, остальные параметры
пока не меняем. Нажимаем «добавить нагрузку»:
77
15.Прикладываем нагрузки к другим линиям. Для вертикальной линии
поставим «Сортировка» : «по Y», «Тип сортировки» : «<» (по
убыванию). Для горизонтальной оставим сортировку по Х, но
поставим тип сортировки «<». Вместе с закреплениями после этого
пластина будет выглядеть так:
16. Осталось назначить материалы. Перейдем в модуль «назначение
материалов», нажмем «выбрать все зоны» и кнопку «сохранить»:
78
17. Импортируем пластину: нажимаем кнопку импорта и выбираем
«импортировать модель целиком». Выбираем путь и нажимаем
сохранить. В целевой папке должны появиться 6 файлов:
18. Создаем проект Sigma в указанной папке. В конфигурации проекта
указываем путь к файлу с формой, созданном в препроцессоре. При
компиляции и расчете проекта, будут подтянуты данные
импортированные из препроцессора. Результат расчет выглядит так:
79
А максимальное эквивалентное напряжение равно 15953.8, что
почти на 10% больше значения, полученного при расчете на
«родной» для Sigma сетке. Это ещё раз показывает, как сильно
влияет конфигурация сетки на расчеты МКЭ.
80
ПРИЛОЖЕНИЕ Б. ИСХОДНЫЙ КОД НЕКОТОРЫХ АЛГОРИТМОВ
СИСТЕМЫ.
1. Триангуляция фронтальным методом: функции Mesh() и
AddElem()
private void Mesh() // Формирование и построение сетки КЭ
{
feNumber = 1;
ExternalFront = new List<MyFrontSegment>();
this.Paint -= MethodForm_Paint;
DisableControls();
for (int i = 0; i < Front.Count; i++)
{
Front[i].finiteElems.Clear();
ExternalFront.Add(MyFrontSegment.createCopy(Front[i]));
}
meshProgress.Show();
meshProgress.progressBar1.Value = 0;
totalNodes = Front.Sum(s => s.Nodes.Count);
currentNodes = totalNodes;
for (int j = 0; j < cZoneCount; j++)
// Выполняем цикл
для каждой зоны
{
currentSegAngles = null;
while (ExternalFront[j].Nodes.Count > 3) // Если
длина фронта ещё может быть разбита
{
if (!AddElem(j)) return;
meshProgress.progressBar1.Value = (int)(100.0 *
(1.0 - (double)currentNodes / totalNodes));
meshProgress.Refresh();
Application.DoEvents();
}
// Добавляем последний треугольник к списку
треугольников
Front[j].finiteElems.Add(new
MyFiniteElement(feNumber++, 0, ExternalFront[j].Nodes, j));
currentNodes -= 3;
meshProgress.progressBar1.Value = (int)(100.0 * (1.0 (double)currentNodes / totalNodes));
meshProgress.Refresh();
Application.DoEvents();
}
endMesh();
this.Paint += MethodForm_Paint;
meshProgress.Hide();
}
81
private bool AddElem(int frontNum)
{
int IndexMinAngle;
if (currentSegAngles == null)
{
currentSegAngles = new Dictionary<MyNode, double>();
for (int k = 0; k <
ExternalFront[frontNum].Nodes.Count; k++)
{
double angle = FindAngle(k, frontNum);
currentSegAngles.Add(ExternalFront[frontNum].Nodes[k], angle);
}
}
currentSegAngles = (from entry in currentSegAngles orderby
entry.Value ascending select entry).ToDictionary(pair => pair.Key,
pair => pair.Value);
IndexMinAngle =
ExternalFront[frontNum].Nodes.IndexOf(currentSegAngles.First().Key);
MinAngle = currentSegAngles.First().Value;
if ((MinAngle <= fMiterAngle) || Math.Abs(MinAngle fMiterAngle) < 0.1)
{
int iLeftPoint = -1, iRightPoint = -1;
FindLeftRightIndex2(IndexMinAngle, out iLeftPoint, out
iRightPoint, frontNum);
MyNode[] Triangle = new MyNode[3];
// Добавление
треугольника к списку
Triangle[0] =
ExternalFront[frontNum].Nodes[iLeftPoint];
Triangle[1] =
ExternalFront[frontNum].Nodes[iRightPoint];
Triangle[2] =
ExternalFront[frontNum].Nodes[IndexMinAngle];
MyFiniteElement fe = new MyFiniteElement(feNumber++,
0, Triangle, frontNum);
Front[frontNum].finiteElems.Add(fe);
currentSegAngles.Remove(ExternalFront[frontNum].Nodes[IndexMinAngle]);
ExternalFront[frontNum].Nodes.RemoveAt(IndexMinAngle);
currentSegAngles[Triangle[0]] =
FindAngle(ExternalFront[frontNum].Nodes.IndexOf(Triangle[0]),
frontNum);
currentSegAngles[Triangle[1]] =
FindAngle(ExternalFront[frontNum].Nodes.IndexOf(Triangle[1]),
frontNum);
currentNodes--;
}
else
{
82
int iLeftPoint = -1, iRightPoint = -1;
FindLeftRightIndex2(IndexMinAngle, out iLeftPoint, out
iRightPoint, frontNum);
MyNode oldPoint =
ExternalFront[frontNum].Nodes[IndexMinAngle];
MyNode newPoint = AddPoint(IndexMinAngle, MinAngle,
frontNum);
if (newPoint == null)
return false;
MyNode[] Triangle = new MyNode[3];
Triangle[0] =
ExternalFront[frontNum].Nodes[iLeftPoint];
Triangle[1] = oldPoint; // Формируем координаты
треугольника для добавления к списку
Triangle[2] = newPoint;
Front[frontNum].finiteElems.Add(new
MyFiniteElement(feNumber++, 0, Triangle, frontNum));
Triangle[0] =
ExternalFront[frontNum].Nodes[iRightPoint];
Triangle[1] = oldPoint; // Формируем координаты
треугольника для добавления к списку
Triangle[2] = newPoint;
Front[frontNum].finiteElems.Add(new
MyFiniteElement(feNumber++, 0, Triangle, frontNum));
currentSegAngles.Remove(oldPoint);
currentSegAngles[ExternalFront[frontNum].Nodes[iRightPoint]] =
FindAngle(iRightPoint, frontNum);
currentSegAngles[ExternalFront[frontNum].Nodes[iLeftPoint]] =
FindAngle(iLeftPoint, frontNum);
currentSegAngles[ExternalFront[frontNum].Nodes[IndexMinAngle]] =
FindAngle(IndexMinAngle, frontNum);
}
return true;
}
2. Процедура регуляризации
private void Regularize(List<MyNode> dontMove)
// Регуляризация
{
MyNode p = new MyNode(); // новая точка
double delta;
this.Hide();
parent.StartProgress("Выполняется регуляризация");
int maxCycles = 500;
Dictionary<MyNode, List<MyNode>> nodeStars = new
Dictionary<MyNode, List<MyNode>>();
foreach (MyNode node in currentModel.Nodes)
{
83
List<MyNode> nearestNodes = new List<MyNode>();
List<MyFiniteElement> nearestElems =
currentModel.FiniteElements.FindAll(fe => fe.Nodes.Contains(node));
foreach (MyFiniteElement fe in nearestElems)
foreach (MyNode nearestNode in fe.Nodes) if
(!nearestNodes.Contains(nearestNode) && nearestNode != node)
nearestNodes.Add(nearestNode);
nodeStars.Add(node, nearestNodes);
Application.DoEvents();
}
do
{
delta = -1;
foreach (MyNode node in currentModel.Nodes)
{
if (dontMove.Contains(node)) continue;
List<MyNode> starNodes = nodeStars[node];
// Вычисляем новые координаты точки
double X = 0, Y = 0;
// новые координаты точки
for (int k = 0; k < starNodes.Count; k++)
{
X += starNodes[k].X;
Y += starNodes[k].Y;
}
X = X / starNodes.Count;
Y = Y / starNodes.Count;
double newDelta = Math.Max(Math.Abs(X - node.X),
Math.Abs(Y - node.Y));
if (delta < 0)
delta = newDelta;
else
delta = Math.Max(delta, newDelta);
node.X = X;
node.Y = Y;
}
} while (delta > 0.01 && maxCycles-- > 0);
parent.EndProgress();
}
84
Download