Newer
Older
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
ЛАБОРАТОРНАЯ РАБОТА № 1
по курсу «Основы программирования на C++»
Разработка конечно-элементного загрузчика сетки
Разработать конечно-элементный загрузчик сеток.
Предусмотреть возможность работы с различными форматами файлов конечно-элементной (КЭ) сетки. Создать базовый класс MeshLoader. Объявить в нем чисто виртуальный метод loadMesh.
Создать производный от MeshLoader класс AneuMeshLoader, в котором переопределить метод loadMesh. Данный класс должен обеспечивать загрузку сетки из формата .aneu.
Предусмотреть возможность консольного запуска бинарного файла и передачи имени загружаемого файла в параметрах командной строки.
В отдельном h-файле создать следующие вспомогательные типы данных:
· Node – тип данных «узел». Хранит ID узла (>= 1), декартовы координаты узла и флаг, определяющий, является ли данный узел вершиной КЭ или его внутренним узлом.
· FiniteElement – тип данных «конечный элемент». Хранит ID КЭ (>= 1), ID типа материала, к которому принадлежит КЭ по данным файла сетки, список ID узлов КЭ.
· BoundaryFiniteElement – тип данных «граничный конечный элемент». Хранит ID элемента (>= 1), ID границы с данным типом граничного условия, список ID узлов поверхностно КЭ.
Предоставить следующие методы:
· методы, позволяющие получить STL-контейнеры узлов, конечных элементов и граничных элементов1;
· метод, позволяющий найти КЭ по ID трех его вершинных узлов, для чего использовать алгоритм find_if и создать необходимый предикат. Предусмотреть возможность наличия нескольких КЭ с данными тремя узлами;
· метод, позволяющий найти КЭ по ребру, заданному с помощью ID двух узлов. Предусмотреть возможность наличия нескольких КЭ с данным ребром;
· метод, возвращающий контейнер граничных узлов по ID границы;
· метод, возвращающий контейнер КЭ с заданным ID области;
· метод, возвращающий контейнер граничных КЭ с заданным ID границы;
· метод, производящий вставку новых узлов в середины ребер существующих КЭ (включая граничные КЭ). Учесть, что обновляются как списки узлов каждого КЭ, так общий список узлов сетки;
· метод, создающий контейнер, n-ый элемент которого хранит контейнер всех «соседей» по ребрам для узла n;
· методы, реализующие отформатированный вывод Node, FiniteElement и BoundaryFiniteElement на консоль;
· при необходимости возможно определение других методов и типов данных.
Основные требования:
Предполагается, что количество узлов и элементов в сетке очень велико. В связи с этим сложность каждого приведенного метода не должна быть больше .
Загрузчик должен быть реализован на основе использования контейнеров, итераторов и алгоритмов STL. Использование циклов должно быть сведено к минимуму.
Ошибки и нештатные ситуации загрузки сетки обработать посредством генерации исключительных ситуаций (при необходимости разработать иерархию исключений). Примерами исключительных ситуаций может быть: не найден файл сетки, неверный формат файла сетки т.п.
Сетки в формате .neu могут быть сгенерированы в программе NetGen (http://sourceforge.net/projects/netgen-mesher/). В формат .aneu данный файл можно преобразовать, добавив в neu-файле в строку с количеством узлов размерность пространства, в строку с количеством КЭ – число узлов в одном КЭ, в строку с количеством граничных КЭ – число узлов в одном граничном КЭ.
Для самостоятельного изучения:
Перенаправление стандартных потоков ввода и вывода в файлы.
ПРИЛОЖЕНИЕ 1
Формат файла .neu
<Количество узлов>
X1 X2 X3
…
X1 X2 X3
<Количество КЭ>
<ID материала> N1 N2 N3 N4
…
<ID материала> N1 N2 N3 N4
<Количество поверхностных КЭ>
<ID поверхности> N1 N2 N3
…
<ID поверхности > N1 N2 N3
Здесь и далее Xi – координата, Ni – ID узла (число от 1 до <Количество узлов>).
ПРИЛОЖЕНИЕ 2
Формат файла .aneu
Данный формат получается «вручную» из файла *.neu изменением расширения на .aneu и внесением информации, выделенной красным цветом:
<Количество узлов> <Размерность пространства>
X1 X2 X3
…
X1 X2 X3
<Количество КЭ> <Количество узлов в одном КЭ>
<ID материала> N1 N2 N3 N4
…
<ID материала> N1 N2 N3 N4
<Количество поверхностных КЭ> <Количество узлов в одном поверхностном КЭ>
<ID поверхности> N1 N2 N3
…
<ID поверхности > N1 N2 N3
ПРИЛОЖЕНИЕ 3
Генерация сетки в NetGen 5.3.
Для генерации сетки в NetGen:
создать файл .geo по приведенным в программе примерам;
открыть файл .geo в программе, выбрав File->Load Geometry;
при необходимости настроить сетку в Mesh->Meshing Options, вкладки General и Mesh Size;
Нажать кнопку Generate Mesh;
Выбрать File->Export Mesh. Сохранить с указанием формата *.neu.
Вручную преобразовать neu-файл в aneu-файл.
Программу можно скачать по ссылке (выбрать версию 5.3!): https://sourceforge.net/projects/netgen-mesher/files/netgen-mesher/5.3/