Newer
Older
# LW1
ЛАБОРАТОРНАЯ РАБОТА № 1
по курсу «Основы программирования на C++»
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
Разработка конечно-элементного загрузчика сетки
Разработать конечно-элементный загрузчик сеток.
1. Предусмотреть возможность работы с различными форматами файлов конечно-элементной (КЭ) сетки. Создать базовый класс MeshLoader. Объявить в нем чисто виртуальный метод loadMesh.
2. Создать производный от MeshLoader класс AneuMeshLoader, в котором переопределить метод loadMesh. Данный класс должен обеспечивать загрузку сетки из формата .aneu.
3. Предусмотреть возможность консольного запуска бинарного файла и передачи имени загружаемого файла в параметрах командной строки.
4. В отдельном h-файле создать следующие вспомогательные типы данных:
· Node – тип данных «узел». Хранит ID узла (>= 1), декартовы координаты узла и флаг, определяющий, является ли данный узел вершиной КЭ или его внутренним узлом.
· FiniteElement – тип данных «конечный элемент». Хранит ID КЭ (>= 1), ID типа материала, к которому принадлежит КЭ по данным файла сетки, список ID узлов КЭ.
· BoundaryFiniteElement – тип данных «граничный конечный элемент». Хранит ID элемента (>= 1), ID границы с данным типом граничного условия, список ID узлов поверхностно КЭ.
5. Предоставить следующие методы:
· методы, позволяющие получить STL-контейнеры узлов, конечных элементов и граничных элементов1;
· метод, позволяющий найти КЭ по ID трех его вершинных узлов, для чего использовать алгоритм find_if и создать необходимый предикат. Предусмотреть возможность наличия нескольких КЭ с данными тремя узлами;
· метод, позволяющий найти КЭ по ребру, заданному с помощью ID двух узлов. Предусмотреть возможность наличия нескольких КЭ с данным ребром;
· метод, возвращающий контейнер граничных узлов по ID границы;
· метод, возвращающий контейнер КЭ с заданным ID области;
· метод, возвращающий контейнер граничных КЭ с заданным ID границы;
· метод, производящий вставку новых узлов в середины ребер существующих КЭ (включая граничные КЭ). Учесть, что обновляются как списки узлов каждого КЭ, так общий список узлов сетки;
· метод, создающий контейнер, n-ый элемент которого хранит контейнер всех «соседей» по ребрам для узла n;
· методы, реализующие отформатированный вывод Node, FiniteElement и BoundaryFiniteElement на консоль;
· при необходимости возможно определение других методов и типов данных.
Основные требования:
1. Предполагается, что количество узлов и элементов в сетке очень велико. В связи с этим сложность каждого приведенного метода не должна быть больше .
2. Загрузчик должен быть реализован на основе использования контейнеров, итераторов и алгоритмов STL. Использование циклов должно быть сведено к минимуму.
3. Ошибки и нештатные ситуации загрузки сетки обработать посредством генерации исключительных ситуаций (при необходимости разработать иерархию исключений). Примерами исключительных ситуаций может быть: не найден файл сетки, неверный формат файла сетки т.п.
4. Сетки в формате .neu могут быть сгенерированы в программе NetGen (http://sourceforge.net/projects/netgen-mesher/). В формат .aneu данный файл можно преобразовать, добавив в neu-файле в строку с количеством узлов размерность пространства, в строку с количеством КЭ – число узлов в одном КЭ, в строку с количеством граничных КЭ – число узлов в одном граничном КЭ.
Для самостоятельного изучения:
1. Перенаправление стандартных потоков ввода и вывода в файлы.
ПРИЛОЖЕНИЕ 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:
1) создать файл .geo по приведенным в программе примерам;
2) открыть файл .geo в программе, выбрав File->Load Geometry;
3) при необходимости настроить сетку в Mesh->Meshing Options, вкладки General и Mesh Size;
4) Нажать кнопку Generate Mesh;
5) Выбрать File->Export Mesh. Сохранить с указанием формата *.neu.
6) Вручную преобразовать neu-файл в aneu-файл.
Программу можно скачать по ссылке (выбрать версию 5.3!): https://sourceforge.net/projects/netgen-mesher/files/netgen-mesher/5.3/