Простой Children
Концепция
Каждый преемник класса Block может иметь дочерние блоки. Каждый класс с items (в настоящее время Matrix и Layer) может иметь дочерние элементы для каждого item.
Каждый дочерний элемент представляет собой файл gmsh_scripts в формате JSON или YAML.
Дочерние элементы указываются в поле data.children. Можно установить «преобразования» для детей в поле «data.children_transforms».
Дочерние элементы указаны в data.items_children. Необходимо установить data.items_children_transforms и data.items_children_transforms_map, чтобы применить к ним преобразования.
Дочерние элементы
Создадим два дочерних элемента и одного родителя. Дети являются экземплярами класса Layer, т.е. представляют собой цилиндры с разным радиусом. Родитель является экземпляром класса Block и имеет 3 элемента, расположенных по оси X.
Мы создаем их структурированными и гексагональными для удобства.
Дочерний элемент 1
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Layer
8 layer: [ [ 0.05;;4, 0.15;;4 ],
9 [ 0.1;;2, 0.3;;2 ] ]
10 layer_curves: [ [ line, circle_arc ],
11 [ line, line ] ]
12 items_zone: [ CHILD_1 ]
13 items_do_structure_map: 1
14 items_do_quadrate_map: 1
python -m gmsh_scripts child_1.yaml
Дочерний элемент 1
Дочерний элемент 2
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Layer
8 layer: [ [ 0.1;;4, 0.3;;4 ],
9 [ 0.1;;2, 0.3;;2 ] ]
10 layer_curves: [ [ line, circle_arc ],
11 [ line, line ] ]
12 items_zone: [ CHILD_2 ]
13 items_do_structure_map: 1
14 items_do_quadrate_map: 1
python -m gmsh_scripts child_2.yaml
Дочерний элемент 2
Родитель
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Matrix
8 matrix: [ [ 0;;2, 1;;2, 2;;2, 3;;2 ],
9 [ 0;;2, 1;;2 ],
10 [ 0;;2, 1;;2 ] ]
11 items_zone: [ PARENT ]
12 items_do_structure_map: 1
13 items_do_quadrate_map: 1
python -m gmsh_scripts parent.yaml
Родитель
Можно добавить детей к родителю, указав data.children со списком имен файлов детей, начинающихся с символа /.
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Matrix
8 matrix: [ [ 0;;2, 1;;2, 2;;2, 3;;2 ],
9 [ 0;;2, 1;;2 ],
10 [ 0;;2, 1;;2 ] ]
11 items_zone: [ PARENT ]
12 children: [
13 /child_1.yaml,
14 /child_2.yaml
15 ]
16 items_do_structure_map: 1
17 items_do_quadrate_map: 1
Можно добавить дочерние элементы к родителю, указав data.children со списком имен файлов дочерних элементов, начинающихся с символа /.
Как видите, дочерние элементы помещаются в начало координат (0, 0, 0). Чтобы переместить их в другое место, используйте поле data.children_transforms, которое содержит transforms для каждого ребенка в соответствии с их позицией в поле data.children.
В этом примере мы перемещаем первого потомка на -1, а второго потомка на 2 по оси Y.
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Matrix
8 matrix: [ [ 0;;2, 1;;2, 2;;2, 3;;2 ],
9 [ 0;;2, 1;;2 ],
10 [ 0;;2, 1;;2 ] ]
11 items_zone: [ PARENT ]
12 children: [
13 /child_1.yaml,
14 /child_2.yaml
15 ]
16 children_transforms: [
17 [ [ 0, -1, 0] ],
18 [ [ 0, 2, 0] ]
19 ]
20 items_do_structure_map: 1
21 items_do_quadrate_map: 1
Родитель с children с children_transforms
Items Children
Добавление дочерних элементов немного сложнее: сначала нам нужно указать дочерние элементы для каждого элемента, а затем применить преобразования к каждому дочернему элементу каждого элемента.
Работа с items состоит из 2-х шагов: создание main field с параметрами, а затем создание addressing field, заканчивающегося суффиксом _map, за исключением полей с do_ префикс, им не нужно main field. Каждое значение в addressing field является индексом в addressing field, а позиция значения указывает, к какому item Matrix или :py Layer должна быть назначена опция из main_field.
В этом примере у родителя есть 3 элемента, поэтому поля адресации будут иметь длину 3. Сначала нам нужно определить основное поле для дочерних элементов items_children, а затем поле адресации items_children_map
items_children состоит из 3 опций, первая и вторая присваивают элементу одного дочернего элемента, а третья - двух:
/child_1.yaml,/child_2.yaml,/child_1.yamlи/child_2.yaml.
items_children_map присваивает первый параметр из items_children первому элементу, второй вариант из items_children второму элементу и третий вариант третьему: [0, 1, 2].
Аналогично задаются поля items_children_transforms и items_children_transforms_map.
items_children_transforms состоит из 2 опций, первая не назначает преобразования одному дочернему элементу, а третья – одно преобразование двум дочерним элементам:
[ [ ] ],[ [ [ 0, 0, 0.1 ] ], [ [ 0, 0, -0.3 ] ] ].
items_children_transforms_map присваивает первую опцию из items_children первому и второму элементам, а вторую опцию – третьему: [0, 0, 1].
Удобно создавать только геометрию вместо сетки при работе с дочерними элементами и их трансформациями.
1metadata:
2 run:
3 factory: geo
4data:
5 class: block.Matrix
6 matrix: [ [ 0;;2, 1;;2, 2;;2, 3;;2 ],
7 [ 0;;2, 1;;2 ],
8 [ 0;;2, 1;;2 ] ]
9 items_zone: [ PARENT ]
10 items_children: [
11 [ /child_1.yaml ],
12 [ /child_2.yaml ],
13 [ /child_1.yaml, /child_2.yaml ],
14 ]
15 items_children_map: [
16 0, 1, 2
17 ]
18 items_children_transforms: [
19 [ [ ] ],
20 [ [ [ 0, 0, 0.1 ] ], [ [ 0, 0, -0.3 ] ] ],
21 ]
22 items_children_transforms_map: [
23 0, 0, 1
24 ]
25 items_do_structure_map: 1
26 items_do_quadrate_map: 1
python -m gmsh_scripts parent_items.yaml
Родитель с items_children в выходном формате geo_unrolled
После этого мы можем добавить стратегию для создания сетки.
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Matrix
8 matrix: [ [ 0;;2, 1;;2, 2;;2, 3;;2 ],
9 [ 0;;2, 1;;2 ],
10 [ 0;;2, 1;;2 ] ]
11 items_zone: [ PARENT ]
12 items_children: [
13 [ /child_1.yaml ],
14 [ /child_2.yaml ],
15 [ /child_1.yaml, /child_2.yaml ],
16 ]
17 items_children_map: [
18 0, 1, 2
19 ]
20 items_children_transforms: [
21 [ [ ] ],
22 [ [ [ 0, 0, 0.1 ] ], [ [ 0, 0, -0.3 ] ] ],
23 ]
24 items_children_transforms_map: [
25 0, 0, 1
26 ]
27 items_do_structure_map: 1
28 items_do_quadrate_map: 1
Родитель с items_children
Мы могли бы подавить создание элементов (не их потомков), установив для items_do_register_map значение 0.
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Matrix
8 matrix: [ [ 0;;2, 1;;2, 2;;2, 3;;2 ],
9 [ 0;;2, 1;;2 ],
10 [ 0;;2, 1;;2 ] ]
11 items_zone: [ PARENT ]
12 items_children: [
13 [ /child_1.yaml ],
14 [ /child_2.yaml ],
15 [ /child_1.yaml, /child_2.yaml ],
16 ]
17 items_children_map: [
18 0, 1, 2
19 ]
20 items_children_transforms: [
21 [ [ ] ],
22 [ [ [ 0, 0, 0.1 ] ], [ [ 0, 0, -0.3 ] ] ],
23 ]
24 items_children_transforms_map: [
25 0, 0, 1
26 ]
27 items_do_structure_map: 1
28 items_do_quadrate_map: 1
29 items_do_register_map: 0
Родитель с items_children без items
Мы также могли бы создать много копий дочерних элементов внутри элемента, добавив дополнительный параметр после координаты с разделителем :, например 5:4 делит последний элемент на 3 части (с 4 узлами) и создает дочерние элементы внутри каждой части.
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Matrix
8 matrix: [ [ 0;;2, 1;;2, 2;;2, 5:4;;2 ],
9 [ 0;;2, 1;;2 ],
10 [ 0;;2, 1;;2 ] ]
11 items_zone: [ PARENT ]
12 items_children: [
13 [ /child_1.yaml ],
14 [ /child_2.yaml ],
15 [ /child_1.yaml, /child_2.yaml ],
16 ]
17 items_children_map: [
18 0, 1, 2
19 ]
20 items_children_transforms: [
21 [ [ ] ],
22 [ [ [ 0, 0, 0.1 ] ], [ [ 0, 0, -0.3 ] ] ],
23 ]
24 items_children_transforms_map: [
25 0, 0, 1
26 ]
27 items_do_structure_map: 1
28 items_do_quadrate_map: 1
29 items_do_register_map: 0
Родитель с items_children с расширенным третьим элементом
Все месте
Можно комбинировать children и items_children, например. добавлять произвольно и регулярно расположенные дочерние элементы.
1metadata:
2 run:
3 factory: occ
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Matrix
8 matrix: [ [ 0;;2, 1;;2, 2;;2, 5:4;;2 ],
9 [ 0;;2, 1;;2 ],
10 [ 0;;2, 1;;2 ] ]
11 items_zone: [ PARENT ]
12 children: [
13 /child_1.yaml,
14 /child_2.yaml
15 ]
16 children_transforms: [
17 [ [ 0, -1, 0 ] ],
18 [ [ 0, 2, 0 ] ]
19 ]
20 items_children: [
21 [ /child_1.yaml ],
22 [ /child_2.yaml ],
23 [ /child_1.yaml, /child_2.yaml ],
24 ]
25 items_children_map: [
26 0, 1, 2
27 ]
28 items_children_transforms: [
29 [ [ ] ],
30 [ [ [ 0, 0, 0.1 ] ], [ [ 0, 0, -0.3 ] ] ],
31 ]
32 items_children_transforms_map: [
33 0, 0, 1
34 ]
35 items_do_structure_map: 1
36 items_do_quadrate_map: 1
37 items_do_register_map: 0
python -m gmsh_scripts parent_all.yaml
Родитель с children и items_children
Сетка
Для создания сетки нам нужны булевы операции, доступные в фабрике occ.
Предупреждение
Рекомендуется отключать поля items_do_structure_map и items_do_quadrate_map, т.е. создавать неструктурированную тетраэдральную сетку при использовании булевых операций для достижения большей стабильности генерации сетки.
1data:
2 class: block.Layer
3 layer: [ [ 0.05;;4, 0.15;;4 ],
4 [ 0.1;;2, 0.3;;2 ] ]
5 layer_curves: [ [ line, circle_arc ],
6 [ line, line ] ]
7 items_zone: [ CHILD_1 ]
8 items_do_structure_map: 0
9 items_do_quadrate_map: 0
1data:
2 class: block.Layer
3 layer: [ [ 0.1;;4, 0.3;;4 ],
4 [ 0.1;;2, 0.3;;2 ] ]
5 layer_curves: [ [ line, circle_arc ],
6 [ line, line ] ]
7 items_zone: [ CHILD_2 ]
8 items_do_structure_map: 0
9 items_do_quadrate_map: 0
1metadata:
2 run:
3 factory: occ
4data:
5 class: block.Matrix
6 matrix: [ [ 0;;2, 1;;2, 2;;2, 5:4;;2 ],
7 [ 0;;2, 1;;2 ],
8 [ 0;;2, 1;;2 ] ]
9 items_zone: [ PARENT ]
10 children: [
11 /child_1.yaml,
12 /child_2.yaml
13 ]
14 children_transforms: [
15 [ [ 0, -1, 0 ] ],
16 [ [ 0, 2, 0 ] ]
17 ]
18 items_children: [
19 [ /child_1.yaml ],
20 [ /child_2.yaml ],
21 [ /child_1.yaml, /child_2.yaml ],
22 ]
23 items_children_map: [
24 0, 1, 2
25 ]
26 items_children_transforms: [
27 [ [ ] ],
28 [ [ [ 0, 0, 0.1 ] ], [ [ 0, 0, -0.3 ] ] ],
29 ]
30 items_children_transforms_map: [
31 0, 0, 1
32 ]
33 items_do_structure_map: 0
34 items_do_quadrate_map: 0
35 items_do_register_map: 1
python -m gmsh_scripts parent_all.yaml
Сетка, созданная с помощью occ factory
Можно настроить качество сетки, используя поля run.options, например:
Mesh.MeshSizeFactor- коэффициент, применяемый ко всем размерам элементов сетки,Mesh.MeshSizeMin- минимальный размер элемента сетки,Mesh.MeshSizeMax- максимальный размер элемента сетки,Mesh.MeshSizeExtendFromBoundary- расширение вычисления размеров элементов сетки от границ во внутреннюю часть (0: никогда;1: для поверхностей и объемов;2: для поверхностей и объемов. , но использовать наименьшую длину ребра элемента поверхности вместо наибольшей длины в 3D Делоне;-2: только для поверхностей;-3: только для объемов),Mesh.MeshSizeFromCurvature- автоматически вычисляет размеры элементов сетки по кривизне, используя значение в качестве целевого количества элементов на 2 * Pi радиан.
Примечание
См. документацию gmsh для получения дополнительной информации об опциях и их описании.
1metadata:
2 run:
3 factory: occ
4 options:
5 Mesh.MeshSizeFactor: 1.0
6 Mesh.MeshSizeMin: 0.1
7 Mesh.MeshSizeMax: 0.3
8 Mesh.MeshSizeExtendFromBoundary: 2
9 Mesh.MeshSizeFromCurvature: 12
10data:
11 class: block.Matrix
12 matrix: [ [ 0;;2, 1;;2, 2;;2, 5:4;;2 ],
13 [ 0;;2, 1;;2 ],
14 [ 0;;2, 1;;2 ] ]
15 items_zone: [ PARENT ]
16 children: [
17 /child_1.yaml,
18 /child_2.yaml
19 ]
20 children_transforms: [
21 [ [ 0, -1, 0 ] ],
22 [ [ 0, 2, 0 ] ]
23 ]
24 items_children: [
25 [ /child_1.yaml ],
26 [ /child_2.yaml ],
27 [ /child_1.yaml, /child_2.yaml ],
28 ]
29 items_children_map: [
30 0, 1, 2
31 ]
32 items_children_transforms: [
33 [ [ ] ],
34 [ [ [ 0, 0, 0.1 ] ], [ [ 0, 0, -0.3 ] ] ],
35 ]
36 items_children_transforms_map: [
37 0, 0, 1
38 ]
39 items_do_structure_map: 0
40 items_do_quadrate_map: 0
41 items_do_register_map: 1
Сетка настроена с помощью metadata.run.options