Поперечное сечение 2
Давайте рассмотрим поперечное сечение (смотрите examples/matrix/cross_section_2)
Поперечное сечение
Для создания этого типа геометрии мы будем использовать класс Matrix. Первым делом нам нужно деомпозировать геометрию на блоки и затем модифицировать каждый из них в соответствии с размерами.
Декомпозиция
Геометрию можно разбить на 4 блока: BOTTOM, TOP1, TOP2 и TOP3, где часть TOP3 требуется для небольшой поверхности с граничным условием \(F\), \(u_v\) на конце верхней части. Без граничного условия, трех блоков было бы достаточно. Каждый из этих блоков будет описан классом:py:class:~gmsh_scripts.block.matrix.Matrix.
Декомпозиция геометрии
Геометрия
Определим, что ось X направлена вправо, Y - в глубину, а Z - вверх, т.е. поперечное сечение симметрично относительно оси Y.
Сначала мы должны создать отдельный файл для каждого из блоков:
top_1.yaml
1 data:
2 class: block.Matrix
3 matrix: [ [ 0, 0.250 ], [ 0, 1 ], [ 0, 0.250 ] ]
top_2.yaml
1 data:
2 class: block.Matrix
3 matrix: [ [ 0, 0.220 ], [ 0, 1 ], [ 0, 0.250 ] ]
top_3.yaml
1 data:
2 class: block.Matrix
3 matrix: [ [ 0, 0.030 ], [ 0, 1 ], [ 0, 0.250 ] ]
bottom.yaml
1 data:
2 class: block.Matrix
3 matrix: [ [ 0, 0.250 ], [ 0, 1 ], [ 0, 0.250 ] ]
Каждый из файлов состоит из одного поля высокого уровня data, которое имеет 2 поля: 1. class - название класса блока 2. matrix - списки координат точек по осям
Например, Matrix имеет 2 точки по оси X с координатами 0 и 0.250.
Матрица также имеет 2 точки по оси Y с координатами 0 и 1 и 2 по оси Z с 0 и 0,250. Таким образом, Матрица представляет собой с параллелограмм с размерами: 0,250, 1 и 0,250 по осям X, Y и Z соответственно и начало в точке (0, 0, 0)»
Мы можем сгенерировать геометрию bottom.yaml в файле bottom.geo_unrolled:
python -m gmsh_scripts bottom.yaml
Геометрия блока BOTTOM
Теперь нам нужно создать основной файл main.yaml со всеми блоками:
1 data:
2 class: block.Block
3 do_register: 0
4 children: [
5 /bottom.yaml,
6 /top_1.yaml,
7 /top_2.yaml,
8 /top_3.yaml
9 ]
10 children_transforms: [
11 [ ],
12 [ [ 0, 0, 0.250 ] ],
13 [ [ 0.250, 0, 0.250 ] ],
14 [ [ 0.470, 0, 0.250 ] ]
15 ]
Файл также имеет одно поле высокого уровня «data» с 4 подполями:
class- имя класса блокаdo_register- Нужно ли создавать блок? (установлено 0, потому что нам не нужно создавать сам блок, т.е. это только контейнер для других блоков)children- ссылки на другие блочные файлы (должны начинаться с символа/children_transforms- трансформации блоков
Поле children_transforms представляет собой список Transform для каждого children. В этом примере нам нужны только простые Translate, описываемые 3 числами - смещение по осям X, Y и Z соответственно.
Например:
Дочерний элемент
bottom.yamlне имеет трансформацийДочерний элемент
top_1.yamlимеет однуTranslate[ 0, 0, 0,250 ]со смещением 0,250 по оси Z и без смещений по X и Y (нам просто нужно поднять его наbottom.yaml)Дочерний элемент
top_2.yamlимеет однуTranslate[ 0.250, 0, 0,250 ]Дочерний элемент
top_3.yamlимеет однуTranslate[ 0.470, 0, 0,250 ]
Сгенерируем геометрию со всеми блоками в main.geo_unrolled:
python -m gmsh_scripts main.yaml
Геометрия со всеми блоками
Сетка
Чтобы сгенерировать сетку, мы должны добавить поле metadata в main.yaml файл:
1 metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6 data:
7 class: block.Block
8 do_register: 0
9 children: [
10 /bottom.yaml,
11 /top_1.yaml,
12 /top_2.yaml,
13 /top_3.yaml
14 ]
15 children_transforms: [
16 [ ],
17 [ [ 0, 0, 0.250 ] ],
18 [ [ 0.250, 0, 0.250 ] ],
19 [ [ 0.470, 0, 0.250 ] ]
20 ]
File metadata has run sub-field with fields:
factory- Какое ядро gmsh использовать для генерации сетки? В настоящее время,gmsh имеет два ядра <https://gmsh.info/doc/texinfo/gmsh.html#Overview-of-Gmsh>`_:geoиocc. Мы используемgeo, потому что он быстрееstrategy-Strategyгенерация сеткиstrategy.class- Класс стратегии. ИспользуемNoBoolean, потому что нам не нужны булевы операции
Предупреждение
Если нам нужны булевы операции, мы ДОЛЖНЫ использовать фабрику occ со стратегией по умолчанию (просто не устанавливайте ее в metadata)
Теперь генератор сетки будет возвращать сетку в файл main.msh2 (он также возвращает main.geo_unrolled как и раньше). Генератор создает неструктурированную тетраэдральную сетку по умолчанию.
python -m gmsh_scripts main.yaml
Сетка по умолчанию
Неструктурированная Тетраэдральная
Мы можем настроить неструктурированную сетку параметрами во входных файлах.
First type of parameters aka point parameters is set in matrix field
(e.g. bottom.yaml):
1data:
2 class: block.Matrix
3 matrix: [ [ 0;0.01, 0.250;0.1 ], [ 0;0.01, 1;0.1 ], [ 0;0.01, 0.250;0.1 ] ]
Как видно, для каждой точки добавлен новый параметр с разделителем ;, например 0;0.01 для первой точки по оси X или 0.250;0.1 для второй точки по оси Z. Параметры 0.01 или 0.1 равны приблизительным размеры сетки вблизи соответствующих точек
В этом примере сетка более мелкая вблизи точки (0, 0, 0) с размером 0,01 и грубее возле точки (0,250, 1, 0,250) с размером 0,1.
Давайте добавим поле metadata в bottom.yaml и создадим сетку:
python -m gmsh_scripts bottom.yaml
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Matrix
8 matrix: [ [ 0;0.01, 0.250;0.1 ], [ 0;0.01, 1;0.1 ], [ 0;0.01, 0.250;0.1 ] ]
Неструктурированная тетраэдральная сетка блока BOTTOM
Можно зафиксировать размер сетки вдоль одной из осей (например, Y с «0,01»):
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Matrix
8 matrix: [ [ 0;0.01, 0.250;0.1 ], [ 0;0.01, 1;0.01 ], [ 0;0.01, 0.250;0.1 ] ]
Неструктурированная тетраэдральная сетка с фиксированным размером по оси Y блока BOTTOM
To generate all blocks, one needs to specify point parameters at all blocks and run generator:
python -m gmsh_scripts main.yaml
Неструктурированная тетраэдральная сетка с фиксированным размером вдоль оси Y в BOTTOM блоке
Второй тип параметров global parameters, задается в поле metadata.run.options (например, bottom.yaml):
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6 options:
7 Mesh.MeshSizeFactor: 0.5
8 Mesh.MeshSizeMin: 0
9 Mesh.MeshSizeMax: 1.0e+22
10 Mesh.MeshSizeFromPoints: 1
11data:
12 class: block.Matrix
13 matrix: [ [ 0;0.01, 0.250;0.1 ], [ 0;0.01, 1;0.01 ], [ 0;0.01, 0.250;0.1 ] ]
Here are 4 options (many other options available, see gmsh documentation):
1. Mesh.MeshSizeFactor - factor applied to all mesh element sizes
2. Mesh.MeshSizeMin - minimum mesh element size
3. Mesh.MeshSizeMax - maximum mesh element size
4. Mesh.MeshSizeFromPoints - compute mesh element sizes from values given at geometry points (e.g. in matrix field)
В этом примере для Mesh.MeshSizeFactor установлено значение 0,5, что создает сетку, которая в два раза мельче»
Неструктурированная тетраэдральная сетка с Mesh.MeshSizeFactor = 0.5
Можно отключить Mesh.MeshSizeFromPoints (установить значение 0), чтобы создать равномерную сетку, размер которой контролируется только global parameters.
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6 options:
7 Mesh.MeshSizeFactor: 1
8 Mesh.MeshSizeMin: 0
9 Mesh.MeshSizeMax: 1.0e+22
10 Mesh.MeshSizeFromPoints: 0
11data:
12 class: block.Matrix
13 matrix: [ [ 0;0.01, 0.250;0.1 ], [ 0;0.01, 1;0.01 ], [ 0;0.01, 0.250;0.1 ] ]
Неструктурированная тетраэдральная сетка с Mesh.MeshSizeFromPoints = 0
Тогда мы могли бы использовать global parameters для управления размером сетки, например, с помощью Mesh.MeshSizeMax = 0,1:
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6 options:
7 Mesh.MeshSizeFactor: 1
8 Mesh.MeshSizeMin: 0
9 Mesh.MeshSizeMax: 0.1
10 Mesh.MeshSizeFromPoints: 0
11data:
12 class: block.Matrix
13 matrix: [ [ 0, 0.250 ], [ 0, 1 ], [ 0, 0.250 ] ]
Неструктурированная сетка с Mesh.MeshSizeMax = 0.1
Для генерации всех блоков необходимо указать global parameters в main.yaml:
1 metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6 options:
7 Mesh.MeshSizeFactor: 1
8 Mesh.MeshSizeMin: 0
9 Mesh.MeshSizeMax: 0.1
10 Mesh.MeshSizeFromPoints: 0
11 data:
12 class: block.Block
13 do_register: 0
14 children: [
15 /bottom.yaml,
16 /top_1.yaml,
17 /top_2.yaml,
18 /top_3.yaml
19 ]
20 children_transforms: [
21 [ ],
22 [ [ 0, 0, 0.250 ] ],
23 [ [ 0.250, 0, 0.250 ] ],
24 [ [ 0.470, 0, 0.250 ] ]
25 ]
python -m gmsh_scripts main.yaml
Неструктурированная тетраэдральная сетка, управляемая global parameters
Неструктурированная Гексаэдральная
Предупреждение
Генерация гексаэдральной неструктурированной сетки является ` экспериментальной <https://gitlab.onelab.info/gmsh/gmsh/-/issues/1791>`_ так что не всегда создает качественную сетку, это зависит от сложности геометрии.
Параметры для неструктурированные гексадральной сетки задаются в metadata.run.options и должны иметь Recombine в своих названиях (см. опции gmsh)
Для создания неструктурированной гексаэдральной сетки, параметр `Mesh.SubdivisionAlgorithm должен быть больше, чем 1 (см. пример 11 по gmsh для дополнительной информации)
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6 options:
7 Mesh.MeshSizeFactor: 1
8 Mesh.MeshSizeMin: 0
9 Mesh.MeshSizeMax: 0.1
10 Mesh.MeshSizeFromPoints: 0
11 Mesh.SubdivisionAlgorithm: 2
12data:
13 class: block.Matrix
14 matrix: [ [ 0, 0.250 ], [ 0, 1 ], [ 0, 0.250 ] ]
python -m gmsh_scripts bottom.yaml
Неструктурированная гексаэдральная сетка bottom.yaml
Для создания неструктурированной гексаэдральной сетки из всех блоков добавьтпараметры в metadata main.yaml:
1 metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6 options:
7 Mesh.MeshSizeFactor: 1
8 Mesh.MeshSizeMin: 0
9 Mesh.MeshSizeMax: 0.1
10 Mesh.MeshSizeFromPoints: 0
11 Mesh.SubdivisionAlgorithm: 2
12 data:
13 class: block.Block
14 do_register: 0
15 children: [
16 /bottom.yaml,
17 /top_1.yaml,
18 /top_2.yaml,
19 /top_3.yaml
20 ]
21 children_transforms: [
22 [ ],
23 [ [ 0, 0, 0.250 ] ],
24 [ [ 0.250, 0, 0.250 ] ],
25 [ [ 0.470, 0, 0.250 ] ]
26 ]
python -m gmsh_scripts main.yaml
Неструктурированная гексаэдральная сетка
Структурированная тетраэдральная
Для создания структурированной тетраэдральной сетки необходимо добавить третий параметр к точки в поле matrix с разделителем ;, например, в bottom.yaml:
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6
7data:
8 class: block.Matrix
9 matrix: [ [ 0;0.01, 0.250;0.1;4 ], [ 0;0.01, 1;0.1;8 ], [ 0;0.01, 0.250;0.1;16 ] ]
Третий аргумент должен быть установлен только для второй точки и указывает число узлов вдоль соответствующего направления. Например, 4 узлов по оси X, 8``узлы по Y и ``16 по Z.
python -m gmsh_scripts bottom.yaml
Структурированная тетраэдральная сетка блока BOTTOM
Можно отключить генерацию структурированной сетки, установив items_do_structure_map в 0 (1 по умолчанию) в data поле:
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6
7data:
8 class: block.Matrix
9 matrix: [ [ 0;0.01, 0.250;0.1;4 ], [ 0;0.01, 1;0.1;8 ], [ 0;0.01, 0.250;0.1;16 ] ]
10 items_do_structure_map: 0
Неструктурированная тетраэдральная сетка блока BOTTOM с items_do_structure_map = 0
Для создания структурированной тетраэдральной сетки со всеми блоками необходимо установить третий параметр в каждом из блоков и запустить main.yaml
Предупреждение
TOP блоки должны иметь одинаковое количество узлов по оси Y и Z
top_1.yaml
1 data:
2 class: block.Matrix
3 matrix: [ [ 0, 0.250;0.1;8 ], [ 0, 1;0.1;8 ], [ 0, 0.250;0.1;8 ] ]
top_2.yaml
1 data:
2 class: block.Matrix
3 matrix: [ [ 0, 0.220;0.1;8 ], [ 0, 1;0.1;8 ], [ 0, 0.250;0.1;8 ] ]
top_3.yaml
1 data:
2 class: block.Matrix
3 matrix: [ [ 0, 0.030;0.1;8 ], [ 0, 1;0.1;8 ], [ 0, 0.250;0.1;8 ] ]
bottom.yaml
1 data:
2 class: block.Matrix
3 matrix: [ [ 0, 0.250;0.1;8 ], [ 0, 1;0.1;8 ], [ 0, 0.250;0.1;8 ] ]
python -m gmsh_scripts main.yaml
Структурированная тетраэдральная сетка
Отключить генерацию структурированной сетки сразу для всех блоков можноустановив children_items_do_structure_map = [0, ..., количество дети] в родительском блоке, например, для main.yaml:
1 metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6 data:
7 class: block.Block
8 do_register: 0
9 children: [
10 /bottom.yaml,
11 /top_1.yaml,
12 /top_2.yaml,
13 /top_3.yaml
14 ]
15 children_transforms: [
16 [ ],
17 [ [ 0, 0, 0.250 ] ],
18 [ [ 0.250, 0, 0.250 ] ],
19 [ [ 0.470, 0, 0.250 ] ]
20 ]
21 children_items_do_structure_map: [0, 0, 0, 0]
Структурированная тетраэдральная сетка с отключенными``children_items_do_structure_map``
Структурированная гексаэдральная
Для создания структурированной гексаэдральной сетки можно выполнить те же шаги, что и для Структурированная тетраэдральная, но с items_do_quadrate_map = 1``(``0 по умолчанию) в поле data:
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6
7data:
8 class: block.Matrix
9 matrix: [ [ 0;0.01, 0.250;0.1;4 ], [ 0;0.01, 1;0.1;8 ], [ 0;0.01, 0.250;0.1;16 ] ]
10 items_do_quadrate_map: 1
python -m gmsh_scripts bottom.yaml
Структурированная гексаэдральная сетка блока BOTTOM
Можно изменить положение узлов вдоль осей, используя один из двух методов:
progression- увеличение/уменьшение расстояния между узлами от начальной точкидо конечной точкиbump- увеличить/уменьшить расстояние между узлами от центра до точек
Чтобы использовать progression, мы должны указать 2 дополнительных подпараметра для третий параметр, разделенный ::
Первый -
0(который выбирает типprogression)Второй - это коэффициент
progression- если коэффициент > 1расстояние будет увеличиваться от первой точки ко второй, иначе уменьшаться
Например, подпараметры progression 0:1.5 для оси Y:
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6
7data:
8 class: block.Matrix
9 matrix: [ [ 0;0.01, 0.250;0.1;4 ], [ 0;0.01, 1;0.1;8:0:1.5 ], [ 0;0.01, 0.250;0.1;16 ] ]
10 items_do_quadrate_map: 1
Структурированная гексаэдральная сетка с progression = 1.5
Например, подпараметры progression 0:0.75 для оси Y:
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6
7data:
8 class: block.Matrix
9 matrix: [ [ 0;0.01, 0.250;0.1;4 ], [ 0;0.01, 1;0.1;8:0:0.75 ], [ 0;0.01, 0.250;0.1;16 ] ]
10 items_do_quadrate_map: 1
Структурированная гексаэдральная сетка с progression = 0.75
Чтобы использовать bump, мы должны указать 2 дополнительных подпараметра в третий параметр, разделенный ::
Первый -
1(который выбирает типbump)Вторым является коэффициент
bump- если коэффициент > 1 расстояние будет увеличиваться от центра, иначе уменьшаться
Например, подпараметры bump 1:2.0 для оси Y:
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6
7data:
8 class: block.Matrix
9 matrix: [ [ 0;0.01, 0.250;0.1;4 ], [ 0;0.01, 1;0.1;8:1:2.0 ], [ 0;0.01, 0.250;0.1;16 ] ]
10 items_do_quadrate_map: 1
Структурированная гексаэдральная сетка с bump = 2.0
Например, подпараметры bump 1:0.5 для оси Y:
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6
7data:
8 class: block.Matrix
9 matrix: [ [ 0;0.01, 0.250;0.1;4 ], [ 0;0.01, 1;0.1;8:1:0.5 ], [ 0;0.01, 0.250;0.1;16 ] ]
10 items_do_quadrate_map: 1
Структурированная гексаэдральная сетка с bump = 0.5
Для создания структурированной гексаэдральной сетки всех блоков можно установить items_do_quadrate_map = 0 в каждом из блоков или установить children_items_do_quadrate_map = [0, ..., количество детей] в родительском блоке, например, для main.yaml:
1 metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6 data:
7 class: block.Block
8 do_register: 0
9 children: [
10 /bottom.yaml,
11 /top_1.yaml,
12 /top_2.yaml,
13 /top_3.yaml
14 ]
15 children_transforms: [
16 [ ],
17 [ [ 0, 0, 0.250 ] ],
18 [ [ 0.250, 0, 0.250 ] ],
19 [ [ 0.470, 0, 0.250 ] ]
20 ]
21 children_items_do_quadrate_map: [1, 1, 1, 1]
python -m gmsh_scripts main.yaml
Структурированная гексаэдральная сетка
Зоны
Если мы хотим добавить имена объектам сетки (например, объемам или поверхностям) мы должны установить дополнительное поле items_zones в поле data
Например, мы можем добавить [ [ Volume, [ NX, X, NY, Y, NZ, Z ] ] ] в файл bottom.yaml, где:
Volume- имя объема[ NX, X, NY, Y, NZ, Z ]- имена поверхностей:NX- поверхность, направленная в направлении, противоположном оси XX- поверхность, направленная в направлении оси XNY- поверхность, направленная в направлении, противоположном оси YY- поверхность, направленная в направлении оси YNZ- поверхность, направленная в направлении, противоположном оси ZZ- поверхность, направленная в направлении оси Z
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6
7data:
8 class: block.Matrix
9 matrix: [ [ 0;0.01, 0.250;0.1;4 ], [ 0;0.01, 1;0.1;8 ], [ 0;0.01, 0.250;0.1;16 ] ]
10 items_zone: [ [ Volume, [ NX, X, NY, Y, NZ, Z ] ] ]
11 items_do_quadrate_map: 1
Структурированная гексаэдральная сетка с зонами
Результат
Примечание
Мы должны назначить разные имена для нижних зон поверхностей TOP2 и TOP3, например, Top2NZ и Top3NZ соответственно
top_1.yaml
1data:
2 class: block.Matrix
3 matrix: [ [ 0;0.1, 0.250;0.1;8 ], [ 0;0.1, 1;0.1;8 ], [ 0;0.1, 0.250;0.1;8 ] ]
4 items_zone: [ [ Volume, [ NX, X, NY, Y, NZ, Z ] ] ]
top_2.yaml
1data:
2 class: block.Matrix
3 matrix: [ [ 0;0.1, 0.220;0.1;8 ], [ 0;0.1, 1;0.1;8 ], [ 0;.1, 0.250;0.1;8 ] ]
4 items_zone: [ [ Volume, [ NX, X, NY, Y, Top2NZ, Z ] ] ]
top_3.yaml
1data:
2 class: block.Matrix
3 matrix: [ [ 0;0.1, 0.030;0.1;8 ], [ 0;0.1, 1;0.1;8 ], [ 0;.1, 0.250;0.1;8 ] ]
4 items_zone: [ [ Volume, [ NX, X, NY, Y, Top3NZ, Z ] ] ]
bottom.yaml
1data:
2 class: block.Matrix
3 matrix: [ [ 0;.1, 0.250;.1;8 ], [ 0;.1, 1;.1;8 ], [ 0;.1, 0.250;.1;8 ] ]
4 items_zone: [ [ Volume, [ NX, X, NY, Y, NZ, Z ] ] ]
main.yaml
1metadata:
2 run:
3 factory: geo
4 strategy:
5 class: strategy.NoBoolean
6data:
7 class: block.Block
8 do_register: 0
9 children: [
10 /bottom.yaml,
11 /top_1.yaml,
12 /top_2.yaml,
13 /top_3.yaml
14 ]
15 children_transforms: [
16 [ ],
17 [ [ 0, 0, 0.250 ] ],
18 [ [ 0.250, 0, 0.250 ] ],
19 [ [ 0.470, 0, 0.250 ] ]
20 ]
21 children_items_do_quadrate_map: [ 1, 1, 1, 1 ]
22 children_items_do_structure_map: [ 1, 1, 1, 1 ]
python -m gmsh_scripts main.yaml
Сетка