Простой 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
_images/tutorial_simple_children_child_1.png

Дочерний элемент 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
_images/tutorial_simple_children_child_2.png

Дочерний элемент 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
_images/tutorial_simple_children_parent.png

Родитель

Можно добавить детей к родителю, указав 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
_images/tutorial_simple_children_parent_2.png

Можно добавить дочерние элементы к родителю, указав 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
_images/tutorial_simple_children_parent_3.png

Родитель с 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 опций, первая и вторая присваивают элементу одного дочернего элемента, а третья - двух:

  1. /child_1.yaml,

  2. /child_2.yaml,

  3. /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 опций, первая не назначает преобразования одному дочернему элементу, а третья – одно преобразование двум дочерним элементам:

  1. [ [ ] ],

  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
_images/tutorial_simple_children_parent_items.png

Родитель с 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
_images/tutorial_simple_children_parent_items_2.png

Родитель с 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
_images/tutorial_simple_children_parent_items_3.png

Родитель с 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
_images/tutorial_simple_children_parent_items_4.png

Родитель с 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
_images/tutorial_simple_children_parent_all.png

Родитель с 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
_images/tutorial_simple_children_parent_all_2.png

Сетка, созданная с помощью occ factory

Можно настроить качество сетки, используя поля run.options, например:

  1. Mesh.MeshSizeFactor - коэффициент, применяемый ко всем размерам элементов сетки,

  2. Mesh.MeshSizeMin - минимальный размер элемента сетки,

  3. Mesh.MeshSizeMax - максимальный размер элемента сетки,

  4. Mesh.MeshSizeExtendFromBoundary - расширение вычисления размеров элементов сетки от границ во внутреннюю часть (0: никогда; 1: для поверхностей и объемов; 2: для поверхностей и объемов. , но использовать наименьшую длину ребра элемента поверхности вместо наибольшей длины в 3D Делоне; -2: только для поверхностей; -3: только для объемов),

  5. 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
_images/tutorial_simple_children_parent_all_3.png

Сетка настроена с помощью metadata.run.options